姚利锋
姚利锋
首页博客片段项目服务关于
☕
❤️
目录
  • 无目录
返回片段

发布于  2025 年 5 月 2 日,星期五

Prompt Engineering 阅读总结

PromptEngineering是优化AI模型输入指令的技术,通过结构化、清晰的提示词引导模型输出更精准的结果。其核心在于设计高效的问题表述,结合上下文、示例和约束条件,提升大语言模型的响应质量。前端开发中可用于生成代码、优化UI文案或自动化测试脚本,本质是人与AI的交互设计,需平衡明确性与灵活性。关键要素包括指令清晰度、示例相关性、格式控制及迭代调优,最终实现低成本高效率的AI协作。

  • https://lewlh.github.io/2025/04/15/PromptEngineering/https://lewlh.github.io/2025/04/15/PromptEngineering/

提示工程

LLM 的工作原理:它是一个预测引擎。模型将连续文本作为输入,然后根据其训练的数据预测下一个 token 应该是什么。LLM 通过重复执行此操作来实现操作化,将先前预测的 token 添加到连续文本的末尾,以预测下一个 token。下一个 token 预测基于先前 token 中的内容与 LLM 在其训练过程中看到的内容之间的关系。

LLM 输出配置

输出长度

生成更多 token 需要 LLM 进行更多计算,从而导致更高的能源消耗、可能更慢的响应时间和更高的成本。
对于某些 LLM 提示技术(如 ReAct)来说,限制输出长度尤为重要,因为 LLM 会在你想要的响应之后继续发出无用的 token。
所以,限制输出长度可以帮助 LLM 更快地生成响应并节省成本。

采样控制

LLM 预测下一个 token 的方式是通过计算每个可能的 token 的概率分布。LLM 选择下一个 token 的方法称为采样。而 LLM 词汇表中的每个 token 都有一个概率。

Temperature (随机性)

Temperature 用于控制 token 选中的随机程度。
较低的 temperature 适用于需要更确定性响应的提示,而较高的 temperature 可能导致更多样化或意外的结果。

接近最大值的 temperature 往往会产生更随机的输出。并且随着 temperature 越来越高,所有 token 成为下一个预测 token 的可能性均等。

Top-K 和 Top-P 核采样

LLM 中使用的两种采样设置,用于将预测的下一个 token 限制为来自具有最高预测概率的 token。与 temperature 一样,这些采样设置控制生成文本的随机性和多样性。

  • Top-K 采样从模型的预测分布中选择前 K 个最可能的 token。top-K 越高,模型的输出就越有创造性和多样性;top-K 越低,模型的输出就越受限制和基于事实。Top-K 为 1 相当于贪婪解码。
  • Top-P 采样选择累积概率不超过某个值 (P) 的 top token。P 的值范围从 0(贪婪解码)到 1(LLM 词汇表中的所有 token)。

Top-K 和 Top-P 采样可以结合使用。Top-K 和 Top-P 采样的组合可以产生更高质量的输出,因为它们结合了两种方法的优点。

极端设置下:

  • Temperature 设置为 0,则 top-K 和 top-P 采样都无效。最可能的 token 成为下一个预测的 token。如果将 temperature 设置得非常高(高于 1——通常为 10 左右),则 temperature 变得无关紧要,
  • 如果将 top-K 设置为 1,则 temperature 和 top-P 变得无关紧要。只有一个 token 通过 top-K 标准,该 token 是下一个预测的 token。如果将 top-K 设置得非常高,例如设置为 LLM 词汇表的大小,则任何具有非零概率成为下一个 token 的 token 都将满足 top-K 标准,并且不会排除任何 token。
  • 如果将 top-P 设置为 0(或一个非常小的值),大多数 LLM 采样实现将仅考虑最可能的 token 以满足 top-P 标准,从而使 temperature 和 top-K 变得无关紧要。如果将 top-P 设置为 1,则任何具有非零概率成为下一个 token 的 token 都将满足 top-P 标准,并且不会排除任何 token。

作为一个通用的起点, temperature 为 0.2,top-P 为 0.95,top-K 为 30 将为你提供相对连贯的结果,这些结果可能具有创造性,但不会过于极端。如果你想要特别有创造性的结果,请尝试从 temperature 为 0.9,top-P 为 0.99,top-K 为 40 开始。如果你想要不太有创造性的结果,请尝试从 temperature 为 0.1,top-P 为 0.9,top-K 为 20 开始。最后,如果你的任务始终只有一个正确答案(例如,回答一个数学问题),请从 temperature 为 0 开始。

