LLM 应用实践
开箱即用的预训练LLM没有按预期或希望执行时,如何提高LLM应用的性能?
- 用检索增强生成(RAG)还是模型微调来改善结果?
如何选择优化方法
建议
- 微调之前先尝试RAG
方法分析
Full Fine-Tuning, PEFT, Prompt Engineering, and RAG: Which One Is Right for You?
方法 | 说明 | 分析 | 图解 |
---|---|---|---|
PE |
提示工程 | 提示工程不用训练网络权重 | |
PEFT |
参数高效微调 | - PEFT 相比全面微调的优势 更高效和更快的训练 保留预训练的知识 |
|
RAG |
检索增强生成 | 优点:成本低,最小化幻觉,易于扩展 缺点: 不在文档中的问题无法解决 窗口受限 |
|
Full FineTune |
全参数微调 | - 优点: 训练数据集更少、提高精度、增加鲁棒性 缺点: 高计算成本、内存需求高、时间/专业知识密集 |
RAG适合融合新知识,微调则提升模型性能和效率,优化内部知识和输出格式,增强复杂指令执行能力。
两种方法可相辅相成,推动大语言模型处理知识密集任务和快速适应新知识、定制化反馈的应用。另外,提示工程(Prompting Engineering)也能优化结果,发挥模型优势。
图解
【2024-5-15】分析对比几种主流范式的区别
综述
如何选择?
- 【2024-9-22】RAG vs 微调 vs 提示工程
四种方法对比
【2023-10-17】如何选择最适合你的LLM优化方法:全面微调、PEFT、提示工程和RAG对比分析
- RAG vs Finetuning — Which Is the Best Tool to Boost Your LLM Application?
- 【2023-12-4】英文原文:Full Fine-Tuning, PEFT, Prompt Engineering, and RAG: Which One Is Right for You?
四种主要的调优方法:
- 全面微调:使用任务特定数据调整LLM的所有参数。
- 一个较小、任务特定、带标签的数据集上进行微调,调整一些模型参数,优化其对特定任务或一组任务的性能
- 全面微调: 所有模型参数都被更新,使其类似于预训练,只不过是在一个带标签且规模较小的数据集上进行。
- 优点: 训练数据集更少、提高精度、增加鲁棒性
- 缺点: 高计算成本、内存需求高、时间/专业知识密集
- 参数高效精细调整(PEFT):修改选定参数以实现更高效的适应。进一步调整预训练模型,只更新其总参数的一小部分
- PEFT 方法可训练的部分不同。一些技术优先训练原始模型参数的选定部分。其他方法集成并训练较小的附加组件,如适配器层,而不修改原始结构
- LoRA是最常用的 PEFT 方法,使用重参数化,这种技术通过执行低秩近似来缩小可训练参数的集合。
- LoRA优点:
- 任务切换效率 - 创建模型的不同版本以适应特定任务变得更容易。你可以简单地存储预训练权重的单个副本,并构建许多小 LoRA 模块。当你从任务切换到任务时,你只替换矩阵 A 和 B,并保留 LLM。这显著减少了存储需求。
- 需要更少的 GPU - LoRA 将 GPU 内存需求减少了最多 3 倍,因为我们不计算/重新训练大多数参数。
- 高精度 - 在各种评估基准上,LoRA 的性能被证明几乎等同于全面微调 - 而且只需要一部分成本
- PEFT 相比全面微调的优势
- 更高效和更快的训练
- 保留预训练的知识
- 提示工程:改进模型输入以指导其输出。
- 在新数据集和任务上训练模型参数,使用所有预训练权重(如全面微调)或一组独立权重(如 LoRA)。
- 相比之下,提示工程根本不涉及训练网络权重
- 基础提示: 零样本提示、少样本提示、链式思考引导
- RAG(检索增强生成):将提示工程与数据库查询结合,以获得丰富的上下文答案。
- 将引导工程与从外部数据源检索上下文相结合,以提高语言模型的性能和相关性。通过在模型上附加额外信息,它允许更准确和上下文感知的响应。
- RAG模型架构将用户查询的嵌入与知识库向量中的embedding进行比较,将来自知识库中相似文档的相关上下文附加到原始用户提示中。然后将这个增强的prompt给到LLMs,可以异步更新知识库及其相关的embedding
- RAG 本质上将信息检索机制与文本生成模型相结合。信息检索组件有助于从数据库中拉取相关的上下文信息,并且文本生成模型使用这个添加的上下文来产生更准确和“知识丰富”的响应。以下是它的工作方式:
- 向量数据库:实施 RAG 包括嵌入内部数据集,从中创建向量,并将它们存储在向量数据库中。
- 用户查询:RAG 从提示中获取用户查询,这是一个需要回答或完成的自然语言问题或陈述。
- 检索组件:一旦接收到用户查询,检索组件扫描向量数据库以识别与查询语义相似的信息块。然后使用这些相关片段为 LLM 提供额外上下文,使其能够生成更准确和上下文感知的响应。
- 串联:将检索到的文档与原始查询串联成一个提供生成响应所需额外上下文的提示。
- 文本生成:将包含串联查询和检索文档的提示馈送到 LLM 以产生最终输出。
- 开源应用框架:
- Creating a RAG Pipeline with LangChainPermalink, 中文版
- RAG 有许多明显的优点:
- 最小化幻觉 - 当模型做出“最佳猜测”假设,本质上填补了它“不知道”的内容时,输出可能是错误的或纯粹的胡说八道。与简单的提示工程相比,RAG 产生的结果更准确,幻觉的机会更低。
- 易于适应新数据 - RAG 可以在事实可能随时间演变的情况下进行适应,使其对生成需要最新信息的响应非常有用。
- 可解释 - 使用 RAG,可以确定 LLM 答案的来源。对答案来源进行追溯对于内部监控、质量保证或处理客户纠纷可能是有益的。
- 成本有效 - 与在特定任务数据集上对整个模型进行微调相比,你可以使用 RAG 获得相当的结果,这涉及到更少的标记数据和计算资源。
- RAG 的潜在限制
- RAG 旨在通过从外部文档中提取上下文来增强 LLM 的信息检索能力。然而,在某些使用案例中,额外的上下文还不够。如果一个预训练的 LLM 在总结财务数据或从患者的医疗文档中提取见解方面遇到困难,很难看出以单个文档形式提供额外上下文如何有所帮助。在这种情况下,微调更有可能产生期望的输出。
improving-llms, 3 of the most common methods for improving the performance of any LLM:
- Prompt Engineering
- Retrieval Augmented Generation (RAG)
- Parameter Efficient Fine-Tuning (PEFT)
四个重要指标上进行比较:复杂性、成本、准确性和灵活性。
- 成本: PE < RAG < PEFT < Full Fine-tuning
- 复杂性:PE < RAG < PEFT = Full Fine-tuning
- 准确性:
- 特定领域术语:PE < RAG < PEFT < Full Fine-tuning
- 时效性:PEFT = Full Fine-tuning < PE < RAG
- 可解释性:PE = PEFT = Full Fine-tuning < RAG
- 幻觉: PE < PEFT < Full Fine-tuning < RAG
- 微调可以通过将 LLM 集中在特定领域数据上来减少这些幻觉。然而,不熟悉的查询仍然可能导致 LLM 编造出一个捏造出来的答案。
- RAG 通过将 LLM 的响应锚定在检索到的文档中来减少幻觉。初始检索步骤本质上进行事实检查,而随后生成受限于检索数据的上下文。对于避免幻觉至关重要的任务,推荐使用 RAG。
- 总结
- 解释性、时效性和避免幻觉至关重要 → RAG
- 要求特定领域风格 → 全面微调 和 PEFT
- 两者都要 → 微调 和 RAG
- 灵活性: Full Fine-tuning < PEFT < PE < RAG
PE vs finetune
【2023-11-30】Prompt Engineering 完胜 Fine-tuning:通用(且强大)的LLM通过prompt即可超越精调的LLM
- 微软研究,通过优化提示词,让GPT-4在医学领域完胜Med-PaLM 2(用医学数据精调的LLM)
- 通用且强大的LLM,能胜任各个领域的任务,比普通但在指定领域精调的LLM更强
- 【2023-11-18】论文: Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine
【2023-9-27】RAG 与 Finetuning,谁是提升 LLM 的最佳工具?
RAG vs finetune
RAG最直接的优势:
- 让大模型利用自身逻辑推导能力,去理解企业私有数据,实现问答能力的拓展。
但是如果给大模型喂企业私有数据做模型微调,也能实现同样的效果,为什么还要用RAG呢? 看场景:
- 第一:私有数据存在一定频率动态更新;
- 第二:要引用原文;
- 第三:硬件资源(GPU)不足(即使用RAG也需要微调,但一次微调处处可用,远比每个企业私有库微调一个模型成本低的多);
这些场景下,用RAG更合适一些。
作者:瀚海方舟
分析
- 微调在特定任务上训练模型,就像在问题解答数据集上微调 GPT-3.5 以提高其在特定数据集上的问题解答性能一样。
判断
- 如果数据集足够大而且不会变,那么采用微调。
- 如果数据集动态变化,需要不断重新训练模型,以跟上变化。
- 如果没有大型数据集,不建议微调。建议用 RAG 来提高 LLM 的性能。同样,也可用 RAG 来提高 LLM 在摘要、翻译等任务上的性能,因为这些任务可能无法进行微调。
这两种方法都获得类似结果,但在复杂性、成本和质量方面有所不同。
RAG更简单、便宜,但质量可能不匹配。
但这两种方案不是实现相同结果的两个方案,而是正交,满足LLM应用的不同需求。
RAG 和 微调之间的细微差别跨越了模型架构、数据需求、计算复杂性等。忽略这些细节可能会破坏项目时间轴和预算。
如何选择?
- 访问外部数据源?是 → RAG 更有效、容易扩展
- 非常适合需要查询数据库、文档或其他结构化/非结构化数据存储库的应用
- 微调需要大量标注数据集,数据更新时,模型更新不及时
- 微调过程没有对查询外部知识的检索和推理步骤进行建模。
- 修改模型行为、风格、领域知识?是 → 微调
- 微调擅长将LLM行为适配到特定细微差别、语调或术语,如 医学专业人士、以诗意的风格写作,或者使用特定行业的行话
- RAG虽然善于整合外部知识,但主要侧重信息检索,不会根据检索信息调整其语言风格或领域特异性
- 抑制幻觉重要吗?是 → RAG
- RAG 相对 微调 不容易产生幻觉,检索机制相当于事实检查器
- 监督语料多吗?是 → 微调,否则 RAG
- 微调依赖有标签数据的数量和质量,数据不足会过拟合
- 数据会变化吗?是 → RAG
- 如果数据经常更新,模型容易过时,而重新训练耗时耗力,增加评估成本
- RAG 检索机制不断查询外部资源,保持最新,知识库/数据源更新时,RAG无缝集成,保持相关性,不用频繁训练
- 要求可解释吗?如果要求较高的透明性+可解释性 → RAG
- LLM 原理像黑盒,推理机制不明,难以解释为什么
- RAG 透明性相对较高,检索+生成,用户可以洞察全过程
维度 | 解释 | RAG |
FineTune |
---|---|---|---|
External knowledge read? | 访问外部数据? | ✅ | ❌ |
Changing model behaviour read? | 改变模型行为? | ❌ | ✅ |
Minimise hallucinations? | 幻觉最小化? | ✅ | ❌ |
Training data availiable? | 较多训练数据? | ❌ | ✅ |
Is data (mostly) dynamic? | 数据动态变化? | ✅ | ❌ |
Interpretability | 要求可解释? | ✅ | ❌ |
建议:
- 从RAG开始,评估其性能,如果发现不足,则转向微调。
- 最佳选择: 自动化,混合方法
- 微调确保聊天机器人符合公司的品牌、语调和一般知识,处理大多数典型的客户查询。
- RAG可以作为一个补充系统,处理更动态或更具体的查询,确保聊天机器人能够从最新的公司文档或数据库中获取信息,从而最大限度地减少幻觉。
- 整合这两种方法,公司可以提供全面、及时且与品牌一致的客户支持体验。
(1) PE 提示工程
提示工程:改进模型输入以指导其输出。
- 在新数据集和任务上训练模型参数,使用所有预训练权重(如全面微调)或一组独立权重(如 LoRA)。
- 相比之下,提示工程根本不涉及训练网络权重
- 基础提示: 零样本提示、少样本提示、链式思考引导
提示工程是与大型语言模型交流的基础方法,类似于给出指令。
它帮助向模型明确所需信息类型,即学习如何准确提问以获取最佳答案。然而,这种方法有其局限,因为模型只能基于其训练数据来响应。
分析
- 优点:
- 易用性:用户友好,不需要高级技术知识。
- 成本效率:使用预训练模型降低了计算成本。
- 灵活性:可以通过调整提示快速得到不同结果,无需重新训练模型。
- 缺点:
- 不稳定性:模型响应的质量和相关性取决于提示的质量。
- 定制限制:定制响应的能力受限于创建有效提示的能力。
- 知识限制:输出受限于模型初始训练时所学的内容,难以提供最新的或高度专业化的信息。
(2) RAG 检索增强生成
检索增强生成(RAG)结合了语言模型与知识库的功能。当模型需要回答问题时,它先从知识库中检索相关信息,再根据这些信息来作答。这就像模型查阅资料库以确保答案的准确性。
RAG适合需要最新信息或超出模型原有知识范围的情况。它的成本和设置介于简单提示和全面微调之间,有助于提供新颖且详细的答案。不过,RAG同样需要额外工具和信息支持。
RAG系统的性能依赖于向量数据库,如MyScale,这是一种成本较低但性能较高的解决方案。MyScale不仅费用更低,而且性能更优,并且可以通过简单的SQL语法访问,方便开发者使用。
分析
- 优点:
- 动态信息:可提供最新且相关的信息。
- 平衡性:在提示工程的简便与微调的精准之间找到了平衡。
- 上下文相关:增加上下文信息,提升回答的深度和洞察力。
- 缺点:
- 复杂性:需要整合语言模型与检索系统。
- 资源需求:尽管比微调需求少,但仍需较大计算资源。
- 数据依赖:输出质量依赖于检索信息的准确性和相关性。
详见站内专题: 检索增强生成 RAG
(3) PEFT 参数高效微调
微调是更新和特化语言模型的过程,就像为手机应用添加新功能。这需要给模型提供大量新数据并花费时间让其学习,如同送模型回学校进修。
虽然微调耗资且耗时,但如果需要模型深入了解特定主题,则值得这样做。微调后,模型能提供更精确的答案。
分析
- 优点:
- 定制化:能高度定制,使模型适应特定领域或风格。
- 准确性:在特定数据集上训练,生成更准确的响应。
- 适应性:能处理特定领域或原始训练中未覆盖的新信息。
- 缺点:
- 高成本:需要大量计算资源,费用高于简单提示。
- 技术门槛:要求具备机器学习和模型架构的专业知识。
- 数据需求:需要大量高质量的数据集,获取困难。
详见站内专题: 参考高效微调 PEFT
(4) 全量微调
全面微调:使用任务特定数据调整LLM的所有参数。
- 一个较小、任务特定、带标签的数据集上进行微调,调整一些模型参数,优化其对特定任务或一组任务的性能
- 全面微调: 所有模型参数都被更新,使其类似于预训练,只不过是在一个带标签且规模较小的数据集上进行。
- 优点: 训练数据集更少、提高精度、增加鲁棒性
- 缺点: 高计算成本、内存需求高、时间/专业知识密集
(5) 混合
LoRAMoE
【2024-3-8】LoRAMoE: 把MoE用到Lora上 复旦大学,2024年3月8号 publish 论文
MoE: 稀疏门控制的专家混合层介绍过MoE,在LoRA: 大语言模型的低秩适应介绍过Lora。这篇论文把MoE用到了Lora上。
动机
- 微调阶段的数据过多时,会让模型忘掉很多世界知识。
LoRA+MoE
- 做法很直接,在FFN层上,加了很多Lora分支,轻量级的expert。
- LoRAMoE 给不同的lora分支做分流时,加入了类型约束,即世界知识相关的任务,分到一组experts中,非世界知识相关的任务,分到剩下的experts中。
- 图见原文
ReFT
【2024-4-13】ReFT:比现有PEFT微调更好的方法
斯坦福发表微调的论文
- 《ReFT: Representation Finetuning for Language Models》
- 一种新的语言模型微调方法——表示微调(ReFT)
- 该方法解决大型语言模型(LMs)微调成本高的问题,通过冻结基础模型上学习任务特定的隐藏表示干预来适应新任务。
ReFT通过定义一个干预函数,修改模型的一小部分表示,而不是修改权重,以此来控制模型的行为。
作为ReFT家族的一个强实例,Low-rank Linear Subspace ReFT(LoReFT
)在低秩线性子空间中干预隐藏表示,比以往的参数高效微调(PEFT)方法更加高效。
- LoReFT通过在低秩投影矩阵定义的子空间内对隐藏表示进行编辑,学习如何通过干预引导模型进行准确预测。
- LoReFT在多个标准基准测试中进行评估,包括常识推理、算术推理、指令遵循和自然语言理解任务。
- LoReFT在上述多个基准测试中展示了出色的性能,LoReFT在保持与现有PEFTs相同或更好性能的同时,使用的参数比先前最先进的PEFTs少10倍至50倍。
RAFT
【2024-3-15】UC Berkeley 提出新方法 RAFT
= RAG
+ FT
- RAFT——针对特定领域的问答的微调和 RAG 方法
- 介绍 UC伯克利:提出索增强微调(RAFT),只需少量微调,就能大幅提升模型领域QA能力
- 论文: RAFT: Adapting Language Model to Domain Specific RAG
- 代码 gorilla
将LLMs适应特定领域时两个候选方案:
- 1、通过RAG利用上下文学习
- 2、有监督的微调
分析: 当前微调方法要么测试期间不利用文档,要么忽略训练期间检索中的不完美之处。
- RAG允许模型回答问题时参考文档,但错过了从固定领域设置中学习和提前访问测试文档的机会。
- 有监督微调允许从文档中学习更广泛的模式,更好地与终端任务和用户偏好对齐。
因此,RAFT 将微调与RAG结合起来。通过RAFT,在有监督的情况下,可以为微调收集最佳结果。
- 同时具备 闭卷考试 + 开卷考试的能力
RAFT 与标准微调不同,训练数据包含相关和不相关文档问题,以及从相关文本得出的思想链式答案。
- 该方法旨在提高模型不仅回忆信息的能力,而且还提高内容中推理和得出答案的能力。
工具调用上超过GPT-4
- Gorilla: Large Language Model Connected with Massive APIs
- 论文: Gorilla: Large Language Model Connected with Massive APIs
评测
- RAFT 始终优于基线,例如使用和不使用 RAG 的特定领域微调,以及使用 RAG 的 GPT-3.5 等更大的模型。
- HuggingFace 数据集上,RAFT 的准确率达到了 74%,比特定领域微调 (DSF) 显着提高了 31.41%,比带有 RAG 的 GPT-4 4.92 显着提高了 3.5%。
- HotpotQA 数据集上,与 DSF 相比,RAFT 的准确率提高了 28.9%。
RAFT 是一种适应LLMs的方法,用于从正面和负面文档集合中阅读解决方案。
这与标准的RAG设置形成对比,在标准的RAG设置中,模型是使用检索器输出进行训练的,包括记忆和阅读。
(6) Agent
LLM 落地应用并发挥作用需要手动构建并反复调试 Agentic Workflow
- 这个过程繁琐,一遍遍修改相似代码,调试 prompt,手动执行测试并观察效果,并且换个 LLM 可能就会失效,有高昂的人力成本。
- 许多公司甚至专职招聘 Prompt Engineer 来完成这一工作。
问题
- 人工介入初始设置,且无法全面捕捉到完成任务所需的工作流多样性。
Agentic Workflow
MetaGPT 开源了 AFLOW,用 MCTS 进行 Agentic Workflow 自动搜索,可以完全自动地构建与优化 Agentic Workflow 问题,不再需要手写代码、调试提示词。
AFLOW 通过蒙特卡洛树搜索优化工作流,极低成本实现 GPT-4o 级能力
- 选取了六个文本推理的任务,覆盖了代码(HumanEval, MBPP),数学(GSM8K, MATH),知识问答(HotpotQA, DROP)三个场景。
- 相比现有手动方法平均提升 5.7%,较其他自动化方法更是提升了 19.5%。在所有六个任务中,AFLOW 展现出全面的领先优势,证明了其在不同任务类型上的稳定性和适应性。
对提示词自动优化的进一步探索,通过蒙特卡洛树搜索
,完全接管了 Agentic Workflow 生成与优化过程,表现远超其他工作流自动优化工作,甚至超越了对比的所有手工工作流基线。
AFLOW 通过将工作流定义为代码可表示的节点和边,从而有效地捕捉 LLMs 调用之间的复杂交互。通过引入操作符的概念,AFLOW 进一步简化了搜索空间,提高了搜索效率。在多个基准数据集上的实验结果表明,AFLOW 能够自动发现和优化工作流,显著提高了任务执行的性能,同时减少了对人工干预的依赖。
自动化工作流优化的目标
- 在给定任务 T 和评估函数 G 的情况下,发现一个工作流 W ,使得 G(W,T) 最大化。
- 搜索过程,其中算法 A 探索搜索空间 S 来确定最优的工作流配置。搜索空间 S 包括所有可能的节点参数和边结构的配置。
AFLOW 首先将工作流优化问题重新构建为一个搜索问题,其中工作流被表示为代码化的节点序列,每个节点代表 LLM 的一个具体操作,节点之间的边定义了操作的逻辑、依赖关系和执行流程。这种表示方法将工作流转化为一个可以搜索和优化的图结构。
MCTS 的四个主要步骤进行迭代:选择(Selection)、扩展(Expansion)、评估(Evaluation)和反向传播(Backpropagation)。
- 选择阶段 AFLOW 使用软混合概率选择机制来选择一个节点进行扩展。这种机制结合了均匀概率分布和基于分数的加权概率分布,以平衡探索和利用,避免陷入局部最优解。选择过程中,AFLOW 会考虑候选节点的得分和探索的需要,从而选择一个既有可能带来性能提升又具有探索价值的节点。
- 扩展阶段 AFLOW 使用 LLM 作为优化器来生成新的工作流。优化器利用选定工作流的经验来生成新的提示或通过修改代码来改变节点连接,从而产生新的工作流变体。这些新的工作流变体是通过对现有工作流的微小调整来实现的,例如添加、修改或删除节点和边。
- 评估阶段 AFLOW 直接执行生成的工作流以获得反馈。由于推理任务具有明确的评估函数,AFLOW 可以通过在验证集上多次运行工作流来计算平均分和标准差,从而获得更准确的优化器反馈。
- 反向传播阶段 工作流的性能信息被反向传播到 MCTS 的树结构中,用于更新节点的得分,并指导未来的搜索迭代。这些信息包括工作流的执行结果和相对于其父工作流的优化成功与否。通过这种方式,AFLOW 能够从每次迭代中学习,并逐渐改进工作流的性能。
为了避免在优化达到极限后继续执行的不必要成本,当连续几轮中分数优先的前 k 个工作流没有改进时,AFLOW 将停止上述迭代过程。
应用经验
方法选择
- 大模型应用:先看大模型是否能实现,然后再考虑小模型加速;
- 简单链路保证性能,复杂链路保证效果
GPT 使用方法
OpenAI 的接口名就叫「completion」,也证明了其只会「生成」的本质。
技术架构总结
【2023-11-23】参考
类型 | 说明 | 图解 |
---|---|---|
纯prompt | 一问一答 | |
Agent + Function Calling | Agent:AI 主动提要求 Function Calling:AI 要求执行某个函数 场景举例:你问过年去哪玩,ta 先反问你有几天假 |
|
Embeddings + 向量数据库 | Embeddings:把文字转换为更易于相似度计算的编码。这种编码叫向量 向量数据库:把向量存起来,方便查找 向量搜索:根据输入向量,找到最相似的向量 场景举例:考试时,看到一道题,到书上找相关内容,再结合题目组成答案。然后,就都忘了 |
|
Fine-tuning | 模型微调 |