大宾的私人知识杂志

AI 应用工程入门(二):如何写稳定可控的 Prompt?

用普通人能听懂的方式解释 Prompt 为什么不是随便提问,而是模型任务的接口协议。

2026-06-115 min

很多人刚开始使用大模型时,会把 Prompt 当成一句问题,比如“帮我总结一下”或“帮我起几个标题”。这种写法适合临时尝试,但不适合产品。产品里的 Prompt 应该像接口协议一样清楚,让模型知道要做什么、按什么边界做、输出给谁使用。

题目 1:Prompt 为什么不是一句问题?

标准答案:Prompt 是给模型的任务说明书。一个好的 Prompt 通常包含角色、任务、背景、输入、约束、输出格式和异常处理。

工程要点:任务越模糊,输出越飘。比如“帮我总结文章”没有说明总结给谁看、总结几个要点、是否允许补充背景、输出 Markdown 还是 JSON。AI 应用工程里,Prompt 的目标不是让模型自由发挥,而是让结果稳定、可控、可解析。

题目 2:工程化 Prompt 的基本公式是什么?

标准答案:好 Prompt 可以先按这个结构写:角色、任务、背景、约束、输出格式、输入内容。

工程要点:角色控制表达风格,任务说明要完成什么,约束规定不能做什么,输出格式决定程序能不能继续消费结果。比如标题生成任务要说明生成几个、标题长度、风格范围、是否允许标题党、只能基于原文还是可以补充常识。

题目 3:为什么输出格式特别重要?

标准答案:AI 应用里,模型输出经常不是直接给人看,而是要被界面渲染、后端解析、数据库存储或进入下一步流程。因此输出格式必须稳定。

工程要点:如果希望模型返回 JSON,就要明确写“只返回合法 JSON,不要返回 Markdown,不要添加解释文字”,并给出完整字段结构。即便如此,后端仍然要做 JSON parse 和字段校验。模型不是编译器,不能完全相信它每次都按格式来。

题目 4:如何让模型生成公众号标题?

标准答案:不要只写“根据文章生成标题”,而要写清角色、任务、约束和输出格式。例如:你是中文公众号高级主编;请根据文章生成 5 个标题;每个标题 12 到 28 个中文字符;风格只能从观点型、故事型、反差型、干货型、情绪共鸣型中选择;只返回 JSON。

工程要点:这类 Prompt 的关键不是文采,而是控制边界。生成数量、长度、风格枚举、是否基于原文、信息不足时怎么处理,都要写清楚。这样结果才更容易进入产品流程。

可以把标题生成任务写成这样的完整模板:

示例代码示例
角色:中文公众号高级主编。
任务:根据文章生成 5 个适合公众号发布的标题。
约束:
- 只能基于文章内容,不要编造文章没有的信息。
- 标题 12 到 28 个中文字符。
- style 只能是:观点型、故事型、反差型、干货型、情绪共鸣型。
- reason 用一句话说明推荐理由。
- 只返回合法 JSON,不要返回 Markdown,不要添加解释文字。

输出格式:
{
  "titles": [
    {
      "title": "标题",
      "style": "风格",
      "reason": "为什么推荐"
    }
  ]
}

文章:
<文章内容>

这个模板把“帮我想几个标题”的自由发挥,改造成了一个可解析接口。后端拿到结果后,可以校验 titles 是否是数组、title 是否为空、style 是否在枚举范围里。

题目 5:AI 应用工程师写 Prompt 的目标是什么?

标准答案:不是让模型看起来聪明,而是让模型输出稳定、可控、可解析、可评测。

工程要点:Prompt 越像 API 文档,模型输出越稳定。后续如果要做评测、重试、缓存、界面渲染,都依赖这个稳定性。Prompt 不是玄学咒语,而是 AI 应用的一层工程协议。

完整示例:Prompt 要写成接口协议

课程里讲 Prompt,不是为了追求玄学提示词,而是把它当成 AI 应用的接口协议。接口协议必须让模型知道:谁在执行任务、要处理什么输入、不能越过什么边界、输出给谁消费、失败时怎么返回。只要输出要被程序继续处理,Prompt 就不能只写一句“帮我”。

以公众号标题生成为例,随口写“帮我生成标题”会带来四类问题:标题数量不稳定,风格不可控,结果不可解析,文章信息不足时模型也会硬编。工程化 Prompt 要把这些问题提前写进去。

示例代码示例
角色:中文公众号高级主编。
任务:根据文章生成 5 个适合公众号发布的标题。
输入:一篇中文文章。
约束:
- 只能基于文章内容,不要补充文章没有的信息。
- 标题长度 12 到 28 个中文字符。
- style 只能取:观点型、故事型、反差型、干货型、情绪共鸣型。
- 如果文章内容太短或无法判断主题,返回空 titles 数组。
- 只返回合法 JSON,不要返回 Markdown,不要解释。

输出格式:
{
  "titles": [
    { "title": "标题", "style": "风格", "reason": "推荐理由" }
  ]
}

文章:
<article>

这份 Prompt 的重点不是“高级主编”四个字,而是后面的任务边界。角色只影响口吻和判断标准;约束影响能不能稳定;输出格式影响程序能不能解析;异常出口影响模型会不会硬答。

服务端还应该把 Prompt 和用户输入分开拼装,避免把业务规则散落在接口里:

TypeScript代码示例
function buildTitlePrompt(article: string) {
  return [
    TITLE_SYSTEM_PROMPT,
    "文章:",
    article.slice(0, 12000),
  ].join("\n\n");
}

function validateTitleResult(value: unknown) {
  // 真正项目里可以用 zod 或 JSON Schema
  if (!value || typeof value !== "object") return false;
  return Array.isArray((value as { titles?: unknown }).titles);
}

这一课的课程重点是:Prompt 不是一句话,而是任务协议。协议写清楚,后面才能做缓存、重试、解析、评测和版本管理;协议写不清楚,再好的模型也只能靠运气输出。

这一篇最该带走的结论是:写 Prompt 不是把想法说给模型听,而是为模型定义任务接口。接口越清楚,系统越稳。