预训练的大语言模型(LLM)提供了强大的通用生成能力,但生产级别的检索增强生成(RAG)系统通常需要更高的专业化程度。现成的大语言模型可能在某些任务上并非天生出色,例如严格遵守检索到的背景信息、以特定风格生成回应,或仅基于提供的片段进行总结。针对您的RAG应用独特需求量身定制的任务来微调生成器大语言模型,能显著提升其输出的质量、相关性和可靠性。这个过程涉及使用反映您希望培养的特定生成行为的精选数据集来调整预训练大语言模型。
为什么要在RAG中微调生成器?
在RAG管道中微调生成组件的主要原因是为了弥合通用大语言模型能力与您的应用程序特定要求之间的差距。以下是几个优势:
- 提升背景信息遵守度: 微调可以训练大语言模型更忠实地基于检索到的文档给出答案,减少其依赖参数知识的情况,这些知识可能已过时或与查询的特定背景不相关。这是提升事实依据的根本。
- 提升任务特定表现: 您的RAG系统可能需要大语言模型执行特定任务。这可能包括:
- 检索内容的摘要: 从多个(有时是相互矛盾的)文本片段生成简洁的摘要。
- 引用生成: 在生成的回应中准确引用所提供背景信息中的来源。
- 风格和语气匹配: 确保大语言模型的输出与特定品牌声调、用户角色或所需的正式程度相符。
- 遵守背景中的指令: 解释并执行检索到的文档中包含的指令或限制。
- 结构化输出生成: 在需要时生成预定义格式的响应,例如JSON、XML或Markdown表格。
- 减少幻觉现象: 通过训练大语言模型关注提供的背景信息并奖励基于事实的响应,微调有助于减少生成看似合理但错误或未经证实的信息。
- 提高特定风格的效率: 如果持续需要特定输出风格或格式,微调可以使大语言模型更擅长直接生成它,可能减少复杂的提示或后处理需求。
识别用于微调的RAG特定生成任务
在开始微调之前,准确定义您希望改进的生成行为很重要。以下是受益于微调的常见RAG特定任务:
- 情境化问答: 大语言模型在许多RAG系统中的主要任务。微调侧重于生成严格源自所提供背景信息的答案。
- 带归属的摘要: 创建摘要,不仅精炼检索到的段落中的信息,还在背景信息中明确将事实归因于其各自的来源。
- 对比分析: 如果RAG系统检索到提供不同观点的多个文档,可能需要微调大语言模型来比较和对照这些观点。
- 基于角色的对话: 对于会话型RAG代理,微调可以帮助大语言模型采纳一致的角色形象(例如,乐于助人的客户支持代理、技术专家)。
- 条件生成: 根据与检索到的背景信息或用户查询相关的元数据而变化的生成响应(例如,为移动用户生成简洁答案,为桌面用户生成详细答案)。
准备用于微调生成器的数据
微调的成功取决于训练数据的质量和相关性。数据集应包含能够展示您的RAG系统生成器期望的输入-输出行为的示例。
数据来源:
- 人工精选示例: 主题专家可以创建高质量的提示-完成对。例如,给定一个查询和一组检索到的文档,专家会编写理想的响应。这通常是质量最高的数据,但制作成本高昂。
- 现有高质量交互: 如果您有用户交互日志,其中RAG系统(可能使用优化程度较低的生成器)在人工审核或编辑后产生了良好结果,这些数据可能很有价值。
- 合成数据生成: 使用更强大的“教师”大语言模型(例如GPT-4、Claude 3 Opus)来生成训练示例。您向其提供查询、背景信息以及关于如何生成目标响应的指令。有必要仔细审查合成数据。
- 用户反馈循环: 系统地收集用户对生成响应的反馈(例如,赞成/反对、更正),并将其转换为训练数据。
数据格式:
数据通常采用提示-完成对的形式。RAG系统中生成器大语言模型的“提示”通常包括检索到的背景信息和原始用户查询(或其转换版本)。“完成”是期望的输出。
一个常见的结构可能如下所示:
{
"prompt": "Context:\nDocument 1: [文档1片段中的文本]\nDocument 2: [文档2片段中的文本]\n\nQuestion: [用户的原始问题]\n\nAnswer:",
"completion": "[理想的、基于背景的回答(可能包含像(文档1)这样的引用)]"
}
或者,对于摘要任务:
{
"prompt": "Context:\n[检索到的段落A]\n[检索到的段落B]\n\nInstruction: 总结:根据提供的背景信息,总结Alpha项目在第三季度的表现,并引用具体段落。",
"completion": "Alpha项目在第三季度用户参与度增长了15%(段落A)。然而,总体收入目标未达成5%(段落B)。"
}
数据质量:
- 相关性: 确保完成内容直接且仅基于提示中提供的背景信息。
- 准确性: 完成内容中的事实信息必须与背景信息相符。
- 风格一致性: 如果是针对特定风格进行微调,所有完成内容都应遵守该风格。
- 多样性: 数据集应涵盖广泛的查询、背景信息类型和期望的响应模式,以确保模型泛化能力良好。
选择基础模型
选择用于微调的基础模型是一个重要考量:
- 指令微调模型: 从已经擅长遵循指令和进行对话的模型开始(例如Llama-3-Instruct、Mistral-Instruct、Gemma-Instruct)。这些模型为RAG任务奠定了良好基础。
- 模型大小: 较大的模型通常具有更大容量,可能更有效地学习特定任务或使用更少的数据。然而,它们的微调和部署成本更高。较小的模型(例如7B到13B参数)在使用高质量、特定领域数据进行微调时,尤其是在使用参数高效技术时,可以出人意料地有效。
- 开源与专有: 开源模型为微调和部署提供了更大灵活性。通过API访问的专有模型可能提供微调功能,但对过程和模型权重的控制较少。
- 架构兼容性: 确保您的微调基础设施和库支持所选模型架构。
微调方法
微调大语言模型有两种主要方法:全量微调和参数高效微调(PEFT)。
-
全量微调 (FFT):
- 过程: 预训练大语言模型的所有参数在训练过程中都会更新。
- 优点: 可以最大程度适应新任务/数据。
- 缺点:
- 需要大量计算资源(多块高端GPU)。
- 为每个微调任务存储模型权重的完整副本,导致高存储成本。
- 容易出现“灾难性遗忘”,即模型会失去预训练时学到的一些通用能力。
-
参数高效微调 (PEFT):
- 过程: 模型的参数中只有一小部分被更新,或者添加并训练新的小参数模块,而大部分预训练模型权重保持冻结。
- 优点:
- 大幅减少计算和内存需求(对于中等规模的模型,通常可以在单个消费级GPU上完成)。
- 更小的存储占用,因为只需要保存修改/添加的参数。
- 在许多任务上通常表现与全量微调一样好,特别是当微调任务与模型的预训练能力密切相关时。
- 更不容易出现灾难性遗忘。
- 流行的PEFT技术:
- LoRA (低秩适应): 将可训练的低秩矩阵注入到Transformer层(通常是注意力机制的查询和值投影矩阵)。LoRA不是微调原始权重矩阵 W,而是训练两个更小的矩阵 A 和 B,使得更新为 W+ΔW=W+BA。由于 A 和 B 是低秩的,它们的参数比 W 少得多。
- QLoRA (量化LoRA): 一种进一步优化,其中基础模型首先被量化(例如,量化到4位精度)以减少其内存占用,然后应用LoRA适配器。这允许在有限硬件上微调更大的模型。
- 其他方法: 前缀微调(Prefix Tuning)、P-微调(P-Tuning)、适配器(Adapters)(例如AdapterHub)。
对于大多数RAG生成微调任务,LoRA和QLoRA等PEFT方法在性能和效率之间提供了极佳的平衡。 它们允许您针对您特定的RAG需求对强大的基础模型进行专业化,而无需承担全量微调的过高成本。
下表提供了一个高层次的比较:
| 特性 |
全量微调 (FFT) |
参数高效微调 (PEFT,例如LoRA) |
| 可训练参数 |
所有模型参数(数十亿) |
小部分(数百万) |
| 计算成本 |
非常高 |
低到中等 |
| 内存 (GPU 显存) |
非常高 |
低到中等 |
| 存储成本 |
高(每个任务一个完整模型) |
低(每个任务一个小适配器) |
| 灾难性遗忘 |
风险较高 |
风险较低 |
| 部署便捷性 |
标准 |
需要合并适配器或单独部署 |
| 典型用例 |
显著的领域迁移 |
任务专业化,风格适应 |
全量微调与参数高效微调方法的比较。
微调过程
无论您选择全量微调还是参数高效微调,一般的监督微调过程包括:
- 数据集准备: 按照前面讨论的,创建您的提示-完成对。将其分为训练集、验证集和(可选的)测试集。
- 环境设置: 选择一个微调库(例如带
peft的Hugging Face transformers、Axolotl、Unsloth),并设置您的计算环境。
- 模型加载: 加载预训练的基础模型,如果使用PEFT,则配置适配器(例如,指定目标模块和秩的LoRA配置)。
- 训练配置:
- 优化器: AdamW是常见选择。
- 学习率: 通常比预训练时小(例如LoRA为1e−5到5e−4,全量微调通常更小)。学习率调度器(例如余弦退火)有益。
- 批处理大小: 由GPU内存决定。较大的批处理大小可以稳定训练,但需要更多内存。梯度累积可以模拟更大的批处理大小。
- 训练轮次(Epoch)数量: 通常几轮(1-5轮)就足够微调了,特别是对于高质量数据。过度训练可能导致模型记忆训练集,在未见数据上表现不佳或失去通用能力。
- 损失函数: 使用标准语言建模损失(交叉熵损失)。模型预测“完成”序列中的下一个token,损失根据预测和实际token之间的差异计算。
- 训练循环: 遍历训练数据,计算损失,并更新模型权重(或PEFT的适配器权重)。
- 评估:
- 训练期间: 监控验证集上的损失,以检测过拟合并指导超参数调优(例如,用于早期停止)。
- 训练后: 使用量化指标(例如用于摘要的ROUGE、用于翻译类任务的BLEU、困惑度)以及定性人工评估,评估保留测试集上的微调模型。对于RAG,评估忠实性(答案是否与背景信息矛盾?)、答案相关性以及遵守期望风格或格式等指标。
- 模型保存: 对于全量微调,保存整个模型。对于PEFT,保存训练好的适配器权重。这些适配器可以加载到原始基础模型之上进行推理。
RAG中生成器微调的实际考量
- 注重事实依据: RAG生成器微调的主要目标通常是提高其有效利用所提供背景信息并避免幻觉的能力。设计您的数据和训练过程来强化这一点。例如,确保完成内容只包含上下文提示中存在的信息。
- 迭代改进: 微调很少是一次性过程。从小型、高质量的数据集开始,训练、评估、找出弱点、扩充数据集或调整训练参数,然后重复。
- 平衡专业化与通用性: 尽管您希望模型专业化,但要确保它不会变得过于狭隘,从而失去其通用推理或语言理解能力,这些能力仍然有价值。
- 针对特定行为的特定任务数据:
- 如果您需要引用生成,您的训练数据必须包含在提供背景信息的情况下,完成内容正确引用该背景信息中部分内容的示例。
- 对于风格适应,确保您的完成内容始终展现目标风格。
- 成本效益分析: 微调会产生费用(数据创建、计算时间、模型维护)。持续评估观察到的生成质量改进是否值得这些持续的开销。有时,高级提示或不同的基础模型可能是一种更具成本效益的解决方案。
- 示例:针对简洁、带归属答案的微调:
设想一个用于内部技术文档的RAG系统。用户抱怨当前的大语言模型(一个通用指令微调模型)经常给出冗长的答案或包含看似合理但未经证实的信息。
为了解决这个问题,您可以:
- 收集数据: 创建(检索到的文档片段,用户问题)对,并编写简洁、理想的答案,这些答案只使用片段中的信息,并明确引用源文档或章节。
- 选择模型与方法: 选择一个中等规模的开源模型(例如Mistral 7B Instruct),并由于资源限制,选择QLoRA微调。
- 微调: 在这个数据集上训练QLoRA适配器,侧重奖励简洁性和准确的归属。
- 评估: 衡量冗余度的降低、直接由背景信息支持的答案数量的增加以及引用的正确性。
预期结果是一个生成器大语言模型,它更善于将检索到的技术文档中的信息合成为简短、准确、可验证的答案提供给用户。
通过仔细考量这些方面,您可以有效地微调大语言模型,使其成为生产RAG系统中高水平的生成组件,从而产生更准确、可靠且用户友好的应用。下一节将介绍控制大语言模型输出的方法,侧重通过提示及其他技术来控制风格、语气和事实性。