【AI工程师精讲】12:技术方案选型:微调、RAG、提示词到底怎么选

0 阅读17分钟

技术评审里最常见的万能建议,大概就是这句话。

  • 用户说答案不准确 → "微调吧";
  • 说格式不统一 → "微调吧";
  • 说知识过期了 → 还是"微调吧"。

微调确实是个万能词,但它不是万能解。

有一类需求用微调做,投入大、效果还差;而用检索,可能一周就上线了。

更糟的是另一个方向的错误:用检索去解决"输出风格统一"这种问题,你会发现怎么调召回都不对——因为问题根本不在"找什么",而在"怎么说"。

这篇文章把三个手段的边界划清楚,并给一条从便宜到贵的决策路径。


第一部分:先划清层次——三者根本不是同类

1.1 各自的职责范围

手段控制什么作用范围特点
提示词(含上下文工程)这一次请求怎么被理解和执行单次调用影响最小、成本最低、迭代最快
检索增强(RAG)模型能看到哪些外部信息知识的来源适合频繁变化、规模巨大的知识
微调模型的输出行为与表达方式模型的默认倾向适合稳定的格式、风格、领域表达

1.2 所以正确的提问方式

不是"用哪个",而是先问"我缺的是哪一层"。

缺什么用什么
缺知识检索
缺格式一致性微调
缺正确的指令表达提示词

三种病,三种药。

这个"分层"的视角很关键:它让你不把这三者看成"三个竞争的方案",而是"三个不同层级的工具"。分层之后,"选哪个"这个问题本身就消失了——你只需要诊断缺哪一层。


第二部分:判据一——知识是动态还是静态

这是最有效的一条判据。

2.1 知识会频繁变化 → 必须走检索

典型场景:制度更新、价格调整、产品迭代。

原因很直接:

检索微调
知识存放位置外部文档烧进权重
更新方式改文档重新训练
生效时间分钟级天级(还要重跑评测、重新部署)

更新成本的差距有多大?检索是分钟级到小时级;微调是天级。

2.2 知识长期稳定 → 对微调更友好

比如某个专业领域的固有概念体系。

这类知识不变,所以"烧进权重"的代价可以被摊薄。

2.3 一句话判据

会变的放外面,不变的可考虑放里面。

这个"内外"的比喻很好用,因为它直接对应了实现方式:放外面 = 检索,放里面 = 微调。

而且它自带一个推论:现实中大部分业务知识都在"会变"这一侧——产品在迭代、政策在调整、价格在变化。所以大部分知识类需求,答案都是检索。

2.4 一个常被忽略的成本对比

除了更新时间,还有一个隐性差异:可溯源性。

  • 检索:能给出出处("根据《XX 规定》第 3 条");
  • 微调:说不出来源,因为知识已经融进权重了。

在需要审计、合规、追责的场景里,能不能给出处往往是硬性要求 ——这时检索不只是"更新快",而是"唯一可行"。


第三部分:判据二——你要改的是"内容"还是"方式"

第二条判据同样好用。

3.1 需要改变"输出长什么样" → 微调更合适

典型信号:

  • 格式总是不对(多一个字段、少一个括号);
  • 风格不稳定(时正式时随意);
  • 术语用得不地道;
  • 该简略的地方写得很长。

这类问题检索解决不了,因为知识本来就在模型里,问题在"怎么表达"。

3.2 需要"知道更多事实" → 检索更合适

典型信号:

  • 模型不知道某个具体产品型号;
  • 不知道某条内部规定;
  • 不知道最新的政策。

这类问题微调能做,但代价大、更新难,而且容易出现"说得像但记不准"。

特别注意最后这句话:用微调灌知识的失败模式不是"答不出来",而是"流畅地说出一个错误的答案"。这比"不知道"更危险,因为它更难被发现。

3.3 一句话区分

微调改的是习惯,检索补的是资料。

"习惯"和"资料"这两个词选得很准:

  • 习惯是稳定的、内化的、不需要每次提醒的;
  • 资料是外部的、需要查的、会变的。

第四部分:判据三——成本与迭代速度

把三者的经济性摆在一起看,决策会更清晰。

4.1 六维对比