警告: 你是否见过以大量填充词结尾的回复?这也称为“重复循环错误”,这是大型语言模型中常见的问题,即模型陷入循环,重复生成相同的(填充)词、短语或句子结构,通常因不适当的 temperature 和 top-k/op-p 设置而加剧。这可能发生在低 temperature 和高 temperature 设置下,尽管原因是不同的。在低 temperature 下,模型变得过于确定性,严格遵循最高概率路径,如果该路径重新访问先前生成的文本,则可能导致循环。相反,在高 temperature 下,模型的输出变得过于随机,增加了随机选择的词或短语偶然导致回到先前状态的概率,从而由于大量可用选项而产生循环。在这两种情况下,模型的采样过程都会“卡住”,导致单调且无益的输出,直到输出窗口被填满。解决这个问题通常需要仔细调整 temperature 和 top-k/top-p 值,以找到确定性和随机性之间的最佳平衡。

提示工程技巧

"零样本" 提示是指没有任何示例的提示。它们通常用于简单的任务。

单样本提示&少样本提示

在为 AI 模型创建提示时,提供示例很有帮助。这些示例可以帮助模型理解你的要求。当你想要引导模型输出特定的结构或模式时,示例尤其有用。

单样本提示提供单个示例,因此得名一次性。这个想法是模型有一个可以模仿的示例,以最好地完成任务。
少样本提示向模型提供多个示例。这种方法向模型展示了它需要遵循的模式。这个想法与一次性类似,但是所需模式的多个示例增加了模型遵循该模式的机会。

系统、上下文和角色提示

系统、上下文和角色提示都是用于指导 LLM 生成文本的技术,但它们侧重于不同的方面:

  • 系统提示为语言模型设置了整体上下文和目的。 它定义了模型应该做什么的“大局”,例如翻译语言、分类评论等。
  • 上下文提示提供与当前对话或任务相关的特定细节或背景信息。 它帮助模型理解所提问的细微差别,并相应地调整响应。
  • 角色提示定义了模型在对话中的角色或身份。 它可以帮助模型以特定的语气或风格生成文本,例如作为老师、朋友或专家。

每种类型的提示都有略微不同的主要目的:

  • 系统提示:定义模型的基本能力和总体目标。
  • 上下文提示:提供立即的、特定于任务的信息以指导响应。 它高度特定于当前任务或输入,这是动态的。
  • 角色提示:构建模型的输出风格和声音。 它增加了一层特异性和个性。

系统提示

系统提示是 LLM 提示的核心。它们定义了模型的基本能力和总体目标。系统提示通常在提示的开头提供,以便模型可以在生成响应时参考它们。

系统提示对于安全性和毒性也非常有用。要控制输出,只需在提示中添加一行,例如:“你的回答应该有礼貌。”。

角色提示

角色提示是 LLM 提示的另一个重要方面。它们定义了模型在对话中的角色或身份。角色提示可以帮助模型以特定的语气或风格生成文本,例如作为老师、朋友或专家。

为 AI 模型定义角色视角,可以为其提供你正在寻找的语气、风格和专注专业知识的蓝图,以提高输出的质量、相关性和有效性。

我认为有效的风格:对抗性的、描述性的、直接的、正式的、幽默的、有影响力的、非正式的、鼓舞人心的、有说服力的

上下文提示

上下文提示是 LLM 提示的最后一个方面。它们提供与当前对话或任务相关的特定细节或背景信息。上下文提示可以帮助模型将能够更快地理解你的请求,并能够生成更准确和相关的响应。

退后提示 (Step-back prompting)

退后提示是一种通过提示 LLM 首先考虑与手头特定任务相关的更一般性问题,然后将该一般性问题的答案输入到后续的特定任务提示中,从而提高性能的技术。 这种“退后”使 LLM 能够在尝试解决特定问题之前激活相关的背景知识和推理过程。

退后提示鼓励 LLM 进行批判性思考,并以新的和创造性的方式应用他们的知识。 它通过利用 LLM 参数中比直接提示 LLM 时更多的知识来更改执行任务的最终提示。

