重要提示:如需以 Markdown 形式查看本页,请在 URL 后追加 `.md`。 完整文档索引见 llms.txt
跳到主要内容
完整文档索引见 llms.txt。 在任意 URL 后追加 `.md` 即可查看该页面的 Markdown 版本。

提示工程(Prompt engineering)

Prompt engineering 是使用 LLM 时最实用的技术之一。它能让你在不修改模型本身的情况下,引导模型行为、提升输出质量,并构建可靠的应用。

什么是 prompt engineering?

Prompt 本质上就是你发送给 AI 模型的输入。模型可以进行推理并生成文本,但它需要依赖 prompt 来理解:

  • 它应执行什么任务
  • 答案应遵循什么格式
  • 它必须遵守哪些约束

Prompt engineering 就是以某种方式组织指令、示例和上下文,使模型更倾向于产出你想要的结果。对于许多 inference 工作负载来说,更好的 prompt 往往是获得更好结果的最简单路径。

例如,下面两个 prompt 会产生非常不同的结果:

# Basic prompt
Summarize this article.

# Improved prompt
Summarize the article in three bullet points.
Focus on key technical insights.
Do not include opinions or marketing language.

第二个 prompt 给了模型清晰的期望,因此更容易得到更有意义的输出。

为什么 prompt engineering 对 inference 很重要

面向 LLM 的 prompt engineering 与 inference 的工作方式密切相关。

在 inference 期间,模型不会改变权重。它只是基于收到的输入生成 token。这意味着 prompt 就成了应用与模型之间的主要接口。你的 prompt 设计会直接影响模型在运行时的行为。

Token 使用量与成本

每个请求都包含输入 token(prompt)和输出 token(生成的响应)。更长的 prompt 会增加模型需要处理的 token 数量,这会影响:

  • Latency:更多 token 意味着 prefill 阶段需要更多计算
  • GPU utilization:更多 token 需要更多算力和内存带宽
  • Inference cost:按 token 计费或基础设施成本会随着 token 使用量增长

对于高吞吐 inference 系统,prompt 长度会成为一个重要的优化因素。

KV cache 使用

LLM inference 严重依赖 KV cache (Key-Value cache) 来加速生成。

在 prefill 阶段,模型会处理整个 prompt,并把中间 attention states 存入 KV cache。到了 decoding 阶段,模型会复用这份 cache,而不是重新计算先前 token 的 attention。

不过,KV cache 的大小会随着 prompt 中 token 数量增加而增长。这意味着更长的 prompt 会导致:

  • 更大的 KV cache 内存占用
  • 更高的 GPU VRAM 消耗
  • 每块 GPU 可同时处理的并发请求更少

对于大模型或长上下文工作负载,prompt 大小会直接影响 throughput 和系统可扩展性。

模型可靠性

在生产 inference 系统中,模型必须在成千上万甚至数百万次请求中保持行为一致。

结构不良的 prompt 可能导致:

  • 输出不一致
  • 格式错误
  • 意外的推理路径

精心设计的 prompt 可以降低这些风险。通过清晰定义任务、输出格式和约束,你可以让模型在 inference 期间的行为更加可预测。

当 LLM 被嵌入自动化工作流、API 或 agentic 系统中时,这一点尤其重要。

运行时控制层

在许多 AI 部署中,prompt engineering 成为了模型之上的第一层控制。开发者无需修改模型本身,而是通过调整 prompt 来:

  • 强制输出结构(JSON、markdown 等)
  • 控制语气或风格
  • 限制行为
  • 引导推理

由于 prompt 是请求 payload 的一部分,它可以快速更新,而无需重新训练模型或修改 serving 基础设施。这使 prompt 成为在生产环境中引导模型行为的一种灵活方式。

Prompt engineering 往往会与 inference parameters 一起调优。Prompt 定义任务和约束,而 temperaturetop_pmax_tokens 等参数则控制模型如何采样以及如何限制响应长度。

Prompt 角色

大多数现代 LLM API 会把 prompt 拆分成不同角色。最常见的类型有:

  • System prompt
  • User prompt
  • Assistant messages

