Appearance
RAG:知识的补充
上一篇讲到,那颗大脑虽然聪明,但有一个致命的盲区:它只知道训练时见过的知识,对于"你的公司、你的产品、你的内部规范",它一无所知。
你问它"我们公司报销能报多少",它只能干两件事:要么老实说不知道,要么——更糟——根据模样像的规律,现场编一个像模像样的答案出来(还记得吗,这是幻觉)。
于是就有了这一篇的主角:RAG(Retrieval-Augmented Generation,检索增强生成)。这个名字很绕,但道理朴素得像一句大白话:
在大脑开口回答之前,先帮它把相关的资料翻出来,把答案塞到它眼前,再让它照着说。
思路:别让大脑背书,让它查资料
把 LLM 比作一个很聪明、但只学过教科书、对公司内部一无所知的新同事。你直接问它"咱们加班费怎么算",它答不上来。
怎么办?如果你的办公桌上恰有一本《员工手册》,你不会重新训练这个同事,而是把那本手册翻到相关的那几页,递到他面前,跟他说:"照着这个念。"
RAG 干的就是这件"递资料"的活儿。它给标准流程拆成三个步骤:
你的问题
↓ ① 从资料库里,把跟问题最相关的几段捞出来
↓
[捞到的段落] + [你的问题] 一起交给 LLM
↓ ② LLM 看着这几段资料,再开口回答从"凭记忆瞎讲"变成"看着参考答案讲",幻觉立刻被压下去一大半,而且你的资料更新了,回答也就跟着对——根本不用重新训练那颗大脑。
难点(也是精髓):怎么"捞"得又快又准
你可能马上会问:那本《员工手册》有几千页,总不能全塞给大脑吧?它一次能"看"的字是有限的(这个限度叫上下文窗口)。所以关键不在"查",而在精准地捞出"就那几段最相关的"。
这里要用到一个比较绕、但很值的概念:向量。
把文字变成"语义指纹"
先讲个最简单的类比。人的直觉,"苹果"和"水果"是相近的,"苹果"和"发动机"离得远。但这种"相近",电脑本来是不懂的——它只能算数字。
于是科学家教电脑做一件事:把每一段文字,都精确地转换成一串数字(一般是一组几百个数字,这串数就叫"向量")。 转换的规则被调教到能满足一个神奇的性质:
意思越相近的两段文字,转出来的这两串数字,就越"像"(数学上就是方向越接近)。
这样一来,"苹果"和"水果"的向量挨得很近,"苹果"和"发动机"的向量隔得很远。这就是所谓的语义检索——它找的不是"字里有没有同一个词",而是**"意思是不是一回事"**。
三个动作
整个过程,做起来其实就三步:
- 预处理(一次性的):把你所有的资料(手册、文档、PDF)切成一小段一小段,每段转成向量,存进一个专门的"向量数据库"里存着。相当于提前把《员工手册》编好索引、按语义排好队。
- 提问时:把用户的问题也转成向量,到数据库里找出"方向最接近"的那几段(一般三到五段)。
- 回答时:把这几个"候选段落"连同问题一起丢给 LLM,由它照着组织成通顺的答复。
你看,其实不复杂:索引是提前造好的,查询是现场做的,回答让大脑来。
它和"把资料喂给模型训练"(微调)有什么不同
很多人容易把这俩搞混。理清楚不难,它俩解决的是两种完全不同的需求:
- RAG 是"现场翻书"。 资料可以随时换,成本低,改完立刻生效。适合"知识经常变、资料多、内部事实类"的问题。
- 微调是"把知识背进脑子里"。 要真去训练模型,成本高、周期长、改一次要重来。适合"想让模型本身的说话风格、行为模式、能力方向发生改变",而不只是为了塞进去几个知识点。
一个很实用的原则:给 Agent "喂公司知识",绝大多数情况用 RAG 就够了,别一上来就惦记微调。 只有当你要的不是"记得更多",而是"变得更像你要的那个样子"时,才值得花力气去训练。微调的具体门道,放在后面的微调训练篇。
它会遇到的酸甜苦辣
RAG 看起来简单,做好了却有不少讲究。挑几个最常踩的,这里提个醒:
- 切块的大小。段落切得太碎,上下文断了,捞出来读不懂;切得太大,又混进一堆无关内容、还白白占用大脑有限的上下文。得找那个平衡点。
- 捞得准不准。捞出来的和问题对不上,大脑再聪明也只能照着错的资料编。所以检索质量,其实比生成质量更值得花心思。
- 不是所有资料都适合向量检索。 人名、编号、拼写这类讲究"字面精确"的,有时候靠关键词搜索反而更稳。成熟的系统常把"按意思找"和"按字找"两者结合起来用,取长补短。
- 要能交代来源。 让大脑回答时带上"这句话出自哪一段文档",既方便人回头核对,也进一步压住幻觉。
这些细节,留到实现篇结合具体技术展开。在基础篇,你只要在心里立住那个核心图景:RAG = 提问时精准翻资料 + 让大脑照着答。
这一篇的要点,用一句话收束:
大脑只擅长"想",不擅长"记得住具体事实"。RAG 的办法,是在它开口前,从你的资料库里把最相关的几段"按意思"找出来递到它眼前,让它照着说。知识更新了,答案跟着就变,还不用重训模型。
不过,大脑即便是知道了,也还只能"说说"。要让一个智能体真的"动起手来",得靠下一件东西:工具调用:那双手。