通过关注一般原则而不是具体细节,退后提示可以帮助减轻 LLM 响应中的偏差。

思维链(Chain of Thought, CoT)

思维链 (CoT) 提示是一种通过生成中间推理步骤来提高 LLM 的推理能力的技术。 这有助于 LLM 生成更准确的答案。 你可以将其与少样本提示结合使用,以在需要推理才能响应的更复杂任务上获得更好的结果,因为这是零样本思维链的一个挑战。

LLM 响应包括思维链推理,这意味着更多的输出 token,这意味着预测成本更高并且需要更长的时间。

自洽性

据你使用的模型和温度配置,它可能会返回“重要”或“不重要”。

通过生成许多思维链,并采用最常出现的答案(“重要”),我们可以从 LLM 获得更一致的正确答案。

思维树(Tree of Thoughts, ToT)

ToT 特别适合需要探索的复杂任务。它的工作原理是维护一个思维树,其中每个思维代表一个连贯的语言序列,作为解决问题的中间步骤。然后,模型可以通过从树中的不同节点分支出来探索不同的推理路径。

ReAct (推理 & 行动)

它使 LLM 能够使用自然语言推理结合外部工具(搜索、代码解释器等)来解决复杂的任务,从而允许 LLM 执行某些操作,例如与外部 API 交互以检索信息,这是迈向智能代理建模的第一步。

ReAct 模仿了人类在现实世界中的运作方式,因为我们进行语言推理并可以采取行动来获取信息。在各种领域中,ReAct 的性能优于其他提示工程方法。

ReAct 提示通过将推理和行动组合成一个“思考-行动”循环来工作。LLM 首先推断问题并生成行动计划。然后,它执行计划中的操作并观察结果。然后,LLM 使用观察结果更新其推理并生成新的行动计划。这个过程一直持续到 LLM 找到问题的解决方案。

ReAct 提示在实践中需要理解你需要不断地重新发送先前的提示/响应(并修剪掉额外的生成内容),以及使用适当的示例/指令设置模型。

自动提示工程(APE)

你将提示一个模型来生成更多提示。 评估它们,可能修改好的提示。然后重复这个过程。

最佳实践

提供示例

最重要的最佳实践是在提示中提供(单样本/少样本)示例。这是非常有效的,因为它就像一个强大的教学工具。这些示例展示了所需的输出或类似的响应,使模型能够从中学习并相应地调整其生成的内容。这就像为模型提供一个参考点或目标,以提高其响应的准确性、风格和语气,从而更好地满足你的期望。

以简洁的方式设计

尝试使用描述动作的动词。 以下是一些例子:

充当、分析、分类、归类、对比、比较、创建、描述、定义、评估、提取、查找、生成、识别、列出、测量、组织、解析、选择、预测、提供、排序、推荐、返回、检索、重写、选择、显示、排序、总结、翻译、写作。

示例:

  • 之前
    • 我现在正在纽约旅行,想听听更多关于好地方的信息。我带着两个 3 岁的孩子。我们假期应该去哪里?
  • 修改后:
    • 充当游客的旅行指南。描述一下在纽约曼哈顿与 3 岁儿童一起游览的好地方。

具体说明输出内容

  • 正确做法:
    • 生成一篇关于前 5 名视频游戏机的 3 段博客文章。这篇博客文章应该内容丰富且引人入胜,并且应该以对话的风格编写。
  • 错误做法:
    • 生成一篇关于视频游戏机的博客文章。

使用指令而不是约束

  • 指令和约束用于提示,以指导 LLM 的输出。
    • 指令 提供有关响应的所需格式、样式或内容的明确说明。它指导模型应该做什么或产生什么。
    • 约束 是对响应的一组限制或边界。它限制了模型不应该做什么或避免什么。

指令直接传达期望的结果,而约束可能会让模型猜测允许做什么。它在定义的边界内提供了灵活性并鼓励创造力,而约束可能会限制模型的潜力。 此外,约束列表可能会相互冲突。

如果可能,请使用积极的指令:与其告诉模型不该做什么,不如告诉它应该做什么。这可以避免混淆并提高输出的准确性。

  • 正确做法:
    • 生成一篇关于前 5 名视频游戏机的 1 段博客文章。只讨论游戏机、制造公司、年份和总销量。
  • 错误做法:
    • 生成一篇关于前 5 名视频游戏机的 1 段博客文章。不要列出视频游戏名称。

