提示工程

生成式 AI 模块中,您了解到生成式 AI 模型的输入空间实际上是无限的。为了生成符合用户预期的输出,您需要构建提示。提示是应用与模型之间的结构化合约。

撰写良好的提示:

  • 说明 LLM 应如何构建回答。
  • 包含多个可随时间推移进行版本控制、测试和改进的组件。
  • 可作为共享制品,用于跨团队协作。

在本模块中,您将学习如何撰写有效的提示。我们会说明提示的结构,以及其组成部分在系统和最终用户之间的分布情况。您还将学习基本的提示技巧,以及每种技巧的适用场景。

在本模块中,我们将使用一个共享示例:BlogBuddy,这是一款由 AI 赋能的写作助理,灵感源自 CyberAgent 对 Prompt API 的使用

返回生成式 AI 模块,查看 BlogBuddy 系统蓝图

提示组件

每个提示组成部分在引导模型行为方面都发挥着特定作用。

  • 上下文:确定模型的角色和领域,以便模型了解其行为方式。
  • 指令:为模型分配特定任务。
  • 输入变量:由应用实时提供的特定情境上下文。
  • 输出格式:定义预期输出结构。例如,您可能需要 JSON 输出。
  • 示例:演示如何针对一个或多个其他输入执行任务。
  • 限制:设置明确的限制,以确保输出内容的一致性、安全性以及与品牌的一致性。

您的提示可以包含这些组成要素中的部分或全部。以下示例展示了 BlogBuddy 的写作助理功能的这些组件。

### Context

You are a writing assistant for blog authors.
Your job is to generate helpful, concise, and engaging content.

### Instruction

Generate 3 alternative titles for the user's blog post with a given style.

### Input variables

Here is the content of the blog post:
${blogPostContent}

Here is the desired style:
${titleStyle}

### Output format

Return valid JSON ONLY, in the following exact structure:
{
  "titles": ["Title option 1", "Title option 2", "Title option 3"]
}

### Examples

Example input:
{
  "blogPostContent": "I finally visited the small neighborhood café I've been eyeing for months...",
  "titleStyle": "friendly"
}

Example output:
{
  "titles": [
    "A First Visit to the Neighborhood Café",
    "Trying the Café I've Wanted to Visit for Months",
    "My Experience at a Long-Awaited Local Spot"
  ]
}
### Constraints

- Each title must be under 128 characters.
- Titles must be original, not copied verbatim from the draft.
- Keep the tone natural and human. Avoid emojis unless explicitly requested.
- Avoid sensationalism or clickbait.
- If the draft includes multiple topics, choose the most prominent topic.

对于您的第一个提示,请从基本要素入手:指令和输出格式。然后,在分析结果并确定需要哪些更精细的控制措施才能取得成功后,逐步添加更多组件。

系统提示与用户提示

部分提示组件是硬编码的,而其他组件可由最终用户提供:

  • 系统提示由应用开发者提供,用于定义模型的整体行为。它可以设置模型的角色、预期语气、输出格式(例如严格的 JSON 架构)以及任何全局限制。系统提示也是您编码安全和责任要求的地方。它在不同请求之间保持一致,并为模型的行为提供稳定的基础。

  • 用户提示包含直接促成输出的即时请求。 用户请求执行特定任务,其中可以包含特定变量。 例如,“为这篇帖子显示三个标题”“继续写这个段落”或“让这篇文案听起来更正式”。

大多数生成式 AI API 都允许您将提示构建为消息数组,每条消息都包含角色(系统或用户)和内容。这样可以更轻松地将稳定的全局指令与动态的每请求输入分开。

如何确定哪些组件应包含在系统提示中,哪些应留给用户指定?答案取决于用户体验的灵活性和模型的性能。

受限用例

对于高度特定的用例,可以在系统提示中预定义大部分提示。例如,在 BlogBuddy 中,用户可以点击显示标题,列出为草稿生成的标题建议。

任务是固定的,输出格式是已知的,用户无需提供额外的上下文即可获得预期结果。在这种情况下,您需要将所有稳定规则、语气指南、输出架构和示例都放在系统提示中。

如需使用 Prompt API 构建此功能,我们可以使用 initialPrompts 为整个会话定义系统级行为:

// Defines stable behavior for the entire session
const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: "system",
      content: `You are a blog-writing assistant.
      Your task is to generate high-quality titles for blog posts.
      Always respond in concise, friendly language.
      Return exactly 3 alternative titles.
      Produce valid JSON with a "titles" array of strings.`
    }
  ]
});

当用户点击 Show Titles 时,系统会针对当前内容调用提示:

// The only variable input is the blog content
const result = await session.prompt(blogContent);

随着时间的推移,用户可能会要求更高的灵活性和更全面的控制。在这种情况下,您可以将某些组件移到用户提示中,并提供界面控件。例如,包含风格或语气规范的下拉菜单。

不过,结构化操作过多可能会影响用户体验。在这种情况下,您可能需要改用更开放式的设计,让用户自行指定大部分提示。 您可以在用户体验模式模块中详细了解如何优化此设计。