维度提示词检索增强微调
首次投入极低(小时级)中(周级,需建库与评测)高(数据 + 训练 + 评测)
单次推理成本低中(多一次检索)低(但可能更长上下文)
更新知识的成本改提示词改文档,分钟级重训 + 重评测,天级
调整格式/风格的难度中(不稳定)高(不适用)低(稳定)
可控性与可解释性中等高(能给出处)低(黑盒行为)
主要风险效果不稳定召回不准、切分不当遗忘、成本、更新慢

4.2 读表的关键

检索和微调各有不可替代的优势——检索赢在"更新快、可溯源",微调赢在"稳定、可控风格"。

"各有不可替代"这个判断很重要:它意味着两者不是竞争关系。如果你发现自己在"二选一",那大概率是诊断错了需求。

4.3 一个容易被忽略的维度

注意"单次推理成本"这一行:

  • 提示词:成本随上下文长度线性增长;
  • 检索:多一次检索的开销(向量搜索 + 重排),但通常远小于把全部文档塞进上下文;
  • 微调:推理本身没有额外开销,但如果因为微调而需要更长的系统提示,成本也会上去。

这一行的启示是:成本不是靠"选了哪个方案"决定的,而是靠**"每次请求实际用了多少 token"** 决定的。


第五部分:一条从便宜到贵的决策路径

按这个顺序走,多数需求能在前三步解决。

5.1 第一步:先优化提示词与上下文组织

具体做什么:

  • 明确任务(说清要干什么);
  • 给出示例(few-shot);
  • 规定输出格式;
  • 把关键信息放在两端。

这一步能解决相当一部分"效果不好"。

5.2 第二步:问题在"缺知识"吗?

是 → 上检索。

但注意做法:先做最朴素的版本——切分 + 向量召回 + 带来源生成。

不要一上来就上混合检索和精排。

为什么? 因为朴素版本能快速告诉你"这条路是否可行"。如果朴素检索都召不回正确内容,那问题在数据或切分方式,加精排也救不了。

5.3 第三步:问题在"格式/风格不稳定"吗?

是 → 考虑微调。

但先试结构化输出的约束(让模型按固定结构返回),很多格式问题在这一步就能解决。

这一步经常被跳过,直接奔向微调。但结构化输出(JSON schema 约束、约束解码)的成本几乎为零,而它能解决大部分"格式不对"的问题。

5.4 第四步:两者都有?

那就组合——检索提供知识,微调调整表达。

注意顺序:先把检索做扎实,再加微调。

顺序的理由见下一部分。

5.5 第五步:问题在"推理能力不够"吗?

这通常不是微调能解决的。

两个方向:

  1. 换基座模型(更强的基座);
  2. 拆成多步流程(让每一步都变简单)。

拆流程这一招经常被低估:如果一个问题需要 5 步推理,而模型单步能做对 85%,那么整体全对率可能只有 44%。但如果把 5 步拆成 5 次独立调用,每步都能给足上下文和检查点,整体成功率会高得多。

5.6 这条路径的价值

每一步都是成本最低的尝试,失败了你只损失了少量时间。

注意最后这句话:它的设计逻辑是**"把风险成本降到最低"**,而不是"最快达到最优效果"。这在工程上是更稳健的思路——因为你没法保证一次就选对,但可以保证"试错很便宜"。


第六部分:组合的正确姿势——检索在前,微调在后

如果确实两个都要,顺序很重要。

6.1 为什么先检索

因为检索解决的是"有没有料",这是硬约束。

如果模型根本看不到正确信息,微调再完美也只能"流畅地答错"。

这是一个必要条件关系:料的正确性是前提。前提不成立,后面的优化都是无效的。

6.2 为什么后微调

因为微调解决的是"表达是否稳定"。

当料已经齐了,再训练输出格式,梯度信号才明确。

这句话的技术含义是:如果输入里没有正确信息,模型只能靠猜——而"猜"的过程中产生的输出,会给出错误的训练信号。

6.3 组合时必须注意的两件事

注意一:训练数据要包含"带检索结果"的输入格式。

推理时输入里会有检索到的文档片段。如果训练时没见过这种格式,模型的表现会打折。

这是最容易出的低级错误。

它的具体表现:模型在评测时表现得"不知道怎么用给的材料",要么忽略材料直接靠记忆回答,要么完全不引用。

