提示词之重
这里的重第一层表示重要。这么说,有点废话,因为大家早已经耳熟能详,使用提示词是跟大模型交互的唯一方式。提示词的质量直接决定了模型输出结果的准确性、有用性和相关性。一个精准、恰当的提示词,能够如同精准的导航仪,引导大语言模型在其庞大的知识体系和复杂的算法网络中,快速且准确地找到用户所需的信息,并以清晰、有条理的方式呈现出来。从撰写一篇引人入胜的文章,到解决复杂的科学问题;从完成细致的代码编写,到提供专业的商业分析,提示词都在其中发挥着关键的引导作用。
随着大语言模型的持续迅速发展,书写提示词已经几乎成为了大部分人生活、工作、学习方式。
重的另一层表示则诚如它的字面意思,太重了!是的,这种重在我看来已经发展成影响我们有效、高效使用的元凶。如何使用精确、最优的提示词越来越变成我们的负担,为此还诞生了各种 prompt 编写技巧及泛式。但这仍旧没从根本上解决问题,相反给人类与大模型沟通带来了更多的挑战。
提示词之罪
目前提示词工程中存在的问题剖析。
1. debug 难,玄学。
在调试的过程中,面对各种与我们期待不符的输出结果,因为模型的黑盒性,我们很难甚至无法确认模型自身能力的瓶颈,还是prompt存在缺陷。
2. 模型适配难题
由于目前的大模型领域百花齐放,我们经常需要对比不同的模型性能,来择优选型。但是当我们将在某个模型上精心设计并验证有效的提示词,直接应用到另一个模型时,常常会遭遇提示词失灵的情况。同样,同一提示词在同一模型的不同版本上,其表现也可能有所不同。随着模型的不断更新迭代,其内部的算法和参数会发生变化,这可能导致原本有效的提示词在新版本模型上的效果大打折扣。例如,OpenAI 的 GPT 系列模型在每次更新后,对提示词的响应都会有一些细微的调整,开发者需要重新优化提示词,以适应模型的变化。
3. 无法确认优化方向
虽然经过许多前辈大佬的总结,我们已经拥有很多的 prompt 书写泛式,包括prompt 的基本组成要素,如:任务(task)、上下文(context)、范例(exemplar)、角色(persona)、格式(format)和语气(tone)。
但是我们不得不承认,总是有很多时候我们没办法灵光一闪,面对无法达到的目标,尤其跟我们的预想一些微小的差异时,我们缺乏科学理性稳健的调试步骤,总是改一下这里试试,改一下那里试试。最终可能浪费我们很长时间。
4. 维护难
自然语言意味着很多事情我们不必确定性、精确性的表述,一个字几个字甚至整句话的误差有时候可能对我们的表达完全没有影响,但有时候可能又会带来不可调和的误解。
如何系统、科学、自动化的解决人类书写提示词带来的问题?如何最大化解决人类语言与 AI 语言之间的信息折损?
为了解决这些所有的问题,可能APE 就是我们所需要的。
自动提示工程
APE(自动提示工程)旨在自动化提示工程过程,通过搜索和优化,自动生成高质量的提示词,从而提高语言模型在各种任务上的表现。简单来讲就是使用各种生成式技术生成 prompt,可以称作为:meta prompt,这很像早些年的元编程的概念。利用更少更关键的信息生成更复杂更真实的信息。
在 APE 领域也诞生了非常多的方法,各种方法也都有各自的优缺点及历史局限性,后面我们会详细分析学习。虽然方法众多,概括起来主要有以下几个关键步骤:
- 给定初始的提示要素:比如可能的输入输出、初始指令、示例等。
- 设计评估指标
- 迭代搜索最优提示
给定初始要素
第一步中提到的初始要素,即提示的组成部分的那些可变因素。常见的可变因素包括:
- 指令(Instruction): 对任务的文字描述
- 示例(Example): 输入-输出对的示例
- 模板(Template): 将输入嵌入到提示中的模板
这些要素不是必须的,并且不同的算法或者方案需要的要素可能也不尽相同。并且这些构成的因素通常我们也可以通过各种有效的大模型进行多样化的生成。
设计评估指标
接下来,我们需要设计一个评估指标,用于衡量提示的质量。常见的评估指标有:
- 任务指标(如分类准确率、生成质量等)
- 参考一致性(与人类标注的一致性)
- 查询效率(如推理时延等)
一个好的评估指标应当能够有效反映提示的实际表现。
搜索最优提示
最后一步是在提示词空间中搜索最优提示。这通常是一个组合优化问题,可以使用贝叶斯优化、强化学习等技术求解。
在搜索过程中,我们会反复评估候选提示,根据评估指标更新最优解,直到满足预期或达到预算。由于评估过程通常代价高昂,因此高效的搜索算法至关重要。
最后我们需要注意的一点是,APE 的过程通常是一个不断迭代的过程,可以在广度和深度上同时进行,比如多样性上可以控制,迭代次数可以控制。我们只需要关注评估指标的合理性就好,通过计算不断迭代下最高的 score ,我们就能选出合适的结果。
APE 框架初探
目前 APE 的领域已经是百花齐放,主要活跃的开源项目有如下几个:
weavel-ai/Ape
Ape,从它的名字就可以看出它是一个开源的专注于自动提示工程的工具库,提供了各种最新的提示优化方法的实现。集成了更容易的基准测试、实验和协作研究。Ape 极大地简化了应用和比较不同的提示优化技术。
主要功能点
-
模块化架构:可轻松扩展的类和类型,用于构建自定义的提示优化技术。
-
全面的实现:通过继承统一的Trainer类,提供了最新方法的简洁实现。
-
基准测试套件:包括各种任务的基准测试,如SQL、推理、数学推理、问答和分类等。
-
社区协作:为提出新的架构和分享创新思想提供专门的空间。
算法实现
- DSPy-MIPRO
- EvoPrompt
-
Few-Shot Trainer
-
TextGradient Trainer
-
TextGrad-Evo Trainer
-
Optuna Trainer
-
Expel Trainer
Eladlev/AutoPrompt
它采用了一个优化(校准)过程,不断迭代构建一个包含具有挑战性的边缘案例的数据集,并相应地优化提示。这种方法不仅减少了手动提示工程的工作量,还有效地解决了常见的提示敏感性和固有的提示歧义问题。
它包括两个主要流程:
- 分类流程:包括用户输入初始提示和任务描述、提供挑战性示例、注释示例、预测评估、提示分析、提示优化和迭代步骤,直到模型性能收敛。
- 生成流程:与分类流程类似,但增加了提示修改步骤,通过语言模型将初始提示转换为适用于分类的输入,然后进行注释、排名校准和生成校准。
microsoft/PromptWizard
PromptWizard是一个离散的提示优化框架,采用自进化机制,LLM生成,批评和完善自己的提示和示例,通过迭代反馈和综合不断改进。这种自适应方法通过进化指令和上下文学习示例来确保整体优化,以获得更好的任务性能。
包含三个关键组件:
- 反馈驱动的改进:LLM生成、批评和改进自己的提示和示例,通过迭代反馈和综合不断改进
- 批评和综合不同的例子:生成健壮的、多样化的和任务感知的综合例子。此外,它同时优化提示和示例
- 自我生成的思维链(CoT)步骤,结合积极,消极和综合的例子
第一阶段
第二阶段
stanfordnlp/dspy
虽然 Dspy 更喜欢强调它是一个 llm 的编程框架而不是提示词优化框架,但我们仍可以认为它 可以提供强大的 APE 功能。
DSPy 为声明式自我改进型 Python 的缩写,它使用签名的方式定义一个应用程序,不需要编写脆弱的提示,提示词被当作一个黑盒,你不再需要书写冗杂的提示词,只需要像传统编程一样定义输入、输出即可,剩下的DSPy会为你付高质量的结果。
DSPy 主要由 signature、module、predict、evaluation、optimizer几部分组成。signature 代表了一个程序的身份,包含了输入输出等内容。predict这是一个 llm 程序 内部包含了各种 llm 应用泛式的封装,如 COT 模式、RAG 模式等。evaluation 和 optimizer 完成了 APE的过程,来提示应用的性能。