这个系列走到第五篇,Agent 已经会循环、会用工具、也记得住事。但有个毛病一直没治好:它答得太顺了,顺到你听不出哪句是编的。

你问它一个内部流程,它讲得头头是道;你拿去核对,发现细节全对不上。它倒不是存心骗你,是它真的“不知道自己不知道”。

另一个毛病更安静:它脑子里的知识,全部停在训练结束的那一天。之后的世界,它一无所知。

两个老毛病,一个根子

先看幻觉。模型每吐一个字,都是在几万个候选里挑一个最顺的。它没有“我确实不知道”这个默认档位,所以没有依据时,它会顺着语言惯性继续往下编。语气和真话一模一样——它根本分不出两者的区别。

再看知识过期。参数里的知识是训练时压进去的,冻在那一天。想让它知道新东西,最直接的办法是重训一轮——但那是大炮打蚊子:贵、慢,而且明天的新数据又得再来一遍。

于是问题变成:能不能不碰模型,只在它开口之前给它“补课”?

能。这个方法叫 RAG。

外挂一座图书馆

图书馆 · 先查再答

RAG 的全称是 Retrieval-Augmented Generation,检索增强生成。名字拗口,道理朴素:把闭卷考试改成开卷考试——先查资料,再动笔。

原来的模型像在闭卷考试:所有知识都背在参数里,背错了没人知道,背漏了也无从补。RAG 给它开卷:回答问题之前,先去一座图书馆把那几页翻出来,摊在眼前,照着答。

开卷之后,幻觉为什么也会少?因为模型的每一句都有了可依据的原文。资料里有的,它照着组织;资料里没有的,它会倾向照实说。它依然在做同一件事——预测,只是这一次,预测的范围被限定在眼前这几页材料里。

“图书馆”是比喻,落到系统里是三样东西:一个装资料的地方(知识库),一套找资料的机制(检索器),一只把资料递到模型眼前的手(提示拼装)。

资料全在模型体外,随时能换、能加、能删;模型本身一个字都不用改。

墨造旁注:RAG 不是把知识灌进模型,是让它在回答之前,先有了“翻书”这个动作。

从切块到拼装:一条流水线

整条流水线只做五件事:

  1. 切块:把文档拆成小段。整座图书馆不能一次全端上来,“一页纸”的量级最好用。
  2. 向量化:每一块转成一串数字——这一步叫嵌入(embedding),数字串就是这一块“意思”的坐标。
  3. 入库:所有坐标存进一个专门找邻居的数据库(向量数据库)。
  4. 检索:用户的问题也转成坐标,在库里找出离它最近的几块原文。
  5. 拼装:把找到的原文和问题一起塞进提示词,交给模型作答。

举个例子。假设知识库是一本报销手册,用户问“出差住宿最多能报多少”。切块之后,写着标准的那一块被捞出来,和问题一起送进模型——模型只需要读懂这一块、把话说顺,不需要事先“记住”任何报销规则。

切块还有个讲究:相邻的块可以留一点重叠,免得一句话正好落在两块的交界上,哪边都不完整。这一点点重叠,常常就是“检索得准”和“检索得歪”的分界线。

骨架就这么多。注意一件事:整条流水线里没有哪一步在改造模型,被改造的是它开口前看到的东西。

“意思接近”是什么意思

最近的点 · 被挑出

第四步的检索,是整条链路上最容易被小看的一环。

传统搜索比的是字面:你搜“怎么退订”,它只给你含“退订”两个字的页面。向量检索比的是意思:每块文本在坐标系里是一个点,意思相近的点会聚在一起。“怎么退订”和“取消订阅的流程”字面上几乎不重合,坐标里却挨得很近。

这等于用“找邻居”代替“对暗号”。换个说法、敲个错别字、甚至换成另一种语言,只要意思没变,它还在附近。

顺带说一句:负责把文本变成坐标的嵌入模型,和负责答题的大模型,通常是两个不同的模型——前者小而快,后者大而稳。嵌入模型的全部训练目标,就是让“意思像”的文本在坐标里靠近、把“意思不像”的拉开;它见过的文本越多,这张地图就画得越细。

检索的本质,是在一张意思的地图上,找出离问题最近的几个点。

检索质量决定上限

天花板 · 由检索决定

外挂图书馆听起来很美,但有一条不太客气的规律:

RAG 的上限不在模型,在检索。

想象一个开卷考试的学生,人很聪明,只是翻到的三页全是无关章节。他越聪明、越用力,越会把无关内容组织成一篇流畅的错答案——原料错了,模型越好,错得越工整。

几个常见的坑:

还有个隐蔽的麻烦:检索系统很难自证好坏。它捞回来的东西看起来都“沾边”,真正的错,往往要等模型把答案组织歪了才暴露。所以这类系统的排查,一半功夫要花在“检索得对不对”上,而不是“回答得好不好看”上。

所以调 RAG,力气通常花在检索侧:切块方式、捞几条、要不要先让模型把问题改写一遍再查。这些动作一点都不“智能”,收益却常常比换一个更大的模型更明显。

从“查过了”到“会查”

回到这个系列一直拧的那根线:会背资料的模型和会决定该不该查、查什么、查够了没有的 Agent,是两回事。

检索接进 Agent 的循环之后,它多出一个可以反复调用的动作:拿不准,先查;查回来的不满意,换个词再查;查够了,再作答。到这里,RAG 不再是一条“增强回答”的流水线,而是 Agent 伸向真实世界的一只手——要不要伸,它自己说了算。

再往深走一步,它还能把查到并验证过的东西沉淀下来——检索的对象,会从外部的文档,慢慢延伸到它自己的历史。到时候,“外挂图书馆”和“自己的记性”,界限就没那么分明了。

下一站

一座图书馆,服务一个读者。这个读者已经很能干:查资料、用工具、写结论,样样自己来。

但如果活同时来了十件,一个读者忙得过来吗?把任务拆开,交给几个各有分工的读者——听上去顺理成章,做起来全是坑。下一站,多智能体。