解决方案很直接:在构造训练数据时,就把检索结果拼进去,用和推理时完全相同的模板。

注意二:微调可能降低对检索内容的"忠实度"。

机制:微调让模型更倾向于按训练时的模式输出。如果训练数据里存在"无视上下文直接回答"的样本,会削弱它对检索结果的依赖。

解决方案:训练数据里要专门放入"依据给定材料回答"的样本,而且在材料里没有答案时,要教它说"根据提供的材料无法回答"。

6.4 一句话总结组合逻辑

检索是"喂料",微调是"教规矩",先喂料再教规矩。


第七部分:三类典型需求的完整答案

给三个具体场景,把上面的逻辑串起来。

7.1 场景一:企业知识库问答

需求特征:

  • 知识经常更新;
  • 需要给出处;
  • 答案要求准确。

结论:检索为主。

具体配置:

  • 提示词负责"必须引用来源、材料里没有就说不知道";
  • 不需要微调,除非输出格式有强要求(比如必须返回结构化 JSON)。

验证这个结论:如果知识更新频率是每周,那么微调意味着每周都要重训+重评测+重新部署——显然不现实。

7.2 场景二:客服话术统一 + 语气规范

需求特征:

  • 知识基本固定(产品信息);
  • 但要求话术统一、不能乱承诺。

结论:微调为主。

具体配置:

  • 用历史优质对话做训练数据,把"语气 + 边界"训进模型;
  • 加上提示词约束兜底;
  • 知识部分若确实需要,再补一个轻量检索。

注意这里的"边界":不能乱承诺是一种行为倾向,不是知识。而行为倾向正是微调擅长改的东西(这也是它必须是微调而不是检索的原因)。

7.3 场景三:结构化信息抽取

需求特征:

  • 从文本里抽固定字段;
  • 格式必须严格。

结论:先提示词 + 结构化输出约束,不够再微调。

理由:这类任务格式明确、可校验,微调的收益常常很明显,因为它是纯粹的"表达形态"问题。

为什么说"不够再微调":因为结构化输出约束(schema 约束解码)本身就能解决绝大部分格式问题,而且成本几乎为零。

7.4 三个场景的共同点

判断依据是"知识是否变化"和"约束是内容还是形态",而不是模型大小或用例名称。

这个规律的实践价值在于:它让你可以在没有先例的新场景里也做出判断,而不只是套用别人的方案。


常见误区

误区一:"知识更新用微调最快。"

恰恰相反。

微调更新知识是三种手段里最慢、最贵的一种,还要承担遗忘风险。

误区二:"RAG 效果不好就换微调。"

先确认检索本身有没有召回正确内容。

召回不准的情况下换微调,等于把"检索失败"掩盖成"模型不会说"。

这个掩盖的后果很严重:你会以为是模型能力问题,于是投入大量资源做微调,而真正该修的是切分策略或 embedding 模型。

误区三:"三个都上最保险。"

三个都上会让问题难以归因 —— 效果不好时你分不清是谁的锅,调试成本急剧上升。

建议增量引入,每次只加一层。

"增量引入"这个原则值得强调:它让每一步的效果都可测量、可归因。而"一次性全上"会让你失去所有诊断能力。

误区四:"提示词是临时方案,正经项目要微调。"

提示词和上下文工程是长期能力,不是过渡方案。

很多成熟产品主要靠上下文组织,而不是靠微调。

这个误区背后的假设是"越重的技术越正式",但实际工程里恰恰相反:越轻的手段越容易迭代、越容易维护。

误区五:"微调之后就不再需要检索了。"

如果知识会更新,必须保留检索。

微调后的模型依然不知道上周新发的文件。微调只改变它"怎么说",不改变它"知道什么"。

误区六:"RAG 和微调同时上就是最优解。"

不一定。 只有当"知识需要外部供给"且"表达需要稳定"两个条件同时成立时,组合才是有意义的。

而且组合会带来两个额外成本:训练数据要包含检索格式;要防止微调削弱忠实度。这两项都需要额外投入。

所以组合不是"更高级",而是"两个问题都需要解决时的必然选择"。


实战问答

Q1:面试问"RAG 和微调怎么选",怎么答得清晰?

A:按"立框架 → 给判据 → 补成本 → 说顺序"四步。

