[{"data":1,"prerenderedAt":473},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fru\u002Fai\u002Frag-production-retrieval-quality-first":13},{"i18nKey":4,"paths":5},"ai-003-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fai\u002Frag-production-retrieval-qualitaet-vor-kosten","\u002Fen\u002Fai\u002Frag-production-retrieval-quality-over-cost","\u002Fes\u002Fai\u002Frag-production-calidad-recuperacion-primero","\u002Ffr\u002Fai\u002Fproduction-rag-retrieval-quality-before-cost","\u002Fit\u002Fai\u002Frag-production-retrieval-quality-first","\u002Fru\u002Fai\u002Frag-production-retrieval-quality-first","\u002Ftr\u002Fai\u002Fproductionda-rag-retrieval-kalitesi-costtan-once-gelir",{"_path":11,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":467,"_id":468,"_source":469,"_file":470,"_stem":471,"_extension":472},"ai",false,"","RAG в Production: Качество Retrieval важнее Cost","Неправильный выбор embedding, chunking и evaluation приводит к галлюцинациям. Уроки из production-опыта: метрики, мониторинг и правильный баланс качества с затратами.","2026-06-01",[21,22,23,24,25],"rag","embedding","retrieval","llm-eval","production-ai",9,"Roibase",{"type":29,"children":30,"toc":451},"root",[31,39,46,51,56,61,68,73,79,84,89,94,220,226,231,237,242,247,282,287,293,298,304,309,314,319,325,330,335,341,346,400,405,421,427,432,437,442,446],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","RAG-системы в production переживают два сценария: либо закрываются через 3 недели из-за галлюцинаций, либо становятся критичным pipeline с F1 выше 90%. Разница в выборе embedding-модели, стратегии chunking и setup'е evaluation. Оптимизация cost — второстепенная задача. Если не решить проблему доставки правильного документа, дешёвая модель будет производить дорогостоящие ошибки.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"embedding-модель-не-размер-а-domain-alignment",[44],{"type":37,"value":45},"Embedding-модель: не размер, а domain alignment",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Первый рефлекс — \"большая модель всегда лучше\". text-embedding-3-large (3072 dim) выигрывает у text-embedding-3-small (1536 dim) далеко не всегда. MTEB benchmark измеряет на общем corpus'е — если ваш домен финансовый, медицинский или e-commerce, эти баллы вводят в заблуждение.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"В production мы увидели: 768-мерная модель, fine-tuned на domain-специфичных данных (например, sentence-transformers\u002Fall-mpnet-base-v2 с дообучением), дала recall@10 на 12% выше, чем generic 3072-мерная модель. Причина простая: embedding space не знает domain-терминологию. Семантическое расстояние между \"Conversion rate optimization\" и \"CRO\" в generic модели 0.68, в domain-tuned — 0.91.",{"type":32,"tag":33,"props":57,"children":58},{},[59],{"type":37,"value":60},"Трейдофф размера очевиден: 3072 dim — индекс 4.2GB, 768 dim — 1.1GB. Latency query: 47ms vs 18ms соответственно (FAISS HNSW, m=16). Если потеря recall составляет \u003C5%, меньшая модель выигрывает и по cost, и по скорости. Решать это нужно измерением, не догадками.",{"type":32,"tag":62,"props":63,"children":65},"h3",{"id":64},"fine-tuning-decision",[66],{"type":37,"value":67},"Fine-tuning decision",{"type":32,"tag":33,"props":69,"children":70},{},[71],{"type":37,"value":72},"Embedding fine-tuning обязателен в двух случаях: (1) очень специфичная domain vocabulary (медицинские термины, крипто-адреса), (2) асимметричное распределение пар query-document (короткие вопросы, длинные документы). OpenAI Embedding API fine-tuning не поддерживает — нужны sentence-transformers или Cohere embed-v3. Начните с 500-1000 labeled пар; больше дают marginal gains.",{"type":32,"tag":40,"props":74,"children":76},{"id":75},"chunking-не-размер-а-семантическая-целостность",[77],{"type":37,"value":78},"Chunking: не размер, а семантическая целостность",{"type":32,"tag":33,"props":80,"children":81},{},[82],{"type":37,"value":83},"\"Chunk size 512 tokens — это хорошо\" — это миф. Мы тестировали три подхода: (1) fixed 512 tokens, (2) по markdown headers (разрезать на H2\u002FH3 границах), (3) semantic chunking (LLM читает контекст параграфа, режет на семантических переходах). Результат: markdown-based дал 18% лучше NDCG@5, но index building 2.3x медленнее.",{"type":32,"tag":33,"props":85,"children":86},{},[87],{"type":37,"value":88},"Проблема fixed chunking — режет посредине предложения. \"Если интегрировать server-side tracking с first-party архитектурой...\" режется на токене 510, второй chunk начинается с \"...архитектурой attribution точность растёт\" — контекст потерян. Retriever найдёт chunk по запросу \"attribution\", но LLM не сможет сформировать ответ без контекста. Отсюда галлюцинация.",{"type":32,"tag":33,"props":90,"children":91},{},[92],{"type":37,"value":93},"Semantic chunking (не RecursiveCharacterTextSplitter из LangChain, а реальный \"переходит ли параграф на новую идею?\" с gpt-4o-mini) лучше, но дорого: chunking 10K страниц знаний стоит $47 (0.15$\u002F1M input tokens). Трейдофф: index building — one-time cost, качество retrieval — постоянная ценность. Мы выбрали semantic, но если ваша база динамичная (обновляется еженедельно), можете вернуться на fixed с учётом затрат.",{"type":32,"tag":95,"props":96,"children":97},"table",{},[98,132],{"type":32,"tag":99,"props":100,"children":101},"thead",{},[102],{"type":32,"tag":103,"props":104,"children":105},"tr",{},[106,112,117,122,127],{"type":32,"tag":107,"props":108,"children":109},"th",{},[110],{"type":37,"value":111},"Стратегия",{"type":32,"tag":107,"props":113,"children":114},{},[115],{"type":37,"value":116},"Avg Chunk Size",{"type":32,"tag":107,"props":118,"children":119},{},[120],{"type":37,"value":121},"NDCG@5",{"type":32,"tag":107,"props":123,"children":124},{},[125],{"type":37,"value":126},"Build Time (10K doc)",{"type":32,"tag":107,"props":128,"children":129},{},[130],{"type":37,"value":131},"Cost",{"type":32,"tag":133,"props":134,"children":135},"tbody",{},[136,165,192],{"type":32,"tag":103,"props":137,"children":138},{},[139,145,150,155,160],{"type":32,"tag":140,"props":141,"children":142},"td",{},[143],{"type":37,"value":144},"Fixed 512",{"type":32,"tag":140,"props":146,"children":147},{},[148],{"type":37,"value":149},"489 tokens",{"type":32,"tag":140,"props":151,"children":152},{},[153],{"type":37,"value":154},"0.71",{"type":32,"tag":140,"props":156,"children":157},{},[158],{"type":37,"value":159},"4 min",{"type":32,"tag":140,"props":161,"children":162},{},[163],{"type":37,"value":164},"$0",{"type":32,"tag":103,"props":166,"children":167},{},[168,173,178,183,188],{"type":32,"tag":140,"props":169,"children":170},{},[171],{"type":37,"value":172},"Markdown-based",{"type":32,"tag":140,"props":174,"children":175},{},[176],{"type":37,"value":177},"680 tokens",{"type":32,"tag":140,"props":179,"children":180},{},[181],{"type":37,"value":182},"0.84",{"type":32,"tag":140,"props":184,"children":185},{},[186],{"type":37,"value":187},"9 min",{"type":32,"tag":140,"props":189,"children":190},{},[191],{"type":37,"value":164},{"type":32,"tag":103,"props":193,"children":194},{},[195,200,205,210,215],{"type":32,"tag":140,"props":196,"children":197},{},[198],{"type":37,"value":199},"Semantic (LLM)",{"type":32,"tag":140,"props":201,"children":202},{},[203],{"type":37,"value":204},"520 tokens",{"type":32,"tag":140,"props":206,"children":207},{},[208],{"type":37,"value":209},"0.81",{"type":32,"tag":140,"props":211,"children":212},{},[213],{"type":37,"value":214},"22 min",{"type":32,"tag":140,"props":216,"children":217},{},[218],{"type":37,"value":219},"$47",{"type":32,"tag":40,"props":221,"children":223},{"id":222},"overlap-strategy",[224],{"type":37,"value":225},"Overlap Strategy",{"type":32,"tag":33,"props":227,"children":228},{},[229],{"type":37,"value":230},"Overlap между chunks повышает recall retrieval'а — но индекс раздувается на 1.4-1.8x. С 50-token overlap мы получили 6% прироста recall (recall@10: 0.78 → 0.83). Можно включать overlap условно: только для длинных документов (>2000 tokens), для коротких отключать.",{"type":32,"tag":40,"props":232,"children":234},{"id":233},"eval-setup-offline-metrics-online-ab",[235],{"type":37,"value":236},"Eval Setup: offline metrics → online A\u002FB",{"type":32,"tag":33,"props":238,"children":239},{},[240],{"type":37,"value":241},"До production нужна evaluation pipeline. \"LLM выглядит хорошо\" недостаточно — retrieval precision\u002Frecall и factuality LLM'а измеряются отдельно.",{"type":32,"tag":33,"props":243,"children":244},{},[245],{"type":37,"value":246},"Два уровня метрик:",{"type":32,"tag":248,"props":249,"children":250},"ol",{},[251,272],{"type":32,"tag":252,"props":253,"children":254},"li",{},[255,261,263,270],{"type":32,"tag":256,"props":257,"children":258},"strong",{},[259],{"type":37,"value":260},"Retrieval layer:",{"type":37,"value":262}," Precision@k, Recall@k, NDCG@k, MRR. Ground truth: вручную размеченные query-document пары (у нас 320 штук). Ragas library's ",{"type":32,"tag":264,"props":265,"children":267},"code",{"className":266},[],[268],{"type":37,"value":269},"context_precision",{"type":37,"value":271}," работает без LLM'а, удобна для быстрых итераций.",{"type":32,"tag":252,"props":273,"children":274},{},[275,280],{"type":32,"tag":256,"props":276,"children":277},{},[278],{"type":37,"value":279},"Generation layer:",{"type":37,"value":281}," Factual consistency (entailment между выводом и документом), hallucination rate (процент информации, выходящей за пределы документов), citation accuracy (насколько LLM правильно указывает источники). Используем LLM-as-judge pattern — просим gpt-4o \"этот ответ опирается на документы?\" Agreement с human eval: 0.89.",{"type":32,"tag":33,"props":283,"children":284},{},[285],{"type":37,"value":286},"Offline eval запускается раз в сутки (CI\u002FCD integrated). Новая chunking стратегия, новая embedding, новый reranker — всё это должно пройти эту сетку до commit. Online A\u002FB — другое: 10% трафика на новую версию RAG, смотрим user feedback + session metrics (task completion, query reformulation rate). Если offline NDCG вырос на 0.02, но online task completion не изменился, deploy пропускаем.",{"type":32,"tag":62,"props":288,"children":290},{"id":289},"надёжность-llm-as-judge",[291],{"type":37,"value":292},"Надёжность LLM-as-Judge",{"type":32,"tag":33,"props":294,"children":295},{},[296],{"type":37,"value":297},"Не доверяйте LLM-as-judge слепо. GPT-4o в 6% случаев неправильно отметил свои же галлюцинации (false positive), в 4% пропустил реальные (false negative). Решение: для critical use cases — human-in-the-loop. Случайные 5% samples проверяет человек, по этому subset вычисляем calibration score LLM'а. Если \u003C0.85, переписываем judge prompt.",{"type":32,"tag":40,"props":299,"children":301},{"id":300},"reranker-мощь-второго-прохода",[302],{"type":37,"value":303},"Reranker: мощь второго прохода",{"type":32,"tag":33,"props":305,"children":306},{},[307],{"type":37,"value":308},"Первый retrieval достаёт 20-50 chunks (recall-focused), reranker сужает до 3-5 (precision-focused). С Cohere rerank-v3 получили 14% прироста precision (P@5: 0.68 → 0.78). Cost: $2 за 1M reranked tokens (в 10 раз дороже embedding), но передаём в LLM context window не 50, а 5 chunks — снижается и cost LLM'а, и риск галлюцинации.",{"type":32,"tag":33,"props":310,"children":311},{},[312],{"type":37,"value":313},"Трейдофф reranker'а — latency: search 18ms, с rerank становится 95ms. Async pipeline это компенсирует — query идёт, background запускает retrieval+rerank, когда LLM начинает stream, всё готово, total 400-500ms. Синхронно делать опасно — UX упадёт.",{"type":32,"tag":33,"props":315,"children":316},{},[317],{"type":37,"value":318},"RAG без reranker'а рассчитывает \"top-k embedding результаты верны\". Работает при высоком лексическом overlap query-document. На semantic queries (\"как интегрировать first-party архитектуру с server-side измерениями?\") embedding в top-10 кладёт 4 irrelevant chunk'а. Reranker использует cross-attention query-document, эту noise чистит. Без него в production citation accuracy падает на 18%.",{"type":32,"tag":40,"props":320,"children":322},{"id":321},"hybrid-search-bm25-embedding",[323],{"type":37,"value":324},"Hybrid Search: BM25 + Embedding",{"type":32,"tag":33,"props":326,"children":327},{},[328],{"type":37,"value":329},"Embedding-only слаб в двух случаях: (1) точные совпадения (бренд, SKU), (2) редкие термины (мало видел в embedding space). BM25 (keyword-based) закрывает этот gap. На Weaviate или Qdrant: 0.7 embedding weight + 0.3 BM25. Recall@10: embedding-only 0.76, hybrid 0.83.",{"type":32,"tag":33,"props":331,"children":332},{},[333],{"type":37,"value":334},"BM25 индекс 5-8x компактнее embedding (inverted index). Latency не добавляет (параллель). Cost hybrid'а — query planning: какие веса на какие query types. A\u002FB testing даёт ответ. У нас обычные queries 0.8 embedding, с brand\u002Fproduct mentions 0.5 embedding.",{"type":32,"tag":40,"props":336,"children":338},{"id":337},"production-monitoring",[339],{"type":37,"value":340},"Production Monitoring",{"type":32,"tag":33,"props":342,"children":343},{},[344],{"type":37,"value":345},"60% RAG deployment'а — это monitoring. Система должна деградировать видимо, не молча. Метрики:",{"type":32,"tag":347,"props":348,"children":349},"ul",{},[350,360,370,380,390],{"type":32,"tag":252,"props":351,"children":352},{},[353,358],{"type":32,"tag":256,"props":354,"children":355},{},[356],{"type":37,"value":357},"Retrieval coverage:",{"type":37,"value":359}," % queries, для которых найдены документы (target >95%)",{"type":32,"tag":252,"props":361,"children":362},{},[363,368],{"type":32,"tag":256,"props":364,"children":365},{},[366],{"type":37,"value":367},"Avg context relevance:",{"type":37,"value":369}," % chunk'ов для LLM, реально relevant (target >0.8)",{"type":32,"tag":252,"props":371,"children":372},{},[373,378],{"type":32,"tag":256,"props":374,"children":375},{},[376],{"type":37,"value":377},"Hallucination rate:",{"type":37,"value":379}," % ответов с информацией вне документов (target \u003C5%)",{"type":32,"tag":252,"props":381,"children":382},{},[383,388],{"type":32,"tag":256,"props":384,"children":385},{},[386],{"type":37,"value":387},"Latency p95:",{"type":37,"value":389}," 95-й перцентиль time-to-response (target \u003C800ms)",{"type":32,"tag":252,"props":391,"children":392},{},[393,398],{"type":32,"tag":256,"props":394,"children":395},{},[396],{"type":37,"value":397},"Cost per query:",{"type":37,"value":399}," embedding + rerank + LLM (target \u003C$0.02)",{"type":32,"tag":33,"props":401,"children":402},{},[403],{"type":37,"value":404},"Push в Datadog, alert в Slack при превышении. Retrieval coverage 2 дня подряд \u003C92% — gap в knowledge base, content team в action. Hallucination растёт — LLM prompt или chunk size на ревью. Latency spike — проверяем sharding'е vector database.",{"type":32,"tag":33,"props":406,"children":407},{},[408,410,419],{"type":37,"value":409},"Связать RAG метрики с business outcome критично — когда retrieval качество растёт, user satisfaction survey тоже растёт? Или только техметрика шумит? Корреляционный анализ даёт ответ. По нашему ",{"type":32,"tag":411,"props":412,"children":416},"a",{"href":413,"rel":414},"https:\u002F\u002Fwww.roibase.com.tr\u002Fru\u002Fverianalizi",[415],"nofollow",[417],{"type":37,"value":418},"методологию аналитики",{"type":37,"value":420}," метрик.",{"type":32,"tag":40,"props":422,"children":424},{"id":423},"cost-vs-quality-balance",[425],{"type":37,"value":426},"Cost vs Quality Balance",{"type":32,"tag":33,"props":428,"children":429},{},[430],{"type":37,"value":431},"Monthly cost production RAG: 1M queries, ~3 chunks per query, gpt-4o-mini generation = ~$420 (embedding $80, rerank $40, LLM $300). Без reranker'а $380, но hallucination rate прыгает 5% → 11% — support tickets взлетают, indirect cost $600+.",{"type":32,"tag":33,"props":433,"children":434},{},[435],{"type":37,"value":436},"Правильная оптимизация: (1) cache layer (повторный query за 24h — из cache, 23% queries повторяются), (2) smaller domain-tuned embedding (768 dim), (3) async rerank (некритичные queries пропускаем rerank). Итог: $280, quality loss \u003C2%.",{"type":32,"tag":33,"props":438,"children":439},{},[440],{"type":37,"value":441},"Неправильно: keyword search вместо embedding, templates вместо LLM. Результат — \"AI\" система с recall 40%. Cost optimization не должна убивать retrieval quality.",{"type":32,"tag":443,"props":444,"children":445},"hr",{},[],{"type":32,"tag":33,"props":447,"children":448},{},[449],{"type":37,"value":450},"Production RAG — это не просто выбор модели. Это eval pipeline, monitoring discipline, постоянная итерация. Embedding можете сделать меньше и быстрее, но если recall упадёт, LLM начнёт галлюцинировать, пользователь потеряет доверие. Сначала retrieval quality на 0.85+ F1, потом оптимизируйте cost. Иначе у вас получится дешёвая машина галлюцинаций.",{"title":16,"searchDepth":452,"depth":452,"links":453},3,[454,458,459,460,463,464,465,466],{"id":42,"depth":455,"text":45,"children":456},2,[457],{"id":64,"depth":452,"text":67},{"id":75,"depth":455,"text":78},{"id":222,"depth":455,"text":225},{"id":233,"depth":455,"text":236,"children":461},[462],{"id":289,"depth":452,"text":292},{"id":300,"depth":455,"text":303},{"id":321,"depth":455,"text":324},{"id":337,"depth":455,"text":340},{"id":423,"depth":455,"text":426},"markdown","content:ru:ai:rag-production-retrieval-quality-first.md","content","ru\u002Fai\u002Frag-production-retrieval-quality-first.md","ru\u002Fai\u002Frag-production-retrieval-quality-first","md",1782079502615]