提示工程基础

提示工程是设计高质量提示以引导大型语言模型(LLM)产生准确输出的过程。无论是否具备数据科学或机器学习工程背景,任何人都可以编写提示,但设计最有效的提示可能很复杂。提示的有效性受多种因素影响,包括所用模型、模型的训练数据、模型配置、词汇选择、风格和语调、结构以及上下文等。因此,提示工程是一个迭代过程。

LLM输出配置

在开始提示工程时,首先需要选择模型和配置选项:

输出长度

  • 重要配置设置之一是生成响应中的令牌数量
  • 生成更多令牌需要LLM进行更多计算,导致能耗更高、响应时间更长和成本更高

采样控制

LLM不会正式预测单个令牌,而是预测下一个令牌可能是什么的概率。常见的配置设置有:

温度 (Temperature)

  • 控制令牌选择的随机程度
  • 较低温度适合需要更确定性响应的提示
  • 较高温度可能导致更多样化或意外的结果
  • 温度为0是完全确定性的

Top-K和Top-P

  • 用于限制从具有最高预测概率的令牌中选择下一个令牌
  • Top-K采样从模型预测分布中选择最有可能的K个令牌
  • Top-P采样选择累积概率不超过某个值(P)的顶部令牌

提示技术

零样本提示 (Zero-shot)

最简单类型的提示,只提供任务描述和一些文本让LLM开始。名称”零样本”代表”无示例”。

单样本和少样本提示 (One-shot & Few-shot)

  • 单样本提示: 提供单个示例,模型可以模仿完成任务
  • 少样本提示: 提供多个示例,展示模型需要遵循的模式

少样本提示所需的示例数量取决于任务复杂性、示例质量和模型能力。一般来说,少样本提示应使用至少3-5个示例。

系统、上下文和角色提示

  • 系统提示: 设置语言模型的整体背景和目的
  • 上下文提示: 提供与当前对话或任务相关的具体细节或背景信息
  • 角色提示: 为语言模型分配特定角色或身份,帮助模型生成与分配角色及其相关知识和行为一致的响应

后退提示 (Step-back)

先考虑与特定任务相关的一般问题,然后将该一般问题的答案输入到随后的提示中。这种”后退”允许LLM在尝试解决具体问题之前激活相关背景知识和推理过程。

思维链 (Chain of Thought, CoT)

通过生成中间推理步骤来提高LLM的推理能力。可以与少样本提示结合,在需要推理的复杂任务上获得更好的结果。

优势:

  • 低投入但非常有效
  • 适用于现成的LLM
  • 提供解释性,可以了解LLM的响应和所遵循的推理步骤

自一致性 (Self-consistency)

结合采样和多数投票,生成多样化的推理路径并选择最一致的答案。步骤如下:

  1. 生成多样化推理路径(高温度设置)
  2. 从每个生成的响应中提取答案
  3. 选择最常见的答案

思维树 (Tree of Thoughts, ToT)

概括了思维链提示的概念,允许LLM同时探索多个不同的推理路径,而不仅仅是遵循单一的思想链。

ReAct (推理和行动)

结合自然语言推理和外部工具(搜索、代码解释器等)解决复杂任务的范式,允许LLM执行某些操作,如与外部API交互以检索信息。

代码提示技术

编写代码的提示

LLM可以帮助生成多种编程语言的代码,加快开发过程。

解释代码的提示

当你需要理解他人的代码时,LLM可以提供解释。

翻译代码的提示

LLM可以帮助将代码从一种语言翻译成另一种语言。

调试和审查代码的提示

LLM可以帮助识别和修复代码中的错误,并提供改进建议。

最佳实践

提供示例

在提示中提供例子非常有效,特别是当需要引导模型输出特定结构或模式时

简单设计

  • 提示应简洁、清晰、易于理解
  • 避免使用复杂语言和提供不必要的信息

明确输出

明确期望的输出,提供具体细节指导模型

使用指令而非约束

  • 专注于积极指令比严重依赖约束更有效
  • 指令直接传达期望的结果,约束可能会让模型猜测什么是允许的

控制最大令牌长度

通过配置或在提示中明确请求特定长度

在提示中使用变量

使用可在不同输入之间更改的变量,使提示更加动态和可重用

实验输入格式和写作风格

不同的模型配置、提示格式和词汇选择可能产生不同的结果

分类任务的少样本提示应混合类别

确保模型学习识别每个类别的关键特征,而不是简单记忆示例顺序

适应模型更新

跟踪模型架构变化、增加的数据和功能

实验输出格式

考虑使用JSON或XML等结构化格式返回数据

结构化输出的好处:

  • 始终以相同风格返回
  • 专注于您想接收的数据
  • 减少虚构的可能性
  • 使关系可见
  • 获得数据类型
  • 可以排序

记录各种提示尝试

详细记录提示尝试,以便随时间学习什么有效

与其他提示工程师一起实验

多人尝试可能会发现更多有效的提示方法

总结

提示工程是一个迭代过程。精心设计和测试不同的提示,分析并记录结果。根据模型的表现改进提示。不断实验直到实现期望的输出。当更改模型或模型配置时,回顾之前使用的提示并继续实验。

有效的提示工程需要耐心和持续的改进,但掌握这些技术可以显著提高与大型语言模型合作的效率和效果。