最优化大模型效果的方向和思考

578 阅读8分钟

当我们探讨如何优化大模型输出效果时,实际上是在思考如何更有效地利用其能力来解决现实问题。

提示词工程

通常来说,通过改进提示词策略可以显著提升模型的表现。例如,编写更加清晰和结构化的提示词、使用少样本提示和思维链等策略。对于复杂问题,我们可以通过拆分问题、设计专门化提示词并多次调用的方式来解决,甚至可以借助模型的规划能力,通过 ReAct(推理+行动)、自我反思、工具调用或者构建 Agent 等方式让模型自主规划和协作。

提示词工程因其效果显著且成本低,常成为优化模型效果的首选方法。然而,提示词工程并非万能,其能力边界受限于模型本身。一方面,大模型的预训练成本高昂且时间长,数据来源于公开数据集(主要包括网页、图书和维基百科等),导致其在推理私有数据和近期数据时效果不佳。另一方面,模型在 SFT(监督微调)阶段往往以适应通用领域的任务为目标,可能无法满足特定领域的任务要求。

在这种情况下,我们可以考虑使用 RAG(检索增强生成)和微调来增强模型的效果。

RAG

RAG 通过在生成过程中添加额外的信息来增强模型的输出效果。最简单的 RAG 系统通常预先构建一个向量数据库,将文档以片段形式保存在数据库中。在生成回答前,RAG 会根据用户的问题检索出最相关的文档片段,并将其添加到提示词中,使大模型获得额外的知识。

以询问大模型今天杭州的天气为例,如果没有额外的信息,模型可能会回答不知道,甚至煞有介事地胡乱给出一个答案(即模型的幻觉问题)。但如果提示词中包含当天的天气信息,模型就能基于此信息提供准确的回答。这就是 RAG 的过程和作用,让模型了解其未知的信息。

然而,没有免费午餐定理告诉我们,解决一个问题往往需要付出更多的代价。首先,RAG 的效果直接来源于文本的质量,因此需要尽可能优化数据索引、存储和检索过程,并建立复杂的 RAG 系统来提升模型的生成效果。尤其是在生产场景中,面对海量、半结构化的数据和各种能力水平的用户与需求,需要花费大量精力优化 RAG 系统。

其次,大量参考文本会增加 token 调用,带来更高的成本,并拖慢模型的响应速度。在移动互联网时代,响应速度对于用户体验至关重要。无论生成结果多么精妙,过长的生成时间会损害用户体验。如果单轮回答无法满足用户需求,也会对产品的用户体验带来致命打击。

微调(FT)

相比 RAG 来说对模型进行微调则直接很多,但也更复杂、成本更高。微调通过将新知识压缩进模型参数,模型可以学习新知识,并在特定任务上表现更佳。

为了模型微调,首先我们需要建立高质量的微调数据集,数据通常为问答对的形式。例如:

Question:火箭迟早要上天,为什么不在天上发射?
Answer:通常来说,在发射前,火箭会被竖直地立在发射架上,而不是在天上,那是因为,空气浮力带来的升力无法支撑它的重量。但是,如果是很小很轻的火箭,也可以由气球或飞机事先带到天上发射,这种技术还在研究中。
——《弱智吧数据集》

数据集的质量直接影响微调效果,因此需要专家花费大量时间来收集、整理和注释,通常准备数据集会占据 70% 以上的工作量。当数据准备妥善,就可以开始模型微调。模型的微调是一个复杂的过程,在机器学习领域有一个非常形象的词叫做“炼丹”,需要我们不断尝试各种超参数、处理各式各样的问题,历经一个漫长的试错过程才有可能获得一个相对理想的结果。

但是好在已有许多工具和服务可以帮助完成微调尝试。

例如,可以使用 OpenAI 的 API 微调 GPT-3.5-Turbo 模型,或使用阿里云 PAI 平台对 Qwen 系列模型进行微调。

如果我们有足够的资源,也可以选择使用 LLaMA-Factory 等框架在本地微调模型,只是这需要大量成本。哪怕是 7B 参数量的小模型,也至少需要一张 24G 显存的 4090 才能进行 LoRA 微调,而效果最佳的全参微调则需要 A100 或多张 4090 并行计算。对于 34B、80B 甚至 100B+ 的大模型,微调所需的计算资源更加庞大。

此外,微调可能导致模型能力退化和知识遗忘,表现为在通用任务上的性能下降和预训练知识的遗忘。这需要在微调过程中采用各种手段来避免或减轻这些问题。

如何最优化大模型

RAG 和微调并非是两条非此即彼的路线,而是模型效果优化的两个方向:优化模型本身和优化上下文内容。在实际工作中,我们往往结合使用这两种技术,从提示词工程开始,根据目标和遇到的问题因地制宜地应用 RAG 或微调来优化大模型的效果。

例如,OpenAI 在 2023 年 11 月的一次演讲中分享了一个典型的优化路径:

  1. 使用简单提示建立基准,以便于监控后续优化的效果。
  2. 从提示词工程开始,通过各种提示策略提升模型效果,例如少样本提示或思维链。
  3. 在实际产品中,需要动态引用提示词、提示样本或知识,这就需要使用 RAG 优化模型上下文。
  4. 如果模型输出格式不稳定或风格不满足需求,需要对模型进行微调。
  5. 如果检索结果质量制约最终提示效果,需要采用更好的 RAG 策略解决问题,例如 HyDE 等。
  6. 最后,可以使用 RAG 知识库建立数据集微调模型,将知识压缩到模型参数内,进一步提升模型能力和效果。

这是一个非常具有启发性案例,对于大多数的工作可以参考这些内容。当然,最重要的是明确目标,解决当下最重要的问题,因地制宜地迭代与优化。


以下是一些我的思考。

1. 从优化提示词开始

一些提示策略在提高模型性能方面总是非常有效,例如:小样本提示、思维链、上下问题学习等,这可以为我们的工作提供一个良好的基础。通过这些手段,我们会发现一些哪怕精心设计提示词也难以解决的问题,这就是未来我们要优化的方向。

2. 建立基准,并持续评估

在工作的最开始,就应该找到多个与目标场景相吻合的指标,来衡量大模型的输出效果,并建立基准和目标。基准有助于我们评估每一项优化措施所带来的效果,以及衡量我们工作与最终目标直接还有多少差距。

3. 逐步迭代,解决最紧要的问题

模型的优化是一个不断尝试和迭代的过程。每一次迭代都要集中精力解决当下最制约效果的问题,通过快速冲刺不断逼近目标。

4. 重视 RAG 和外围组件的建设,如无必要不要微调

在最小的成本下,持续交付最大的价值是最重要的事儿。微调是非常耗时、耗力和耗费成本的一项工作,结果具有不确定性。模型的迭代速度也很快(至少在当下),每隔一段时间就有新的 SOTA 诞生,如果要切换模型就必须重新微调。我们更应该将重心更多地放在模型的外围组件的建设上,例如 RAG、数据库、外部工具和工作流等。 如无必要,不要微调。

OK,非常感谢你的观看,我是 Hyde,我们下次见。