提示词工程(二)
DAIR.AI 提示工程指南 个人总结
1.模型基本设置
- Temperature:决定模型输出是稳定保守,还是随机,有创造性。对于质量保障,数据分析等确定性任务,建议将温度设置为0;对于创意写作等需要多样性的任务,可以适当提高温度。
- Top_p:同样衡量模型输出的确定性。使用Top-p意味着只有词元集合(tokens)中具有top_p概率质量的才会被考虑用于响应(0.1 表示只考虑包含在最高 10% 概率质量中的 token),因此较低的top_p值会选择最有信心的响应。这意味着较高的top_p值将使模型考虑更多可能的词语,包括不太可能的词语,从而导致更多样化的输出。一般建议是改变 Temperature 和 Top P 其中一个参数就行,不用两个都调整。
- Max length:限制模型输出的最大长度,防止输出过长或过短。
- Stop sequence:指定一个或多个停止序列,当模型生成这些序列时,模型将停止生成更多的文本。这对于控制输出的结构和内容非常有用。
- Frequency penalty:惩罚模型重复使用相同的词语或短语,通过给重复数量多的 Token 设置更高的惩罚来减少响应中单词的重复,鼓励模型生成更多样化的输出。frequency penalty 越高,某个词再次出现的可能性就越小。
- Presence penalty:也是对重复的 token 施加惩罚,但惩罚对于所有重复 token 都是相同的,出现两次的 token 和出现 10 次的 token 会受到相同的惩罚。如果希望模型生成多样化或创造性的文本,可以设置更高的 presence penalty。一般建议是改变 frequency penalty 和 presence penalty 其中一个参数就行,不要同时调整两个。
2.做什么还是不做什么?
避免说不要做什么,而应该说要做什么,同时尽可能做到具体,直接,明确。
3.结构化提示词
结构性较强(或具有较强引导性)的提示词可以迫使模型以特定的格式输出结果,减少模型输出不相关或不必要的信息,避免啰嗦。当然,提示词的结构并不是固定不变的。
4.Few-shot提示词
- 标签空间和演示指定的输入文本的分布都很重要(无论标签是否对单个输入正确)。
- 使用的格式也对性能起着关键作用,即使只是使用随机标签,这也比没有标签好得多。
- 其他结果表明,从真实标签分布(而不是均匀分布)中选择随机标签也有帮助。
也就是说,在Few-shot提示词中,即使用户不知道每个提供的样本的具体标签,也最好按照某种格式向模型提供一些示例输入和输出,且特征和标签的分布尽量接近真实分布(即使它们未能一一正确匹配)。
5.链式思考(CoT)提示词
对于具体的问题,可以给出具体的思考步骤示例,或者强制模型输出自身的思考过程,以提高模型的逻辑推理准确率。
- 自动思维链(Auto-CoT):
- 问题聚类:将问题池中的问题划分为几个聚类
- 演示抽样:从每组聚类中选择一个具有代表性的问题,并使用带有简单启发式的 Zero-Shot-CoT 生成其推理链
- 向模型提出真正的问题后,模型会自动按照上述的CoT过程进行推理并回答
- 通过提供不同的CoT思考路径,模型可以获得更好的推理能力。
6.生成知识提示
对知识的补充,解释或扩展可以促进模型深入搜索与思考(即使与原问题无关)。这可以看作是一种另类的CoT提示词。
1 | Q1 输入:希腊比墨西哥大。 |
7.链式提示
对于较为复杂或行为位置的任务,可以先将任务分解为许多子任务,确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分,继续提供给模型,直到完成整个任务。除了提高性能,链式提示还有助于提高 LLM 应用的透明度,增加控制性和可靠性。
8.思维树(ToT)提示词
简而言之,ToT就是一种引导大模型自发进行多路径探索式推理的方法,鼓励模型同时探索多种可能的思考路径,然后选择最优的那条。
- 将问题拆为多个子步骤
- 对每个步骤,要求模型生成多个候选方案
- 对每个候选方案,要求模型进行打分/筛选优劣
- 在所有方案中探索最优路径(使用DFS/BFS等)
值得注意的是,ToT提示词以多轮对话搜索树的形式来增强 LLM 解决复杂问题的能力,它既可以使用DFS/BFS/束搜索,也可以通过强化学习来训练一个“ToT 控制器”
1 | Q: 假设三位不同的专家来回答这个问题。 |
9.检索增强生成RAG
为了完成更复杂和知识密集型的任务,可以基于语言模型构建一个系统,以此访问外部知识源。
RAG 会接受输入并检索出一组相关/支撑的文档,并给出文档的来源(例如维基百科)。这些文档作为上下文和输入的原始提示词组合,送给文本生成器得到最终的输出。LLM 的参数化知识是静态的,RAG 让语言模型不用重新训练就能够获取最新的信息,基于检索生成产生可靠的输出。
10.自动推理并使用工具(Automatic Reasoning and Tool-use,ART)
一般来说,LLM只负责向用户提供信息和建议,而不直接执行任务。使用者需要针对特定任务手写示范,还需要精心编写交替使用生成模型和工具的脚本来完成任务。ART使用冻结的 LLM 来自动生成包含中间推理步骤的程序,工作原理如下:
- 接到一个新任务的时候,从任务库中选择多步推理和使用工具的示范。
- 在测试中,调用外部工具时,先暂停生成,将工具输出整合后继续接着生成。
ART 引导模型总结示范,将新任务进行拆分并在恰当的地方使用工具。此外,ART 还可以手动扩展,只要简单地更新任务和工具库就可以修正推理步骤中的错误或是添加新的工具。
- ART的两大核心组件:
- 任务库:存储各种任务的”推理+工具使用”示范程序,新任务来时,通过语义匹配自动检索相似示范
- 工具库:提供可被调用的外部工具接口,包括搜索,编程,计算,知识库检索,API调用等
11.自动提示工程师APE
一个用于自动指令生成和选择的框架。指令生成问题被构建为自然语言合成问题,使用 LLMs 作为黑盒优化问题的解决方案来生成和搜索候选解。
第一步涉及一个大型语言模型(作为推理模型),该模型接收输出演示以生成任务的指令候选项。这些候选解将指导搜索过程。使用目标模型执行指令,然后根据计算的评估分数选择最合适的指令。
1 | 输出演示-(推理模型)->指令候选项-(目标模型)->评估分数->选择最优指令 |
12.方向性刺激提示
训练了一个可调节的策略 LM 来生成刺激/提示,并使用使用RL来优化策略LM。策略 LM 可以很小,并且可以优化以生成指导黑盒冻结 LLM 的提示。
13.PAL(程序辅助语言模型)
与思维链提示不同,它不是使用自由形式文本来获得解决方案,而是将解决步骤卸载到类似 Python 解释器的编程运行时中。
14.ReAct 框架
简单来讲,ReAct是一种将CoT与ART结合的框架,既能让模型进行链式思考,又能让模型在思考过程中调用工具来获取信息或执行操作,从而更有效地解决复杂任务。
ReAct 是一个将推理和行为与 LLMs 相结合通用的范例。ReAct 提示 LLMs 为任务生成口头推理轨迹和操作。这使得系统执行动态推理来创建、维护和调整操作计划,同时还支持与外部环境(例如,Wikipedia)的交互,以将额外信息合并到推理中。下图展示了 ReAct 的一个示例以及执行问题回答所涉及的不同步骤。
15.自我反思(Reflexion)
自我反思的关键步骤是a)定义任务,b)生成轨迹,c)评估,d)执行自我反思,e)生成下一条轨迹。下图展示了自我反思的智能体学习迭代优化其行为来解决决策、编程和推理等各种人物的例子。自我反思(Refelxion)通过引入自我评估、自我反思和记忆组件来拓展 ReAct 框架。

16.多模态CoT
多模态思维链提示将文本和视觉融入到一个两阶段框架中。第一步涉及基于多模态信息的理性生成。接下来是第二阶段的答案推断,它利用生成的理性信息。参见语言不是你所需要的全部:将感知与语言模型对齐
17.提示函数
通过将提示封装成函数,可以创建一系列函数来建立工作流程。每个函数代表一个特定的步骤或任务,当按特定顺序组合时,它们可以自动化复杂的流程或更高效地解决问题。
18.对抗性提示
- 提示注入
- 提示泄漏
- 绕开内容限制
防御策略:
- 显式添加防御字段
- 参数化prompt
- 改变提示词格式
- 构建检测器
- 微调模型
19.偏见
避免偏斜分布,而是为每个标签提供更平衡的例子数量。
后记
这是一篇相当详细的提示词工程教程,内容涵盖了相当前沿的技术。笔者在写这篇总结文章时,也发现许多过去的提示词技巧(并不很久远,大概20-22年左右)在现在的各种先进的LLM上已经完全没有必要了。总的来说,提示词工程是一个与时俱进的领域,同时随着大模型的发展,提示词也必然会变得更加高效,精炼,甚至被新的表达媒介所取代。