- Published on
如何写好Prompt-2025
- Authors
- Name
- 辣条加辣
- @GeorgePekingzcc
谷歌出了一本关于prompt engineering 的白皮书,花几个小时的时间看完后,感觉有些东西还是有价值的,这里记录一下。
关于prompt 的一点看法
个人感觉 prompt engineering 绝对是被低估的一项技术,可能有人认为,不就是说几句话,让AI扮演一些角色吗,一点都不难。确实, prompt engineering的门槛不高,每个人都可以说两句,甚至有所谓的万能提示词,但能不能针对具体问题找到合适的提示词让效果产生质的飞跃,绝对是一项不断实践,不断打磨的技术。
关于prompt, 你应该知道的术语
首先是一些prompt 中的术语,知道这些,你已经打败90%的人了。 如果你调用过大模型的API, 这些词汇都是传给大模型的必须参数,我尽量用人话描述。
output length
控制AI模型生成回复时输出的token数量是一个重要的配置。 生成更多的token意味着需要更多的计算资源,这可能导致更高的能耗、潜在的响应变慢以及更高的成本。
需要注意的是,减少LLM的输出长度并不会使其在风格上或文本上变得更简洁,它仅仅是让LLM在达到限制时停止预测更多的token。如果你的需求确实需要较短的输出,你可能还需要调整你的prompt来适应这一点。
sampling control(采样控制)
这是用来控制生成式AI(比如ChatGPT)在生成文本时"怎么选词"的一组参数。通过调整这些参数,可以让AI的回答更有创造力或者更保守。
TLDR: 指定temperature 越高比如1.0),AI越跳脱,而且每次生成的内容非常不一样,越低(比如0.1),AI 越保守,每次生成的内容越一致。
- temperature(温度): 温度决定了AI生成内容的"随机性"。温度越高(比如1.0),AI越容易生成新奇、意想不到的内容;温度越低(比如0.2),AI的回答会更稳定、更常规。可以理解为"脑洞大小"的调节器。
- Top K: 这是指每次生成下一个词时,AI只在概率最高的前K个词里选。比如Top K=5,AI只会在最有可能的5个词里随机选一个。K越小,生成的内容越保守;K越大,内容越多样。
- Top P(又叫Nucleus Sampling,核采样): 这是另一种控制多样性的方式。AI会把所有可能的下一个词按概率从高到低排队,直到这些词的总概率加起来超过P(比如0.9),然后只在这部分词里随机选一个。P越小,内容越保守;P越大,内容越多样。
几种不同的prompting
- System prompting (系统提示) 为语言模型设定整体的背景和目的。它定义了模型应该做什么的"大方向",比如翻译语言、分类评论等。系统提示可以用来生成满足特定需求的输出,例如,你可以用系统提示生成与特定编程语言兼容的代码片段,或者返回某种特定结构(如JSON)。系统提示对于安全性和控制有害内容也很有用,只需在提示中添加一句类似"你的回答应该保持尊重"的话即可。
- Contextual prompting (上下文提示) 提供与当前对话或任务相关的具体细节或背景信息。它帮助模型理解所提问题的细微之处,并相应地调整回答。通过提供上下文提示,你可以帮助确保AI交互尽可能无缝和高效。模型将能够更快地理解你的请求,并生成更准确和相关的响应。
- Role prompting (角色提示) 为语言模型分配一个特定的角色或身份让其扮演。这有助于模型生成与所分配角色及其相关知识和行为一致的响应。例如,你可以让模型扮演书评编辑、幼儿园老师或励志演说家。一旦模型被赋予角色,你就可以给出特定于该角色的提示。为AI模型定义角色视角,为其提供了你所期望的语气、风格和专业知识蓝图,从而提高输出的质量、相关性和有效性。一些有效的风格包括:对抗性、描述性、直接、正式、幽默、有影响力、非正式、鼓舞人心、有说服力。
这三种提示方式可能会有相当大的重叠。例如,一个为系统分配角色的提示,也可能包含上下文信息。然而,每种类型的提示都有其略微不同的主要目的:
- 系统提示:定义模型的基本能力和总体目标。
- 上下文提示:提供即时的、特定于任务的信息来指导响应。它高度特定于当前任务或输入,是动态的。
- 角色提示:构建模型的输出风格和语调。它增加了一层特殊性和个性。
关于prompt 的一些技巧
Step-back prompting (退一步提示)
示例:
假设我们想为一个第一人称射击游戏写一个故事情节。
直接提示(效果一般):
为第一人称射击游戏写一个新关卡的一段故事情节,既有挑战性又有吸引力。
退一步提示(效果更好):
步骤1:先问一个更一般性的问题
问题:根据流行的第一人称射击游戏,哪5个虚构场景能为第一人称射击游戏关卡提供既有挑战性又有吸引力的故事背景?
步骤2:使用第一步的回答作为背景知识
指令:根据上面提到的"被遗弃的军事基地"这一场景,为第一人称射击游戏写一个新关卡的一段故事情节,既有挑战性又有吸引力。
通过先"退一步"获取更广泛的背景知识,AI可以生成更加丰富、详细且有深度的故事情节。
Chain of Thought (CoT) (思维链提示)
思维链提示是一种通过生成 中间推理步骤 来提高LLM推理能力的技术。这有助于LLM生成更准确的答案。
示例:
直接提示(容易出错):
当我3岁时,我的伙伴比我大3倍。现在我20岁了,我的伙伴多大?
可能得到错误答案:63岁(简单地用20乘以3)
CoT提示(更准确):
当我3岁时,我的伙伴比我大3倍。现在我20岁了,我的伙伴多大?让我们一步一步思考:
1. 我3岁时,我的伙伴是3×3=9岁
2. 我的伙伴比我大9-3=6岁
3. 现在我20岁了,我的伙伴应该是20+6=26岁
加入"让我们一步一步思考"这样的提示词,可以引导AI列出推理步骤,从而大幅提高解决数学和逻辑问题的准确性。
Tree of Thoughts (ToT) (思维树提示)
思维树提示扩展了思维链的概念,允许LLM同时探索多个不同的推理路径。说白了就是在提示词里面让AI 多思考几种方案。
示例:
解决一个复杂的问题,如象棋难题:
我们来解一个象棋难题:白方行动并在3步内将军。初始位置是...(此处是棋盘描述)
让我们考虑几种不同的开局可能性:
可能路径1:白方的车移动到...
可能路径2:白方的主教移动到...
可能路径3:白方的骑士移动到...
对每种可能性,让我们分析结果:
分析路径1:如果白方的车移动,黑方可能会...,然后白方可以...
分析路径2:如果白方的主教移动,黑方可能会...,但这不会导致将军
分析路径3:如果白方的骑士移动,黑方别无选择,只能...,然后白方可以...并将军
最佳解决方案是路径3,因为...
这种方法让AI能够探索多条思路,而不是单一线性思考,特别适合解决需要考虑多种可能性的问题。
ReAct (Reason & Act) (推理与行动提示)
ReAct允许AI结合推理和行动,通过执行特定操作(如搜索信息)来解决复杂问题。
示例:
使用Python代码实现:
# 任务:找出"Metallica乐队成员共有多少个孩子?"
# 推理1:我需要找出Metallica有哪些成员
搜索("Metallica乐队成员")
# 观察:Metallica有4名成员:James Hetfield、Lars Ulrich、Kirk Hammett和Robert Trujillo
# 推理2:我需要找出James Hetfield有多少个孩子
搜索("James Hetfield有多少个孩子")
# 观察:James Hetfield有3个孩子
# 推理3:我需要找出Lars Ulrich有多少个孩子
搜索("Lars Ulrich有多少个孩子")
# 观察:Lars Ulrich有3个孩子
# 继续搜索其他成员...
# 最终推理:总共有10个孩子
# 最终答案:10
ReAct的强大之处在于它能够将思考与行动结合起来,自主决定需要执行哪些操作来解决问题,模拟了人类解决问题的方式。
Automatic Prompt Engineering (APE) (自动提示工程)
你要实在不知道咋写,你就跟AI 说根据 ai prompt best practice帮我写一个prompt
关于prompt的最佳实践
Provide examples (提供示例)
最重要的最佳实践是在prompt中提供样本示例。这非常有效,因为它充当了强大的教学工具。这些示例展示了期望的输出或类似的响应,使模型能够从中学习并相应地调整其自身的生成。这就像给模型一个参考点或目标,以提高其响应的准确性、风格和语调,使其更好地符合你的期望。
Design with simplicity (设计简洁)
Prompt应该简洁、清晰,易于你和模型理解。经验法则是,如果一个prompt对你来说已经很混乱,那么它很可能也会让模型感到困惑。尽量不要使用复杂的语言,也不要提供不必要的信息。
例如:
- 修改前: 我现在正在纽约旅游,我想了解更多关于好玩的地方的信息。我带着两个3岁的孩子。我们假期应该去哪里?
- 修改后: 扮演一个为游客服务的导游。描述在纽约曼哈顿适合带3岁孩子参观的好地方。
Be specific about the output (明确输出要求)
要具体说明期望的输出。
例如:
- 推荐: 生成一篇关于排名前5的视频游戏机的3段式博客文章。博客文章应内容丰富且引人入胜,并以对话式风格撰写。
- 不推荐: 生成一篇关于视频游戏机的博客文章。
Use Instructions over Constraints (优先使用指令而非约束)
指令和约束都用于引导LLM的输出。
- 指令 (Instruction):提供关于期望响应格式、风格或内容的明确指示。它指导模型应该做什么或产生什么。
- 约束 (Constraint):对响应设置限制或边界。它限制模型不应该做什么或避免什么。
如果可能,请使用积极的指令:告诉模型该做什么,而不是不该做什么。这可以避免混淆并提高输出的准确性。
例如:
- 推荐: 生成一篇关于排名前5的视频游戏机的1段式博客文章。只讨论游戏机本身、制造商、年份和总销量。
- 不推荐: 生成一篇关于排名前5的视频游戏机的1段式博客文章。不要列出视频游戏名称。