本章内容涵盖:
- 提示工程基础
- 将外部知识整合到提示中
- 帮助语言模型进行推理和行动
- 组织提示工程流程
- 自动化提示优化
提示赋予语言模型(LM)生命。提示工程是一种强大技术,可在不通过昂贵微调更新模型内部权重的情况下,引导模型行为。无论你是技术专家,还是在AI产品团队中担任非技术角色,掌握这项技能都是使用语言模型的关键。提示工程让你能够立即开始使用语言模型,快速探索和增强其能力,无需技术专长。通过精心设计的提示,你可以让语言模型执行应用所需的特定任务,提供符合用户需求的定制功能。
本章将继续跟随 Alex,观察他如何在提示工程领域探索,以提升其应用生成内容的质量。他从简单的零样本提示开始,逐步学习更高级的技术,如链式思维(CoT)和反思提示。每种方法都激发语言模型不同的认知能力,从类比学习到将复杂问题拆解成可管理部分。图6.1展示了这一进阶过程。
通过理解这些技术,你将获得应用现有方法和创造创新提示的工具,以应对特定的使用场景。效率至关重要,因此在6.4节,我们将介绍管理提示开发的最佳实践,以及帮助你保持探索有条不紊和高效的工具与流程。
提示工程也是更高级语言模型架构的基础,如检索增强生成(RAG)、语言模型微调和代理式AI系统,这些内容将在第7至9章中详细讲解。所有这些技术都依赖于良好的提示来引导语言模型的行为。在许多项目中,随着应用的成熟,你会从一种语言模型架构过渡到另一种,但所使用的提示通常相对稳定。
6.1 提示工程基础
本节将带你了解提示工程的基础知识。我们将从零样本提示(zero-shot prompting)开始,这是一种简单的输入-输出提示技术,没有任何附加条件。随后,我们会探讨更高级技术中提示的组成部分,并了解如何将它们组织成提示模板。
6.1.1 零样本提示
零样本提示是最直接的提示方法。我们只需将任务文本输入模型,要求其给出响应或解决方案。图6.2中的例子展示了一个用于情感分析的简单提示,即判断一段文本是积极还是消极。
图6.2 情感分析的输入-输出提示示例
如图所示,提示仅包含任务说明,没有附加信息,例如示例或更详细的执行指令,模型仅在“Sentiment:”后生成下一个词语,如上方框中所示。零样本学习直接利用了自回归语言模型的预训练目标,即在给定上下文的情况下预测下一个词。
虽然技术上较为简单,零样本提示在语义层面仍有很大的发挥空间。为了优化输出,你可以加入额外的上下文信息、请求细节、期望风格的说明等。因此,在其提示探索初期,Alex 设计了如下提示:
Generate a blog article on Small Language Models for CIOs of large businesses. Make it engaging and actionable, showing ways to integrate SLMs into their IT operations.
从技术上讲,这个提示的工作原理与简单的情感分析提示相同:将问题视为过去的上下文,输出答案是基于预训练目标生成的。我们可以假设语言模型在训练数据中见过这种风格的对话,因此生成了更详尽的输出。用户对此是预期的,就像你把任务交给团队成员时,会期望得到更详细的答复一样。
实际上,零样本提示在简单任务和训练数据覆盖的任务上效果很好。如果任务复杂或全新,语言模型可能需要更多信息,比如任务执行的“示范”(少样本提示)或涉及的推理步骤描述(链式思维提示,CoT)。我们稍后会讨论这些技术——但首先,让我们梳理一下完整提示中可用的各种构建模块。
6.1.2 使用提示组件和模板组织提示工程
Alex 在开始做提示工程时进展迅速。他浏览了许多提示指南和论坛讨论,学习最新的提示技巧,并能马上尝试哪些对他的应用有效。然而,不久之后,他发现学习曲线趋于平缓,细节让他陷入困境。他难以记清已经尝试过的内容,分不清哪些方法有效、哪些效果不佳。经过反思,Alex 意识到许多成功的提示都具有某些共同元素和模式。为了简化流程,他决定系统化自己的方法。他找出可重复使用的关键组件,提炼出几个成功的提示结构。通过定义可调整变量(如主题和内容类型),使提示模板具有重用性和高效性,便于今后生成内容。
提示组件
简单的零样本提示让你能利用现有语言模型的能力。但大多数创造真正用户价值的任务更复杂,结果质量和价值取决于你提供多少相关信息以及提示设计得多好。除了你希望模型响应的指令或问题外,还可以包含其他信息,比如额外上下文、输入变量或示例。一个完整的提示通常包含以下组件:
-
上下文——外部信息,引导模型生成更优回复。例如,在对话场景中,可提供迄今为止的对话内容作为下一轮回复的上下文。上下文还常用于角色扮演,指定模型应扮演的角色。我的经验是,角色扮演在专业领域(如合规、法律、医疗)尤其有效。
示例:你是一位对AI法规(包括欧盟AI法案)深谙其道的专家内容创作者,负责撰写高质量内容,帮助专业人士了解AI合规。你熟悉行业趋势和法律影响,语气权威而易懂。 -
指令——你希望模型执行的任务。
示例:生成一篇关于提供主题的详细博客文章,重点介绍如何遵守欧盟AI法案。文章应信息丰富、可操作,且便于商业专业人士理解,以确保其AI系统合规。 -
示例——展示任务在其他输入数据上的执行示范(见5.2节少样本提示)。
示例1:
主题:AI系统中的数据隐私
内容:开发AI系统时,确保数据隐私至关重要。GDPR要求通过强加密、限制访问和获得适当同意来保护个人数据。
示例2:
主题:AI开发中的伦理考量
内容:AI开发者须考虑公平、透明和责任等伦理原则,确保AI系统不延续偏见,并对用户及监管机构负责。 -
输入数据——动态变量和占位符,用于创建灵活且可复用的提示模板。以 Alex 为例,可包括内容主题、类型和风格。
示例:
主题:[插入主题,如“遵守欧盟AI法案的步骤”]
类型:[博客文章、社交媒体帖子、新闻通讯等]
风格:[权威、对话式、专业等] -
输出格式——关于输出类型或格式的说明。当你希望对输出进行程序化后续处理时,这非常重要。
示例:输出应按以下结构组织:
引言:简要介绍主题。
正文:详细阐述3–5个关键点,每点用小标题分隔。
结论:总结重点,鼓励读者采取行动。 -
限制条件——限制模型输出的额外指令。例如,Alex 可以限制输出长度,要求避免某些词汇等。
示例:
限制条件:- 文章限制在800字以内。
- 避免专业术语,使用简单易懂的语言。
- 不包含推广性语言或产品提及。
创建提示模板
你不必在每个提示中都包含上述所有组件——最优的提示结构依赖于具体任务。在自己迭代寻找最佳提示时,记下尝试过的内容。一旦找到有效提示,就可以将其保存为模板,方便后续复用。提示模板为所有你可能想修改的变量预留位置。使用提示模板时,只需填写变量值,无需重复写整个提示。类似 LangChain(mng.bz/rZyZ)这样的模板引擎会帮你填充现有模板中的变量。
注意事项
不要过早依赖提示工程工具——在未充分了解需求和流程前,它们可能限制你的灵活性。建议先手动尝试不同表述、示例结构和优化方案。一旦识别出有效模式,再引入工具进行优化和规模化。这确保你保持掌控,避免过早受限,开发真正符合用例的提示。
以下是 Alex 用于生成博客文章的示例模板:
[context]
We’re an AI consultancy and want to promote the use of Small Language Models among our clients because we believe in their efficiency and quality.
[instruction]
Write a {content type}<blog article> about {topic}<Small Language Models> for {target audience}<CIOs of large businesses>. Make it engaging and actionable, showing ways to integrate the concept into their IT operations.
[constraints]
Observe the following:
- Use {style}<objective, professional> language.
- The article shouldn’t exceed {length}<2000> words.
通过将提示拆解成模块化元素——例如系统提示、指令、上下文和示例——提示的创建变得更加结构化且易于复现。这不仅提升了一致性,也加快了迭代速度。提示模板允许将动态变量轻松插入预定义结构,使针对不同任务调整提示更快捷。像 LangChain 这样的工具进一步自动化这一流程,提高了生产力和提示的整体质量。
你可以在附录中找到用于记录提示实验的模板。结合模块化方法,这将使提示工程从令人沮丧、临时拼凑的活动转变为结构化的优化过程。你也可以进阶尝试更高级的技术,如少样本提示和链式方法,从而释放语言模型更高的效率和精确度。
6.2 少样本提示:通过类比学习
如果零样本提示对于你的任务效果不够理想,少样本提示是下一个合理尝试的步骤。它依赖于成功任务执行的示例,引导模型通过类比学习。你如何构造和排列这些示例,会显著影响语言模型的输出。
6.2.1 少样本提示基础
在少样本提示中,你向模型展示一个或多个高质量的任务示例(也称演示),每个示例包括输入和对应的目标输出。模型据此泛化到同类新任务,即指令中描述的任务。通常,这比简单的零样本方法表现更好。然而,少样本提示的原始形式因需人工构建示例,扩展性较差。同时,它会消耗更多的token,当输入示例过长时,可能会触及模型的上下文长度限制。
向提示中添加示例
图6.3 情感分析少样本提示示例
让我们将图6.2中的情感分析提示扩展为少样本提示(见图6.3)。首先,添加一些情感分析任务的示范例子,然后提供当前任务的输入,并提示生成对应输出。
在许多情况下,你不需要为每个示例都指定输入,因为输入相对稳定。因此,在 Alex 的应用中,用户应能提供其表现最佳内容的示例,使语言模型能够识别并复制其风格、结构等。Alex 为少样本提示设计了以下提示模板:
[instruction]
Generate a {LinkedIn post} to {announce our Webinar on May 25, 2025, on the topic of complying with the EU AI Act.}
[examples]
Here are some examples of announcements that performed well in the past:
Example 1:
Join us for an insightful webinar on Compliance with the EU AI Act!
Date: October 28, 2024
Time: 4:30 PM
Location: Virtual (Zoom/Webinar link)
The EU AI Act is set to introduce new regulatory frameworks, and it’s crucial for businesses to understand how to stay compliant. In this webinar, we’ll cover key aspects of the Act, compliance requirements, and practical steps to align your AI initiatives with the new regulations. Don’t miss this opportunity to stay informed and prepared.
Register now [Insert Registration Link] and ensure your business is ready for the future of AI governance!
Example 2:
Join our Webinar for a deep dive into Fine-Tuning Large Language Models (LLMs): Best Practices and Strategies!
Date: November 5, 2024
Time: 2:00 PM
Location: Virtual (Zoom/Webinar link)
Unlock the full potential of Large Language Models (LLMs) by learning how to fine-tune them for your specific needs. In this webinar, we’ll explore advanced techniques for optimizing LLMs, tailoring them for specialized tasks, and improving performance while maintaining efficiency. Whether you’re a developer or an AI enthusiast, this session will provide actionable insights and strategies to elevate your AI models.
Register now [Insert Registration Link] and take your LLM projects to the next level!
未来,Alex 计划将客户的媒体渠道整合进应用,使其能自动将表现最佳的示例内容拉入提示中。虽然模型输出效果尚可,但 Alex 仍然怀疑提供示例是否真的能提升性能。他回到零样本提示,发现对于社交媒体帖子等短文本,性能差距明显;然而对于博客文章等较长内容,输出质量似乎并未提升,于是又回归零样本提示。一般而言,随着你添加越来越多细节以优化结果,提示往往会“膨胀”起来。你应定期审查并精简提示,去除不必要的信息,使提示更简洁易管理,同时节省模型的 token 使用和推理时间。
识别与辨别偏见
少样本提示在训练示例的选择和排列顺序上提供更多灵活性,但不同组合会带来不同结果。这种变异性部分源自你在提示工程时应注意的几种偏见:
- 多数标签偏见——如果示例中的标签分布不均衡,则存在该偏见。例如,在情感分析的少样本提示中,如果大多数示例是正面情绪,模型可能会倾向于将后续示例判定为正面。通过使用平衡的数据集可减轻此偏见。
- 近期偏见——模型倾向于复制示例列表末尾的输出。例如,如果提示中最后一个情感分析示例是正面,模型可能会将当前示例也判为正面。这是因为语言模型对近期上下文记忆更深。可通过在示例列表中弱化最后一个示例标签的比例来缓解此偏见。
- 常见token偏见——模型更频繁地产生常见(概率较大)的token,而非罕见token。比如你想从文本中提取更细致的情绪,使用 Paul Eckman 定义的六种基本情绪(悲伤、快乐、恐惧、愤怒、惊讶、厌恶)[1]。如果模型训练数据中“快乐”和“恐惧”的出现频率高于其他情绪,模型会偏向输出这两个标签。一般通过在示例列表中增加少见标签的出现频率来减轻,但这很难,因为通常无法获得模型训练数据的频率分布。
附录中提供了少样本提示常见问题的故障排查指南。为避免提示混乱和重复工作,务必对提示开发过程进行文档记录和版本管理,以便追踪所做工作、有效方法及失败点(详见6.4.2节)。当你找到适合应用的成功提示关键因素后,可以考虑基于相关示例数据库的自动化方法,实现提示规模化,同时系统性地减轻上述偏见。
6.2.2 少样本提示的自动化
随着 Alex 持续开发他的内容生成应用,他发现了一个日益突出的问题:向少样本提示中添加的示例越多,模型的效率反而越低。起初,提供大量示例有助于引导语言模型的回复,但随着示范数量增加,提示变得过长且处理成本高昂。通过优化每个提示的示例选择,可以简化这一开销。Alex 可以构建一个系统,自动从数据库中检索对当前输入最有帮助的示例,而不是手动挑选或让模型处理过多示例。图6.4展示了这一流程。
构建示例数据库
首先,Alex 需要为不同的内容生成任务(如撰写产品描述或社交媒体帖子)构建一个针对性的示例数据库。起初,他考虑添加大量示例以覆盖所有可能的场景,但这种方式耗时且类似于创建微调数据的过程——这是他计划稍后探索的内容(见第8章)。
相反,Alex 选择了更聚焦的方法。他精选了一套较小但高质量的示例,代表多样且相关的案例,既降低成本,又保持模型的高性能和稳定性。这使模型能有效运行,避免不必要的冗余。
如果你使用少样本提示执行预测任务(如情感分析),可以利用语言模型自动完成数据标注。为节省更多资源,可以尝试“懒惰”方法,即对示例进行随机标注。标注应覆盖你希望模型使用的标签空间。以情感分析为例,可以随机为一组文本标注为正面或负面。虽然看似违背直觉,但研究发现标注的正确性对模型性能影响甚微[2]。理论上,随机标注可省去标注步骤。但需注意,示例数据库仍应包含其他学习信号,如目标标签空间和输出格式。
检索最有帮助的示例
系统应在提示时从数据库中检索“最有帮助”的示例,即对于给定输入,能为语言模型提供最强学习信号的示例。使用与输入任务相似的示例可提升模型性能。
例如,假设你向问答系统输入“德国的首都是哪里?”,并有两个候选示例:
- 示例A:
问题:法国的首都是哪里?
答案:巴黎 - 示例B:
问题:木瓜是长在树上吗?
答案:当然
示例A更有助于你的少样本提示,因为它与输入在语义上更为接近。文本的语义相似度通常通过句子嵌入来衡量,我们将在下一章学习相关内容。
通过少样本提示,你可以利用类比学习的力量教会语言模型新任务。然而,这些任务仍较为简单,解决方案主要是单步骤的。许多现实任务更复杂,需要语言模型执行更复杂的推理过程。
6.3 向语言模型注入推理能力
随着 Alex 的应用逐渐成熟,他开始遇到少样本提示的瓶颈。虽然少样本提示在处理社交媒体帖子等简单任务时表现良好,但面对详细的博客文章或需要多步骤推理的内容时,效果不佳。这时,链式思维(CoT)、自洽性(self-consistency)和反思(reflection)等推理技术派上用场。通过将任务拆解成逻辑步骤并对输出进行迭代,Alex 能引导模型处理更细腻复杂的内容生成,产出更丰富、更连贯的结果。
6.3.1 链式思维(Chain-of-thought)
我们的推理过程可以用语言描述。请看以下数学题:
问题:Roger 有五个网球。他又买了两罐网球,每罐有三个网球。现在他一共有多少个网球?
推理过程:
Roger 最初有 5 个球。
2 罐,每罐 3 个网球,共 6 个网球。
5 加 6 等于 11。
答案:11
这里,我们会给出最终答案。但正如老师常常要求我们详细说明思考过程,以便评估并发现潜在问题一样,语言模型也能从更细致透明的推理过程中受益。作为人类,我们知道如果花时间将复杂推理任务拆解成更简单的步骤(甚至可以写在纸上)并逐步解决,成功的概率更高。语言模型也是如此——如果你将推理过程分散在更长的相关 token 序列中,成功率也会更高。
链式思维(CoT)提示利用语言与推理的紧密关系,教导语言模型模拟推理过程(见图6.5)。其工作分为两个步骤:
- 思路拆解——将复杂问题拆分为更小、更易处理的部分。俗话说,“吃大象的方法只有一个——一口一口地吃”。
- 思路生成——为每个部分生成部分解决方案。当所有部分都“解决”后,语言模型便能构建出整体问题的最终解决方案。
以下是 Alex 为生成特定主题博客文章编写的提示示例:
[instruction]
Let’s write a blog article on <topic> following these steps:
[thoughts/subtasks]
Brainstorm Ideas:
List the main points and subpoints you want to cover. Focus on what’s important and relevant for the audience.
Outline:
Organize the points into a clear structure—beginning with an introduction, followed by the body sections, and ending with a conclusion.
Introduction:
Start with a hook to grab attention. Briefly introduce the topic and explain why it’s important to the reader.
Body:
Develop each section with clear topic sentences, examples, and supporting evidence. Make sure each section flows logically to the next.
Conclusion:
Summarize the key points, give a clear takeaway, and end with a final thought or call to action.
Edit:
Review the draft for clarity, structure, and flow. Make sure the writing is concise and engaging.
链式思维(CoT)也有其“懒人”变体。此时,我们跳过具体工作流程的说明,只是简单地让模型逐步思考或执行,例如:
[instruction]
Let’s write a blog article on <topic>.
First, outline the key steps in the writing process.
Then, follow these steps to write the article.
这迫使语言模型“边思考边表达”,在每个步骤生成中间结果。由于这种思考过程会产生更多的token,获得成功输出的概率因此高于直接跳到结论的情况。
链式思维的真正威力在处理复杂任务时体现得尤为明显。对于简单任务,比如生成一则快速公告,CoT 的优势可能不大;但对于涉及多层推理的任务,其效果不可否认。研究显示,使用推理复杂度更高的示范例子能显著提升性能,使得链式思维在解决复杂问题时远胜少样本提示。Alex 发现,针对许多内容相关任务,CoT 能使语言模型的表现接近微调模型的水平,节省时间和资源,同时不降低质量。
最后,CoT 的一个重要拓展是提示链(prompt chaining)。你可以为每个子任务单独运行一个提示,并将前一子任务的结果作为上下文传入。这种方法通过让模型专注于任务的各个部分,提高了准确性。提示链还可与其他复杂提示结合使用,如自洽性(6.3.2节)和反思(6.3.3节)。
想了解更多链式思维提示细节,可参考原始论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》[3]。给予模型“思考时间”,即推理时的扩展(inference-time scaling,详见6.4.1节),也启发了其他技术,如思维树(Tree-of-Thought,ToT)[4]和草稿本提示(scratchpad prompting)[5]。尽管如此,即便是最精心设计的推理步骤也无法保证完全准确。为此,Alex 认识到可以利用语言模型的自省能力进一步提升输出质量。下一节,我们将探讨自洽性提示,一种让模型批判性评估自身输出、提升准确性和可靠性的技术。
6.3.2 自洽性(Self-consistency)
与确定性的计算机代码——我们与机器交互的标准媒介——不同,大多数语言模型内置了一定程度的随机性,表现常常难以预测。同一个提示或略作修改的提示,多次运行可能产生截然不同的结果。这种不稳定性可能令人不安,但通过调整心态和调用语言模型的方式,我们可以利用自洽性提示[6]获得优势,如图6.6所示。如果时间和资源允许,可以多次运行提示(对于 OpenAI 模型,将温度参数调高于0以激活随机性),然后让模型从多个输出中选出“最佳”答案:
图6.6 自洽性提示示意图
- 对于具有明确标准答案的分类输出(如情感分析),你可以使用多数投票法来确定最终结果。
- 对于开放式输出(如文本生成),你可以让模型对自己的输出进行自我评估和评分。
- 有时还可以用更有把握的方法来评估输出。例如,如果你让模型生成一段代码以运行特定的单元测试,你可以检查该测试是否通过。
以下是 Alex 用于试验多种生成内容变体的示例提示:
[instruction]
Generate three <content type>{LinkedIn posts} to <message>{announce our Webinar on May 25, 2025, on the topic of complying with the EU AI Act}.
Critically evaluate the quality of your posts on a scale from 1 to 10.
[output format]
Provide the output as a JSON array, where each object has two fields:
- post
- evaluation
总体而言,自洽性是一条令人兴奋的路径,适用于需要创造力和创新的任务。在内容生成中,它可用于生成并筛选一系列创意选项。这不仅限于内容本身,诸如构思文章主题等其他任务也能通过自洽性来完成。这种创造性方法常用“双钻石模型”来描述,如图6.7所示。第一个钻石阶段从问题空间发散,随后聚合到一个最佳问题定义;第二个钻石阶段探索广泛的潜在解决方案,再将它们相互比较,以确定特定情境中最优的解决方案。
这两个钻石阶段都可以用自洽性提示来建模。在这种情况下,我们面临的是一个没有对错之分的创造性任务。最终答案的评估和选择应基于一组自定义标准,比如内容的新颖性、风格和深度。另一个技巧是为每个生成的备选方案设置不同的上下文。例如,假设你的内容同时面向不同的用户群体,你可以针对每个群体条件化语言模型,从而生成更加多样且具代表性的一组输出。
与链式思维类似,自洽性提示也可以拆解成多个组成部分。例如,Alex 可能会多次运行他的帖子生成提示,然后汇总所有生成的变体,要求语言模型对它们进行评估和比较:
提示1–4:
[instruction]
Generate a LinkedIn post to announce our Webinar on May 25, 2025, on the topic of complying with the EU AI Act.
提示5:
[instruction]
You’ll see a list of LinkedIn posts. Critically evaluate their quality on a scale from 0 to 10.
[inputs]
Here is the list:
{posts}
自洽性能够增强其他提示技术,包括零样本提示、少样本提示和链式思维(CoT)。利用语言模型谦逊自省能力的其他技术还包括自我完善、自我批评,甚至提示进化(prompt breeding),这是一种自动化的语言模型迭代自我提升方法[7]。我们这里不展开这些技术的细节,但如果你发现自洽性对你的问题效果显著,并希望进一步优化,建议深入研究相关论文。下一节,我们将探讨反思(reflection),这是一种结合自省与改进的强大技术。
6.3.3 反思与迭代改进
反思作为一种提示技术,要求语言模型审查、批评或改进其之前的输出。这类似于人类经常停下来反思自己的工作,通过多轮审查发现需要改进或完善的地方。就像作家写完一篇文章后会反复检查其清晰度、连贯性或逻辑漏洞一样,反思提示鼓励模型重新思考其回答,从而有机会提升准确性或获得更深入的见解。
假设 Alex 的应用用户正在使用语言模型生成一份关于遵守欧盟《人工智能法案》的详细报告。这是一个相当复杂的话题,需要在草稿、法规文本和其他相关文件间反复核对。因此,用于改进内容的反思提示可能如下所示:
[instruction]
Review the draft you just generated and identify any areas that need further clarification, checking, or additional detail. Then, use this feedback to provide a more comprehensive response.
该提示要求模型分析其输出并针对薄弱环节进行迭代改进。
与链式思维(CoT)和自洽性一样,这种提示策略也可以串联使用,以便在执行过程中获得更多的控制力和细化程度。例如,下面这组两个提示的顺序,先让模型评估其输出并提出改进建议,然后根据这些建议改进草稿:
提示1:
[instruction]
Review the draft you generated and evaluate it according to the following criteria: clarity, completeness, actionability. For each criterion, provide suggestions for potential improvement.
[inputs]
Here is your draft: {draft}
[output format]
Provide your result as a JSON array. Each object should contain the following fields:
Criterion: Name of the criterion
Score: Your evaluation score on a scale from 0 to 10
Feedback: Your feedback, including suggestions for improvement
提示2:
[instruction]
You’ll see a draft of a report about the EU AI Act and feedback on the draft. Use the feedback to improve the report.
[inputs]
Here is the draft:
{draft}
Here is the feedback:
{feedback}
反思也存在一些局限性。如果模型的初始输出根本存在缺陷或基于错误假设,仅仅反思回答可能无法纠正这些错误。如果没有明确具体的提示引导,反思可能会增加回复的长度或复杂度,但不一定提升质量。因此,关键是要在反思过程中保持谨慎的指导,确保其带来实质性改进,而非无谓的冗长。
先进的提示技术如链式思维(CoT)、自洽性和反思,使语言模型能够模拟人类的推理过程。链式思维通过将任务拆解成更小、更易处理的部分,逐步解决问题,从而提高复杂输出(如详细内容)的准确性。自洽性利用模型的内在随机性,生成多个输出并通过评估或投票选出最佳结果。反思提示则引导模型批判性地评估并改进其输出,促进迭代优化。这些技术,尤其是结合使用或串联应用时,增强了对模型的控制力、创造力和输出质量,是复杂问题解决和内容生成的有力工具。
6.4 提示工程的最佳实践
到目前为止介绍的提示技术为你提供了基本知识,帮助你开启提示工程之旅。随着经验的积累和提示活动的具体化,你将变得更加富有创造力,并探索这些技术的各种变体。本节介绍探索、编写和管理提示的最佳实践和工具。
6.4.1 通用指南
首先,让我们看看一些通用的提示指南。无论具体使用哪种语言模型、周边工具栈或解决何种问题,都可以将这些作为经验法则。
- 了解你的模型
正如第5章所述,理解你所用语言模型的能力、局限和偏见至关重要。除了对模型进行实验,还要深入调研其基本参数,如训练数据、截止日期、训练目标和过程等。了解其他人和公司如何使用该模型也非常有益。全面认识模型的优缺点能让你的提示工程更高效,并带来更安全、可靠的应用。 - 利用团队的集体智慧
提示工程的乐趣之一在于它极大地受益于团队的多样性和集体智慧。虽然提示工程是一门需要掌握的技艺,但相比其他工程学科(如计算机编程)它相对易上手。如果多名团队成员(包括技术和非技术人员)参与提示工程,这将是一次丰富的体验,并最终提升最终成果。在这种情况下,你应更加注重组织一个系统化的协作提示工程流程。 - 不断试验与迭代
提示工程是一门经验学科。虽然有通用的成功与失败指南,但它们并非适用于所有提示任务。此外,不同语言模型的提示方式有所不同,切换模型时,同一提示的输出可能发生巨大变化。因此,采用实验和迭代的心态,结合有纪律的评估和合适的工具保持团队有序(详见6.4.2节)非常重要。开始时保持简单——可采用一次性提示,尝试几种不同表达方式。然后分析模型输出的错误和不足,逐步采用更复杂的提示方法。附录中有一个模板,帮助你记录工作并监控进展。 - 精准且具体
在提示中尽可能明确有用的参数和细节,帮助模型生成最优答案。如果缺少必要细节,模型会自行猜测,容易导致误解,因为它无法完全掌握上下文。为了让语言模型应对自然语言的模糊和歧义,你需要针对期望结果量身定制提示。
举例来说,假如你想分析用户对产品新功能的反馈,了解满意度及具体问题。不要使用模糊的提示“用户如何看待我们的新功能?”——这可能得到泛泛的回答。应改用更有效的提示:“分析我们上个月发布的新分析功能的用户反馈,识别正面和负面情绪,突出用户提出的前三大问题。” - 提供丰富的上下文
通过整合上下文信息,你可以确保AI的回复更贴合你的目标和需求。你可以提供各种上下文线索,比如为何要执行当前任务、希望语言模型体现的角色、输出应采用的风格等。
比如,你用AI模型为新产品功能发布生成营销文案。你希望文案具说服力,面向技术精通的用户。与其使用通用提示,不如提供目标受众和合适风格的信息,例如:
Write marketing copy to announce our latest product feature, targeting tech-savvy users. Emulate the enthusiastic and engaging style of a tech product evangelist.
在这个带有上下文的提示中,你向AI提供了关于任务(营销文案)、受众(技术精通的用户)和风格(充满热情且吸引人的科技产品推广者)的具体细节。这些指导帮助语言模型生成符合目标受众口味、与业务目标一致的营销文案。它利用上下文信息确保AI的输出相关且量身定制,满足你的具体需求。
提供额外上下文时,需要权衡提示整体长度。提示越长,不仅成本更高,响应速度也更慢。甚至可能达到模型的上下文长度限制。因此,要简洁,只包含与任务直接相关的信息,并考虑使用第6.4.2节描述的高级提示优化技术。
备注:第7章我们将介绍检索增强生成(RAG),这是一种动态整合领域知识以回答用户查询的语言模型架构。
- 指定输出格式
默认情况下,语言模型的输出较为无结构且常常篇幅较长。例如,ChatGPT喜欢给出长长的列表或枚举。如果你需要特定格式或类型的输出,应在提示中直接说明。你可以要求模型生成连贯的文本,而非项目符号,也可以让它生成结构化输出,如JSON或CSV格式,使用特定语言(英语、德语、中文),去除所有冗余模板,采用特定的语言风格,等等。
例如,假设 Alex 应用的用户想生成一个关于领先的太空旅游开发公司的概览,用户可以使用如下提示:
[context]
I would like to write an article about the leading companies active in space tourism.
[instruction]
List and describe the main companies in this area.
像 ChatGPT 这样的模型会给出一份详细的公司列表,但用户仍需对数据进行解析和后处理。现在,我们来添加对输出格式的具体要求:
[context]
I would like to write an article about the main companies active in space tourism.
[instruction]
List and describe the main companies in this area.
[output format]
For each company, provide the following information in a JSON format:
Name of the company
Year founded
Location
Number of employees
Main USP
模型会生成结构化的输出,这不仅更简洁,还可以直接用于构建表格、数据可视化等。这种提示技术同样适用于第5章第5.2.3节中描述的语言模型模式。诸如微软的 Guidance(github.com/guidance-ai…)和 Outlines(github.com/dottxt-ai/o…)等框架支持高效生成结构化输出。
- 从不同视角收集多个结果
正如我们在自洽性讨论中提到的,你可以“欺骗”模型,让它扮演多个身份,从不同视角生成输出。在当今多样性越来越重要的商业环境中,这是一项值得探索的宝贵能力。让模型承担不同角色——如人口统计学、职业、性格等——并针对同一任务生成输出。
例如,在 Alex 的应用中,用户可以选择目标受众,如技术人员、商务高管、创业者等。提示模板会将所选细分群体加入提示中。如果用户指定多个群体,则可生成、审阅并混合多个草稿。虽然需要对特定观点中可能反映的刻板印象和偏见保持批判意识,但它们可以作为进一步探索、优化和汇聚到最佳解决方案的良好起点。
- 给模型时间思考:推理时扩展(Inference-time scaling)
当人类面对复杂认知任务时,如果能有更多时间去完成,得出正确结果的概率会增加。这让他们能细致思考解决步骤、测试备选方案、验证每一步结果等。正如6.3.1节中关于链式思维(CoT)所示,语言模型的情况类似——不同之处在于这里的“时间”维度不是实际时间,而是模型处理的token数量。模型将复杂问题拆解为多个步骤时,它通过生成更多token“拉长”了求解路径。每生成一个正确的token,都会增加成功的概率,因为它丰富了构建解决方案的上下文。迭代优化和投票方法(如自洽性)也是推理时扩展的变体。更多详情见文献《Scaling LLM Test-Time Compute Optimally Can Be More Effective than Scaling Model Parameters》[8]。
注意事项
推理时扩展会增加语言模型应用的成本。在采用此方法前,请确保其价值合理。简单的一步问题或如“越南的首都是哪里?”这类问题无需复杂推理,语言模型现有知识即可直接回答。相比之下,如果你的任务需要多步骤推理(如编程或商业建模),推理时扩展能显著提升输出质量。
6.4.2 系统化提示工程流程
在 Alex 构建内容生成应用的早期阶段,实验至关重要。他花费了大量时间在试验平台中不断调整提示,并记录哪些有效、哪些无效。这个探索阶段轻量且灵活,非常适合快速迭代和学习,也帮助他积累了竞争对手难以模仿的知识。
然而,随着应用趋于稳定,Alex 找到了一个能带来不错效果的基础版本,他的改进变得更加渐进,手动跟踪进展已无法满足需求。他需要一种方法来衡量每一次细微调整的影响,高效协作不断扩大的团队,并且最关键的是避免重复劳动。同时,风险也在上升——Alex 准备将应用推向用户,面对不可预知的输入来考验他的语言模型。他意识到,快速修补往往弊大于利,一次小的提示修改可能破坏其他精心设计的提示。此时,Alex 不再仅靠创造力和试错,而是需要一个管理提示工程流程的框架。
管理提示开发
从探索转向开发时,模块化尤为关键。在6.1.2节,我们看到可复用的提示组件和模板能节省时间并加快迭代。Alex 采用了 LangChain,具备强大的提示模板、上下文构建和记忆管理功能。对他的团队来说,像 PromptAppGPT(github.com/mleoking/Pr…)这样的低代码框架,或Prompt Engine(github.com/microsoft/p…)这样的图形化界面工具,使得技术和非技术成员都能轻松协作编写提示。
为了跟踪进展和版本管理,Alex 建立了版本控制,确保每次调整都被保存、版本化,必要时能轻松回滚。这一流程避免了重复工作,让团队能自信实验而不破坏已有功能。传统的机器学习运维(MLOps)工具,如 MLflow 或 Weights & Biases,也开始延伸到大语言模型运维(LLMOps),结合程序化控制和用户友好界面以管理提示。
未来,Alex 还考虑开发专属提示管理工具,允许团队直接在应用界面测试新提示。这将极大加快迭代速度,让团队实时获得新提示在实际环境中的表现反馈,缩短开发周期,提升用户体验。
优化提示
随着 Alex 使用少样本提示和链式思维提示不断完善他的提示,他意识到需要对提示进行优化以处理更复杂的任务并降低成本。因此,他采用了提示压缩技术[9],该技术在不丢失信息核心的前提下,压缩上下文和示例,保持高质量输出且减少token消耗。自动化压缩是确保大规模效率的关键。
Alex 还探索了自动提示调优,让模型学习针对特定任务优化提示。通过微调少量与内容生成任务相关的参数,Alex 能优化语言模型性能,无需大规模重训。这种方法帮助他针对应用独特需求调整模型,减少大量人工工程投入。
评估提示
在应用上线前,Alex 需确保提示能产生安全且高质量的输出。基于5.2.3节关于语言模型评估的原则,他建立了包含相关性、连贯性和准确性等关键指标的测试套件。但 Alex 不止于此,他还设计评估覆盖边缘案例,确保即使面对最意外的输入也能产生合理结果。随着真实用户数据的不断涌入,他计划持续完善测试套件。同时,他测试了诸如 BetterPrompt(better-prompts.online/)等开源工具,通过独立质量检测验证输出,确保应用在不可预测环境中平稳运行。
生产环境中的用户行为与反馈监控
一旦应用上线,Alex 很快遇到所谓的领域偏移(domain shift)问题——用户以他未预见的方式使用应用。尽管训练数据经过精心筛选,用户输入的自由文本却难以预测,导致错误、不准确甚至在某些情况下产生有害响应。这些风险可以通过 NVIDIA NeMo Guardrails 和 Guardrails AI 等护栏工具减轻。然而,即使使用这些工具,当用户直接与语言模型交互时,持续监控依然必不可少。监控帮助你根据真实输入调整提示和示例,逐步减少领域偏移,降低风险。
成功的提示工程结合了创造力、工程严谨性以及持续的监控和优化。本节介绍了在你开始探索提示技巧时确保提示有效的最佳实践,以及实现系统化、高效提示工程所需的流程和工具。下一章将介绍检索增强生成(RAG),这是一种动态丰富提示上下文信息的流行架构。
总结
- 对于简单任务或覆盖充分的话题,优先使用零样本提示。
- 面对复杂任务时,通过提供示例采用少样本提示。
- 将提示拆分为可复用组件,如上下文、指令和示例,以节省时间。
- 以结构化和迭代改进的思路开展提示工程。
- 使用链式思维(CoT)提示,引导模型完成多步骤任务。
- 利用自洽性提示,运行多个提示版本并选出最佳输出,适合创造性任务。
- 采用反思提示,让模型审查并改进其输出。
- 压缩上下文和示例,优化提示并减少token消耗。
- 根据真实用户交互持续监控和调整提示。
- 使用工具和版本控制,高效管理和完善提示开发。