终于到这个话题了。AIGC 面试里出现频率最高的问题之一。面试官问你你们项目用了 RAG为什么不微调或者反过来你们微调了为什么不直接用 RAG很多人被这个问题问住了不是因为不会答而是因为——他没想过为什么选这个。今天把这事彻底聊透。先搞清楚各自的作用很多人把微调和 RAG 理解成一个方案的两个选项。错。它们的定位完全不同。RAG检索增强生成不改变大模型本身通过给模型提供额外的上下文资料来提高回答质量。模型还是那个模型只是每次提问时给它多塞一些相关资料。微调Fine-tuning改变大模型本身的权重让模型学会新的知识、格式、风格。打个比方RAG 是考试时给你开卷——书还是那本书但你翻书找答案。微调是让你重新学一遍——你的知识变了脑子里的权重变了。开卷考试的成本低、速度快、知识更新灵活。重新学一门的成本高、时间长但学会之后不需要翻书也能答。RAG 的优势和劣势RAG 最大的优势知识更新快。你有一份新的内部文档——上传到向量库用户马上就能问到。不需要训练、不需要 GPU、不需要等。修改成本也低。文档错了直接删掉重新上传。秒级生效。RAG 最大的劣势Prompt 变长。每次提问你都要把检索到的相关文档塞进 Prompt。文档越多Prompt 越长Token 消耗越大。你设 top_k 5每个块 500 tokens光上下文就是 2500 tokens。再加上用户输入、历史对话……你的 Token 消耗轻松翻倍。所以 RAG 适合什么场景知识频繁更新的场景。比如内部知识库、政策问答、实时数据查询。微调的优势和劣势微调最大的优势改变模型行为。这一点 RAG 做不到。比如你需要模型无论用户怎么提问都用固定的 JSON 格式输出。RAG 只能告诉模型应该这样输出但模型不一定遵守。微调能让模型学会这种格式形成肌肉记忆。再比如你需要模型掌握一个特定的术语体系——医疗诊断术语、法律条文引用格式、金融产品描述风格——这些靠 RAG 加几篇文档是学不会的。需要微调让模型深度理解这些术语的用法。微调最大的劣势昂贵且不灵活。训练需要 GPU。即使你用 LoRALow-Rank Adaptation也要几个小时到几十个小时。知识更新必须重新训练。你的产品价格每个月微调一次每次都重新训练成本爆炸。所以微调适合什么场景固定风格和固定格式的场景。比如客服话术模板、固定输出格式、专业术语体系。✨ 现代 AIGC 的黄金组合RAG LoRA不是非得二选一。现实中它们不是互斥的是互补的。先用 LoRA低秩适配微调让模型学会你需要的输出格式和术语风格。然后在推理时挂上 RAG让模型从文档库里搜实时知识。这就是 RAG Fine-tuning 组合模式的完整形态。Service public class HybridLlmService { private final ChatClient loraChatClient; private final VectorStore vectorStore; public ChatResponse handleQuery(String question) { // Step 1: 从RAG获取相关文档 ListDocument docs vectorStore.similaritySearch( SearchRequest.query(question).withTopK(3) ); // Step 2: 把文档作为上下文扔给微调过的模型 return loraChatClient.prompt() .user(u - u.text(question)) .system(以下是相关资料\n docs.stream() .map(Document::getContent) .collect(Collectors.joining(\n---\n))) .call() .chatResponse(); } }LoRA 负责怎么说——模型的语气、格式、风格。RAG 负责说什么——模型回答的知识来源。LoRA 微调的参数远比全量微调少。一个 7B 的模型LoRA 只需要训练 0.1%-1% 的参数。几分钟到几小时就能完成。而且 LoRA 的权重文件很小几十 MB可以随时切换。想换风格了换一个 LoRA 权重文件就行不用重新训练整个模型。LoRA 在 Spring AI 里的使用也很简单。你可以加载一个微调后的模型端点用法和普通模型完全一样spring: ai: openai: base-url: http://localhost:8000/v1 # 你的LoRA服务 api-key: not-needed chat: options: model: qwen2.5-7b-lora然后你的 ChatClient 连接的就是经过微调的模型。代码零改动。微调 LoRA 需要多少数据很多人一想到微调就头大我没有几百万条数据。LoRA 的数据量要求比全量微调低得多。质量比数量重要。一个典型的 LoRA 数据集{ messages: [ {role: system, content: 你是一个电商客服助手回复简短有礼貌。}, {role: user, content: 我想退货}, {role: assistant, content: 亲很抱歉给您带来不便。请提供订单号我来帮您办理退货。} ] } { messages: [ {role: system, content: 你是一个电商客服助手回复简短有礼貌。}, {role: user, content: 这个商品怎么用}, {role: assistant, content: 亲商品内附有详细说明书。如果您找不到我可以把电子版发给您。} ] }几十到几百条高质量对话就能让 LoRA 学到风格。不需要几千条。关键点覆盖常见场景每条数据都是人工精写的不要用模型生成的假数据来微调模型。结果只会越调越差。什么时候必须微调有些场景 RAG 确实搞不定场景一改变模型说话的方式。你的客服需要模仿一个特定的人设——有语气、有口头禅、有回复节奏。RAG 给文档只能告诉模型应该这样说话但它不一定会照做。微调是强制让它学会。场景二掌握专业术语体系。比如医疗诊断报告用的特殊术语和缩写。RAG 能给模型一些文档学习术语但模型可能在上下文太长时忘记。微调后这些术语变成模型的长期记忆。场景三固定的输出结构。比如你需要模型每次输出都是严格的 JSON Schema。RAG Prompt可以做到大部分情况但对于特别严格的结构要求微调更可靠。场景四隐私合规。RAG 需要把文档传给第三方 API 提供商OpenAI、通义千问。如果文档涉及高度机密数据比如客户隐私信息你不能传给第三方。微调后模型学会了知识推理时不需要传外部文档。LoRA 的技术原理一句话说清微调时只动极小一部分参数。全量微调是修改模型所有参数。Llama 7B 有 70 亿参数全量微调需要 4-8 张 A100训练几天成本几万。LoRA 不修改原始权重而是在原始权重旁边并联一些小矩阵Adapter训练时只调这些小矩阵。推理时把 Adapter 的权重合并回主模型。一个 7B 模型LoRA 只训练几百万参数不到 1%。单张 4090 就能跑几十分钟到几小时训完。性价比高是中小团队的理想选择。算力成本的门槛大幅降低了。不过要注意一点LoRA 调的是说法不是知识。指望用它把一套新知识灌进模型里效果通常不如直接上 RAG。它擅长的是让模型换一种语气、换一种格式说话。 面试官视角的标准回答如果面试官问RAG 和微调怎么选RAG 和微调解决的不是同一个问题。RAG 解决的是知识不足微调解决的是行为不对。知识频繁变化的场景用 RAG。因为 RAG 的知识更新成本几乎为零上传文档就生效。固定输出格式、专业术语、特定风格用微调。而且现在推荐 LoRA 微调只训练 0.1%-1% 的参数几十分钟搞定权重文件几十 MB 可以随时切换。生产上我推荐两者组合。先用 LoRA 让模型学会格式和风格推理时再挂 RAG 补充知识。LoRA 负责怎么说RAG 负责说什么。我的判断顺序是先用 RAG解决不了再考虑 LoRA全量微调是兜底选项。不要为了微调而微调先评估 RAG 能不能解决问题。下一篇聊一个容易被问住的问题你的 AIGC 项目效果到底怎么评估测试集怎么建、灰度怎么做、上线后监控哪些指标。