提示工程
1 前言
本篇内容主要参考https://github.com/dair-ai/Prompt-Engineering-Guide/tree/main,结合个人搜集资料制作而成。
提示工程是一个较新的学科,应用于开发和优化提示词(Prompt),帮助用户有效地将语言模型用于各种应用场景和研究领域。掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。研究人员可利用提示工程来提高大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计和研发出强大的技术,实现和大语言模型或其他生态工具的高效接轨。
除非另有说明,本指南默认所有示例都是在 OpenAI 的 Playground 上使用 gpt-3.5-turbo 进行测试。模型使用默认配置,即 temperature=1 和 top_p=1 。这些提示也应适用于具有类似功能的其他模型,如gpt-3.5-turbo,但模型响应可能会有所不同。
2 提示工程简介
2.1 模型设置
使用提示词时,您通常会通过 API 或直接与大语言模型进行交互。你可以通过配置一些参数以获得不同的提示结果。
2.1.1 temperature和top_k
2.1.1.1 概念
temperature 和 top_p 是控制大语言模型生成输出“多样性”和“随机性”的两个非常重要的采样策略参数。它们主要用于 文本生成(Text Generation)阶段,比如你使用 model.generate() 时。
temperature 控制输出概率分布的平滑程度,即“模型有多自信地选最可能的词”。数学上,输出 token 的概率分布一维向量p中的每个元素会被转换为:
top_p(又名 nucleus sampling),是一种“累积概率裁剪法”,只在最可能的前几个 token 中进行采样,总和达到 p 为止。
总结:temperature:控制模型说话是“保守还是奔放”;top_p:控制模型“在多少高概率词中选”。
2.1.1.2 举例理解
假设模型输出每个词的概率排序为:
| Token | Prob |
|---|---|
| "猫" | 0.4 |
| "狗" | 0.3 |
| "人" | 0.15 |
| "鱼" | 0.05 |
| "火箭" | 0.05 |
| "电话" | 0.03 |
| … | … |
top_p=0.9,那么模型只会在前几个加起来超过 90% 的词中选择(即“猫”、“狗”、“人”),剩下的(如“电话”、“火箭”)不会被采样。
通常temperature和top_k建议只调一个,保持另一个默认。例如:
output = model.generate(
input_ids,
max_new_tokens=100,
do_sample=True, # 开启采样
temperature=0.7,
top_p=0.9,
)
设模型预测当前 token 位置可以生成以下 4 个词的概率:
| Token | 原始概率 $p_i$ | $\log(p_i)$ |
|---|---|---|
| A | 0.5 | $\log(0.5)$ ≈ -0.693 |
| B | 0.3 | $\log(0.3)$ ≈ -1.204 |
| C | 0.15 | $\log(0.15)$ ≈ -1.897 |
| D | 0.05 | $\log(0.05)$ ≈ -2.996 |
这个分布看起来:A 是最可能的选择,D 很少见。
temperature = 0.5(温度低,变“保守”),\(p_i' = softmax(log(p_i) / temperature)\),
| Token | New log-prob | Exponentiate | Softmax 比例 |
|---|---|---|---|
| A | -1.386 | $e^{-1.386}$ ≈ 0.25 | ≈ 0.62 |
| B | -2.408 | $e^{-2.408}$ ≈ 0.09 | ≈ 0.22 |
| C | -3.794 | $e^{-3.794}$ ≈ 0.02 | ≈ 0.10 |
| D | -5.992 | $e^{-5.992}$ ≈ 0.0025 | ≈ 0.006 |
结果就是A的概率被强化了,现在D基本不会被选。
使用Top P意味着只有词元集合(tokens)中包含top_p概率质量的才会被考虑用于响应,因此较低的top_p值会选择最有信心的响应。这意味着较高的top_p值将使模型考虑更多可能的词语,包括不太可能的词语,从而导致更多样化的输出。
2.1.2 Max Length
可以通过调整 max length 来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。
2.1.3 Stop Sequences
stop sequence 是一个字符串,可以阻止模型生成 token,指定 stop sequences 是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为 stop sequence 来告诉模型生成不超过 10 个项的列表。
2.1.4 Frequency Penalty和Presence Penalty
都是越高,生成的token越不重复
frequency penalty 是对下一个生成的 token 进行惩罚,这个惩罚和 token 在响应和提示中已出现的次数成比例, frequency penalty 越高,某个词再次出现的可能性就越小,这个设置通过给 重复数量多的 Token 设置更高的惩罚来减少响应中单词的重复。
presence penalty 也是对重复的 token 施加惩罚,但与 frequency penalty 不同的是,惩罚对于所有重复 token 都是相同的。出现两次的 token 和出现 10 次的 token 会受到相同的惩罚。 此设置可防止模型在响应中过于频繁地生成重复的词。 如果您希望模型生成多样化或创造性的文本,您可以设置更高的 presence penalty,如果您希望模型生成更专注的内容,您可以设置更低的 presence penalty。
与 temperature 和 top_p 一样,一般建议是改变 frequency penalty 和 presence penalty 其中一个参数就行,不要同时调整两个。
2.2 基本概念
2.2.1 给LLM提示
一个提示词可以包含你传递到模型的指令或问题等信息,也可以包含其他详细信息,如上下文、输入或示例等。你可以通过这些元素来更好地指导模型,并因此获得更好的结果。

浙公网安备 33010602011771号