灵活任务依赖于详细的用户提示

开放式互动体验,可帮助用户从头开始撰写博文,为用户提供更大的灵活性。他们可能会要求提供创意、大纲、重写内容、语气转换或头脑风暴,或者具体说明任务应如何执行。对于这类应用,您可能需要更强大的服务器端模型。

对于灵活任务,用户需要指定更多信息,因为可能的选项范围要广得多。系统提示仍然控制着整体行为。

最佳实践包括:

  • 在系统提示中放入稳定的规则、结构和示例。在用户提示中放入动态内容和特定于任务的请求。
  • 用户体验越开放,用户提示就越需要灵活,以适应不可预测的输入。
  • 用户提示需要完成的工作越多,模型的能力就越强,因为模型必须处理更多变化,但内置结构更少。

您可以使用这些规则,在产品上下文中逐步优化控制与用户灵活性之间的权衡。密切观察用户偏好设置和行为。更灵活的设置并不一定能转化为实际价值。用户还需要有时间、技能和认知带宽来撰写更详尽的提示。

常用的提示技巧

开发者通常会尝试多种提示技巧,以找到最适合其使用情形和模型的技巧。

零样本提示

您向模型描述任务,并希望获得最佳结果。例如:

"What is the capital of France?"

对于许多 AI 任务,零样本提示都是一种高效的基准。对于不太复杂的请求(例如查询百科知识),您最好还是使用这种技术。不过,在大多数实际应用中,您需要使用额外的条件和逻辑来扩展提示。

少样本提示

通过少样本提示,您可以提供示例来展示正确的行为、风格、结构和其他重要变量。以下是用于情感分类的提示示例:

You classify user messages into one of the following categories:
- "positive"
- "negative"
- "neutral"
Here are examples to guide your classifications:
Input: "I love this product! It works perfectly."
Output: { "label": "positive" }

Input: "This is terrible. I want a refund."
Output: { "label": "negative" }

少样本提示非常适合此类伪预测任务。它还可以应用于具有可识别结构的任务,例如图 1 中的标题生成。

当输出空间非常大时(例如开放式或长篇内容),小样本提示可能不是最佳技术。很难甚至不可能提供有意义的示例来涵盖该空间。

思维链提示

您鼓励模型在生成答案之前进行逐步推理。 您可以明确描述这些步骤,也可以让模型自行定义。例如:

"Think step-by-step to identify the main idea of this paragraph. Then produce a
short heading under 60 characters."

思维链非常适合需要多步推理和执行的任务,例如撰写博客文章大纲或支持复杂决策。这是所谓推理模型背后的主要技术。

这可能成本高昂。生成逐步推理轨迹会增加计算量、费用和延迟时间。仅当您的使用场景需要复杂的推理和规划时才使用。

自我反思提示

在初始生成之后,您要求模型自行评判并修改其输出。例如:

"Review your previous output.
Identify unclear phrasing and rewrite it more concisely."

自我反思对于需要通过迭代改进来完成的任务(例如编辑或重写工具)尤其有用。它易于实现,并且可以大幅提升质量。当提示的效果良好时,自我反思循环会很有帮助。首先,优化输出内容,使其更清晰或更令用户满意。

要点总结

在本模块中,您学习了如何使用结构化组件构建提示。实际上,提示工程是一项高度实验性的工作。只有经过多轮改进,才能实现清晰度和可靠性。

在下一模块中,我们将介绍以评估为导向的提示开发。这种做法有助于您系统地改进提示,并找到最适合您的产品和用户的提示。

资源

每种技术都有自己的变体和最佳实践。有各种详细的外部资源,例如:

请查看所选模型的文档,其中可能包含可帮助您获得尽可能理想效果的具体建议。

检验您的掌握情况

您可以在系统提示中指定哪些类型的规则?

具体输入变量(例如用户输入)、预期输出结构、模型角色和字符数限制。
太棒了,回答正确!
此处仅显示用户输入。
不太准确,再试一次。
确定模型的角色和领域,以便模型了解自己的行为方式。
不太准确,再试一次。
您使用的模型类型和模型大小。
不对,再试一次。

如果您希望模型在生成答案之前进行逐步推理,应该使用哪种技巧?

零样本提示
回答不正确。
少样本提示
回答不正确。
思维链提示
太棒了,回答正确!
自我反思提示
回答不正确。

小样本提示在什么情况下最有用?

要求模型在没有任何上下文的情况下执行任务。
回答不正确。
当任务遵循可识别的结构(例如生成标题)或需要特定格式时。
太棒了,回答正确!
当输出空间非常大时,例如开放式创意写作。
回答不正确。
当您希望模型批判自己的作品时。
回答不正确。

什么是自我反思提示技术?

让模型自行评判和修改输出内容,以提高清晰度或质量。
太棒了,回答正确!
多次运行提示并对结果求平均值。
回答不正确。
如果结果不理想,则要求用户重写提示。
回答不正确。
允许模型动态更改系统提示。
回答不正确。