第一步,立框架:

RAG 管知识、微调管表达。

第二步,给判据:

  • 知识是否频繁变化 → 变就上 RAG;
  • 约束是内容还是形态 → 形态就考虑微调。

第三步,补成本对比:

RAG 更新是分钟级,微调是天级。

第四步,说清组合顺序:

先检索把料喂对,再微调把表达训稳。

这四步的结构优势在于:它不只回答了"怎么选",还回答了"选完之后怎么用"。


Q2:我们的 RAG 效果不好,是不是该微调了?

A:先做归因,别急着换方案。

看三个指标:

观察结论
召回的块里有没有答案没有 → 检索问题(改切分、改 embedding、改召回策略)
有答案但答案没用上→ 提示词约束问题(明确要求"依据材料回答")
用上了但表达不好→ 这才是微调的场景

多数"RAG 效果不好"最终落在前两类。

这三步归因的成本是"拿 20 条失败样本人工看一遍",大约半小时——但它能避免几周的无效微调。


Q3:微调之后还要不要保留 RAG?

A:看知识性质。

如果知识会更新,必须保留检索——微调后的模型依然不知道上周新发的文件。

微调只改变它"怎么说",不改变它"知道什么"。

这句话值得反复强调,因为它是很多架构决策的分界线。


Q4:三个手段能不能同时上,会不会打架?

A:可以共存,但要注意两件事。

第一,训练数据的输入格式要与推理一致(包含检索结果的那种格式)。

第二,风险在于归因困难 —— 出问题时不知道是谁的锅。

建议增量引入:每次只改一层,并保留评测基线。

具体做法:每引入一层,都记录"改之前"和"改之后"的指标。这样任何变化都能归因到具体的那一层。


Q5:我怎么知道该先做提示词还是先做检索?

A:问一个问题:

"这个错误,是模型不知道,还是模型没按我要的方式说?"

答案先做什么
不知道检索(先补知识)
不知道怎么说提示词(先明确要求)

如果答案是"我也说不清",那就先花半小时做提示词优化——因为它的成本最低,而且它还能帮你更清楚地看到"到底缺什么"。

一个实用技巧:在提示词里明确写"如果你不知道,就说不知道"。如果模型开始频繁说"不知道",那知识缺口就暴露出来了 ——这时候你就知道该上检索了。


Q6:结构化输出约束能解决多少格式问题?

A:大部分。

能解决的:

  • JSON 结构不对、字段缺失、多余字段;
  • 枚举值超出范围;
  • 类型错误(该是数字给了字符串);
  • 输出里有额外解释文字。

解决不了的:

  • 内容本身选错了字段(比如把"收货地址"填进了"账单地址");
  • 需要理解语境才能填对的值;
  • 格式之外的行为倾向(比如"不能乱承诺")。

所以判断标准是:

如果问题是"结构不对",用约束;如果问题是"填得不对",才需要微调。

区分这两者能省掉大量微调工作。


术语表

术语含义
提示/上下文工程通过组织输入来控制单次请求的行为
检索增强(RAG)在生成前检索外部资料并放入上下文,解决知识来源问题
微调通过训练调整模型行为,解决输出形态与稳定性问题
结构化输出约束强制模型按给定结构返回内容,可在不微调的情况下大幅改善格式问题
归因定位"效果不好"具体出在检索、生成还是表达环节
增量引入每次只增加一层手段,便于对比与定位问题
忠实度模型输出与给定材料的一致程度,是 RAG 场景的核心指标

结语

把这篇压缩成三句话:

第一,RAG 管知识、微调管表达、提示词管这一次怎么问——三者是不同层次,不是替代关系。

搞混层次,就会出现"用微调去更新知识"这类注定低效的做法。

第二,判断顺序是:

① 知识是否频繁变化?     变 → 检索(更新成本分钟级 vs 天级)
② 约束是内容还是形态?   形态 → 微调(先试结构化输出约束)
③ 推理能力够不够?       不够 → 换基座或拆流程(微调补不上)

第三,"两者都要"时,一定是先把检索做扎实,再训练表达。

检索是"喂料",微调是"教规矩"。

而如果只允许带走一条判据,那就是:问自己"这是知识问题还是表达问题" —— 这一个问题,能定掉大部分选型。