速成课 · No. 28
当模型不了解你的领域时,有三种方式可以补救:在 prompt 里告诉它、在运行时把事实递给它(RAG),或者真正去重新训练它的 weights(fine-tuning)。它们解决的是真正不同的问题——而大多数人一上来就伸手去够最贵的那个。下面讲清每一种到底做什么、决定如何取舍的那一个区别,以及如何挑出能解决问题的最便宜的办法。
只讲精髓 · 每个想法一个画面 · 工程胜于魔法
这三种技术的存在都是为了解决同一个问题:模型在通用层面才华横溢,却对你的具体情况一无所知。准确理解它缺什么,正是你挑对补救办法的关键。
它的知识是冻结的、通用的
一位才华横溢的毕业生,几年前读过一座浩瀚的图书馆——但没读过你公司的文件,也没读过他们毕业那天之后发表的任何东西。
模型只知道它的 training data 里有的东西,这些数据冻结在某个 cutoff 日期,取自公共互联网。它拥有广博的通用知识,却对你的私有数据、你的具体领域,或训练之后发生的任何事一无所知。所以开箱即用时,它没法回答关于你产品的问题、遵循你的内部风格,或使用上周的数字。这门课里讲的一切,都是在弥合模型的通用知识与你那个特定世界之间的那道鸿沟。
你可能需要的三种不同东西
一名新员工可能需要一份简报文档、一个可供查阅的文件柜,或者真正的培训来改变他们的工作方式——三道不同的缺口,三种不同的补救。
这道鸿沟有不同的形状,它们的补救办法也不一样。有时你需要模型为这项任务知道一些事实;有时需要它借助一大批不断变化的知识;有时需要它表现得不一样——一种一致的格式、语气或技能。这些分别对应那三种技术:告诉它(prompting)、给它一个知识来源(RAG),或重新训练它(fine-tuning)。说清你面对的是哪道缺口,整个决策就在于此。
让技术匹配缺口
一份一页的备忘录就能解决的事,你不会送人去上一年的培训——你让付出的力气匹配真正缺失的东西。
这些技术在成本、速度和擅长之处上差别极大,所以伸手去够错的那个,在这两层意义上都是昂贵的。最常见的错误是直接跳到 fine-tuning——最重的那个选项——而其实 prompting 或 RAG 能更快更便宜地解决问题。真正的本事不是知道怎么做 fine-tuning;而是把缺口诊断得足够精确,从而挑出能弥合它的最轻的那个技术。
模型的知识是冻结的、通用的——它不了解你的世界。Prompting、RAG 和 fine-tuning 各自弥合不同的缺口,所以诊断缺口正是你做选择的方式。
第一个也是最便宜的技术,就是把模型所需的东西直接放进 prompt。它即时见效、无需训练,而且远比人们以为的更强大——所以它永远是你的起点。
把它需要的东西直接放进 context
在任务前给一位机灵的临时工做简报:这是情况、这是规则、这是一个好范例——他们有能力,只是缺了背景,现在就能上手了。
给模型补上它所缺东西的最简单方式,就是把它放进 prompt——指令、相关事实、你想要的格式、几个例子。模型立即用上这些 in-context 信息,无需任何训练。因为模型很擅长遵循清晰的指令和例子,很多所谓「模型做不到这个」其实是「我没把话说够清楚」。Prompting 是要先用尽的东西,而不是留到最后的。
Few-shot 即时教会行为
给出三个完成好的、正是你想要的输出的例子,然后请它做第四个——这个模式当场就学会了,不用上学。
你不仅能塑造模型知道什么,还能塑造它如何表现,而且就在 prompt 里完成,办法是给出例子——few-shot prompting。想要某种特定的格式、语气或处理任务的方式?放进两三个这样的例子,模型就会照着这个模式来。这意味着很多人以为需要 fine-tuning 才能做到的事——一种一致的风格、某种特定的输出形态——往往用 context 里的例子就能做到,免费而且即时。
它的局限:窗口和重复
一次简报够开一场会用,但你能递过去的纸张就那么多,而且每一次都得重新递一遍——对备忘录来说没问题,对百科全书来说就笨拙了。
Prompting 有实实在在的局限。所有东西都必须塞进 context window,所以你没法把一个庞大的知识库粘进去。而且它是按次的:你每次都把那段 context 发过去,每个请求都为它付费,模型在两次调用之间从不会保留它。当知识对窗口来说太大、不停在变,或者你会一遍遍粘贴同样的大段材料时,光靠 prompting 就不够用了——而那正是下一个技术登场的地方。
Prompting 把模型所需的东西放进 context——事实、格式、例子——即时而且无需训练。它既强大又便宜,唯一的局限是窗口大小,以及每次调用都得重复一遍。
当知识对 prompt 来说太大或太新时,你不是把它全塞进去——而是在需要它的那一刻去取出相关的那一块。这就是 retrieval-augmented generation。
在运行时取出相关的事实
一场开卷考试:你不是把整座图书馆背下来,而是在问题来临的那一刻查阅那几页相关的内容,据此作答。
RAG(retrieval-augmented generation)处理那些大到塞不进 prompt 的知识,办法是按需只取出相关的那一部分。在提问时,它检索你的文档,拉出最相关的那些片段,把这些放进 context 供模型据此作答。于是模型基于你真实的、当前的数据来工作,却从未把它背下来过——你在它正需要的时候恰好把对的那一页给它。(RAG 的那门课讲得很深;这里只讲它在这套阵容里的位置。)
最适合庞大、多变、私有的知识
一座你持续更新的参考图书馆:事实变了,你不会去重印图书管理员的脑子——你只更新书架,下一次查阅就是最新的了。
RAG 大显身手的地方,正是 prompting 力不从心之处:一个大到塞不进窗口的知识库、经常变动的事实,或者模型从未训练过的私有数据。更新一份文档,下一个回答立刻就体现出来——无需重新训练。这让 RAG 成了把模型扎根在你那些特定、当前、可能保密的信息上的标准做法。当缺口是「它需要知道一些东西」,尤其是那些会变动的东西时,RAG 通常就是答案。
RAG 增添的是知识,不是新行为
给某人更好的参考书,会让他消息更灵通——但这不会改变他的写作风格,也不会教会他一项新技能。进来的是事实,不是习惯。
关于 RAG 至关重要的一点:它改变的是模型为这一个回答所知道的东西,而不是它根本上如何表现。模型底层的技能、风格和推理都没变——你只是递给了它更好的事实来据此工作。所以 RAG 是知识缺口的对的工具,却是行为缺口的错的工具。如果你需要模型始终以某种特定方式回应,检索更多文档并不能带你到那儿——这就指向了第三个技术。
RAG 在运行时取出相关的事实,把模型扎根在那些对 prompt 来说太大、太新或太私密的知识上。它增添的是模型知道什么——不是它如何表现。
最重的技术真正修改了模型本身。它是唯一能改变模型根深蒂固行为的那个——也是人们出于错误理由、过早伸手去够的那个。
Fine-tuning 在你的例子上重新训练模型
不是为一项任务给某个工人做简报,而是送他去接受培训,改变他默认的工作方式——新方式是烤进去的,而不是每次重新递过去的。
Fine-tuning 拿一个现有模型,在一组你自己的例子上对它进一步训练,调整它内部的 weights,让新行为成为模型本身的一部分。Prompting 和 RAG 是在运行时增添信息、模型本身不变,而 fine-tuning 不同,它真正改变了模型。结果是一个默认就按你的方式表现的模型,无需在每个 prompt 里都放进指令或例子——它已经学会了。
它教的是行为、格式和风格
一种把通才变成某个人的培训,让他可靠地以你的内部口吻写作,或每一次都用同样的方式处理你那项特定任务——是学会的习惯,而不是一句提醒。
Fine-tuning 真正擅长的是行为:一种一致的语气或内部风格、一种特定的输出格式、一项模型反复在做的专门任务,或是贴合你领域措辞的方式。当你有大量「像这样的输入应当产生像那样的输出」的例子时,fine-tuning 能把这个模式又深又可靠地烤进去,超出 prompt 里的例子所能达到的程度。它塑造的是模型如何回应,学进了它的 weights 里。
代价:数据、力气和维护
送某人去上一个真正的培训项目,要花时间、金钱和一套课程——而当工作内容变了,你得把他们从头再训练一遍。
Fine-tuning 是昂贵的那个选项。它需要一份高质量的例子数据集(往往要很多)、一套训练流程,以及专业知识——而且关键在于,它不是一次性的成本:情况一变,你就得重新训练。LoRA 和其他「参数高效」方法只调整模型的一小部分而不是全部,让它更便宜,这降低了门槛——但它仍然比 prompting 或 RAG 重得多。只有当 fine-tuning 那份特定的好处值得时,你才去承担它的成本。
Fine-tuning 重新训练模型的 weights,把新行为烤进去——对一致的风格、格式和重复任务很棒。它是昂贵的那个选项:数据、训练,加上持续的维护,即便用了 LoRA 也是。
有一个区别能化解 fine-tuning 与 RAG 之间大部分的困惑,并避开那个最常见的昂贵错误。抓住它,选择往往就自己做出来了。
Fine-tuning 教形式;RAG 教事实
你培训一个人怎么写一份报告(一项学会的技能),但你把要写进去的数据递给他(每次现查)——技能是教会的,事实是取来的。
这就是一刀切中要害的规则:fine-tuning 管的是模型如何回应;RAG 管的是它知道什么。 Fine-tuning 教形式——风格、语气、格式、一项任务的形态——办法是把它烤进 weights。RAG 供给事实——当前的、特定的、私有的信息——办法是在运行时取出它们。一个改变行为;另一个改变知识。几乎每一个「我该 fine-tune 还是用 RAG?」的问题,一旦你问起这道缺口是形式还是事实,就都化解了。
昂贵的错误:用 fine-tuning 来加知识
送某人去上学,背一本每周都变的电话簿——等他背会了,它早就错了,而且每次更新你都得重新训练。
最常见的昂贵失误,是用 fine-tuning 来给模型加上它应当知道的事实。它大多效果不好,代价昂贵,而最糟的是,训练一结束事实就冻结了——你的数据一变,这个 fine-tune 过的模型就过时了,你必须重新训练。会变动的事实属于 RAG,在那里更新是即时的。用 fine-tuning 来注入知识,是在简单又当前的办法明明就在眼前时,去做那件又难又脆的事。
它们可以结合:fine-tune 形式,RAG 事实
一位受过怎么做这份工作训练的专家(fine-tune 过),同时也查阅一份始终最新的参考来获取具体细节(RAG)——两全其美,各做各擅长的事。
它们不是对手;最强的系统往往两者并用。你可以为你领域的行为和风格去 fine-tune 一个模型,并且用 RAG 在运行时给它喂当前的事实——形式来自 fine-tuning,事实来自检索,各自处理它真正适合的那道缺口。把它们看作互补而非竞争,正是理解这个区别的标志:你不是在二选一,而是把每一个用在它适合的那部分问题上。
Fine-tuning 教形式——风格、格式、行为;RAG 教事实——当前的、特定的知识。那个经典的昂贵错误,是用 fine-tuning 来加事实,而事实在训练一结束的那一刻就冻结了。
把这三者放在一起,它们就构成了一架成本和威力递增的阶梯。这里的纪律和工程里处处一样:只在问题逼着你往上时,才往上爬。
从最底层开始:prompting
在订一门培训课之前,你先试着把任务说清楚——大多数时候,所需的也就只是这个。
这架阶梯从便宜又即时,通向昂贵又缓慢:prompting,然后 RAG,然后 fine-tuning。永远从最底层开始。先试清晰的指令和几个例子;极大一部分问题就在那儿解决了,免费,几分钟之内。只有当 prompting 真的弥合不了这道缺口时,你才往上爬。从顶层开始——一上来就伸手去够 fine-tuning——正是那种定义了「有预算的新手」的昂贵错误。
只在下一级够不着时才往上爬
只有当较小的工具在这活儿上真的失败了,你才换上更大的工具——而不是因为那个更大的听起来更正经。
当知识对 prompt 来说太大、太新或太私密时——一道 prompting 填不上的明确知识缺口——爬到 RAG。当你需要 prompting 和例子无法可靠达到的一致行为,而且你有数据和预算去教会它时——爬到 fine-tuning。每一级的正当理由,都只在于它下面那一级失败了。每一步的问题都是:更便宜的技术在这里真的不够用了,还是我只是在假设它不够用?
大多数产品永远用不上最高那一级
大多数活儿靠一份好简报和一本参考书就办成了——完整的重新训练是例外,只留给那种真正需要它的罕见情况。
老实说:绝大多数 LLM 应用靠 prompting 和 RAG 就服务得很好,根本不需要 fine-tuning。Fine-tuning 是一个真实而强大的工具,用于「大规模的根深蒂固行为」这一特定情况——但它是例外,不是默认。把它当作最后的手段,只在更轻的那几级明显失败时才去够,这会比因为它听起来高级就去够它,远更经常地把你引向正确。
这架阶梯是 prompting,然后 RAG,然后 fine-tuning——成本和威力递增。从最底层开始,只在下一级真的够不着时才往上爬。大多数产品永远用不上最顶层。
选得好,归根结底是诚实地诊断缺口,并衡量你的补救是否奏效——这和支配模型其他一切的工程纪律是同一套。
先诊断缺口,再挑工具
好医生先诊断,再开方——他们不会因为手术够戏剧化就去够它,而是先弄清到底哪里出了问题。
整个决策都系于把缺口说准:模型是缺事实(RAG)、需要更清晰的指令(prompting),还是需要把不同的行为烤进去(fine-tuning)?大多数错误的选择,都源自跳过这道诊断、直接扑向某个技术。问清到底缺什么,让它匹配能契合的最轻的工具,你就能避开那些昂贵的弯路——尤其是「为事实去 fine-tune」那个大坑。
衡量它是否真的奏效
你不会假定培训起了作用——你事后测一测那个工人,看看输出有没有变好。
无论你用哪个技术,都用 evals 来验证它:这个改动在真实的案例上,真的改善了输出吗?一个更好的 prompt、一条 RAG 流水线、一次 fine-tune——每一个都是一个假设,你靠衡量来确认,而不是靠感觉。这对 fine-tuning 来说尤其重要,那里成本高昂,一句含糊的「好像好点了」不足以为它正名。衡量让你对「更重的技术是否值得比更轻的多占一个位置」这件事保持诚实。
- 缺口是什么——事实、更清晰的指令,还是不同的行为? - 你先试过 prompting 了吗——清晰的指令和几个例子? - 它是不是一道知识缺口——庞大、当前或私有的事实——指向 RAG? - 它是不是一道行为缺口——一致的形式、风格、重复的任务——指向 fine-tuning? - 对 fine-tuning 来说,你有那些例子数据和预算吗,包括持续的维护? - 你在衡量吗——所选的技术是否真的改善了输出?
- training data / cutoff——模型知道什么,冻结在某个日期。 - prompting / in-context / few-shot——把模型所需的东西直接告诉它,就在 prompt 里。 - RAG——在运行时检索相关事实,为回答扎根。 - fine-tuning / weights / LoRA——重新训练模型,把行为烤进去。 - form versus facts——fine-tuning 改变它如何回应;RAG 改变它知道什么。 - the decision ladder——prompting,然后 RAG,然后 fine-tuning,按成本递增。 - evals——衡量这个技术是否真的改善了结果。
- 在挑技术之前,你诊断缺口——事实、指令,还是行为。 - 你从 prompting 开始,只在它真的不够用时才往上爬。 - 你用 RAG 处理知识、用 fine-tuning 处理行为,从不用 fine-tune 来加事实。 - 当有帮助时,你把它们结合起来——形式来自 fine-tuning,事实来自 RAG。 - 你用 evals 来衡量,并把 fine-tuning 当作经过论证的最后手段,而不是默认。
诊断缺口,然后爬这架阶梯:prompting 管指令,RAG 管事实,fine-tuning 管行为。用能奏效的最轻的技术,在有帮助时把它们结合,并衡量它确实奏效了。