基础原理
Prompting、RAG 与 fine-tuning:区别是什么?
这三种技术能用来改变模型输出的方式各不相同:更好的指令、检索来的上下文,或者被实际改动过的模型本身。这篇文章说明每一种到底能解决什么问题、又解决不了什么,以及为什么很多产品从来都用不上第三种技术。
全部文章 · 最近核实:
三种不同的解法,对应三种不同的问题
Prompting 改变的是你在一次请求里告诉模型的内容:指令、示例、格式规则。检索增强生成,也就是 RAG,改变的是模型在一次请求里能看到什么,做法是检索相关材料并把它加进上下文——检索这一步具体怎么运作,参见《什么是 RAG》。Fine-tuning 改变的是模型本身,通过调整它的权重,让某种模式被固化下来,不用每次重复就能用上。这三者不是同一个解法的三个难度等级,而是分别回应三种不同的缺口。
Prompting 只改变眼前这一次请求
一个提示词由包含在单次请求里的指令、示例和限制条件组成。回答一旦返回,这些东西就不会留存下来——除非你再次带上同样的指令,否则下一次请求又是从同一张白纸开始。这正是 prompting 成为最便宜、迭代最快的技术的原因:改一下措辞几秒钟就能测试,不需要基础设施,也不需要重新训练。
Prompting 也是在求助于其他方法之前最值得先用到底的一招。相当多"模型不会做 X"的问题,实际上是"指令从来没让它做 X"的问题。
RAG 添加事实和文档,但不碰模型
RAG 解决的是另一种问题:模型从未训练过的信息,或者变化太快、训练根本追不上的信息——你自己的文档、当前的记录、任何私有内容。检索这一步不是把这些信息教给模型,而是找到相关的段落,直接把它们作为上下文放进请求里,用嵌入按含义而不是按字面表达来搜索——这种搜索底层如何运作,参见《什么是嵌入》。
由于模型本身什么都没变,更新底层文档会立刻更新系统能回答的内容,完全不需要重新训练这一步。代价是回答质量会被检索质量卡住上限:如果正确的段落从来没被找到,模型就无法使用一段它从未见过的信息。
Fine-tuning 改变的是模型本身
Fine-tuning 用额外的训练样本调整模型的权重,让一种行为模式——某种语气、某种回答格式、示例中展示的某项专门技能——成为模型自身的一部分,而不是你必须在每个提示词里重复、或者靠检索来补充的东西。训练完成后,模型在任何请求上默认就会这样表现,不需要额外的指令。
它也有 prompting 和 RAG 都没有的实打实的成本:训练样本需要准备和筛选,一次训练跑起来要执行并评估,得到的结果是一个具体的模型产物,随着基础模型不断改进,还得对它做托管和同步维护。Fine-tuning 同样不会添加实时或变化中的事实——它把某种模式固化在一份固定的训练集里,也会像任何静态训练一样过时。
把技术和真正的失败对上号,而不是挑最花哨的选项
语气不对、格式不对、指令被忽略:通常是 prompting 的问题。事实错误或缺失,尤其涉及自己的内容或变化很快的内容:通常是检索的问题。你希望在每一次请求中都始终如一地体现某种专门行为,又不想每次都重新解释一遍:这才是 fine-tuning 真正被设计来解决的情况。这几种方法并不互斥——一个经过微调的模型仍然可以接收提示词和检索来的上下文——但每一种都只解决它被设计来解决的那类失败,选错方法只会让真正的问题继续悬而未决,同时增加成本和复杂度。
为什么很多产品从来都用不上 fine-tuning
Prompting 和 RAG 都不会动到底层模型,所以升级到更新、更强的基础模型往往只是一次配置改动。而经过微调的模型会被绑定在它训练所用的那个基础模型上——基础模型的一次重大升级通常意味着重新准备数据、重新训练,而不是简单地切换过去。正因如此,很多产品用 prompting 加检索就解决了整个问题,只有当某种具体、定义明确的行为需要在海量请求中始终保持一致、又不想承担每次重复指令和上下文的成本时,才会去用 fine-tuning。
常见问题
- RAG 会永久更新模型的知识吗?
- 不会。RAG 改变的只是一次请求的上下文里包含了什么;底层模型从来不会被修改。下一次没有检索到同样材料的请求,会像其他任何提示词一样,在没有这些信息的情况下开始。
- Fine-tuning 是不是总比 prompting 或 RAG 更准确?
- 不是。Fine-tuning 会把训练样本中的某种模式固化下来,但不会添加那些训练数据里没有的事实,也不能像检索那样让事实保持最新。一个经过微调的模型,对训练范围之外的任何内容,仍然可能自信满满地出错。
- Prompting、RAG 和 fine-tuning 可以组合使用吗?
- 可以。它们改变的是系统里不同的部分,所以一个经过微调的模型,在同一次请求里仍然可以同时接收检索来的上下文和明确的指令。把它们组合起来是很常见的做法;没必要把它们当成互斥的选项。
- 应该先尝试哪一种?
- 几乎总是先试 prompting。它不需要任何基础设施,改一下措辞几秒钟就能测试。当缺口是缺失或过时的信息时,再转向检索;只有当某种具体、定义明确的行为需要在足够大的请求量上保持一致、值得付出训练和维护成本时,才考虑 fine-tuning。
与其阅读,不如亲自试试
ClawAI 的上下文包以及文件和工作区检索,会在不触碰底层模型的情况下把相关材料加入请求;ClawAI 不提供模型微调——它路由到的云端和本地模型,都是按已经训练好的状态直接使用的。