专栏名称: 数据派THU
本订阅号是“THU数据派”的姊妹账号,致力于传播大数据价值、培养数据思维。
目录
相关文章推荐
大数据分析和人工智能  ·  10万字、近20家企业BI智能分析决策合集 ·  2 天前  
数据派THU  ·  权威期刊Cell ... ·  4 天前  
51好读  ›  专栏  ›  数据派THU

原创 | 大模型扫盲系列——模型优化实践从OpenAI到个人专属-Prompt 工程优化技巧( 上)

数据派THU  · 公众号  · 大数据  · 2024-10-14 17:00

正文

作者:金一鸣

本文约4000字,建议阅读8分钟

本文介绍优化大模型效果的大利器,从而帮助读者在实战中高效地选择技术方案来优化模型效果。


上一篇文章大模型扫盲系列——大模型实用技术介绍(上)中谈到实用的大模型核心技术,这篇承接实战相关的主题,介绍优化大模型效果的大利器,从而帮助读者在实战中高效地选择技术方案来优化模型效果。


首先,在技术方面,笔者更关注如何得到一个效果更好的LLM解决方案。在去年的OpenAI的DevDay上,开放了闭门会上分享精进大模型效果的视频(https://youtu.be/ahnGLM-RC1Y?si=tNrLOHqCHnYOdMaa),从这个视频分享中,可以清晰地看到整个行业在大模型落地应用技术层面的改进方向,如图1 所示。

 

图1 大模型落地应用技术层面的改进方向


通过图1总结一下该分享的内容:


1、通过“提示工程”快速构建基础步骤,作为目标任务效果的基线。

2、优化模型效果,主要通过RAG(从上下文角度出发)以及Fine-tuning(从模型角度出发)进行优化,两种方式各有优劣,根据具体情况选择,可以任一一种或者两种都使用。


视频中可以得到一条很清晰的迭代思路:在具体场景中应用大模型解决问题时,最开始应该从Prompt Engineering入手,使用各种prompt技巧,快速迭代得到一个较好的基线效果,当出现效果瓶颈时,从错误的case入手,考虑是否需要使用RAG来引入一些外部知识进行知识补充,或者是通过指令微调(Instruction Finetuning)的方式让模型在当前任务上进行高效迭代。


另外,除了这两种方式,在优化方向上也可以从数据,强化学习(RL)角度进行迭代,LLM目前在这些方面的探索技术也有很多,后续作为优化效果的重点方向统一总结。


1. Prompt原理


视频中再一次提到了优化prompt技术的重要性,它是改进模型效果最简单也是最高效的技巧,一开始可以通过尝试利用prompt方式提升baseline效果,这种方式比finetune,RAG等要方便很多,迭代的效率也会高很多。很多人可能会好奇为什么调试提示词会对模型效果有这么大的改善,这里从prompt原理角度出发,解释一下为什么prompt会使得大模型获得更优的效果。


对于大型语言模型,无论是现在主流的Causal LM类还是prefixLM类的模型,都是通过自注意力机制(self-attention)学习输入序列的内部表示。当向模型提供一个prompt时,该prompt激活了特定的内部表示路径。已经在预训练过程中通过大量数据学习到了这些路径,并且与prompt中的词汇、结构或语境相关联。因此,一个好的prompt有助于将模型的注意力引导到与任务相关的表示上。


另外,从统计学角度来看,prompt优化本质就是最大化联合概率,模型试图最大化给定前文(prompt)条件下,生成正确下文(response)的概率。良好的prompt提供清晰、相关的上下文信息,使得模型能够更准确地估计这些条件概率,因此生成更准确、更相关的输出。

 


从信息熵角度看,prompt优化其实就是降低信息熵的过程,一个好的prompt可以降低模型在生成回答时面临的不确定性。良好的prompt通过提供充足的上下文信息,限制了模型在生成回答时可能探索的路径数量,使模型更有可能生成高质量且相关的回答。

 


2. Prompt优化方向


在前面系列文章中,已经简单提到prompt相关介绍,这里还是总结一下在实战中对调优效果比较有效的几个方法:


2.1. Prompt撰写思路


针对prompt分步骤编写,主要包含以下任意要素:


  • 任务指令:明确要求模型执行的具体操作或任务。

  • 上下文:提供外部数据或额外的上下文,帮助模型更准确地理解并回应。

  • 输入数据:用户提供的内容或问题。

  • 输出指示:明确规定所需的输出类型或格式(如json格式等)。


写prompt的通用技巧则可以根据下面的思路来进行:


1. 从简单开始:提示设计是一个需要反复实验和优化的过程。建议从简单的提示入手,然后逐步添加更多元素和上下文,以获得更优的结果。

2. 任务指令:可以通过指令让模型执行各种简单任务,如“提取”、“分类”、“总结”、“判断”等,这些指令可以帮助设计出有效的提示应对不同任务。

3. 完整性:对希望模型完成的任务,指令越具体、详细,结果往往越理想。在提示中加入示例特别有效,这有助于按照特定格式获得期望的输出。

4. 明确指示:在设计提示时,最好直接说明要模型执行的操作,而不是告诉它不该做什么,避免模糊提示。


2.2. Prompt进阶技巧


“XoT”系列:(https://arxiv.org/pdf/2311.04254)

 

图2 “XoT”系列 Prompt 进阶技巧


“XoT”是指thought prompting相关的技术,这些prompt方法在解决复杂推理问题上会有比较显著的效果,通过最近发表的XoT来一起总结一下这个系列各个方法的核心思想。


CoT (Chain-of-thought):


该方法的核心思路就是拆解步骤,通过对一个复杂问题,比如数学问题,常识推理问题等进行拆解推理,将需要多步骤才能得到结果的推理过程也让大模型输出,最后通过一步一步推理得到最后的结果,最典型的语句就是提示让大模型逐步思考(Let's think step by step)。


CoT-SC(Self-consistency CoT):


该方法是在CoT基础上增加Self-consistency的思想,这个思想也出自CoT作者合作的一篇文章(https://arxiv.org/pdf/2203.11171),明确给出了在CoT中加入Self-consistency能明显提升大模型在推理问题上的效果。核心思路是多数投票来选出最优结果,使用 CoT 的多个实例来让 LLM 生成多个输出,然后从多个 LLM 输出中选择最佳结果,与 vanilla CoT 相比,它提供了更稳定和置信的推理结果。


ToT:https://arxiv.org/pdf/2305.10601

利用树结构的方式把各路思考方式组织起来,并利用搜索算法(例如广度优先搜索、深度优先搜索)来扩展树以寻求最佳解决方案。ToT 中的思想评估依赖于 LLM 本身,因此需要多次调用LLM 推理,现在比较好的使用方式也是大多和Agent调用方式结合。一种比较简单的用法就是在prompts中写直接让大模型跟进ToT思想推理,比如Imagine three different experts are answering this question。


GoT:https://arxiv.org/pdf/2308.09687


这个方式则是在树结构的基础上更进一步,利用图的范式进行思考方式的组织,通过在中间搜索阶段通过思维聚合和细化来生成类似图形的思维结构。建模的核心是将 LLM 生成的信息建模为任意图(arbitrary graph),其中信息单元(LLM Thoughts)是顶点,边对应于这些顶点之间的依赖关系。这种方法可以将任意的 LLM 思维组合成协同结果,提炼整个思维网络的精髓,或使用反馈循环增强思维。


XoT(EVERYTHING OF THOUGHTS):

https://arxiv.org/pdf/2311.04254


最新的XoT是一个 LLM-MCTS 协作框架,旨在增强思维生成过程,从而帮助 LLM 解决复杂问题。它利用 蒙特卡罗树搜索(MCTS) 进行熟练和高效的思维探索,同时利用 LLM 的能力来完善和修改从 MCTS 中得出的思想。这种协同作用创造了一种互惠互利的安排,最终能够成功解决具有高性能、效率和灵活性的复杂问题,这篇文章中也比较了其他oT类方法和XoT在计算24点游戏任务上的实验效果,可以看到效果还是远远好于其他方法,这里还有一个有意思的点是也比较了微调在这个任务上的效果,可以看到准确率是非常低的,只有2.19%,在这个实验说明finetune的方式在这种复杂推理任务上的效果可能不如MCTS + RL的方式。不同模型性能比对如图3所示。

 

图3 不同模型性能比对


重点介绍一下核心的MCTS搜索获取最佳思路的工作原理,下文讲到现在其他方向也会利用MCTS来寻找最佳结果,比如MCTS和RL结合的训练(https://arxiv.org/pdf/2406.03816),MCTS和Agent结合寻找最佳路径(https://arxiv.org/pdf/2307.13453)还有最近很火的multiQ项目也用了MCTS方法(https://multion-research.s3.us-east-2.amazonaws.com/AgentQ.pdf)。本质思路都是类似的,在这里借用这个场景说明该算法原理:

  • 初始化:构建一棵树,树的根节点代表初始状态,每个节点代表一种可能的状态。在开始时,树只有一个节点,即根节点。

  • 选择(selection):从根节点开始,通过选择具有最高价值的子节点逐层向下移动。选择的算法使用PUCT算法来选择子节点,通过最大化UCB(Upper Confidence Bound)来进行算法训练迭代。公式如下:

 


其中:Q(s,a)是动作 a 在状态 s 下的估计价值(平均奖励),值越大说明当前action价值也大。N(s)是状态 s 的访问次数。N(s,a)是从状态 s 采取动作 a 的访问次数。c是控制探索与利用平衡的常数。


选择过程重复进行,直到到达一个叶节点,即没有完全展开的节点。


  • 评估与拓展(Evaluation and Expansion):当到达叶节点时,如果该节点表示的状态不是终止状态(即游戏或决策过程未结束),则对该节点进行扩展。从该节点中选择一个未被访问过的动作,将其应用到当前状态,生成一个新的子节点。新的子节点代表新的状态,并被添加到树中。

  • 模拟(Simulation):从新扩展的节点开始,进行一次完整的模拟(也称为“随机游戏”或“随机构造路径”),直到到达终止状态。模拟可以通过随机选择动作或应用简单的策略来进行,其结果用于估计从当前节点开始的策略的效果,通常是通过奖励来衡量。

  • 反向传播(Backpropagation):将模拟结果(即奖励)从新扩展的节点向上传递回根节点。在反向传播的过程中,更新所有经过节点的统计信息包含:更新节点的访问次数 N(s);更新节点的动作价值 Q(s,a),通常是基于累计的奖励的平均值。

  • 策略网络(Policy Network)和价值网络(Value Network)训练:该算法重点步骤就是训练这两种网络,类似强化学习的训练方式,策略网络用于预测在当前状态下采取每个可能动作的概率,从而指导MCTS在扩展和选择节点时更具策略性。而价值网络用于估计当前状态的价值(即预期的未来回报),从而减少不必要的模拟次数,提高搜索效率。这两部分的损失函数可以描述为:

 


其中:v(s)表示模拟得到的真实回报,(s)是价值网络的预测值,π(a|s)则是基于MCTS的访问次数分布的目标策略,(a|s)为策略网络预测的动作 a 在状态 s 下的概率。


对于value network通过最小化价值预测 (s)与真实回报v(s)之间的均方误差来训练价值网络。对于policy network则是通过最大化输出的动作概率 (a|s)与MCTS中动作实际发生频率的对数似然,训练策略网络。


整体训练流程大致如下:随机初始化策略网络和价值网络的参数θ,使用初始网络执行MCTS,在每次模拟过程中生成新的状态-动作-回报对,并记录到训练数据集中,然后使用收集到的模拟数据,应用梯度下降法更新网络参数θ,不断进行MCTS模拟和网络训练,使得策略网络和价值网络逐渐逼近真实的策略和状态价值。直到损失函数不再显著下降,或者策略和价值的估计达到满意的精度时,停止训练。


总而言之,MCTS+LLM的方式和现在热门的快慢思考的概念非常类似,最近发的LLM推理相关的文章也是借用这个概念。一次MCTS+LLM类似于快思考,而MCTS+LLM+搜索迭代的MCTS则就是慢思考,通过分步骤不断找到最佳的策略和价值。


编辑:于腾凯
校对:林亦霖

数据派研究部介绍




数据派研究部成立于2017年初,以兴趣为核心划分多个组别,各组既遵循研究部整体的知识分享实践项目规划,又各具特色:


算法模型组:积极组队参加kaggle等比赛,原创手把手教系列文章;

调研分析组:通过专访等方式调研大数据的应用,探索数据产品之美;

系统平台组:追踪大数据&人工智能系统平台技术前沿,对话专家;

自然语言处理组:重于实践,积极参加比赛及策划各类文本分析项目;

制造业大数据组:秉工业强国之梦,产学研政结合,挖掘数据价值;

数据可视化组:将信息与艺术融合,探索数据之美,学用可视化讲故事;

网络爬虫组:爬取网络信息,配合其他各组开发创意项目。


点击文末“阅读原文”,报名数据派研究部志愿者,总有一组适合你~



转载须知


如需转载,请在开篇显著位置注明作者和出处(转自:数据派THUID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

未经许可的转载以及改编者,我们将依法追究其法律责任。




关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。




新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU


点击“阅读原文”加入组织~