
这两年RAG已经从“能做个问答Demo”走到了“能不能扛住线上业务”的考验期。我接触过不少团队本地Jupyter跑得眉飞色舞一到生产就卡住检索出来的文档不相关、回答偶尔一本正经地胡说八道、换一次数据就要人工评估几十条回复。最近我系统性梳理了一个生产级Agentic RAG的完整落地路径它不只是一套代码而是一整套工程方法论如何设计Agent自主规划检索策略、如何区分向量库/知识图谱/结构化库的适用场景、如何建立评估体系、上线后如何监控和排查。这篇文章相当于这套方法论的核心章节提炼适合正在做知识库问答、企业信息检索、智能客服、报告生成并且已经不满足于“能跑”的开发和架构同学。1. Agentic RAG是什么跟传统RAG差在哪1.1 先搞明白传统RAG的边界检索写死在哪里问题就出在哪里传统RAG的流程大家都熟文档切块、embedding入库、用户问题也转成向量、取top_k、拼prompt、让大模型生成。优点是非常简单工程上很容易落地但问题恰恰藏在“简单”里——它把“检索什么”这一步写死成了“永远找语义最接近的几段文字”。你问什么都一样先把问题向量化然后去向量库里捞捞回来就拼给模型模型只能用这些材料作答。这个流程对“这个政策文件里关于报销的规定是什么”之类的问题足够用但一碰到需要判断、组合、换路线的复杂问题立刻捉襟见肘。举个例子用户问“我们Q3营收比Q2增长了多少”。传统RAG会去抓一段看起来跟“营收”相关的文字但它不会想到先去查结构化财务表也不会意识到这个问题需要一次数值计算。更麻烦的是如果top_k里没有正确答案它不会重试而是硬着头皮编一个。很多人遇到的“RAG瓶颈”根源就在这里检索策略单一、没有反馈回路、错了也不会回头。你换更大的模型、更好的embedding都治标不治本因为决策逻辑没有变。1.2 Agentic RAG的核心能力把检索策略的选择权交给LLMAgentic RAG的关键改变是让大模型自己决定“怎么查”。它先分析问题类型把它路由到不同工具上——可能是向量检索、SQL查询、知识图谱查询或者外部API拿到结果后还会做一次验证如果发现答案没找到它会换个关键词重新检索或者改走其他工具。你可以把它理解成一个老练的助理而不是一个只会伸手拿书的人。助理会先判断这是个什么问题该查档案室还是查财务系统查完之后还会看一眼资料够不够用不够就换一种查法。工程上做这件事需要三块东西。第一块是工具注册表Tool Registry把每个检索能力包装成带名字、带描述的APILLM才知道什么场景该调用哪个。第二块是状态管理用一个状态机或者图来约束Agent的步骤避免它在工具调用之间无限循环。第三块是决策策略什么时候停、什么时候换路、什么时候把问题转给人工这些边界不写死Agent就会变得不可控。LangGraph、LlamaIndex的Agent模块、甚至自研状态机都能做框架本身不重要重要的是状态和边界设计。1.3 为什么这套能力值得当成一门课来系统学最近搜“rag教程”“rag框架”的人很多但真正卡住大家的已经不是怎么调库而是怎么让一套RAG系统稳定地跑在线上。Agentic RAG尤其要注意——它多出来的每一层智能都会带来多一次的故障可能。把production和agentic放在一起就意味着你不能再用demo思维写代码。输入要有防护输出要有校验每一步都要可观测、可回滚。这是一套之前做普通CRUD或传统RAG时很少涉及的工程能力所以它值得被当成一门课来对待而不是“装个包跑通就完事”。下文我会按生产落地的真实顺序把检索、知识库选型、评估、部署各环节的关键决策拆开讲。2. 生产化才是真难点demo能跑线上为什么卡住2.1 检索质量一到生产就失灵三个典型原因和排查路径很多人到了production阶段遇到的第一个问题本地测试时检索结果好好的上生产后同样的问法召回的内容变成了垃圾。原因通常有三类。第一是数据变了——生产库里的文档数量级、语言分布、格式多样性和本地那几百个测试文件完全不是一个量级。第二是切分参数没调很多教程默认chunk_size500、overlap50但生产文档里如果表格多、代码多、中英混排多这个默认值很可能把关键信息从中间切断。第三是embedding模型和领域不匹配通用模型在专业术语密集的场景下召回效果会肉眼可见地变差。排查思路也别急着怀疑模型先把一次query的检索结果赤裸裸地打出来。看top_k里到底有没有相关内容如果没有那是上游检索问题跟生成模型无关如果有但回答错了才是下游生成问题。这一步分层能把排查时间缩短一半。另外我建议在本地起一个和生产一致的检索函数单独做召回测试不要让Agent流程混进来干扰判断。2.2 没有评估体系优化就是赌运气RAGAS与Golden Set生产化最容易被跳过的环节是评估。demo阶段你看三五个回复觉得“还行”但线上成百上千的query你根本不知道哪些在退化哪些在变好。RAG圈现在提到评估基本都会拿RAGAS那套指标说事faithfulness忠实度回答有没有被检索内容支撑、answer relevance答案相关性回答有没有直接回应问题、context relevance上下文相关性检索出来的上下文是否够用。指标是工具但更关键的是先攒一个Golden Set——50到100条覆盖核心业务场景的“问题-参考答案-应引用文档”。这个数据集看起来费时间实际上是你后续所有迭代的锚点。我见过太多团队花三周优化检索算法结果因为评估集没建根本看不出优化是正向还是负向。先花一周把评估集和评测脚本跑起来再谈优化这是production项目最值得的一笔投资。没有评估体系的Agentic RAG就是在黑箱里调参靠感觉上线迟早出事故。2.3 成本、延迟和数据更新Agent多出来的每一轮调用都要付钱Agentic RAG的token消耗是传统RAG的2到5倍这是很多人没提前算的一笔账。一次查询可能触发多轮工具调用每轮都是一次大模型请求。生产里必须做三件事一是设定迭代上限例如最多调用4次工具超过就降级到简单模式二是模型分级规划用小规格模型做路由和意图识别只有最终生成才调用大模型三是对检索结果做缓存相同或相似问题的embedding和检索结果缓存起来能拦掉大量重复计算。延迟也一样不得不在效果和体验之间取舍。比如top_k取20再加rerank到5效果比直接top_k取5好但延迟多200ms这个trade-off要在评估阶段定下来而不是上线后被用户吐槽了才来调。还有一个经常被忽略的问题——数据更新。生产知识库不可能永远不变新增文档、过期文档、删除文档各自要有更新策略。文档更新后索引要重建否则Agent检索到的还是旧版本答案最容易出事故。3. 知识库形态怎么选向量库、知识图谱和结构化库是不同工具3.1 向量库、知识图谱、结构化库的核心区别与应用场景这个主题最近讨论很多因为RAG做深了你会发现“向量库包打天下”是不成立的。三种形态实际上是三类工具适用场景完全不同。形态底层数据组织擅长的问题典型应用向量知识库文本块 embedding语义模糊检索、相似内容召回政策文档问答、客服FAQ、会议纪要搜索结构化知识库数据库表、数据仓库精确过滤、聚合统计、多条件查询财务数据查询、用户画像筛选、经营报表知识图谱KG实体-关系-属性多跳关系推理、路径分析组织关系、风险链路、产品关联分析很多人问“rag知识库和结构知识库区分以及应用场景”本质上是没分清意图类型。政策问答、语义搜索这类问题向量库最合适因为它不需要你提前定义数据模型但“上个月华东区卖了多少台A型号”这种问题向量库给不了精确数字必须走结构化数据。知识图谱则解决另一类问题“哪些供应商同时给A和B供货”“这个变更会影响哪些下游系统”这类关系型问题用向量检索只能得到零散文档用KG能直接沿关系边跳出来。3.2 什么场景值得上知识图谱和本体关系推理与路径约束上不上KG判断标准很实际你的问题里有没有“关系”。如果用户会问“这个流程涉及哪些系统、对应负责人是谁”向量检索大概率只能给你一些不相关的材料而KG可以直接给出关系路径。另一个判断点是是否需要约束推理路径。比如金融风控场景必须走“客户-产品-风险等级”这样的既定链路这时候在KG上套一层本体Ontology就很有价值。本体定义了概念与关系的schemaLLM先生成结构化查询再执行而不是自由发挥这能显著降低幻觉也是现在ontology rag被反复提起的原因。但我也劝一句如果业务问题全是纯文本问答没有复杂关系和多跳先别急着建KG。图谱的构建和维护成本远比向量库高数据没有清晰实体关系时建出来也是一个没人维护的死图。生产里我见过太多团队跟风建图谱最后因为实体对齐做不好查询结果还不如纯向量检索白费三个月时间。3.3 生产环境的混合检索架构让Agent自己决定查哪条路真正上生产大多数知识库系统是混着用的。主检索仍然是向量库因为覆盖度最高、成本最低同时把关键实体的关系抽到KG里做实体链接和关系查询结构化数据继续留在库里通过text-to-SQL工具暴露给Agent。谁来决定走哪条路Agent本身。它先做路由判断再决定调用哪个工具多轮检索时还可以把结果做交叉核对比如SQL查到数据后回到文档库取一段上下文做支撑说明。这套架构对中小团队并不友好所以我建议从简到繁第一版只上向量库结构化库跑通评估后再加KG。大多数项目的检索瓶颈在召回质量而不在关系推理先把常规路径做好再谈高级能力。混合架构不是炫技是问题本身复杂到单一路径解决不了时才需要的方案。4. 从本机原型到生产部署的实操路线4.1 Mac本机快速搭建RAG知识库OllamaChroma的十分钟方案很多人在搜“怎么在mac上搭建rag知识库”我直接给一条可行的本机路线。前提是你有一台Apple Silicon的Mac建议内存16GB以上。第一步安装Ollama一条命令brew install ollama然后拉取模型ollama pull qwen2.5:14b负责生成和ollama pull bge-m3负责embedding。bge-m3在中文场景下表现比较均衡Alibaba的嵌入模型也可以替换关键是跟你的文档语料语言匹配。向量库本机先用Chroma或FAISSChroma更省事数据落盘在本地目录。用LlamaIndex或者LangChain把流程串起来我用LlamaIndex写一个最小可运行示例from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.embeddings.ollama import OllamaEmbedding from llama_index.llms.ollama import Ollama from llama_index.core.settings import Settings Settings.embed_model OllamaEmbedding( model_namebge-m3, base_urlhttp://localhost:11434 ) Settings.llm Ollama( modelqwen2.5:14b, temperature0.1 ) documents SimpleDirectoryReader(./data).load_data() index VectorStoreIndex.from_documents( documents, chunk_size512, chunk_overlap64 ) query_engine index.as_query_engine(similarity_top_k6) response query_engine.query(你准备好的测试问题) print(response)这个示例只有十几行但它把你的本机RAG跑起来了。chunk_size512和overlap64是我踩过比较多轮的起点适合中文文档如果文档结构性强比如大量表格和清单建议降到256。跑起来之后别急着换框架先看检索效果再往Agent方向扩展。注意Apple Silicon上Ollama默认占内存不小跑14B模型同时开浏览器和IDE可能会卡建议把模型量化版本换成qwen2.5:14b-instruct-q4_K_M体感会好很多。4.2 Agentic流程的工程拆分把智能拆成四个可维护状态把RAG升级成Agentic不用一步到位我习惯拆成四个可控组件。一是路由Router先判断问题意图是事实问答、关系查询、数值统计还是闲聊。路由可以用小模型加few-shot提示来做不需要大模型。二是检索Retriever按路由结果调用不同工具每个工具必须有清晰的名字和描述LLM才知道什么时候该用。三是验证Validator拿到检索结果后让模型判断“这些上下文是否足以回答问题”不足则触发二次检索或改写query最多循环N次。四是回答Responder用最终上下文生成答案带引用还可以做一次自检。伪代码把调度逻辑写出来def agentic_answer(question: str, tools: dict) - str: intent route(question) # 1 路由 max_iterations 3 for _ in range(max_iterations): context tools[intent].retrieve(question) # 2 检索 if len(context) 0: question rewrite_query(question) # 重写query后继续 continue verified validate(question, context) # 3 验证 if verified[sufficient]: break return answer(question, context) # 4 回答这套拆法的好处在于每个环节都能单独打日志、单独评估出问题时能定位到具体节点而不是在一条深不可测的Agent链时排查。实际项目里Agentic最容易犯的毛病是死循环——工具调用失败后反复重试。max_iterations一定要设限超限后走fallback路径比如直接返回几条相关文档链接或者转人工。4.3 生产级评估能力先攒一套回归集再谈上线上线前最重要的一件事是把评估跑成自动化流程。我建议建一个Golden Set每条包含三样东西问题、期望答案要点、应当覆盖的引用文档。数量不用多50到100条但要覆盖生产真实query的分布。跑评测时自动记录三个维度忠实度看回答里的关键论点是否都能在引用里找到答案相关性看回答对问题的命中程度引用命中率看系统引用的文档和Golden Set标注的参考文档重叠度。评估分两套跑。离线回归每次改动索引、提示词、切分参数后批量跑一遍Golden Set对比分数变化在线抽查线上流量按一定比例采样人工标注回答质量。没有这两套机制任何“效果优化”都是在赌运气。有人会觉得100条太少实际上100条精心设计的集子已经能拦住80%的明显回归关键是问题要覆盖不同意图类型别只挑简单的。5. 生产环境的常见问题与排查经验5.1 检索为空、答非所问、幻觉三类问题的排查顺序上线之后一定会有反馈归纳起来三类检索为空、答非所问、幻觉。我按优先级给你一个排查顺序。检索为空先看检索引擎的原始输出top_k是不是真没召回。如果没召回多半是query的表达方式和文档的语言风格差太远试试改写query、加同义词、上混合检索向量BM25如果召回了一堆但都不相关检查chunk_size和embedding模型考虑换领域模型或加rerank。答非所问多半是prompt和温度设置问题。生成温度降到0.1左右system prompt里明确写“如果上下文不足直接说不知道”。另外Agent路由错了也常见——问统计问题却跑了文档检索问语义问题却走了SQL这种要去路由模块的日志里看意图判断结果。幻觉第一防线是强制引用要求回答必须标注来源只允许基于引用内容下结论第二防线是前面说的Validator检索内容不足时不生成第三防线才是换更好的模型。一个容易被忽略的坑多个来源互相矛盾。比如文档A说流程是三步文档B说四步模型会择优或者拼凑。这种需要在路由阶段识别冲突性问题把两边的信息都检索出来让答案在最后注明“不同文档存在差异需人工确认”。5.2 知识库能不能存图片多模态资料的正确入库姿势很多人搜“rag知识库能存储图片嘛”直接回答能但你要分清存的是什么。向量库本身不存图片原文件它存的是图片输入到多模态模型比如CLIP、SigLIP生成的向量以及图片的元数据。原文件放对象存储比如S3、OSS或者MinIO向量库里存embedding和对象地址。检索时先向量召回再按地址从对象存储拉原图展示。实际项目里图片类资料常见几种形态产品图、扫描文档、幻灯片截图、PDF里的图表。处理方式也不同产品图可以用图文混合索引问“红色款有没有现货”时既检索产品描述文本也检索图片向量扫描件和PDF里的图表则先OCR转成文本再入库效果通常比直接向量化图片更好、更省钱。我的建议是能不上多模态就不上多模态RAG的成本和延迟都会增加但如果业务确实需要就按“向量对象存储元数据”三条腿来搭别想着把所有图片二进制塞进向量库。5.3 可观测性设计上线后如何定位是哪个环节坏了Agentic RAG上线后你不可能像调试单体应用那样直接打断点必须提前把可观测性设计进去。我推荐用OpenTelemetry做链路追踪每个环节路由、检索、验证、生成都打一个span记录耗时和输入输出摘要。如果一个query变慢追踪里能直接看到卡在哪一轮检索如果回答质量下滑能回看是哪一步把错误上下文带了进来。工具上LangSmith和Langfuse这类平台可以直接跟LangChain/LlamaIndex集成。不上这些平台也得有结构化日志至少把每一次tool call的query、检索结果数量和token消耗记录下来。没有日志的Agent系统故障排查会是一场灾难——你根本不知道Agent在内部做了多少次“思考”也不知道是哪次思考带偏了方向。可观测性是生产化和demo最明显的分界线demo里你人可以盯着看生产里机器必须替你盯着。最后说点个人体会。我做知识库项目这几年最大的感受是成功上线Agentic RAG的关键不在Agent的“智能”有多惊艳而在能不能把不确定性管理好。先用最小的可运行版本跑通把评估集建起来把日志铺齐再慢慢加自主决策能力。每一步都要问自己这一层智能会不会让系统更不可控如果会就先想想兜底方案。希望这篇拆解能帮你在production这条路上少踩一些坑——毕竟“能跑”和“能上线”之间隔着的不是模型能力而是工程修养。