说句实在话,这两年聊 Agent 架构的博文一抓一大把,但大部分讲来讲去都是模型选型、Prompt 调优、Function Calling 怎么注册,最多再补一个 ReAct 循环。真正让 Agent 从“玩具”变成“工具”的那一层——外部知识访问体系,反而经常被一笔带过。大多数项目做砸了,不是模型不够聪明,是知识这层地基没打好:要么把几篇文档直接丢给 LLM 做“伪 RAG”,要么用传统知识库的思路硬套 Agent 场景,结果检索出来一堆不相关切片,Agent 拿着错误上下文一本正经地胡说八道。
我最近完整落地过一套面向 Agent 的外部知识访问体系,顺带把总体架构从传统知识库迁到了多源知识生态。这篇文章就把整个设计和踩坑过程摊开讲,从架构分层、数据接入、RAG 质量调优,到 Dify、AnythingLLM、自建向量库这些工具的真实表现,以及常见的升级事故,一次性说透。适合正在做 Agent 开发、RAG 知识库搭建、或者想把团队文档库变成 Agent 外脑的人。
1. 问题与思路:Agent 为什么需要自己的“知识外挂”
1.1 核心痛点:模型参数里装不下业务知识
先看一个最基础的问题:为什么 Agent 不能只靠 LLM 本身?因为预训练模型的知识是有截止时间的,它根本不知道你公司内部的 API 规范、产品迭代记录、客户私有协议,更不知道你们上周刚定的数据口径。即使你用的模型足够强,它也只能“编造”一个看起来合理的答案,而不是给出真实业务里验证过的结论。
有人可能会说,那我把业务知识全部写进 System Prompt 不就行了?短期可以,长期完全不行。Prompt 窗口是有限的,塞个几十页文档,光是 token 成本就够呛,而且上下文一长,模型对早期信息的注意力会衰减。更要命的是,知识是动态变化的,每一次更新都要改 Prompt 并重新测试,这个维护成本在知识量稍微上来之后就不可接受了。
所以 Agent 需要一套“外部知识访问体系”,本质上是把知识的存储、检索、更新和 Agent 的推理过程解耦。模型负责“怎么想”,外部知识库负责“知道什么”。这才是 RAG 知识库在 Agent 项目里不是一个插件,而是一个基础设施的真正原因。
1.2 总体架构:知识访问不是单点功能,而是一条链路
我在设计这个体系时,没有把“知识库”当成一个独立服务来做,而是把“知识访问”放到了 Agent 运行的核心链路上。整条链路大致分五层:
- 接入层:负责对接不同类型的知识源,包括本地文档、线上文档、结构化数据库、网页、甚至其他 Agent 的输出。
- 处理层:做文档解析、清洗、切片、向量化、元数据抽取,把非结构化数据转成可检索的形式。
- 存储与索引层:向量数据库加倒排索引的混合存储,支撑语义检索和关键词检索。
- 访问层:对 Agent 暴露统一的检索接口,支持单轮查询、多轮追问、批量召回。
- 治理层:权限控制、血缘追踪、数据更新审计、知识版本管理。
这里最容易被忽略的是治理层。很多人搭 RAG 知识库,跑通一个本地问答就宣布成功,但到了真实业务里,知识的时效性和权限边界才是大问题。你不能让所有 Agent 都访问全部知识,也不能让错误的知识长期驻留在索引里不更新。这一点在后面章节我会展开讲。
1.3 从传统知识库到多源知识生态:演进背后的原因
传统知识库是什么?典型形态是企业 Wiki、FAQ 库、文档管理系统,它们解决的问题是“人能查到准确信息”,核心操作是分类、目录、全文搜索。这个模式在“人查知识”的场景下很好用,因为人有判断力,能自己过滤不相关信息。
但 Agent 不一样。Agent 要的是“直接能用的答案”,它没有耐心也没有能力去翻 200 个搜索结果并逐个判断。传统知识库的查询方式是用户主动发起,而 Agent 的查询方式是代码自动发起,前者可以容忍“搜出来一堆再慢慢看”,后者必须做到“搜出来就直接能用”。
所以这个演进不是把传统知识库搬到向量数据库就完了。它涉及三个维度的根本变化:
- 从“文档管理”到“知识服务”:关注的不再是文件存不存在,而是知识能不能在正确的时间被正确的 Agent 消费。
- 从“单一来源”到“多源生态”:知识分散在 Wiki、工单系统、代码仓库、即时通讯记录、外部网页里,Agent 需要的是对这些源统一建模,而不是为每个源单独做一套接口。
- 从“静态查询”到“动态学习”:知识库需要随业务变化持续索引,还要通过 Agent 与用户的交互反馈来淘汰劣质知识,让知识生态具备自我更新的能力。
2. 架构落地的关键选型:知识源接入层
2.1 先定边界:本地部署还是托管服务
在做技术选型前,第一件事不是选数据库,而是先回答一个问题:知识的私密等级和部署边界到底在哪里。这个问题不解决,后面所有选型都是空的。
如果知识库里的内容涉及内部数据、客户资料或者未公开的业务信息,那用纯托管的云端知识库服务就要非常谨慎。不是说不能用,而是要先确认数据链路是否合规,比如是否经过第三方模型服务、存储是否加密、有没有做数据隔离。我见过不少团队图省事,直接把内部文档传到某个在线知识库平台,结果平台一升级政策,整个知识体系都得跟着动,非常被动。
另一个极端是“全都本地部署”,其实也没必要。纯本地的向量库加 embedding 模型,确实能保证数据不出内网,但运维成本高,而且很多团队没有足够的 GPU 资源去跑高质量 embedding。我的建议是分层处理:核心商密知识本地化,一般性可公开的参考资料或者网页知识可以用托管服务,这样既控制风险,又降低运维压力。
提示:无论选哪种方式,第一步都要理出“知识资产清单”,标注每个知识域的安全级别和更新频率。这个清单是后面所有架构决策的输入。
2.2 接入层抽象:别让 Agent 直接绑死某个知识库
我踩过最大的坑,就是一开始图简单,直接把 Agent 的检索函数写死到了具体的知识库 API 上。当时觉得反正是自己用,先跑通再说。结果到第二个业务方接入时,发现他们的知识在两个不同的系统里,一个在开源知识库平台,一个在内部的文档服务里,而我那个写死的函数根本没法复用,只能重写。
正确的做法是在 Agent 和具体知识源之间加一个接入抽象层。对 Agent 暴露的接口非常简单,就两个核心方法:
class KnowledgeSource(ABC): @abstractmethod def search(self, query: str, top_k: int = 5, filters: dict = None) -> list[Document]: pass @abstractmethod def update(self, item: Document) -> bool: pass不同的知识源只是这个接口的不同实现,比如 WikiSource 走的是全文搜索加向量混合,JiraSource 走的是结构化查询加关键词过滤,WebSource 走的是爬虫和网页解析。Agent 根本不需要知道自己调的是哪一个源,它只知道“我可以从这里拿知识”。
这样设计的好处有两个。第一,新增知识源对你来说就是写一个实现类,不用改动 Agent 主流程;第二,Agent 判断“该不该咨询外部知识”的逻辑可以从具体的知识源细节中解放出来,变得更通用。多源知识生态不是把多个知识库堆在一起,而是让多个知识源在一个统一的访问协议下协作。
2.3 主流通用工具横评:Dify / AnythingLLM / FastGPT / Coze / 自建
很多人问知识库搭建到底用哪个平台,我在不同项目里把这些方案都试过一轮,直接说结论。
- Dify:目前最适合做 Agent 知识库工作流的平台,流水线式的 RAG 编排能力很强,支持召回测试和知识库管理。我们团队主推它做中大型项目基座。缺点是升级要格外小心,后面我会单独讲我遇到的事故。
- AnythingLLM:适合个人和小团队,安装轻量,界面直观,支持多文档和本地模型,但对细粒度权限控制比较弱。
- FastGPT:中文场景效果好,工作流清晰,适合从 Dify 过来的用户过渡,但部分高级功能要实际跑一遍才知道是不是符合预期。
- Coze:适合快速验证 Agent 想法,尤其是想用现成插件和知识库拖拽实现的场景,但深度定制能力有限,数据出口也需要注意。
- 自建(向量库 + Embedding + 编排脚本):灵活度最高,适合知识源极其复杂、需要深度定制的企业场景,代价是全部要自己维护。
这套横评不是绝对的。实际做决定时,我会用一个简单的判断矩阵打分:接入成本、检索效果可调性、权限能力、部署方式、社区生态。我的经验是,小步验证期用 AnythingLLM 或 Coze 这类轻量方案就够了,一旦确定要长期演进,尽早切到 Dify 或自建的架构上。
2.4 企业/团队场景下的权限与审计
当知识库的使用者从一个 Agent 变成多个 Agent、多个团队时,权限与审计就会从“可选项”变成“必选项”。你可能觉得给 Agent 关掉某些知识源的访问权限很麻烦,但不做的话,一个通用的 Agents 服务就可能成为信息泄露的通道。
我在设计中采用的规则是:Agent 实例绑定身份,知识源条目绑定可见范围。Agent 在调用检索接口时,会带上自己的身份令牌和后端根据身份解出的权限标签,检索服务在处理查询时追加一层元数据过滤,比如只返回该 Agent 可见的知识条目版本。权限标签可以用 tenant、部门、项目等多维组合。
审计上,我会记录每一次检索的 query、命中的知识条目、上下文切片片段、Agent 最终使用的文档 ID。这个日志不是为了监控用户,而是为了回答最现实的问题:某个回答引用了一段知识,这段知识是哪来的?原始文档是谁维护的?版本是不是最新的?有了血缘追踪,知识质量问题才可追溯、可修复。
3. 决定检索效果的三个细节:切片、向量化、重排
3.1 切片策略:不是字越多越好
RAG 知识库效果差,最常见的元凶其实是切片策略不对,而不是 embedding 模型不行。太多人拿到文档就一股脑开切,要么固定每 500 字切一段,要么把整个章节当成一段丢进去,完全不考虑文档本身的语义边界。
切片的本质是“在合适的粒度切出能被检索到的语义单元”。粒度太粗,一段话里混了多个主题,向量表示会互相干扰,检索时相关度被冲淡;粒度太细,比如把一句话切一段,语义不完整,召回后模型拿到的上下文缺失严重,回答质量不足以支撑推理。
我常用的策略,优先级从高到低排:
- 结构优先:先按 Markdown/Word 的标题层级切,尽量保证一个切片对应一个逻辑小节。大部分技术文档和产品手册都适合这种切法。
- 语义段落聚合:没有明显标题结构的文本,先做段落切分,再按语义相似度做邻近段落聚合,形成主题完整的块。
- 边界重叠:每个切片的前后各保留少量相邻文本作为重叠窗口,避免检索边界把一句话截成两半。
- 动态分块:结合 token 数和语义完整度动态决定切片长度,而不是做固定长度硬切。
还需要给切片附加元数据,比如来源文档 ID、章节路径、页码、创建时间。这些元数据在权限过滤、引用溯源、回答后处理阶段都特别有用。没有元数据的切片库,一旦检索出结果,你连它是哪个版本、哪个章节的都说不清楚。
3.2 Embedding 与相似度阈值
关于 embedding 模型选择,我不建议盲目追新,关键是模型和你的文档领域是否匹配。通用领域中文文档,用官方榜单靠前的开源 embedding 模型基本够用;如果领域知识非常垂直,比如医药、法律、工业标准,强烈建议用领域语料做微调或者至少做些领域词汇扩展,否则术语之间的语义相似度很容易跑偏。
相似度阈值要基于实际召回测试来定,不能拍脑袋。阈值设太高,很多相关切片被过滤掉,Agent 会回答“没有找到相关知识”;阈值设太低,不相关的切片混进来,答案会被干扰。我一般会在标注好的测试集上跑一批查询,画出阈值和准确率的关系曲线,找出平衡点。
检索不能只依赖纯语义。关键词精确匹配在代码类、编号类、专有名词类的知识里效果非常关键。很多问题问的不是“什么意思”,而是“这个报错码怎么解决”,报错码是精确字符串,语义检索很难匹配好。所以我的检索模块默认是混合检索:向量召回一批,关键词召回一批,再做结果融合,然后进入重排环节。
3.3 重排序:召回质量差的最后一道救生圈
第一次把 RAG 召回结果直接喂给 Agent 时,我很快发现一个问题:包含正确答案的那个切片在 top 5 里,但 LLM 综合多个切片后却答错了。原因是召回的排序没有把最关键的证据放前面,模型被一些相关但没那么关键的切片带偏了。
解决这个问题要靠 rerank 重排模型。召回阶段可以放宽阈值,多召回一些候选,然后交给重排模型按查询与切片的细粒度相关性重新打分,只保留最相关的前几个。多花一次模型推理很值得,它能把 top 10 乃至 top 20 的噪声结果重新洗牌,帮助 LLM 聚焦到真正的答案上。
重排后再做上下文压缩:不是把全部切片原文塞进 prompt,而是对切片做提炼、去重,提取更精确的证据片段。这能大幅减少 token 消耗,也能提升回答准确度。我见过有团队不舍得用重排,认为贵;实际上和一次大模型调用的成本比,重排模型通常便宜得多,而它带来的准确率提升是肉眼可见的。
3.4 评测指标怎么读:Precision / Recall / Faithfulness
热词里有 RAG 知识库指标,这里专门说一下怎么看指标体系。很多人跑通知识库后不知道好不好,全凭感觉,这样就很难迭代。我的做法是把指标拆成检索层和生成层。
检索层主要看 Context Precision(召回的上下文里有多少是相关的)和 Context Recall(所有相关切片里被召回的比例)。Context Precision 低,说明有噪声,要调切片策略、阈值或重排;Context Recall 低,说明漏召回,需要调整检索融合策略,扩大召回候选,或者改进 embedding。生成层重点看 Faithfulness,即答案是否忠于检索到的上下文,是否引入了上下文没有的幻觉内容,以及 Answer Relevance,即回答有没有偏题。这两个指标是人工或基于强模型的自动评估,我通常每周跑一轮并记录变化趋势。
不要让指标绑架架构,但也不能不看。至少留一份包含 50 到 100 个真实问题的评测集,每次修改索引或检索逻辑后都跑一遍,这样你能明确知道改动是变好了还是变坏了。
4. 实操记录:多源知识生态的最小实现
4.1 场景设定与数据流
我这里用一个比较有代表性的场景来说明:一个十人左右的技术团队,想做一个能解答内部开发规范、产品需求、线上事故记录的 Agent。知识源有三个:内部技术 Wiki、产品需求文档库、公共网页上的第三方技术文档。这个场景涵盖了多源异构知识,又不至于复杂到没法讨论。
整体数据流是这样的。原始知识源各自变化,通过不同的接入器抽取内容,把原始格式统一转成“知识条目”的中间态,然后进入统一的处理管道,做清洗、切分、向量化,最后写入索引库。Agent 收到用户问题时,先判断当前任务是否需要外部知识,如果需要,就组装检索请求,带身份和权限信息,统一走访问层查询。访问层融合多个知识源的召回结果,经过重排后返回给 Agent 作为推理上下文。
这个流程听起来复杂,但在 Dify 这类平台里其实就是一条可视化流水线:文档源 → 文档清洗 → 分段与向量化 → 索引 → 检索 → 重排 → 上下文注入。难点不在哪一步单独做,而在把每一步的参数调对。
4.2 知识库搭建与索引更新
在 Dify 里搭建知识库的时候,有几个关键配置要格外留意。第一是分段方式,我建议优先选择“自定义分段”,利用 Markdown 标题作为天然边界,再叠加重叠窗口。第二是索引方式,如果检索类型支持混合检索,就开混合;如果只有纯向量索引,可以考虑后续在自建层加关键词索引做互补。第三是召回设置,TopK 和 Score 阈值不要一次定死,先在自建评测集上做几轮调参。
索引更新是知识库长期维护里最容易翻车的点。文档改了一句话、删了一个章节,如果知识库不感知变化,Agent 就会一直用旧知识回答。我采用的策略是对每个文档维护一个内容哈希,每次源更新时用新的内容哈希比对,变了就把旧切片失效、重新处理新文档,并追加一条版本日志。定时全量重建不是好方案,因为数据量大了以后耗时不可控,增量更新才是常态。
对于团队多人协作,我强烈建议写一个知识入库规范,明确哪些文档应该进知识库、文档负责人是谁、更新频率是多久。没人维护的知识库,三个月后就会变成“负资产”,因为里面的过期内容比没有内容更误导 Agent。
4.3 Agent 调用知识库的方式:Workflow 还是 Function Calling
平台类工具和自建 Agent 在“如何把知识库接给 Agent”这个问题上,走两条不同的路。
用 Dify 这类平台时,通常是编排 Chatflow/Workflow,在流程节点里加“知识检索”节点,让结果作为后续 LLM 节点的上下文。这种方式优点是对开发者友好,最适合结构化流程;缺点是 Agent 自由度有限,检索时机和方式基本上是预设好的。
如果自己是 Agent 编排方,更常见的做法是 Function Calling。Agent 有一个“knowledge_search”工具,模型根据用户问题判断要不要调用、用什么 query、要检索哪个知识域。这种模式给了模型更强的自主性,它可以先问用户澄清,再决定搜什么,甚至在一次任务里多次检索不同主题。代价是要处理工具调用失败、结果过多等分支逻辑。
我的建议是:如果知识检索路径非常固定,用 Workflow;如果 Agent 要处理大量开放式问题,用 Function Calling。真正的复杂项目往往是两者结合:主问题走 Workflow 保证质量,开放追问走 Function Calling 保证灵活。
4.4 把“外部知识”和“记忆”区分开
最后一块容易混淆的是 Agent 的记忆和外部知识库。有人会把对话历史丢进知识库索引,也有人会把长期事实存在知识库里,这两个思路都不太对。
Agent 的记忆处理的是“本次任务和过去对话中产生的信息”,比如用户偏好、最近讨论进度,它是状态的临时载体;外部知识库处理的是“组织沉淀下来的、相对稳定的知识资产”,它是内容的长期载体。把对话记忆当知识库,会让知识库被大量过期的对话细节污染;把知识库当记忆,则会让 Agent 每次请求都检索庞大的知识空间,既不经济也容易跑题。
我在项目中会把两者在程序上隔离:记忆走向量记忆库或者 KV 存储,外部知识走专门的知识服务,在 Prompt 里也会明确区分上下文来源。这样不仅职责清楚,调试的时候也能快速定位问题出在记忆环节还是知识环节。
5. 真实事故:升级翻车、检索“失忆”、切片过碎
5.1 平台升级后知识库无法保存或报 internal server error
挑一个印象最深的事故说:有一次我们的 Dify 从旧版本升级到新版本后,知识库页面能打开,但一点“保存”就报错,后台一直弹出 internal server error,修改知识库配置也频繁失败。
查了半天才发现,原因是升级后向量数据库中索引的元数据结构发生了变化,旧的知识库文档里存了不兼容的元数据字段,服务端在做序列化保存时直接抛出异常。处理方法分两步。第一步,把出问题的知识库文档重新清空并重建索引,先让服务恢复可用;第二步,检查新版本导入数据的要求,确认新增必填字段,再重新跑批导入。之后我把“升级前导出知识库配置与索引元数据”列进了升级 checklist,绝不裸奔升级。
这个事故的教训是:生产环境里升级知识库平台,一定要先在预发布环境做数据迁移演练,而且要有能回滚的方案。数据量越大,结构和元数据不兼容的风险越高,别指望所有升级都能平滑切换。
5.2 检索不准:不是 Embedding 的锅,是召回策略太粗暴
另一个高频问题是“明明知识库里有正确答案,Agent 却说没有”。一开始我也以为是 embedding 不行,换了好几个模型都没用。后来逐条检查,发现是召回策略太“纯向量”了。
技术类知识里有大量精确标识符,比如状态码、接口名、产品版本号。用户问题“project-123 部署失败怎么办”,在向量空间里很可能匹配不到包含“project-123”的切片,因为模型的向量表示不擅长精确字符串对齐。解决办法就是前面说的混合检索:关键词精确匹配和向量召回并行,最后做结果融合,果然召回率一下子就上去了。
这个案例让我形成一个习惯:不管用什么知识库平台,先看它支不支持关键词或全文检索的混合模式。如果只支持纯向量召回,那你得在文档层面主动保留一些可检索的“关键词索引”,否则后面效果调优基本无解。
5.3 上下文爆炸:一次性塞太多切片
还有一种情况,不是检索不到,而是检索到了太多。K 值设得过大,重排又做得不够狠,Agent 的上下文窗口就堆满了各种相似但不冲突的切片。模型在长上下文里反而更容易被无关细节干扰,最终答非所问。
我早期遇到过一个问题,Agent 回答一个非常具体的问题时,硬是把 6 段很长的切片都塞给了模型,结果模型被其中一段关于“历史背景”的文本带偏,忘了用户问的是“怎么操作”。后来我把重排后的 TopK 压到 3 段以内,并加上了每段切片的长度上限,同时在 Prompt 里注明“优先依据第一段证据回答”,效果立刻改善。
记住一个原则:RAG 的上下文不是越多越好,而是越“精”越好。相关知识再全,堆在一个不聚焦的上下文里,反而会降低 Agent 的推理质量。
5.4 安全问题:别让 Agent 拿到“能删库”的知识库权限
安全这条可能有点老生常谈,但确实是想提醒下。Agent 工具的权限不能照搬人的权限去授权。很多内部知识库虽然有“用户访问控制”,但给 Agent 做集成的时候,开发者图省事,直接生成了一个管理员级别的 API 令牌给 Agent 用。
这意味着一旦 Prompt 注入漏洞被触发,攻击者可以让 Agent 去修改、删除知识库里的文档,甚至读取权限范围外的敏感数据。我在设计访问层时,特意为 Agent 生成了最小权限的专用令牌:对知识库只读,而且限定在特定知识域,不带任何写权限。涉及知识更新的操作,全部走人工审批的后台任务,而不是由 Agent 直接执行。
注意:任何外部知识访问体系,都要专门设计“Agent 最小权限方案”,与人的权限体系分开管理。记住,Agent 不是你的同事,它是代码,代码会按最坏路径执行。
5.5 稳定与可观测性:别让“外脑”变成“黑洞”
最后补一个运维层面的坑。知识库作为 Agent 的外部依赖,稳定性和可观测性必须纳入监控。有一段时间我们的知识检索服务偶尔超时,Agent 就直接跳过检索走“自由发挥”,导致线上回答质量时好时坏,非常难排查。
后来给整个知识访问链路加了详细的日志和链路追踪:注册了每次检索请求的耗时、召回数量、索引版本、是否命中缓存。一旦 Agent 回答异常,可以先从访问链路的日志判断到底是没有召回、召回超时还是上下文拼接异常。知识访问不该是无人值守的黑洞,它要像数据库一样被认真对待,有健康检查、错误率告警和容量规划。
6. 高频问题排查速查表
为了把经验沉淀下来,我整理了一份问题排查速查表。每次知识问答效果不对,我都先按这个表定位:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 答案明显引用过期信息 | 文档更新后索引未重建 | 检查文档内容哈希,触发增量重建 |
| 检索结果分散、主题不聚焦 | 切片粒度过大,一段多主题 | 改用结构优先切分,加重叠窗口 |
| 精确编号/代码搜不到 | 纯向量检索不擅长精确匹配 | 开启关键词/全文检索,做混合召回 |
| topK 返回相关但答案仍错 | 缺少重排,排序被无关切片干扰 | 引入 rerank,重排后再截断 |
| 答案偏离问题、答非所问 | 注入上下文过多过杂 | 降低 TopK,限制单段长度,明确证据优先级 |
| 升级后知识库无法保存 | 索引元数据或结构不兼容 | 预发布环境演练迁移,必要时重建索引 |
| 检索没有权限控制 | Agent 使用管理员令牌 | 改为最小权限只读令牌,按知识域隔离 |
| 服务偶发超时但无感 | 知识检索链路未监控 | 增加耗时日志、健康检查与告警 |
| 多轮对话后知识混淆 | Agent 记忆和知识库混用 | 记忆走独立存储,上下文来源标注清楚 |
这张表里每一条都来自真实事故,不是理论推演。遇到问题不要直接去换模型,先跑一遍这个检查顺序,大概率能找到根因。
7. 避坑清单与个人经验
最后把个人体会集中说几点,如果能帮你在做 Agent 外部知识访问体系时少折腾几个通宵,这文章就没白写。
第一,先跑通一个最小闭环,再谈多源生态。很多人一上来就想把 Wiki、数据库、网页、音视频全部接进来,结果每条接入链路都在返工。我建议先用一个代表性文档源做一条端到端流程:文档接入 → 切片 → 向量化 → 检索 → 回答,把这一条链路的质量调到位,再复制到更多知识源上。多源生态是增量叠加,不是从零开始的大爆炸。
第二,知识库的“准”和“全”永远是一对矛盾。检索逻辑上既要控制噪声,又要保证召回。我的经验是采用两阶段策略:召回阶段宽容一些,允许候选多一些;重排阶段严格一些,把真正有用的证据放到最前面。先广后精,比试图在召回阶段一步做到完美要现实得多。
第三,一定要区分“工具能力”和“知识质量”。再强的 RAG 知识库和 Agent 框架,都救不了一堆没人维护的过时文档。知识源侧的负责人机制、版本管理、更新流程,才是整个知识生态里最值钱的投入。一开始可能觉得烦,但跑几个月之后你就会发现,稳定效果的上限是内容质量决定的,而不是模型参数决定的。
如果顺着这个方向继续往下做,我建议下一步把注意力放在两点上:一是检索评测集的持续积累,把它当作知识体系的自动化测试;二是从“检索出相关文本”进化到“检索出可执行的知识”,让 Agent 直接操作数据源里的结构化知识,而不是只把它塞进模型上下文。知识访问这块做好了,Agent 才有资格去处理真正复杂的任务。