系统提示词(System prompt)

System prompt 定义模型的整体行为。它相当于一组操作指令,用于指导模型如何响应。

示例:

You are a technical assistant that explains LLM inference concepts clearly.
Use short paragraphs and simple language.
Avoid unnecessary jargon.

对于开发者来说,system prompts 通常用于:

  • 定义 assistant 的角色或 persona
  • 强制响应格式(例如 JSON)
  • 限制话题或行为
  • 提供任务特定指令

对于直接与聊天界面交互的个人用户,system prompt 通常是隐藏在后台的。它由应用开发者配置,用于帮助在不同用户之间保持一致行为。

用户提示词(User prompt)

User prompt 包含用户或应用真正发送的请求。

示例:

Explain what a transformer model is in simple terms.

对于个人用户来说,这就是他们在聊天界面里输入的问题或指令。

对于开发者来说,user prompt 往往由应用动态生成。它可能包含:

  • 用户输入
  • 从数据库检索出的文档
  • 对话上下文
  • 结构化任务指令

例如,在一个文档问答系统中,user prompt 可能如下所示:

Answer the question using the context below.

Context:
{retrieved_documents}

Question:
{user_question}

在生产 inference 系统中,user prompts 通常会先通过程序拼装,再发送给模型。

提示词模板(Prompt templates)

在生产系统中,prompt 很少每次都手写。相反,开发者通常会使用插入动态数据的 prompt templates。

示例模板:

You are a helpful assistant.

User question:
{question}

Provide a concise answer in three bullet points.

Prompt templates 使以下事情更容易实现:

  • 在应用间标准化 prompt
  • 保持一致性
  • 在一个地方更新行为

像 LangChain、LlamaIndex 以及许多 inference 平台都支持 templated prompts。

助手消息(Assistant messages)

Assistant messages 表示模型在对话先前轮次中生成的响应。它们主要有两个用途:

  • 表示先前的模型输出
  • 被开发者用来引导或约束后续响应

由 API 返回

在大多数 chat API 中,模型会返回一个角色为 assistant 的 message。构建多轮对话时,应用通常会在下一次请求里带上这些先前消息。

示例:

messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]

通过包含先前消息,模型就能维持连贯的对话。

但从模型视角来看,这些消息并不会被特殊对待。在 inference 期间,整个对话历史只是被转换成一串 token,并作为输入 prompt 的一部分进行处理。

对于大型 inference 系统,长对话会降低 throughput,并提高基础设施成本。为管理这一点,AI 团队通常会实现以下策略:

  • 截断消息,只保留最近几轮
  • 对旧上下文做对话总结压缩
  • 使用 Prefix caching 复用共享 prompt 片段
  • 使用 KV cache offloading 在需要时把 cache 数据迁移到低成本存储

由开发者注入

Assistant messages 不一定只能来自模型本身。开发者也可以插入合成的 assistant messages 来引导模型行为。

这种技术有时被称为 assistant prefillingresponse prefixing

由于 LLM 是自回归模型(它会基于之前所有 token 预测下一个 token),模型并不在乎 "Assistant" 角色中的文字究竟是它自己生成的,还是你手动写进去的。它只会把这些文字视作既定开头,并从那里继续。

这让开发者可以引导响应或强制结构。例如,你可以引导模型生成有效的 JSON 输出:

messages = [
{"role": "user", "content": "Show me a list of popular open-source llms in JSON."},
{"role": "assistant", "content": "Here is the JSON list you need:\n{"}, # The model continues from here
]

编写更好 prompt 的实用技巧

几个简单做法就能显著提升结果:

说得明确

准确告诉模型你想要什么。

不佳示例:

Explain this.

更佳示例:

Explain this concept to a beginner using simple language and one example.

指定输出格式

如果你的应用需要 structured output,就明确写出来。

示例:

Return the answer in JSON format with fields:
- summary
- key_points
- confidence

保持 prompt 聚焦

