尧图精选

Agent知识库实战:从文档切分到RAG检索的完整落地指南

🕒 发布时间:2026/10/1 5:05:24 📁 来源:尧图网络
1. 为什么你的 Agent 需要一个真正的知识库做 Agent 开发的人十有八九都经历过这个阶段一开始觉得模型能力挺强什么都往里塞结果一到实际业务场景就露馅。用户问一个公司内部的产品参数模型开始一本正经地胡说八道问一个上周刚更新的政策条款它给你编出一个看起来很像但完全错误的答案。这不是模型不行而是你根本没给它“查资料”的能力。我早期做智能体项目时也踩过这个坑。当时接了一个企业内部的客服助手需求客户给了我将近 200 份 PDF 文档包括产品手册、售后政策、常见问题汇总。我第一反应是把这些内容全部拼接成一个大文本塞进系统提示词里。结果呢上下文窗口直接爆掉就算用支持长上下文的模型推理成本高得离谱而且模型在超长文本里的注意力衰减非常明显经常漏掉关键信息。更致命的是文档一更新整个提示词就得重新构建维护成本几乎不可接受。这就是知识库要解决的核心问题。知识库的本质是把“模型不知道但业务需要”的信息以一种可以被高效检索的方式存起来在用户提问时精准地把相关片段喂给模型。它不改变模型本身的参数而是在推理阶段动态补充上下文这就是 RAG检索增强生成的基本思路。但很多人对知识库的理解停留在“把文档切碎、向量化、存进数据库”这个层面觉得只要搭好这套流水线就万事大吉。实际做下来你会发现真正决定知识库好不好用的根本不是用了哪个向量数据库而是文档怎么切、检索怎么排、召回的内容怎么组织。这三个环节任何一个出问题最终呈现给用户的答案都会大打折扣。这篇文章我会从实际项目经验出发把知识库从设计到落地的完整链路拆开讲。不管你是用 Dify 这类低代码平台搭知识库流水线还是自己写代码从零构建 Agent 的知识检索模块这里面的核心逻辑和踩坑经验都是通用的。适合已经上手过基础 Agent 开发、准备把智能体推向真实业务场景的开发者也适合正在评估知识库方案的技术负责人。2. 知识库的整体设计与方案选型2.1 先搞清楚你的知识库要服务什么场景在动手写代码或者配置平台之前有一个问题必须先回答清楚你的知识库是给谁用的在什么场景下用。这个问题听起来很虚但它直接决定了后面所有的技术选型。我见过太多人一上来就研究“用哪个 embedding 模型效果最好”“Milvus 和 Qdrant 哪个性能更强”结果搭出来的东西根本不符合业务需求。举个例子如果你做的是一个内部技术文档助手用户是研发同事他们提问的方式通常是“XX 接口的超时配置在哪里改”“这个报错码是什么意思”这类问题的特点是术语精确、意图明确、答案通常集中在某个文档的某个段落。这种情况下你的切分策略应该偏向细粒度检索时关键词匹配的权重要调高。但如果你做的是一个面向客户的售前咨询 Agent用户可能会问“你们这个方案和市面上其他家比有什么优势”“我们这种规模的企业适合用哪个版本”这类问题意图模糊、需要综合多份文档的信息、答案往往需要归纳总结。这时候切分粒度要适当放大检索时语义相似度的权重更重要甚至需要考虑多路召回再重排。所以我的建议是在选型之前先做一件事收集 50 到 100 条真实用户可能会问的问题手动标注每个问题的答案应该来自哪些文档的哪些段落。这个工作看起来笨但它能帮你建立起对业务场景的直观认知后面做切分和检索调优时这就是你的黄金测试集。2.2 知识库的技术架构拆解一个完整的 Agent 知识库从文档到最终答案大致会经过这几个环节文档接入层负责把各种格式的原始资料PDF、Word、Markdown、网页、数据库记录统一转换成纯文本。这一步的坑在于格式解析尤其是 PDF 里的表格、多栏排版、扫描件 OCR处理不好后面全白搭。切分层决定文本怎么被拆成小块。这是整个链路里最容易被低估的环节。切得太碎语义不完整检索出来的片段缺少上下文切得太大噪声多检索精度下降而且浪费上下文窗口。向量化层把文本块转成向量。选 embedding 模型时不能只看榜单分数要考虑你的业务语言中文、英文、中英混合、领域术语通用模型对专业术语的表示可能很差、以及成本API 调用还是本地部署。存储与索引层负责向量的存储和相似度检索。向量数据库的选择要考虑数据量级、查询并发、过滤条件比如按文档类型、时间范围过滤、以及运维成本。检索层是用户提问时实际执行的部分。这里涉及查询改写、多路召回、重排序等策略。很多知识库效果不好问题就出在这一层太简单只做了一次向量相似度搜索就完事了。生成层把检索到的内容组织成提示词交给模型生成最终答案。这里的关键是怎么把检索结果排列好、怎么告诉模型哪些内容可信、怎么处理检索不到的情况。下面这张表对比了几种常见的知识库搭建方案方便你根据团队情况做选择方案类型代表工具优势劣势适用场景低代码平台Dify、Coze上手快可视化配置内置流水线定制能力有限复杂逻辑难实现快速验证、中小规模知识库框架集成LangChain、LlamaIndex灵活度高组件丰富社区活跃抽象层多调试困难版本变动大有一定开发能力的团队自建全链路自己写完全可控性能可优化工作量大需要维护全套组件大规模、高并发、特殊需求开源知识库系统各类 Wiki 系统开箱即用协作功能完善AI 检索能力通常较弱以人工查阅为主、AI 为辅我的实际经验是先用低代码平台跑通流程、验证效果确认知识库确实能解决业务问题之后再考虑是否需要自建。很多项目死在“过度工程化”上还没验证需求就花两个月搭了一套自建系统结果发现业务方根本不用。2.3 关于 MCP 在知识库中的角色最近 MCPModel Context Protocol这个概念很热很多人问知识库要不要上 MCP。我的看法是MCP 解决的是“Agent 怎么标准化地调用外部工具和数据源”的问题它和知识库是互补关系不是替代关系。传统做法是把知识库检索封装成一个函数在 Agent 的提示词里告诉模型“你可以调用 search_knowledge_base 这个工具”。MCP 做的事情是把这种工具调用标准化让不同的 Agent 框架都能用同样的方式接入同样的数据源。如果你只是做一个单一 Agent 配一个知识库用不用 MCP 差别不大。但如果你有多个 Agent、多个数据源知识库、数据库、APIMCP 的价值就体现出来了——你不需要为每个 Agent 单独写一套接入代码而是把数据源统一封装成 MCP Server任何支持 MCP 的 Agent 都能直接调用。不过要注意MCP 目前还在快速演进阶段协议细节和生态工具都在变。生产环境使用前一定要做好版本锁定和兼容性测试别把核心链路绑死在一个还在变的标准上。3. 核心细节解析与实操要点3.1 文档切分知识库效果的第一道分水岭文档切分这件事看起来简单实际上决定了知识库效果的上限。我见过太多项目embedding 模型换了三四个向量数据库调了各种参数效果就是上不去最后发现问题出在切分上——文档被切得七零八落检索出来的片段根本读不通。先说一个基本原则切分的单位应该是“语义完整的片段”而不是“固定长度的字符串”。很多人图省事直接按 500 个字符一刀切结果一个完整的操作步骤被切成两半用户问“第三步怎么做”检索到的片段只有前半步模型只能瞎编。实际操作中我会根据文档类型采用不同的切分策略对于结构化文档产品手册、API 文档、政策条款优先按标题层级切分。一级标题下的内容作为一个大块如果超过阈值再按二级标题切以此类推。这样每个片段都自带层级信息检索出来之后你能知道它属于哪个章节模型也能更好地理解上下文。对于非结构化文档会议纪要、聊天记录、自由文本按段落切分同时设置一个最大长度限制。如果单个段落超过限制再按句子边界切分。这里的关键是保留重叠区域一般设置 10% 到 20% 的重叠防止关键信息刚好落在切割边界上。对于表格和列表尽量不要拆散。一个表格如果被切成两半检索出来毫无意义。我的做法是把表格转成 Markdown 格式作为一个整体存储如果实在太大按行分组但保留表头。下面是一个切分参数的参考配置你可以根据自己的文档特点调整文档类型切分单位块大小字符重叠大小特殊处理产品手册二级标题800-1200100保留标题层级路径API 文档单个接口500-80050保留接口名和参数表政策条款单条条款300-60050保留条款编号会议纪要单个议题600-1000100保留参会人和时间自由文本段落500-80080按句子边界对齐还有一个容易被忽略的点切分时要保留元数据。每个文本块除了内容本身还应该带上来源文档名、章节路径、更新时间、文档类型等信息。这些元数据在检索时可以用来做过滤在生成时可以用来给模型提供引用来源。3.2 向量化选模型不能只看榜单Embedding 模型的选择直接决定了语义检索的质量。但我要泼一盆冷水榜单分数高不代表适合你的业务。我做过一个实验用同一个知识库分别用三个不同的 embedding 模型做检索测试集是 100 条真实用户问题。结果发现某个在通用榜单上排名第一的模型在我的业务场景下召回率反而最低。原因很简单我的文档里有大量专业术语和内部缩写通用模型在训练时没见过这些词把它们都映射到了相近的向量空间导致检索时区分不开。所以选 embedding 模型时我建议按这个顺序来第一步确认语言支持。如果你的文档是中文为主就不要选那些主要针对英文优化的模型。有些模型号称支持多语言但中文效果明显差一截。第二步用你的真实数据做小规模测试。准备 50 到 100 个问题-答案对分别用候选模型做检索看召回率和准确率。这个测试花不了多少时间但能帮你避开大坑。第三步考虑成本和延迟。API 调用的模型效果好但按量收费数据量大的时候成本可观本地部署的模型一次性投入但需要 GPU 资源。如果你的知识库更新频繁还要考虑重新向量化的成本。第四步关注维度选择。高维向量检索精度高但存储和计算成本大低维向量反之。一般 768 维或 1024 维是比较平衡的选择除非你的数据量特别大或者精度要求特别高。还有一个实操技巧对于中英混合的文档可以考虑用两个模型分别处理中文和英文部分或者选择一个在中英双语上都表现均衡的模型。我试过用纯中文模型处理英文技术文档效果惨不忍睹。3.3 检索策略别只做一次向量搜索很多知识库效果不好的根本原因是检索层太简单——用户问题转成向量在数据库里找最相似的 top-k 个片段直接扔给模型。这种做法在简单场景下能用但稍微复杂一点的问题就歇菜了。我现在的标准做法是多路召回加重排序第一路向量检索。把用户问题向量化找语义最相似的片段。这一路擅长处理“意思相近但用词不同”的情况。第二路关键词检索。用 BM25 或者类似算法做全文检索找包含关键术语的片段。这一路擅长处理“用户问了一个具体术语必须精确匹配”的情况。第三路元数据过滤。如果用户问题里提到了时间范围、文档类型、产品版本先用元数据过滤缩小范围再做检索。三路召回的结果合并之后用一个重排序模型Reranker做精排。重排序模型会同时看用户问题和候选片段给出一个更准确的相关性分数。这一步能显著提升最终喂给模型的内容质量。下面是一个检索流程的配置示例# 伪代码示意展示多路召回加重排的流程 def retrieve_knowledge(query, top_k5): # 第一路向量检索 query_vector embed(query) vector_results vector_db.search(query_vector, top_k20) # 第二路关键词检索 keyword_results bm25_index.search(query, top_k20) # 第三路元数据过滤如果查询中包含过滤条件 filters extract_filters(query) if filters: vector_results apply_filters(vector_results, filters) keyword_results apply_filters(keyword_results, filters) # 合并去重 merged merge_and_deduplicate(vector_results, keyword_results) # 重排序 reranked reranker.rank(query, merged) # 返回 top_k return reranked[:top_k]重排序模型的选择也有讲究。有些重排序模型只支持英文有些对中文优化不够。我实测下来对于中文知识库选择一个在中文语义匹配任务上表现好的重排序模型比换一个更强的 embedding 模型带来的提升更明显。3.4 提示词组织怎么把检索结果喂给模型检索到相关片段之后怎么把它们组织成提示词也是一门学问。我见过有人直接把检索结果拼接起来扔给模型结果模型被无关信息干扰答案质量反而下降。我的做法是结构化组织检索结果每个片段带上来源信息和相关性分数让模型知道哪些内容更可信你是一个基于知识库回答问题的助手。请根据以下参考资料回答用户问题。 参考资料 [来源产品手册 v2.3第 4 章相关性高] 这里放检索到的内容 [来源售后政策第 2 节相关性中] 这里放检索到的内容 回答要求 1. 只根据参考资料中的信息回答不要编造 2. 如果参考资料中没有相关信息明确告诉用户你不知道 3. 回答时引用来源方便用户核实这里有几个关键点明确告诉模型“只根据参考资料回答”能大幅降低幻觉标注相关性分数让模型知道哪些内容更可信要求引用来源方便用户核实也方便你排查问题。还有一个细节检索结果的数量不是越多越好。我一般控制在 3 到 5 个片段太多会稀释关键信息而且浪费上下文窗口。如果检索结果的相关性分数普遍偏低宁可告诉用户“没找到相关信息”也不要硬塞给模型让它编。4. 实操过程与核心环节实现4.1 从零搭建一个可用的知识库完整流程下面我以一个实际项目为例把知识库搭建的完整流程走一遍。这个项目的背景是为一家企业的内部技术支持团队搭建一个 Agent能够回答产品使用问题、故障排查步骤、以及内部流程规范。第一步文档收集与清洗。客户提供了大约 150 份文档格式包括 PDF、Word、Markdown 和 Confluence 导出的 HTML。我先把所有文档统一转成 Markdown 格式转换过程中重点处理表格和代码块。PDF 里的表格用工具转成 Markdown 表格代码块保留原格式。这一步花了大概两天时间主要是处理各种格式兼容问题。第二步文档切分。按照前面说的策略产品手册按二级标题切分API 文档按接口切分流程规范按条款切分。切分之后总共得到约 3200 个文本块平均每个块 800 字符左右。每个块都带上了来源文档名、章节路径、文档类型三个元数据字段。第三步向量化与存储。Embedding 模型选了一个在中英双语上表现均衡的模型维度 1024。向量数据库用了支持元数据过滤的方案因为后面检索时需要按文档类型过滤。3200 个块全部向量化大概花了 20 分钟成本可以接受。第四步检索流程搭建。实现了向量检索加关键词检索的双路召回重排序模型选了一个中文效果好的。检索参数方面每路召回 20 个候选重排序后取 top 5 喂给模型。第五步提示词设计与调试。按照前面说的结构化方式组织检索结果反复调整提示词重点解决模型“过度依赖检索结果”和“检索不到时硬编”两个问题。第六步测试与调优。用之前收集的 100 条真实问题做测试逐条检查答案质量。发现的问题主要集中在两类一是某些问题的答案分散在多个文档中单次检索覆盖不全二是某些专业术语的检索效果差需要补充同义词映射。4.2 关键参数的计算与选择过程在搭建过程中有几个参数需要根据实际情况计算和调整这里把计算过程分享出来。切分块大小的确定。块大小不是拍脑袋定的要考虑两个因素embedding 模型的最大输入长度以及检索后喂给模型的上下文预算。假设 embedding 模型最大支持 512 个 token模型上下文窗口是 8K token检索 5 个片段每个片段加上提示词模板大约占 200 token那么留给每个片段的空间大约是 (8000 - 1000) / 5 1400 token。中文一个字符大约对应 1.5 个 token所以块大小可以设在 800 到 900 字符左右。这个计算能帮你避免“切分块超出模型限制”或“检索结果塞不进上下文”的问题。召回数量的确定。召回数量太少可能漏掉关键信息太多重排序和生成的负担都增加。我的经验值是向量检索和关键词检索各召回 15 到 25 个候选重排序后保留 3 到 5 个。这个范围在大多数场景下都能取得不错的平衡。如果测试发现召回率不够优先增加召回数量而不是调整切分。相似度阈值的设定。检索时需要设置一个相似度阈值低于阈值的结果不返回。阈值设太高很多问题检索不到结果设太低无关内容混进来。我的做法是用测试集跑一遍画出相似度分布曲线找到区分“相关”和“不相关”的拐点。一般来说余弦相似度在 0.7 以上可以认为是相关的0.5 以下基本不相关中间区域需要结合重排序来判断。4.3 实操现场一次完整的检索调试记录这里记录一次真实的调试过程展示怎么定位和解决知识库效果问题。问题现象用户问“产品 A 的并发上限是多少”Agent 回答“根据文档产品 A 的并发上限是 1000”。但实际文档里写的是“标准版并发上限 500企业版并发上限 2000”。Agent 把两个版本的信息混在一起了。排查过程先看检索结果发现检索到了两个片段一个是标准版的参数表一个是企业版的参数表。两个片段的相似度分数很接近重排序后都进了 top 5。模型看到两个不同的数字自己“综合”了一下给出了一个错误的答案。解决方案这个问题本质上是检索时没有区分版本。我在元数据里增加了“产品版本”字段检索时如果用户问题里提到了版本就按版本过滤如果没提就在提示词里明确告诉模型“检索结果包含多个版本的信息请分别列出”。调整之后Agent 的回答变成了“标准版并发上限 500企业版并发上限 2000”问题解决。这个案例说明知识库的效果问题往往不是模型不行而是信息组织方式有问题。遇到问题时要先看检索结果再看提示词最后才考虑换模型。5. 常见问题与排查技巧实录5.1 知识库效果问题速查表下面这张表整理了我在实际项目中遇到的高频问题、可能原因和解决方法方便你快速定位问题问题现象可能原因排查方法解决方法检索不到相关内容切分粒度过大或过小检查检索结果的相关性分数调整切分策略增加重叠检索到无关内容相似度阈值过低查看检索结果的分数分布提高阈值增加重排序答案遗漏关键信息召回数量不足检查答案涉及的文档是否被召回增加召回数量多路召回答案包含错误信息检索结果中有冲突内容检查检索结果是否包含多个版本增加元数据过滤提示词说明答案过于笼统检索结果不够具体检查检索到的片段是否包含细节细化切分提高检索精度响应速度慢检索链路太长分别计时各环节耗时优化索引减少召回数量更新文档后效果下降旧向量未清理检查向量库中是否有过期数据建立文档更新同步机制5.2 几个容易踩的坑和避坑技巧坑一文档更新后忘记重新向量化。这是最常见的问题。文档改了但向量库里还是旧的内容检索出来的自然是过时信息。我的做法是建立一个文档版本管理机制每次文档更新时自动触发重新切分和向量化。如果文档量大可以做增量更新只处理变化的文档。坑二忽略元数据的作用。很多人只存文本内容和向量不存元数据。结果检索时没法过滤生成时没法引用来源。我的建议是至少存四个元数据字段来源文档、章节路径、更新时间、文档类型。这几个字段在检索和生成时都会用到。坑三提示词里没有处理“检索不到”的情况。如果检索结果为空或者相关性都很低模型可能会硬编一个答案。一定要在提示词里明确告诉模型“如果参考资料中没有相关信息直接告诉用户你不知道”。坑四用同一个知识库服务所有场景。不同场景对知识库的要求不同混在一起用会导致效果下降。如果条件允许按场景拆分知识库或者至少用元数据做逻辑隔离。坑五只测试“能查到”的问题不测试“查不到”的问题。知识库不仅要能回答知道的问题还要能正确地说“不知道”。测试集里一定要包含一些知识库覆盖不到的问题验证 Agent 是否会编造答案。5.3 知识库的持续运营与迭代知识库不是搭完就完事了它需要持续运营。我一般会做这几件事定期检查检索日志看哪些问题检索不到结果哪些问题的检索结果相关性低。这些是知识库的盲区需要补充文档或者调整切分。收集用户反馈看哪些回答被标记为“有帮助”或“没帮助”。没帮助的回答要逐条分析是检索问题还是生成问题。监控知识库的覆盖率统计用户问题中有多少能在知识库中找到答案。这个比例应该随着运营逐步提升如果长期不涨说明文档补充跟不上业务变化。定期更新向量索引尤其是文档更新频繁的场景。我一般设置每周做一次全量检查每天做一次增量更新。6. 关于知识库的一些个人体会做知识库这件事技术选型固然重要但真正拉开差距的是对业务的理解和对细节的把控。我见过用最简单的方案做出效果很好的知识库也见过用了一堆先进工具但效果一塌糊涂的项目。区别就在于有没有认真对待每一个环节——文档怎么清洗、怎么切分、怎么检索、怎么组织提示词。还有一个体会是知识库的效果评估不能只看“回答对不对”还要看“回答有没有依据”。一个能给出正确答案但说不出依据的 Agent在业务场景里是不敢用的。所以我在设计知识库时一定会要求检索结果带来源信息生成答案时引用来源。这样用户能核实你也能排查问题。最后分享一个小技巧如果你的知识库效果怎么调都上不去不妨先停下来手动模拟一遍检索流程。拿几个典型问题自己看看检索出来的片段是什么如果你是模型看到这些片段能不能给出正确答案。很多时候问题一眼就能看出来——要么是片段本身就不包含答案要么是片段太多太杂关键信息被淹没了。找到问题再对症下药比盲目调参有效得多。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →