拓冰建站拓冰建站
首页 / 资讯中心 / 正文

AI Agent知识获取管道实战:RAG从0到1搭建与调优

1. 为什么知识获取管道是 AI Agent 落地的第一道坎做 AI Agent 的人迟早会撞上同一堵墙模型本身很聪明但你问它公司内部的报销标准、上周刚更新的产品参数、某个客户的特殊约定它要么一本正经地胡说要么干脆承认不知道。这不是模型不行而是它的知识被冻结在训练截止那一刻而真实业务里的知识每天都在变。知识获取管道要解决的就是这件事——让 Agent 在回答问题之前先去外部知识源把相关资料捞回来再基于这些资料组织答案。这套机制就是RAG检索增强生成。你可以把它理解成给模型配了一个随叫随到的资料员模型负责理解和表达资料员负责在正确的时间递上正确的材料。我见过太多团队一上来就堆向量库、调 embedding 模型结果上线后rag hit rate惨不忍睹答非所问。问题往往不在模型而在管道本身没搭对。这篇就按我实际搭过几套rag知识库的经验把知识获取管道从 0 到 1 拆开讲清楚包括每一步为什么这么做、参数怎么定、坑在哪里。适合正在做ai agent开发、准备落地rag项目的工程师也适合想搞明白rag是什么的产品和运营同学。先说结论一个能用的 RAG 管道核心不是向量检索这四个字而是文档怎么切、查询怎么改写、召回怎么排序、上下文怎么拼这四件事的工程细节。下面逐个拆。2. 文档切分决定 RAG 上限的隐形环节2.1 切分粒度为什么比 embedding 模型更关键很多人以为 RAG 效果差是 embedding 模型不够强其实切分策略才是天花板。原因很直接检索的最小单位是 chunk文本块如果 chunk 切得不好再强的 embedding 也救不回来。举个我踩过的真实例子。一份产品手册里有一句该型号支持 -20℃ 至 60℃ 工作温度如果按固定 500 字切分这句话可能被切在块尾前半句在上一块、后半句在下一块。用户问这个型号耐低温吗检索到的块里只有至 60℃ 工作温度模型自然答不出 -20℃。信息被切断了检索就失效了。所以切分的核心原则是尽量保证语义完整。一个 chunk 应该是一个能独立表达完整意思的单元而不是机械地按字数砍。2.2 三种主流切分策略的取舍策略适用场景优点缺点固定长度切分结构松散的纯文本实现简单、速度快容易切断语义递归字符切分通用文档按段落/句子层级回退语义较完整对表格、代码不友好语义/结构切分结构化文档、Markdown、代码保留标题层级和逻辑结构实现复杂、依赖解析器我现在的默认选择是递归字符切分 结构感知优先按 Markdown 标题、段落、句子逐级回退同时保留标题作为 chunk 的元数据。这样每个 chunk 都带着它属于哪个章节的信息检索时能提供额外上下文。具体参数上我一般这样定chunk_size中文场景 300~500 字英文 500~800 token。太大则噪声多、召回不准太小则语义不完整。chunk_overlap设为 chunk_size 的 10%~20%用来缓解边界切断问题。比如 chunk_size400overlap 就设 40~80。保留元数据来源文件、章节标题、页码、更新时间这些在后续排序和引用时非常有用。注意overlap 不是越大越好。我试过把 overlap 设到 50%结果同一个句子在多个 chunk 里重复出现检索时返回一堆高度相似的块反而挤占了真正有用的上下文位置。2.3 特殊内容的处理经验表格、代码、FAQ 这三类内容用通用切分器基本都会翻车得单独处理。表格我一般转成表头 每行的自然语言描述再入库。比如一张产品参数表转成产品A 的 工作温度 是 -20℃ 至 60℃这样的句子检索命中率会明显提升。代码块则按函数或类为单位切分保留函数签名作为元数据。FAQ 最省事一问一答直接作为一个 chunk天然语义完整。这些处理看起来琐碎但实测下来光是把表格转成自然语言这一项就能让相关问题的 rag hit rate 提升两成以上。这是文档预处理阶段最值得投入的地方。3. 稠密嵌入与向量检索召回阶段的核心机制3.1 稠密嵌入到底在做什么稠密嵌入dense embedding是把一段文本映射成一个高维向量语义相近的文本在向量空间里距离更近。你可以把它想象成给每段文字在一个巨大的坐标系里定位——意思接近的文字坐标就挨得近。这里有个常见误解embedding 捕捉的是语义相似不是关键词匹配。用户问怎么退款文档里写的是申请退货流程两者字面完全不同但 embedding 能把它们拉到相近位置。这正是稠密检索相比传统关键词检索的优势。但反过来embedding 对精确匹配反而不敏感。用户问型号 X200 的参数如果文档里型号是X-200embedding 可能就匹配不上。这就是为什么后面要讲混合检索。3.2 向量库选型别一上来就上重型方案选向量库我踩过的最大坑是过度设计。早期项目数据量才几万条我非要上分布式向量库结果运维成本高、调试困难收益几乎为零。我的经验判断标准很简单数据量 10 万条直接用内存向量库或轻量方案甚至本地文件持久化就够。net rag本地知识库这类场景完全没必要上集群。10 万 ~ 1000 万条选成熟的单机向量库关注索引类型和过滤能力。 1000 万条再考虑分布式方案同时评估召回延迟。选型时重点看三个能力近似最近邻索引HNSW、IVF 等、元数据过滤按来源、时间筛选、增量更新不用全量重建。第三点特别容易被忽略但业务知识天天变不能增量更新意味着每次更新都要重建整个索引成本极高。3.3 相似度度量与 top-k 的取值逻辑相似度度量常用余弦相似度因为 embedding 通常做了归一化余弦相似度计算简单且对向量长度不敏感。top-k 的取值是个平衡题。k 太小可能漏掉相关文档k 太大噪声多且拖慢后续生成。我的做法是召回阶段取大一点k20~50排序阶段再收敛到 3~8 条。这叫宽召回、精排序是 RAG 里非常实用的一个策略。提示top-k 不要拍脑袋定。拿一批真实问题跑一遍看正确答案出现在第几位如果经常排在第 10 名开外说明召回或切分有问题而不是简单调大 k 能解决的。4. 查询改写让用户的问题真正问对4.1 用户提问和文档表述之间的鸿沟用户提问的方式和文档的表述方式天然存在鸿沟。用户问这个功能要钱吗文档写的是该服务采用订阅制收费模式。embedding 虽然能拉近语义但差距太大时仍然会漏。查询改写就是在检索之前把用户的口语化问题转成更适合检索的形式。这一步做得好rag hit rate 能有肉眼可见的提升。4.2 几种实用的改写手法同义扩展把问题里的关键词扩展成多个同义表达。比如退款扩展成退款、退货、退费、取消订单。问题拆解复杂问题拆成多个子查询分别检索。用户问X200 和 X300 哪个续航长拆成X200 续航和X300 续航两个查询分别召回再合并。假设文档生成让模型先根据问题编一段可能的答案再用这段答案去检索。听起来反直觉但实测有效——因为生成的答案在表述风格上更接近文档检索命中率更高。多查询融合用模型生成多个不同角度的查询全部检索后做结果融合。这是目前比较主流也比较好用的做法。我一般把改写和检索串成一条链原始问题 → 生成 3~5 个改写查询 → 分别检索 → 去重合并 → 进入排序。多花的这点算力换来的是召回质量的明显提升很值。4.3 改写的边界别改过头改写不是越多越好。我见过把一个问题改写成十几个查询的结果召回了一堆不相关的块反而干扰排序。3~5 个高质量改写通常是最佳区间。另外改写要保留原始问题的核心实体。如果用户问的是X200 的保修期改写时把X200丢了那就南辕北辙了。我的做法是改写时强制保留原始问题中的专有名词和数字。5. 重排序与上下文组装把好料端到模型面前5.1 为什么召回之后还要重排序召回阶段用的是 embedding 相似度它快但不够准。重排序rerank阶段用一个更精细的模型对召回的候选块逐一打分把真正相关的排到前面。打个比方召回像是用粗筛子快速捞一批可能相关的资料重排序像是拿放大镜逐份细看挑出最对口的几份。两阶段配合既保证了速度又保证了精度。重排序模型通常比 embedding 模型大、慢但只对几十条候选打分成本可控。实测下来加了重排序之后最终喂给模型的上下文质量提升非常明显尤其是那些召回排名靠后但实际相关的块能被重新捞上来。5.2 上下文组装的三个原则召回和排序都做完了最后一步是把选中的块拼成上下文喂给模型。这一步看似简单其实有讲究。相关性优先按重排序分数从高到低排列把最相关的放最前面。模型对上下文开头的内容注意力更集中。控制总长度上下文不是越多越好。塞太多会超出模型窗口也会稀释关键信息。我一般控制在模型窗口的 50%~70%留出空间给问题和回答。保留来源标注每个块带上来源信息方便模型引用也方便后续排查。用户看到答案能追溯到原文信任度会高很多。5.3 一个容易被忽略的细节块之间的顺序如果召回的多个块来自同一份文档的连续段落拼接时最好按原文顺序排列而不是按分数打乱。因为连续段落之间有逻辑衔接打乱后模型理解起来会吃力。这个细节很小但对答案连贯性有实际影响。6. 从能跑到好用RAG 管道的调优与评估6.1 怎么判断 RAG 到底好不好没有评估的调优都是瞎调。我一般盯三个指标召回率正确答案所在的块有没有被召回。这个指标低说明切分或 embedding 有问题。命中率hit rate正确答案在最终排序里排第几。这个指标低说明重排序或 top-k 有问题。答案质量人工抽检或让模型自评看最终答案是否准确、是否忠于原文。我习惯建一个小规模评测集50~100 个真实问题每个标注正确答案所在的文档。每次改动管道跑一遍看指标变化。这个习惯帮我避免了很多感觉变好了其实变差了的误判。6.2 常见瓶颈与对应解法现象可能原因解法召回不到相关内容切分切断语义 / embedding 不匹配调整切分、换 embedding 模型召回了但排序靠后缺少重排序加 rerank 阶段答案答非所问上下文噪声多收紧 top-k、加强重排序答案不完整上下文被截断调整 chunk 大小、控制拼接长度更新后效果变差索引未同步建立增量更新机制这张表是我排查问题时最常用的对照清单基本能覆盖八成以上的常见问题。6.3 关于 Agentic RAG 的一点前瞻传统的 RAG 是一次检索、一次生成的固定流程。而agentic rag让 Agent 自己决定要不要检索、检索几次、用什么查询——它把检索当成一个可以反复调用的工具而不是固定步骤。这个方向的价值在于面对复杂问题时Agent 可以先检索、发现信息不够、再换个角度检索直到信息足够才回答。这比固定管道灵活得多但代价是延迟和成本上升。我的建议是先用好基础 RAG等基础管道稳定了再考虑 agentic 化。基础没打好就上 agentic只会把问题放大。7. 我在实际搭建中攒下的几条经验搭 RAG 管道这件事文档里不会写的经验往往最值钱。分享几条我踩坑换来的第一先做数据清洗再做切分。很多文档里有页眉页脚、水印文字、乱码这些噪声进了库就是干扰项。我现在的流程里清洗是独立的一步宁可多花时间。第二embedding 模型要跟业务语料对齐。通用 embedding 模型在专业领域医疗、法律、工业表现会打折。如果预算允许用业务语料微调一下 embedding效果提升很直接。第三别迷信单一检索方式。稠密检索擅长语义稀疏检索关键词擅长精确匹配。混合检索把两者结合在大多数场景下都比单用一种稳。这也是我现在的默认配置。第四日志要记全。每次查询的原始问题、改写后的查询、召回的块、排序分数、最终答案全部落日志。出问题时能快速定位是哪一环掉的链子。没有日志的 RAG 系统调优基本靠猜。第五小步迭代别一次改太多。我早期喜欢一次改好几个环节结果效果变差了根本不知道是哪个改动导致的。后来改成一次只动一个变量配合评测集验证效率反而高得多。这套管道搭下来从文档入库到最终答案中间有切分、嵌入、检索、改写、重排序、组装六个环节每个环节都有优化空间。但别想着一次全做到位先把主链路跑通再逐个环节打磨这是最务实的路径。基础 RAG 跑稳了后面无论是接 GraphRAG、接本体、还是做 agentic 化都是在稳固地基上盖楼而不是在沙子上堆东西。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门