提示工程基础
提示工程是设计高质量提示以引导大型语言模型(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)
结合采样和多数投票,生成多样化的推理路径并选择最一致的答案。步骤如下:
- 生成多样化推理路径(高温度设置)
- 从每个生成的响应中提取答案
- 选择最常见的答案
思维树 (Tree of Thoughts, ToT)
概括了思维链提示的概念,允许LLM同时探索多个不同的推理路径,而不仅仅是遵循单一的思想链。
ReAct (推理和行动)
结合自然语言推理和外部工具(搜索、代码解释器等)解决复杂任务的范式,允许LLM执行某些操作,如与外部API交互以检索信息。
代码提示技术
编写代码的提示
LLM可以帮助生成多种编程语言的代码,加快开发过程。
解释代码的提示
当你需要理解他人的代码时,LLM可以提供解释。
翻译代码的提示
LLM可以帮助将代码从一种语言翻译成另一种语言。
调试和审查代码的提示
LLM可以帮助识别和修复代码中的错误,并提供改进建议。
最佳实践
提供示例
在提示中提供例子非常有效,特别是当需要引导模型输出特定结构或模式时
简单设计
- 提示应简洁、清晰、易于理解
- 避免使用复杂语言和提供不必要的信息
明确输出
明确期望的输出,提供具体细节指导模型
使用指令而非约束
- 专注于积极指令比严重依赖约束更有效
- 指令直接传达期望的结果,约束可能会让模型猜测什么是允许的
控制最大令牌长度
通过配置或在提示中明确请求特定长度
在提示中使用变量
使用可在不同输入之间更改的变量,使提示更加动态和可重用
实验输入格式和写作风格
不同的模型配置、提示格式和词汇选择可能产生不同的结果
分类任务的少样本提示应混合类别
确保模型学习识别每个类别的关键特征,而不是简单记忆示例顺序
适应模型更新
跟踪模型架构变化、增加的数据和功能
实验输出格式
考虑使用JSON或XML等结构化格式返回数据
结构化输出的好处:
- 始终以相同风格返回
- 专注于您想接收的数据
- 减少虚构的可能性
- 使关系可见
- 获得数据类型
- 可以排序
记录各种提示尝试
详细记录提示尝试,以便随时间学习什么有效
与其他提示工程师一起实验
多人尝试可能会发现更多有效的提示方法
总结
提示工程是一个迭代过程。精心设计和测试不同的提示,分析并记录结果。根据模型的表现改进提示。不断实验直到实现期望的输出。当更改模型或模型配置时,回顾之前使用的提示并继续实验。
有效的提示工程需要耐心和持续的改进,但掌握这些技术可以显著提高与大型语言模型合作的效率和效果。