在生成式 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."
自我反思对于需要通过迭代改进来完成的任务(例如编辑或重写工具)尤其有用。它易于实现,并且可以大幅提升质量。当提示的效果良好时,自我反思循环会很有帮助。首先,优化输出内容,使其更清晰或更令用户满意。
要点总结
在本模块中,您学习了如何使用结构化组件构建提示。实际上,提示工程是一项高度实验性的工作。只有经过多轮改进,才能实现清晰度和可靠性。
在下一模块中,我们将介绍以评估为导向的提示开发。这种做法有助于您系统地改进提示,并找到最适合您的产品和用户的提示。
资源
每种技术都有自己的变体和最佳实践。有各种详细的外部资源,例如:
- Google Cloud 的提示工程指南
- DAIR 的提示工程指南
- Janna Lipenkova 撰写的提示撰写简易指南
- 请参阅《AI 产品开发艺术》中的第 6 章。
请查看所选模型的文档,其中可能包含可帮助您获得尽可能理想效果的具体建议。
检验您的掌握情况
您可以在系统提示中指定哪些类型的规则?
如果您希望模型在生成答案之前进行逐步推理,应该使用哪种技巧?
小样本提示在什么情况下最有用?
什么是自我反思提示技术?