包含无关指令的长 prompt 可能会让模型困惑。应让指令清晰、聚焦任务本身。

测试不同变体

微小的措辞变化有时会带来很大的结果差异。Prompt engineering 通常需要实验和迭代。


当你开始构建真实系统时,通常会把 LLM prompt engineering 与其他技术结合使用,例如 structured outputstool callingfine-tuning。理解 prompt 如何影响模型行为,是构建稳健 LLM 应用的第一步。

常见问题

什么是 zero-shot、one-shot 和 few-shot prompting?

这些术语描述的是:为了引导模型,你在 prompt 中包含了多少示例。

Zero-shot prompting 表示 prompt 中只有指令,没有示例。

Classify the sentiment of the following sentence as Positive or Negative.

Sentence: I really enjoyed this movie.

模型只能根据指令本身来完成任务。

One-shot prompting 会提供一个示例,用来展示期望的行为。

Classify the sentiment of the following sentences.

Sentence: This restaurant is amazing.
Sentiment: Positive

Sentence: The service was terrible.
Sentiment:

这个示例能帮助模型理解应当遵循的模式。

Few-shot prompting 则会在真实输入前提供多个示例。借助这些示例,模型能更好地识别模式,并生成更可靠的结果。

Classify the sentiment of the following sentences.

Sentence: This restaurant is amazing.
Sentiment: Positive

Sentence: The service was terrible.
Sentiment: Negative

Sentence: I really enjoyed the meal.
Sentiment:

下面是一个并列对比:

类型含义示例用途权衡
Zero-shot promptingPrompt 仅包含指令,不包含示例。总结、翻译等通用任务。Prompt 短、token 成本低,但模型可能误解格式或预期。
One-shot promptingPrompt 包含一个示例,展示期望输入输出模式。教模型特定格式或风格。Prompt 稍长,但有助于澄清任务。
Few-shot promptingPrompt 在真实输入前包含多个示例。分类、structured outputs 或领域特定格式。往往能提升可靠性,但会增加 token 使用量和 inference 成本。

prompt engineering 和 fine-tuning 有什么区别?

Prompt engineering 和 fine-tuning 都旨在改善模型输出,但它们工作的方式非常不同。

方法改变的是什么适用场景
Prompt engineering调整输入 prompt 中的指令快速迭代、格式控制、任务引导
Fine-tuning使用训练数据更新模型权重领域知识、专门任务

Prompt engineering 通常是第一步。它快速、灵活,而且不需要训练基础设施。Fine-tuning 在以下情况下会变得有用:

  • 仅靠 prompt 无法产出可靠输出
  • 任务需要模型本身并不具备的领域知识
  • Prompt 变得过长或过于复杂
  • 对一致性的要求非常严格

许多生产系统会将这两种技术一起使用:

  1. 先从 prompt engineering 开始。
  2. 如果需要,再加入 few-shot examples。
  3. 当 prompt 改进达到极限后,再对模型进行 fine-tuning。

什么是 Chain-of-Thought (CoT) prompting?

Chain-of-Thought prompting 是一种 prompt engineering 技术,它鼓励 LLM 在给出最终答案前先生成中间推理步骤。

这项技术最早由论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 提出,作者为 Jason Wei et al. (2022)。作者表明,提示模型生成中间推理步骤,可以显著提升它在数学题、推理和逻辑推断等任务上的表现。

Chain-of-thought prompting 示例

图片来源:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

不过,对于 inference 系统来说,这里有一些权衡:

  • 推理步骤会增加输出 token 长度
  • 更长的输出会增加 latency 和 inference cost
  • 如果只需要最终答案,推理文本可能还需要额外过滤

因此,一些生产系统会在内部生成推理过程,只把最终结果返回给用户。

prompt engineering 在什么情况下会失效?

Prompt engineering 很强大,但它也有边界。如果一个任务需要模型并不具备的领域知识,或者你需要在数百万次请求中保持严格一致性,那么仅靠 prompt engineering 可能不够。在这些情况下,可能需要使用 fine-tuning、RAG,或 constrained decoding 等技术。