原文 [Google《Prompt Engineering》提示词工程白皮书.pdf](Google《Prompt Engineering》提示词工程白皮书.pdf)
记住一个 LLM 是如何工作的;它是一个预测引擎。模型接收序列文本作为输入,然后根据其训 练数据预测下一个标记应该是什么。LLM 被部署来反复执行此操作,将先前预测的标记添加到 序列文本的末尾,以预测下一个标记。下一个标记的预测基于先前标记中的内容与 LLM 在训练 期间所见内容之间的关系。
当你编写一个提示时,你是在为 LLM 设置正确的序列标记。提示工程是设计高质量提示的过程, 以引导 LLM 生成准确的输出。这个过程涉及调整以找到最佳的提示,优化提示长度,并评估提 示的写作风格和结构是否与任务相关。在自然语言处理和 LLM 的背景下,提示是为模型提供以 生成响应或预测的输入。
在进行提示工程时,您将首先选择一个模型。
一旦您选择了模型,您就需要确定模型的配置。
输出长度:在响应中生成多少个标记。请注意,生成更多标记需要 LLM 进行更多计算,这会导致更高的能耗和可能更慢的响 应时间,从而导致更高的成本。
采样控制:LLMs 并不正式预测单个标记。相反,LLMs 预测下一个标记可能是什么的概率,LLM 的词汇 表中的每个标记都会得到一个概率。这些标记概率随后被采样以确定下一个生成的标记。温度、 top‑K 和 top‑P 是最常见的配置设置,它们决定了如何处理预测的标记概率以选择单个输出标 记。
温度控制着标记选择的随机程度。较低的温度适合期望更确定性的响应的提示,而较高的温度 可能导致更多样化或意外的结果。温度为 0 (贪婪解码)是确定性:总是选择概率最高的标记(尽管请注意,如果有两个标记具有相同的最高预测概率,则 根据如何实现平局决定,您可能不会总是得到温度为 0 时的相同输出)。接近最大值的温度倾向于产生更随机的输出。随着温度越来越高,所有标记成为下一个预测标记的可能性都相等。
Top‑K 和 top‑P (也称为核采样)是两种在大型语言模型( LLM )中使用的采样设置,用于限制预测的下一个标记只能来自具有最高预测概率的标记。与温度一样,这些采样设置控制生成文本的随机性和多样性。
Top‑K 采样从模型预测分布中选择最有可能的 Top‑K 个标记。Top‑K 越高,模型的输出越具 创造性和多样性;Top‑K 越低,模型的输出越保守和事实性。Top‑K 为 1 等同于贪婪解码。
Top‑P 采样选择累积概率不超过某个特定值( P )的前缀标记。P 的取值范围从 0 (贪婪解 码)到 1 ( LLM 词汇表中的所有标记)。
在 top‑K 和 top‑P 之间选择最佳方法的方式是尝试这两种方法(或同时使用),看看哪一种能产生你想要的 结果。
如果温度、 top‑K 和 top‑P 都可用,则满足 top‑K 和 top‑P 两个条件 的 token 将成为下一个预测 token 的候选,然后从通过 top‑K 和 top‑P 条件的 token 中应用温 度进行采样。如果只有 top‑K 或 top‑P 可用,行为相同,但只使用一个 top‑K 或 P 设置。如果温度不可用,则满足 top‑K 和 / 或 top‑P 条件的 token 将随机选择以生成单个下一个预测 token。
在极端的采样配置值设置下,该采样设置要么取消其他配置设置,要么变得无关紧要。
-
如果你将温度设置为 0,top‑K 和 top‑P 就变得无关紧要了 —— 最可能的标记将成为下一个 预测的标记。
-
如果你将温度设置得非常高(超过 1— 通常在 10 以上),温度就变得无关紧要 了,然后随机采样通过 top‑K 和 / 或 top‑P 标准的标记来选择下一个预测的标记。
-
如果你将 top‑K 设置为 1,温度和 top‑P 就变得无关紧要了。只有一个标记通过了 top‑K 标准, 并且这个标记就是下一个预测的标记。
-
如果你将 top‑K 设置得非常高,比如达到 LLM 词汇表的 大小,任何有非零概率成为下一个标记的标记都将满足 top‑K 标准,并且没有任何标记被选中。
-
如果你将 top‑P 设置为 0 (或一个非常小的值),大多数 LLM 采样实现将只考虑最可能的标记 来满足 top‑P 标准,这使得温度和 top‑K 变得无关紧要。
-
如果你将 top‑P 设置为 1,任何有非零 概率成为下一个标记的标记都将满足 top‑P 标准,并且没有任何标记被选中。
-
作为一个一般性的立场,温度设置为 0.2,top‑P 为 0.95,top‑K 为 30 将给出相对连贯的结果, 这些结果可以富有创意但不会过于夸张。
-
如果你想要特别富有创意的结果,尝试将温度设置为 0. 9,top‑P 为 0.99,top‑K 为 40。
-
而如果你想要较少创意的结果,尝试将温度设置为 0.1,top‑P 为 0.9,top‑K 为 20。
-
最后,如果你的任务总是只有一个正确答案(例如,解答数学问题),则 从温度为 0 开始。
提示技术
LLM 调整以遵循指令,并在大量数据上进行训练,以便它们可以理解提示并生成答案。但是 LLM 并不完美;您的提示文本越清晰,LLM 预测下一个可能文本的能力就越强。此外,利用 LLM 的训练方式和 LLM 的工作方式的具体技术将帮助您从 LLM 获取相关结果。
通用提示 / 零样本
一个 zero-shot 5 ~提示是最简单类型的提示。它只提供任务的描述和一些文本,让 LLM 开始。这 个输入可以是任何东西:一个问题、故事的开头,或者指令。零样本这个名字代表 ‘ 没有例子 ’。
“ 单样本 ” 和 “ 少样本 ”
当零样本不起作用时,你可以在提示中提供演示或示例,这导致了 “ 单样本 ” 和 “ 少样本 ” 提示。
在为 AI 模型创建提示时,提供示例是有帮助的。这些示例可以帮助模型理解你要求的内容。当 你想引导模型到一个特定的输出结构或模式时,示例尤其有用。
单样本提示提供了一个 single~示例,因此得名单样本。其理念是模型有一个可以模仿以最好完成任务示例
少样本提示提供了 multiple~个示例给模型。这种方法向模型展示了一个它需要遵循的模式。其 理念与单样本类似,但多个期望模式的示例增加了模型遵循该模式的可能性。
系统、上下文和角色提示
系统提示为语言模型设定整体上下文和目的。它定义了模型应该做什么的 ‘ 大图景 ’,例如 翻译语言、分类评论等。
上下文提示提供与当前对话或任务相关的具体细节或背景信息。这有助于模型理解所提问题的 细微差别,并据此调整回答。
角色提示为语言模型分配一个特定的角色或身份。这有助于模型生成与分配的角色及其相关知识 和行为一致的回答。
系统、上下文和角色提示之间可能存在相当大的重叠。例如,一个为系统分配角色的提示也可以包含上下文。然而,每种类型的提示都服务于略微不同的主要目的:
- 系统提示:定义模型的根本能力和总体目的。
- 上下文提示:提供即时、针对特定任务的指导信息。它非常具体于当前任务或输入,具有动态性。
- 角色提示:定义模型的输出风格和语气。它增加了一层具体性和个性。
系统提示
系统提示对于生成满足特定要求的输出非常有用。‘ 系统提示 ’ 这个名字实际上代表 ‘ 向系 统提供额外任务 ’。例如,您可以使用系统提示生成与特定编程语言兼容的代码片段,或者您 可以使用系统提示返回一个清晰的框架。请看表 4,我在其中以 JSON 格式返回了输出。
从提取数据的提示中返回 JSON 对象有一些好处。在实际应用中,我无需手动创建这种 JSON 格式,我已能够以排序的方式返回数据(当处理日期时间对象时非常方便),但最重要的是, 通过提示 JSON 格式,它迫使模型创建结构并限制幻觉的产生。
系统提示对于安全性和毒性也非常有用。为了控制输出,只需在提示中添加一行,例如:‘ 你的回答应该尊重他 人。’。
角色提示
角色提示是提示工程中的一种技术,涉及为生成式 AI 模型分配一个特定的角色。这有助于模型 生成更相关、更有信息量的输出,因为模型可以针对其被分配的特定角色来构建其响应。
上述示例展示了扮演旅行代理人的角色。当你将角色更改为地理老师时,你会注意到你会收 到不同的回答。
为 AI 模型定义一个角色视角,给它提供了一个蓝图,以改善输出的质量、相关性和有效性,包 括你期望的语气、风格和专注的体验。
Here are some styles you can choose from which I find effective: Confrontational, Descriptive, Direct, Formal, Humorous, Influential, Informal, Inspirational, Persuasive
以下是一些您可以选择的样式,我认为它们很有效: 对抗性、描述性、直接性、正式性、幽默性、影响力、非正式性、鼓舞人心 、有说服力
上下文提示
通过提供上下文提示,您可以确保您的 AI 交互尽可能顺畅和高效。模型将能够更快地理解您的 请求,并能够生成更准确、更相关的回复
回溯提示
回溯提示是一种通过提示 LLM 首先考虑与当前特定任务相关的一般性问题,然后将对该一般性 问题的答案输入到后续特定任务的提示中的技术。这种 ‘ 回溯 ’ 允许 LLM 在尝试解决特定问 题之前激活相关的背景知识和推理过程。
通过考虑更广泛和根本的原则,LLM 可以生成更准确和有洞察力的回答。回溯提示鼓励 LLM 进 行批判性思考并以新的和创造性的方式应用他们的知识。它通过利用 LLM 参数中的更多知识来 改变执行任务的最终提示,这些知识在 LLM 直接被提示时可能不会发挥作用。
通过关注一般原则而非具体细节,这种回溯提示可以帮助减轻 LLM 响应中的偏见。
问题 1:基于流行的第一人称射击动作游戏,你认为哪些虚构的关键设定有助于构建一个具有挑战性和引人入胜的第一人称射击视频游戏关卡故事情节?
问题 2:追加问题 1 的输出作为输入
背景:第一人称射击游戏的5个引人入胜的主题:
…
废弃军事基地:一个庞大且荒芜的末日废墟军事建筑群中爬行着变异士兵和叛徒机器人,是应对枪战挑战的理想选择。
…
选取其中一个主题,并撰写一段故事情节对于一款第一人称射击类视频游戏的新级别,即具有挑战性和吸引力。
Chain of Thought (CoT) 思维链
思维链提示是一种提高 LLM 推理能力的技术,通过生成中间推理步骤。这有助 于 LLM 生成更准确的答案。您可以将它与少量样本提示结合使用,以在需要推理才能响应的更 复杂任务上获得更好的结果,因为它是一个零样本思维链的挑战。
CoT 有很多优点。首先,它成本低而效果显著,并且与现成的 LLM (因此无需微调)配合良好。 您还可以通过 CoT 提示获得可解释性,因为您可以从 LLM 的响应中学习,并看到遵循的推理步 骤。如果出现故障,您将能够识别它。思维链似乎在在不同 LLM 版本之间移动时提高了鲁棒性。 这意味着您的提示性能在不同 LLM 之间应该下降得较少,如果您的提示没有使用推理链的话。 当然,也存在一些缺点,但它们是相当直观的。
LLM 的响应包括思维链推理,这意味着更多的输出令牌,这意味着预测成本更高,耗时更长。
思维链在各种用例中可能很有用。想想代码生成、用于打破 将请求分解为几个步骤,并将这些步骤映射到特定的代码行。通常,任何可以通过 “ 通过谈话解决 问题 ” 的任务都是思维链的好候选。如果您能解释解决问题的步骤,就尝试思维链。
Self-consistency 自洽性
虽然大型语言模型在各种 NLP 任务中表现出令人印象深刻的成功,但它们的推理能力通常被视 为一个限制,仅通过增加模型大小是无法克服的。正如我们在之前的思维链提示部分所学的,模 型可以被提示生成类似于人类解决问题的推理步骤。然而,CoT 使用简单的 ‘ 贪婪解码 ’ 策略, 限制了其有效性。自洽性结合采样和多数投票来生成多样化的推理路径并选择最一致的答案。 它提高了 LLMs 生成的响应的准确性和连贯性。
自洽性给出了一个伪概率似然,表明答案的正确性,但显然成本很高。
它遵循以下步骤:
- 生成多样化的推理路径:将相同的提示多次提供给 LLM。高温度设置鼓励模型生成不同的 推理路径和问题视角。
- 从每个生成的响应中提取答案。
- 选择最常见的答案。
让我们来看一个电子邮件分类系统的例子,它将电子邮件分类为 “ 重要 ” 或 “ 不重要 ”。将 零样本思维链提示多次发送给 LLM,以查看每次提交后响应是否有所不同。注意电子邮件中的 友好语气、用词选择和讽刺。所有这些都可能欺骗 LLM。
您可以使用上述提示并尝试查看它是否返回一致的分类。根据您使用的模型和温度配置, 它可能会返回 “ 重要 ” 或 “ 不重要 ”。
通过生成许多思维链,并取最常见的答案( “ 重要 ” ),我们可以从 LLM 中获得更一致的准确答案。
Tree of Thoughts (ToT) 思维树
它推广了思维链提示 的概念,因为它允许 LLM 同时探索多个不同的推理路径,而不仅仅是遵循单一的线性思维链。
这种方法使 ToT 特别适合需要探索的复杂任务。它通过维护一个思维树来实现,其中每个思维代 表一个连贯的语言序列,作为解决问题的一个中间步骤。然后,模型可以通过从树的不同节点分 支出来探索不同的推理路径。
ReAct (推理与行动)
原因与行动( ReAct )提示是一种范式,它使 LLM 能够通过自然语言推理与外部工具 (搜索、代码解释器等)相结合来解决复杂任务,允许 LLM 执行某些动作,例如与外部 API 交 互以检索信息,这是向代理建模迈出的第一步。
ReAct 模仿了人类在现实世界中的操作方式,因为我们用言语进行推理,并可以采取行动 来获取信息。ReAct 在各种领域中对其他提示工程方法都表现出良好的效果。
ReAct 提示通过将推理和行动结合成一个思维 ‑ 行动循环来工作。LLM 首先对问题进行推理, 并生成一个行动计划。然后它执行计划中的行动并观察结果。然后 LLM 使用观察结果来更新 其推理并生成一个新的行动计划。这个过程一直持续到 LLM 找到问题的解决方案。
自动提示工程
此时你可能意识到编写提示可能很复杂。如果能够自动化这个过程(编写一个编写提示的提示) 岂不是很好?嗯,有一种方法:自动提示工程( APE )。这种方法不仅减轻了对人类输入的 需求,还提高了模型在各种任务中的性能。
你将提示模型生成更多的提示。评估它们,可能修改好的提示。然后重复。
例如,您可以使用自动提示工程来帮助训练一个用于商品 T 恤网店聊天机器人的聊天机器人。 我们希望找出所有可能的客户下单购买乐队商品 T 恤的方式。
- 编写将生成输出变体的提示。在这个例子中,我使用 gemini‑pro 生成 10 条指令:我们有一个乐队商品T恤网店,为了训练聊天机器人,我们需要各种订购方式:“一件金属乐队S码T恤”。生成10个变体,语义相同但含义保持不变。
- 通过选择指标对所有的指令候选者进行评分评估,例如,你可以使用 BLEU (双语评估助 手)或 ROUGE (面向摘要评估的召回辅助者)。
- 选择评分最高的指令候选者。这个候选者将成为你可以在软件应用或聊天机器人中使用的最 终提示。你还可以调整所选提示并再次评估。
最佳实践
提供示例
最重要的最佳实践是在提示中提供(一次性 / 少量)示例。这非常有效,因为它充当了一个强 大的教学工具。这些示例展示了期望的输出或类似的响应,使模型能够从中学习并相应地调整 自己的生成。这就像为模型提供了一个参考点或目标,以提高其响应的准确性、风格和语调, 使其更好地符合您的期望。
简单设计
提示应简洁、清晰,易于你和模型理解。一般来说,如果你自己都觉得困惑,那么模型也很可能 感到困惑。尽量使用简单的语言,不要提供不必要的信息。
Try using verbs that describe the action. Here’s a set of examples:
Act, Analyze, Categorize, Classify, Contrast, Compare, Create, Describe, Define, Evaluate, Extract, Find, Generate, Identify, List, Measure, Organize, Parse, Pick, Predict, Provide, Rank, Recommend, Return, Retrieve, Rewrite, Select, Show, Sort, Summarize, Translate, Write.
行动,分析,分类,归类,对比,比较,创造,描述,定义,评估,提取,寻找,生成,识 别,列出,测量,组织,解析,挑选,预测,提供,排名,推荐,返回,检索,改写,选择, 展示,所以,总结,翻译,写作。
具体说明输出内容
请具体说明所需的输出。简短的指令可能无法充分指导 LLM,或者可能过于通用。在提示(通 过系统或上下文提示)中提供具体细节可以帮助模型专注于相关内容,从而提高整体准确性。
使用指令而非约束
指令和约束在提示中用于指导 LLM 的输出。
指令提供了关于期望的响应格式、风格或内容的明确指示。它指导模型应该做什么或产生什么。
约束是一组对响应的限制或边界。它限制了模型不应该做什么或避免什么。
越来越多的研究表明,在提示中关注积极的指令可能比过度依赖限制更有效。这种方法与人类 更倾向于积极的指令而不是不做某事的清单相一致。
说明直接传达期望的结果,而约束可能使模型猜测允许的内容。它提供了灵活性并鼓励在定义的 边界内发挥创造力,而约束可能会限制模型潜力。约束列表可能相互冲突
约束仍然有价值,但在某些情况下。为了防止模型生成有害或带有偏见的内容,或者当需要严格的输出格式或 风格时。
如果可能的话,请使用积极的指令:而不是告诉模型不要做什么,而是告诉它应该做什么。这可以避免混淆并提 高输出的准确性。
DO: Generate a 1 paragraph blog post about the top 5 video game consoles. Only discuss the console, the company who made it, the year, and total sales.
DO NOT: Generate a 1 paragraph blog post about the top 5 video game consoles. Do not list video game names.
作为最佳实践,首先应优先考虑指令,明确指出您希望模型做什么,并且仅在必要时出于安全、 清晰或特定要求使用约束。进行实验和迭代,以测试指令和约束的不同组合,找到最适合您特 定任务的方法,并记录这些信息。
控制最大标记长度
为了控制生成的 LLM 响应的长度,您可以在配置中设置最大标记限制,或者在提示中明确请求特定长度。例如:用一条推文长度的话解释量子物理学。
使用变量在提示中
为了重复使用提示并使其更具动态性,请在提示中使用变量,这些变量可以根据不同的输入进 行更改。例如,如表 20 所示,一个提供城市事实的提示。在提示中,不要将城市名称硬编码, 而应使用变量。变量可以通过让您避免重复来节省您的时间和精力。如果您需要在多个提示中 使用相同的信息,可以将它存储在变量中,然后在每个提示中引用该变量。当将提示集成到您 自己的应用程序中时,这非常有意义。
VARIABLES
{city} = "Amsterdam"
PROMPT
You are a travel guide. Tell me a fact about the city: {city}
实验输入格式和写作风格
不同模型、模型配置、提示格式、词汇选择和提交可能会产生不同的结果。因此,实验提示属性 如风格、词汇选择和提示类型(零样本、少样本、系统提示)非常重要。
例如,一个旨在生成关于革命性的视频游戏机世嘉 Dreamcast 文本的提示,可以表述为一个问 题、一个陈述或一个指令,从而产生不同的输出:
问题:世嘉梦幻之星是什么,为什么它是一款革命性的游戏机?
陈述:世嘉梦幻之星是世嘉于 1999 年发布的第六代视频游戏机。它 ⋯⋯
指令:写一段描述世嘉梦幻之星游戏机并解释为什么它如此革命性的段落
对于分类任务的少样本提示,混淆类别
一般来说,您的几个示例的顺序不应很重要。然而,在进行分类任务时,请确保在几个示例中混 合可能的响应类别。这是因为否则您可能会过度关注示例的具体顺序。通过混合可能的响应类别, 您可以确保模型正在学习识别每个类别的关键特征,而不是简单地记住示例的顺序。这将导致在 未见数据上具有更稳健和可推广的性能。
一个好的经验法则是从 6 个少量示例开始,并从这里开始测试准确性。
适应模型更新
了解模型架构的变更、新增数据和功能非常重要。尝试使用更新的模型版本,并调整您的提示 以更好地利用新模型功能。
尝试输出格式实验
除了提示输入格式外,还应考虑尝试输出格式的实验。对于像提取、选择、解析、排序、排名 或分类数据等非创造性任务,尝试让输出以结构化格式(如 JSON 或 XML )返回。
从提取数据的提示中返回 JSON 对象有一些好处。在实际应用中,我无需手动创建这种 JSON 格式,我已能以有序的方式返回数据(当处理日期时间对象时非常方便),但最重要的是,提 示 JSON 格式迫使模型创建结构并限制虚构。
总结来说,使用 JSON 作为输出格式的好处:
- 始终以相同风格返回
- 聚焦你想收到的数据
- 减少幻觉的可能性
- 使其具有关系感知能力
- 您将获得数据类型
- 你可以整理它
JSON 修复
虽然以 JSON 格式返回数据提供了许多优势,但它并非没有缺点。JSON 的结构化特性,虽然 有利于解析和在应用中使用,但比纯文本需要更多的标记,从而导致处理时间增加和成本上升。 此外,JSON 的冗长性很容易消耗整个输出窗口,当生成因标记限制而突然中断时,这尤其成 问题。这种截断通常会导致无效的 JSON,缺少关键的闭合花括号或括号,使得输出变得不可 用。幸运的是,像 json-repair 库(可在 PyPI 上找到)这样的工具在这些情况下非常有价 值。这个库可以智能地尝试自动修复不完整或格式错误的 JSON 对象,在处理 LLM 生成 的 JSON 时,尤其是在处理潜在的截断问题时,它是一个至关重要的盟友。
Working with Schemas
使用结构化 JSON 作为输出是一个很好的解决方案,正如我们在本文中多次看到的。但 input 怎 么办呢?虽然 JSON 在结构化 LLM 生成的 output 方面非常出色,但它也可以在结构化您提供 的 input~时非常有用。这就是 JSON 模式发挥作用的地方。JSON 模式定义了您 JSON 输入的预 期结构和数据类型。通过提供模式,您为 LLM 提供了一个清晰的数据蓝图,帮助它专注于相关 信息,并降低误解输入的风险。此外,模式可以帮助建立不同数据片段之间的关系,甚至通过包 括具有特定格式的日期或时间戳字段,使 LLM“ 时间感知 ”。
让我们假设您想使用一个大型语言模型( LLM )来生成电子商务目录中产品的描述。除了提 供产品的不定文本描述外,您还可以使用 JSON 模式来定义产品的属性:
{
"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"}
},
然后,您可以提供符合此架构的实际产品数据,作为 JSON 对象:
{
"name": "Wireless Headphones",
"category": "Electronics",
"price": 99.99,
"features": ["Noise cancellation", "Bluetooth 5.0", "20-hour battery life"],
"release_date": "2023-10-27"
}
通过预处理您的数据,而不是仅提供完整文档,而是提供架构和数据,您使 LLM 能够清楚地了 解产品的属性,包括其发布日期,从而更有可能生成准确且相关的描述。这种结构化输入方法, 引导 LLM 关注相关字段,在处理大量数据或将 LLM 集成到复杂应用时特别有价值。
与其他提示工程师一起进行实验
如果你处于必须尝试想出一个好提示的情况,你可能想找多个人一起尝试。当每个人都遵循本 章中列出的最佳实践时,你将在所有不同的提示尝试之间看到性能的差异。
CoT 最佳实践
对于 CoT 提示,需要在推理之后提供答案,因为推理会改变模型在预测最终答案时获得的 标记。
使用 CoT 和自洽性时,您需要能够从提示中提取最终答案,并将其与推理分开。
对于 CoT 提示,将温度设置为 0。
思维链提示基于贪婪解码,根据语言模型分配的最高概率预测序列中的下一个单词。一般来 说,当使用推理时,为了得出最终答案,很可能只有一个正确答案。因此,温度应始终设置 为 0。
记录各种提示模板
上文中已经提到过本章的最后一条建议,但我们无法强调这一点的重要性:详细记录你的提示 模板,这样你就可以随着时间的推移了解哪些做得好,哪些不好。
提示输出可能在不同模型、不同采样设置以及同一模型的不同版本之间有所不同。此外,即使在 同一模型的相同提示下,输出句子结构和词语选择也可能存在细微差异。(例如,如前所述,如 果两个标记具有相同的预测概率,则可能会随机打破平局。这可能会影响后续预测的标记。)
我们建议以表格 21 为模板创建一个 Google 表格。这种方法的优点是,当你不可避免地需要重 新访问你的提示工作 —— 无论是为了将来继续(你可能会惊讶,仅仅短暂的休息后就能忘记多 少),测试不同版本模型的提示性能,以及帮助调试未来的错误 —— 你将有一个完整的记录。
除了表格中的字段外,跟踪提示版本(迭代)、记录结果是否 OK/NOT OK/SOMETIMES OK 的字段以及记录反馈的字段也非常有帮助。
当在处理一个 retrieval augmented generation 系统时,你还应该捕捉影响内容被插入到提示 中的 RAG 系统的具体方面,包括查询、块设置、块输出和其他信息。
一旦你觉得提示接近完美,就将其应用到你的项目代码库中。在代码库中,将提示保存在与代码 分开的文件中,这样更容易维护。最后,理想情况下,你的提示是操作化系统的一部分,作为提 示工程师,你应该依赖自动化测试和评估程序来了解你的提示在任务中的泛化程度如何。
提示工程是一个迭代过程。尝试不同的提示,分析并记录结果。根据模型的表现调整你的提 示。持续实验,直到达到期望的输出。当你更改模型或模型配置时,返回并继续使用之前使 用的提示进行实验。