[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:ai-engineer\u002Frag-retrieval-search":4,"config":194},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":97,"samples":108},"ai-engineer","AI Engineer","","rag-retrieval-search","Rag Retrieval Search","en",75,2025,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,94],{"key":19,"name":20,"count":11},"agents-tool-use","Agents Tool Use",{"key":22,"name":23,"count":11},"aimlops-deployment-strategies-ml","Aimlops Deployment Strategies Ml",{"key":25,"name":26,"count":11},"aimlops-experiment-tracking-reproducibility","Aimlops Experiment Tracking Reproducibility",{"key":28,"name":29,"count":11},"aimlops-feature-store-data-versioning","Aimlops Feature Store Data Versioning",{"key":31,"name":32,"count":11},"aimlops-ml-cicd-pipelines","Aimlops Ml Cicd Pipelines",{"key":34,"name":35,"count":11},"aimlops-model-monitoring-drift-detection","Aimlops Model Monitoring Drift Detection",{"key":37,"name":38,"count":11},"aimlops-model-versioning-registry","Aimlops Model Versioning Registry",{"key":40,"name":41,"count":11},"aipy-async-concurrency-ml-serving","Aipy Async Concurrency Ml Serving",{"key":43,"name":44,"count":11},"aipy-data-pipeline-dataloader","Aipy Data Pipeline Dataloader",{"key":46,"name":47,"count":11},"aipy-gpu-memory-management","Aipy Gpu Memory Management",{"key":49,"name":50,"count":11},"aipy-numpy-vectorization-broadcasting","Aipy Numpy Vectorization Broadcasting",{"key":52,"name":53,"count":11},"aipy-python-ml-packaging-environments","Aipy Python Ml Packaging Environments",{"key":55,"name":56,"count":11},"aipy-tensor-ops-autograd","Aipy Tensor Ops Autograd",{"key":58,"name":59,"count":11},"embeddings-vector-search","Embeddings Vector Search",{"key":61,"name":62,"count":11},"evaluation-testing","Evaluation Testing",{"key":64,"name":65,"count":11},"fine-tuning-adaptation","Fine Tuning Adaptation",{"key":67,"name":68,"count":11},"inference-serving","Inference Serving",{"key":70,"name":71,"count":11},"llm-fundamentals","Llm Fundamentals",{"key":73,"name":74,"count":11},"prompt-engineering","Prompt Engineering",{"key":76,"name":77,"count":11},"rag-chunking-indexing","Rag Chunking Indexing",{"key":79,"name":80,"count":11},"rag-embeddings-similarity","Rag Embeddings Similarity",{"key":82,"name":83,"count":11},"rag-evaluation","Rag Evaluation",{"key":85,"name":86,"count":11},"rag-generation-context","Rag Generation Context",{"key":88,"name":89,"count":11},"rag-reranking-fusion","Rag Reranking Fusion",{"key":91,"name":92,"count":11},"rag-retrieval","Rag Retrieval",{"key":8,"name":9,"count":11},{"key":95,"name":96,"count":11},"safety-guardrails","Safety Guardrails",[98,102,105],{"key":99,"name":100,"count":101},"llm-rag","LLM\u002FRAG",450,{"key":103,"name":104,"count":101},"mlops","MLOps",{"key":106,"name":107,"count":101},"python","Python",[109,127,140,154,167,181],{"id":110,"topic":9,"difficulty":111,"body":112,"options":113,"correct_key":118,"explanation":126},"019f667f-d9b8-7e1e-bdf4-1d3bac0efb54",1,"In retrieval for RAG, what is the core difference between dense (embedding-based) retrieval and sparse (keyword\u002FBM25) retrieval?",[114,117,120,123],{"key":115,"text":116},"a","Dense only works on short docs; sparse only works on long docs.",{"key":118,"text":119},"b","Dense matches by meaning; sparse matches by exact term overlap.",{"key":121,"text":122},"c","Dense needs no index; sparse always needs a graph index.",{"key":124,"text":125},"d","Dense sorts results alphabetically; sparse sorts by file size.","Dense retrieval compares query and document embeddings in a semantic vector space, so paraphrases and synonyms can match even without shared words. Sparse retrieval (e.g. BM25) scores documents by exact token overlap, weighted by term rarity and frequency, so it needs the literal term to appear. (a), (c), and (d) describe distinctions that have nothing to do with how these two methods actually compute relevance.",{"id":128,"topic":9,"difficulty":111,"body":129,"options":130,"correct_key":115,"explanation":139},"019f667f-d9b9-7975-a437-3b736daee5c1","At a high level, what does the BM25 scoring function weigh when ranking a document for a query?",[131,133,135,137],{"key":115,"text":132},"Term frequency, term rarity (IDF), and document length.",{"key":118,"text":134},"How recently the document was indexed and its inbound link count.",{"key":121,"text":136},"The cosine angle between two learned dense vectors.",{"key":124,"text":138},"Total unique word count in the document, ignoring the query.","BM25 combines term frequency (how often a query term appears in a document), inverse document frequency (rarer terms across the corpus get more weight), and document length normalization (so long documents don't win purely by repeating terms more). (b) describes recency\u002Flink-based ranking signals, unrelated to BM25. (c) describes dense vector similarity, not sparse scoring. (d) ignores the query entirely, which BM25 does not do.",{"id":141,"topic":9,"difficulty":142,"body":143,"options":144,"correct_key":121,"explanation":153},"019f667f-d9ba-7815-9c1c-ec60ee78b1e2",2,"A 4-document corpus (tokenized by whitespace) is indexed with `BM25Okapi`, and the query `\"what does error x401 mean\"` is scored against each:\n```\ndoc0: \"restart the service after updating the configuration file\"\ndoc1: \"error code x401 means the authentication token has expired\"\ndoc2: \"authentication tokens can expire and usually require a refresh\"\ndoc3: \"server logs show timeout errors during periods of high load\"\n```\nRunning `bm25.get_scores(query)` gives real scores of `[0.0, 1.6946, 0.0, 0.0]`. Why does doc1 score so much higher than the rest?",[145,147,149,151],{"key":115,"text":146},"BM25 always favors whichever document was indexed first.",{"key":118,"text":148},"doc1 is the shortest document, and BM25 favors short documents.",{"key":121,"text":150},"doc1 uniquely contains the rare query token \"x401\".",{"key":124,"text":152},"The other documents were rejected by the tokenizer for stopwords.","\"x401\" appears in the query and is unique to doc1 in this corpus, giving it a high inverse-document-frequency weight; doc2 is semantically about the same topic (authentication token expiry) but shares no exact query tokens with high IDF, so it scores 0. (a) is false — BM25 has no notion of insertion order. (b) is a real but secondary factor (BM25 does have length normalization), but here the deciding factor is the exact rare-term match, not length alone. (d) misdescribes tokenization — stopwords lower scores, they don't zero out documents entirely.",{"id":155,"topic":9,"difficulty":142,"body":156,"options":157,"correct_key":124,"explanation":166},"019f667f-d9bc-73e7-b8d3-1ffbfa2e327e","Two candidate documents are represented as 4-dim toy embeddings along semantic axes `[auth, error, server, refresh]`:\n```\nquery = [0.90, 0.10, 0.00, 0.60]\ndoc1  = [0.85, 0.90, 0.00, 0.10]   # mentions the exact error code, weak refresh signal\ndoc2  = [0.95, 0.05, 0.00, 0.90]   # paraphrase, no code, strong auth+refresh signal\n```\nComputing real cosine similarity gives `cos(query, doc1) ≈ 0.6782` and `cos(query, doc2) ≈ 0.9841`. What does this tell you about dense retrieval here?",[158,160,162,164],{"key":115,"text":159},"Cosine similarity cannot exceed 0.9 for normalized vectors.",{"key":118,"text":161},"doc1 must contain a typo, since it scores lower here.",{"key":121,"text":163},"Neither document is relevant, since neither score is near 1.",{"key":124,"text":165},"doc2's semantic profile aligns more closely with the query.","Cosine similarity measures the angle between vectors regardless of exact tokens present; here doc2's profile (strong auth + refresh, matching the query's dominant signals) aligns more closely with the query than doc1's profile, even though doc1 is the one containing the literal error code. This illustrates that dense retrieval ranks by overall semantic alignment, not by presence of a specific rare term. (a) is a false constraint — cosine similarity naturally ranges up to 1.0. (b) and (c) misread what the numbers indicate.",{"id":168,"topic":9,"difficulty":169,"body":170,"options":171,"correct_key":118,"explanation":180},"019f667f-d9be-7db3-91d8-43ee0dc70844",3,"For the same query, BM25 (question 3) ranks doc1 (contains \"x401\") first with score 1.6946 while doc2 scores 0.0. Running dense cosine similarity (question 4) on a semantically comparable pair ranks the paraphrase document (0.9841) above the exact-code document (0.6782). What does this divergence demonstrate about combining the two methods?",[172,174,176,178],{"key":115,"text":173},"One of the two scoring implementations must contain a bug.",{"key":118,"text":175},"Different signals cause disagreement; that's why hybrid combines both.",{"key":121,"text":177},"BM25 should be dropped entirely in favor of dense retrieval.",{"key":124,"text":179},"BM25 scores and cosine similarities are directly comparable.","Both scoring runs are correct on their own terms — they simply measure different kinds of relevance. BM25 rewards exact rare-term overlap, dense embeddings reward overall semantic closeness. Neither is \"wrong\"; this exact kind of disagreement is the motivation for hybrid retrieval, which merges both rankings so that a document strong in either signal can surface. (a) wrongly assumes disagreement implies a bug. (c) draws an unsupported conclusion from a single example. (d) is a critical error — BM25 and cosine similarity live on different, non-comparable scales, which is precisely why fusion methods use rank position rather than raw scores.",{"id":182,"topic":9,"difficulty":142,"body":183,"options":184,"correct_key":121,"explanation":193},"019f667f-d9c2-7070-b556-485ded5d6176","A retrieval run returns this ranked list of document IDs: `[\"d7\", \"d3\", \"d1\", \"d9\", \"d2\"]`. The only relevant document for the query is `\"d1\"`, sitting at rank 3. Computing `recall@k` for real gives `recall@1 = 0.0`, `recall@2 = 0.0`, `recall@3 = 1.0`. What does this concretely show about the effect of `top-k` on recall?",[185,187,189,191],{"key":115,"text":186},"recall@k is undefined whenever the relevant doc isn't ranked first.",{"key":118,"text":188},"Recall dropped as k increased, meaning more results made it worse.",{"key":121,"text":190},"Recall stays 0 until k reaches the relevant doc's rank, then jumps to 1.",{"key":124,"text":192},"This recall@k is actually measuring precision, not recall.","recall@k asks whether the relevant document(s) are contained anywhere within the top-k results; since d1 is at rank 3, top-1 and top-2 both miss it (recall 0), and top-3 (and beyond) include it (recall 1). Because raising k only adds more candidates without removing any, recall@k is monotonically non-decreasing in k. (a) is false — recall@k is well-defined even at 0. (b) misreads the numbers, which increase, not decrease. (d) confuses recall with precision; precision would also account for how many irrelevant documents are mixed in, which this example does not test.",{"fields":195,"seniorities":372,"interview_shapes":373,"locales":378,"oauth":380,"question_count":383,"coach_enabled":384,"jd_match_enabled":384},[196,219,239,255,279,286,305,324,346,353,359,366],{"key":197,"name_tr":198,"name_en":198,"sort":111,"specializations":199},"backend","Backend",[200,203,206,207,210,213,216],{"key":201,"name":202,"field":197},"general","Genel",{"key":204,"name":205,"field":197},"go","Go",{"key":106,"name":107,"field":197},{"key":208,"name":209,"field":197},"java","Java",{"key":211,"name":212,"field":197},"csharp","C#\u002F.NET",{"key":214,"name":215,"field":197},"nodejs","Node.js",{"key":217,"name":218,"field":197},"php","PHP",{"key":220,"name_tr":221,"name_en":221,"sort":142,"specializations":222},"frontend","Frontend",[223,224,227,230,233,236],{"key":201,"name":202,"field":220},{"key":225,"name":226,"field":220},"javascript","JavaScript",{"key":228,"name":229,"field":220},"typescript","TypeScript",{"key":231,"name":232,"field":220},"react","React",{"key":234,"name":235,"field":220},"vue","Vue",{"key":237,"name":238,"field":220},"angular","Angular",{"key":240,"name_tr":241,"name_en":241,"sort":169,"specializations":242},"fullstack","Fullstack",[243,244,245,246,247,248,249,250,251,252,253,254],{"key":201,"name":202,"field":240},{"key":204,"name":205,"field":197},{"key":106,"name":107,"field":197},{"key":208,"name":209,"field":197},{"key":211,"name":212,"field":197},{"key":214,"name":215,"field":197},{"key":217,"name":218,"field":197},{"key":225,"name":226,"field":220},{"key":228,"name":229,"field":220},{"key":231,"name":232,"field":220},{"key":234,"name":235,"field":220},{"key":237,"name":238,"field":220},{"key":256,"name_tr":257,"name_en":257,"sort":258,"specializations":259},"devops-cloud","DevOps \u002F Cloud",4,[260,261,264,267,270,273,276],{"key":201,"name":202,"field":256},{"key":262,"name":263,"field":256},"aws","AWS",{"key":265,"name":266,"field":256},"gcp","GCP",{"key":268,"name":269,"field":256},"azure","Azure",{"key":271,"name":272,"field":256},"kubernetes","Kubernetes",{"key":274,"name":275,"field":256},"terraform","Terraform",{"key":277,"name":278,"field":256},"linux","Linux",{"key":5,"name_tr":6,"name_en":6,"sort":280,"specializations":281},5,[282,283,284,285],{"key":201,"name":202,"field":5},{"key":106,"name":107,"field":5},{"key":99,"name":100,"field":5},{"key":103,"name":104,"field":5},{"key":287,"name_tr":288,"name_en":289,"sort":290,"specializations":291},"database","Veritabanı","Database",6,[292,293,296,299,302],{"key":201,"name":202,"field":287},{"key":294,"name":295,"field":287},"postgresql","PostgreSQL",{"key":297,"name":298,"field":287},"mysql","MySQL",{"key":300,"name":301,"field":287},"mongodb","MongoDB",{"key":303,"name":304,"field":287},"redis","Redis",{"key":306,"name_tr":307,"name_en":308,"sort":309,"specializations":310},"mobile","Mobil","Mobile",7,[311,312,315,318,321],{"key":201,"name":202,"field":306},{"key":313,"name":314,"field":306},"ios-swift","iOS (Swift)",{"key":316,"name":317,"field":306},"android-kotlin","Android (Kotlin)",{"key":319,"name":320,"field":306},"flutter","Flutter",{"key":322,"name":323,"field":306},"react-native","React Native",{"key":325,"name_tr":326,"name_en":327,"sort":328,"specializations":329},"security","Güvenlik","Security",8,[330,331,334,337,340,343],{"key":201,"name":202,"field":325},{"key":332,"name":333,"field":325},"appsec","AppSec",{"key":335,"name":336,"field":325},"offensive-pentest","Offensive \u002F Pentest",{"key":338,"name":339,"field":325},"cloud-security","Cloud Security",{"key":341,"name":342,"field":325},"devsecops","DevSecOps",{"key":344,"name":345,"field":325},"blue-team-incident","Blue Team \u002F Incident",{"key":347,"name_tr":348,"name_en":349,"sort":350,"specializations":351},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[352],{"key":201,"name":202,"field":347},{"key":354,"name_tr":355,"name_en":355,"sort":356,"specializations":357},"data-engineer","Data Engineer",10,[358],{"key":201,"name":202,"field":354},{"key":360,"name_tr":361,"name_en":362,"sort":363,"specializations":364},"game-dev","Oyun Geliştirme","Game Development",11,[365],{"key":201,"name":202,"field":360},{"key":367,"name_tr":368,"name_en":368,"sort":369,"specializations":370},"ml-engineer","ML Engineer",12,[371],{"key":201,"name":202,"field":367},[14,15,16],{"junior":374,"mid":376,"senior":377},{"questions":375,"median_sec":3},20,{"questions":375,"median_sec":3},{"questions":375,"median_sec":3},[379,10],"tr",[381,382],"google","github",21750,true]