RAG 答不准怎么办?先做一个检索诊断器

RAG 答不准怎么办?先做一个检索诊断器 这期开始是和之前入门版教程做了区分本期往后主要是偏实战类教程如果还没入门的可以看前面几期做 RAG 的时候我最怕听到一句反馈这个答案不对。这句话很正常但它没法直接定位问题。文档可能没进来切块可能切坏了Retriever 可能没召回也可能是模型拿到了正确上下文但回答跑偏。所以我一般不会第一步就改 Prompt。Prompt 当然要调但在调之前我会先把这次检索到底拿回了什么打印出来。这一篇就围绕这个动作做一个小工具检索诊断器。它不追求最终回答多漂亮只解决一个问题让我看到一次查询从问题到候选 Node 的过程。先跑起来看它到底打印什么这篇配套了四个脚本code/07_advanced_retrieval/01_topk_baseline.py code/07_advanced_retrieval/02_metadata_filter.py code/07_advanced_retrieval/03_query_fusion.py code/07_advanced_retrieval/04_keyword_rerank.py可以在llamaindex目录下运行cd llamaindex python code/07_advanced_retrieval/01_topk_baseline.py python code/07_advanced_retrieval/02_metadata_filter.py python code/07_advanced_retrieval/03_query_fusion.py python code/07_advanced_retrieval/04_keyword_rerank.py这几个脚本会用到向量化和模型配置需要先准备好.env。如果你只想先看代码思路可以先从第 2 个脚本看起它的数据更小边界也更清楚。本篇主要用到这些导入from llama_index.core import SimpleDirectoryReader, VectorStoreIndex from llama_index.core.retrievers import QueryFusionRetriever from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters这里先不用急着记 API。下面会按排查顺序把它们放回代码里看。第一件事只看召回不生成回答01_topk_baseline.py做的事情很克制建一个索引然后只调用 Retriever。核心代码是这样def build_diagnostic_index() - VectorStoreIndex: documents SimpleDirectoryReader(str(ADVANCED_DATA_DIR)).load_data() return VectorStoreIndex.from_documents(documents) def inspect_retrieval(index: VectorStoreIndex, question: str, top_k: int) - None: retriever index.as_retriever(similarity_top_ktop_k) nodes retriever.retrieve(question) print_nodes(nodes)SimpleDirectoryReader负责把目录里的示例文档读成Document。VectorStoreIndex.from_documents()会基于这些文档构建一个向量索引。这里是内存索引适合教程不代表生产就应该这么放。index.as_retriever()是这一篇最关键的入口。它把 Index 转成 Retriever。retrieve()只做召回不做回答生成。我特意没有写query_engine index.as_query_engine() response query_engine.query(question)因为那样很快就会把检索和生成混在一起。现在我只想知道模型回答之前到底看到了哪些材料。运行以后我会看三件事top_k1时关键 Node 有没有回来。top_k3时正确 Node 排在第几位。top_k5时无关内容是不是明显变多。top_k不是越大越好。它变大以后正确资料可能回来了噪声也可能一起进来。很多线上 RAG 问题就是在“漏召回”和“召回太杂”之间来回摆。权限和版本不要交给 Prompt第二个脚本是02_metadata_filter.py。真实知识库里文档经常不是一类公开文档、内部复盘、不同租户、不同部门、不同版本都可能在同一个系统里。这类边界要尽量在检索阶段处理而不是让模型看完以后再“自觉一点”。代码里先构造了几段带 metadata 的文档Document( textE-401 对外只需要解释为权限不足请联系管理员确认账号分组。, metadata{team: support, visibility: public}, )然后加过滤条件def build_public_filter() - MetadataFilters: return MetadataFilters(filters[ExactMatchFilter(keyvisibility, valuepublic)]) filtered_retriever index.as_retriever( similarity_top_k3, filtersbuild_public_filter(), )MetadataFilters是一组过滤条件。ExactMatchFilter表示某个 metadata 字段必须精确等于指定值。这里的意思很直接只允许visibilitypublic的内容进入候选结果。脚本会先打印不过滤的结果再打印过滤后的结果。你要看的不是答案而是内部文档有没有被挡住。这个习惯很重要。权限、租户、版本这些东西如果已经进入了 LLM 上下文再靠 Prompt 兜底就晚了。问法不稳定时再看 Query Fusion有些问题不是top_k的问题而是问法太容易漂。比如故障码、模块名、内部缩写、产品编号。它们不一定和文档正文在语义上很像但它们有明确事实关系。这时可以看03_query_fusion.pybase_retriever index.as_retriever(similarity_top_k3) fusion_retriever QueryFusionRetriever( retrievers[base_retriever], llmSettings.llm, similarity_top_k3, num_queries3, use_asyncFalse, verboseTrue, )QueryFusionRetriever会基于原始问题生成多个查询版本再合并结果。retrievers里放的是底层 Retriever。示例里只有一个向量 Retriever真实项目里也可以组合关键词检索、向量检索、外部搜索。num_queries控制生成多少个查询版本。llm会参与问题改写所以它不是免费的能力。调用成本、耗时、稳定性都要算进去。我通常在这类场景里测试 Query Fusion用户问法差异大但背后问的是同一批事实。如果只是普通 FAQ先别急着上这层基础检索做稳更重要。rerank 不是补救漏召回第四个脚本是04_keyword_rerank.py。这里用关键词分数做了一个很小的 rerankdef rerank_by_keywords(nodes, keywords: list[str]): return sorted( nodes, keylambda item: keyword_score(item.node.get_content(), keywords), reverseTrue, )这个例子不是建议你生产里手写排序模型而是为了看清 rerank 的位置。它发生在 Retriever 之后Retriever - candidates - rerank - answer如果正确 Node 根本没被召回rerank 没法凭空变出来。如果正确 Node 已经在候选里只是排在第三、第四位rerank 才有意义。这也是我排查 RAG 时很在意的一点先分清楚是“没召回”还是“召回了但排得不好”。这两个问题的处理方式不一样。这套东西放到项目里怎么用我会把检索诊断器放在项目早期。每次改 chunk、metadata、top_k、fusion、rerank都拿固定问题集跑一遍。不要只看最终回答要看命中的 Node、score、metadata 和排序变化。上线以后也建议把这些信息写进日志question retrieved node ids score metadata filters rerank order等用户反馈“答案不对”时你至少能知道问题从哪一层开始查。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】