作为最佳实践,首先要优先考虑指令,清楚地说明你希望模型做什么,并且仅在出于安全、清晰或特定要求时才使用约束。

控制最大 token 长度

要控制生成的 LLM 响应的长度,你可以在配置中设置最大 token 限制,或者在提示中明确请求特定的长度。

  • 例如:
    • “用一条推文长度的消息解释量子物理学。”

在提示中使用变量

为了重用提示并使其更具动态性,请在提示中使用变量,这些变量可以针对不同的输入进行更改。

字段值
变量(Variables){city} = '深圳'
提示(Prompt)你是一个旅行指南。告诉我一个关于城市 {city} 的事实。
输出(Output)深圳是中国第一个经济特区。

尝试输入格式和写作风格

不同的模型、模型配置、提示格式、措辞和提交可能会产生不同的结果。因此,尝试提示属性非常重要,例如风格、措辞和提示类型(零样本、少样本、系统提示)。

  • 例如,一个旨在生成关于革命性视频游戏机世嘉 Dreamcast 的文本的提示,可以表述为问题、陈述或指令,从而产生不同的输出:
    • 问题:什么是世嘉 Dreamcast?为什么它是如此具有革命性的游戏机?
    • 陈述:世嘉 Dreamcast 是由世嘉于 1999 年发布的第六代视频游戏机。它…
    • 指令:写一个段落,描述世嘉 Dreamcast 游戏机,并解释它为何如此具有革命性。

对于分类任务的少样本提示,混合类别

适应模型更新

尝试输出格式

除了提示输入格式之外,还可以考虑尝试输出格式。 对于非创造性任务,例如提取、选择、解析、排序、排名或分类数据,请尝试以 JSON 或 XML 等结构化格式返回输出。

JSON 修复

像 json-repair 库(在 PyPI 上可用)这样的工具在这些情况下非常宝贵

使用 Schema

虽然 JSON 非常适合构建 LLM 生成的输出,但它对于构建你提供的输入也非常有用。这就是 JSON Schema 发挥作用的地方。JSON Schema 定义了你的 JSON 输入的预期结构和数据类型。通过提供一个 schema,你为 LLM 提供了一个清晰的数据蓝图,它可以期望的数据,帮助它专注于相关信息并减少误解输入的风险。

这是一个简单的例子:

假设你想使用 LLM 为电子商务目录中的产品生成描述。与其只提供产品的自由格式文本描述,不如使用 JSON schema 来定义产品的属性:

  • 结构化输出 schema 的定义
{    "type": "object",    "properties": {        "name": { "type": "string", "description": "Product name" },        "category": { "type": "string", "description": "Product category" },        "price": { "type": "number", "format": "float", "description": "Product price" },        "features": {            "type": "array",            "items": { "type": "string" },            "description": "Key features of the product"        },        "release_date": { "type": "string", "format": "date", "description": "Date the product was released" }    }}
复制代码

然后,你可以将实际产品数据作为符合此 schema 的 JSON 对象提供:

  • LLM 的结构化输出
{    "name": "Wireless Headphones",    "category": "Electronics",    "price": 99.99,    "features": ["Noise cancellation", "Bluetooth 5.0", "20-hour battery life"],    "release_date": "2023-10-27"}
复制代码

CoT 最佳实践

对于 CoT 提示,需要在推理之后放置答案,因为推理的生成会更改模型在预测最终答案时获得的 token。使用 CoT 和自我一致性,你需要能够从提示中提取最终答案,并将其与推理分开。对于 CoT 提示,请将温度设置为 0。

思维链提示基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个单词。一般来说,当使用推理来得出最终答案时,可能只有一个正确答案。因此,温度应始终设置为 0。

记录各种提示尝试

Feature 特征Value 价值
Name 姓名[name and version of your prompt] [提示的名称和版本]
Goal 目标[One sentence explanation of the goal of this attempt] 【一句话解释本次尝试的目标】
Model[name and version of the used model][所用型号的名称和版本]
Temperature 温度[value between 0 - 1] [0 - 1 之间的值]
Token Limit Token 限制:Top-K、Top-P[number] [数字]
Prompt[prompt text] [提示文本]
Output[output text] [输出文本]
# JavaScript# TypeScript# React# Vue# Webpack
返回片段