Medprompt: 用提示词策略让通用模型的表现超过精心微调的专用模型
微软前段时间发布了一篇博客,标题是「The Power of Prompting」,展示了如何用提示词策略,让通用模型超过精心微调过的模型的效果。例子用的是医学领域的数据集。
大语言模型的「黑盒」特性让提示词变得很好玩。我以为是用了什么魔法 prompt,兴冲冲地打开一看,靠,脑瓜子差点死机。就像 2G 内存的电脑打开了大型 3D 网游。
但打都打开了,起码也走两步吧。
Medprompt 效果见图一、图二。图三就是核心思路。
单从提示词技巧上来说,没有什么银弹,主要就是自生成思维链示例 (Self-generated CoT)、动态示例选择 (Dynamic few-shot selection) 、一致性交叉验证最终答案 (Self-consistency) 。整个思路值得学习。
一共可以分为三步:数据预处理、推理阶段动态选择 5 个相关示例、从 5 个答案中选数量占优的作为最终答案。
------------
数据预处理阶段
------------
将数据集中的所有问题进行向量化处理,同时使用 CoT 对每个问题生成推理过程和答案。然后将生成的答案与标准答案 (ground truth label) 对比,如果答案是对的,就把这些自动生成的向量数据、推理过程和答案都保存下来。
我的理解是,这一步主要是为了给问题增加更详细的推理过程数据,以便提升接下来的 Few-shot 效果。
这些推理过程数据如果全部要人工来做,工作量很大。用上述自生成思维链示例 (Self-generated CoT) 就可以让模型自动完成。
------------
动态选择 5 个相关示例
------------
这一步也是核心步骤。
我们知道,给模型提供例子 (one/few shot) 能提升回复效果。例子与问题相关度越高,效果通常会更好。
在第一步里,已经有了一个向量化的问答数据集,并且有详细的推理步骤。
这一步就是从上述向量数据集里找 5 个与查询问题最相关的例子。具体是先把查询的问题向量化,然后用基于 KNN (最近相邻算法) 的向量查询算法从向量数据集里查询。
简单说 (再复杂我也说不了),就是计算向量之间的相似性,来从第一步的数据集里找出与要解答的问题相似度最高的 5 个例子。
然后,我们将这 5 个问题、推理链和答案作为新问题的上下文信息,准备让模型生成答案。
------------
最终答案生成
------------
这一步,使用查询出来的例子,对要查询的问题进行多次答案生成,并且每次都随机改变答案选项的顺序,以减小模型可能对某个选项的偏好倾向 (比如更倾向选 C)。
最后根据生成的多个答案,通过多数投票 (Self-consistency) ,选出最终的答案。
感觉这个思路很好玩,数据处理真的是至关重要啊。
The Power of Prompting:
www.microsoft.com论文:
arxiv.org