Day 3:Prompt 工程与 Prompt Contract
学习目标
今天的目标是建立对 Prompt 工程的系统理解,从”随便写写”进化到”结构化设计”。
很多人以为 Prompt 工程就是写好一句话,然后反复调试直到模型给出满意的结果。这确实是一种方式,但它是不可复制的、不可维护的、不可扩展的。今天要学的是一种更工程化的方式——用结构化的方法设计 Prompt,让 Prompt 变成可管理、可测试、可迭代的资产。
更重要的是,今天要引入”Prompt Contract”这个概念。它是一种思维方式,把 Prompt 看作你与大模型之间的一份契约——你承诺提供什么信息,模型承诺输出什么格式。这种契约思维是从”用 AI”走向”开发 AI 应用”的关键转变。
完成今天的学习后,你应该能写出结构化的企业级 Prompt,能说明 Prompt 的能力边界,能区分普通 Prompt 和企业级 Prompt 的本质差异。
核心概念
一、Prompt 的作用
Prompt 是你与大模型沟通的桥梁。它的作用是把你的意图翻译成模型能理解的形式,同时引导模型产生符合你期望的输出。
从信息论的角度看,Prompt 是一个信号,它的质量决定了模型输出的质量上限。给模型一个模糊的 Prompt,你得到的可能是模糊的回答。给模型一个精确的 Prompt,你得到的可能是一个精确的回答。当然,这只是上限——模型的能力水平决定了实际输出能否达到这个上限。
Prompt 的作用可以拆解为几个层面:
意图传达——告诉模型你想做什么。是分析、总结、翻译、生成、还是比较?模型需要首先理解你的意图,才能选择合适的策略。
上下文提供——给模型补充必要的背景信息。模型不知道你是谁、你的业务是什么、你的受众是谁。这些信息需要通过 Prompt 提供。
格式约束——告诉模型你想要什么格式的输出。是段落、列表、表格、还是 JSON?格式约束让输出能被后续流程使用。
质量标准——告诉模型什么样的输出算”好”。准确、简洁、专业、还是通俗易懂?不同的质量标准会影响输出的风格和深度。
边界划定——告诉模型什么不要做。不要编造数据、不要使用口语、不要超过 500 字。边界划定能减少模型的不可控行为。
二、Prompt 的局限
在深入了解 Prompt 的能力之前,先搞清楚它做不到什么。
Prompt 不能改变模型的能力边界。如果一个模型没有学过半导体物理,你写再好的 Prompt 也无法让它做出专业的半导体分析。Prompt 是放大器,不是创造器。它能把模型已有的能力更好地发挥出来,但不能凭空创造新能力。
Prompt 不能保证 100% 的输出稳定性。即使你把 Temperature 设为 0,由于并行计算中浮点数精度的微小差异,不同调用之间仍然可能有细微差别。在大多数场景下这无所谓,但在需要完全确定性输出的场景下,Prompt 本身是不够的。
Prompt 不能替代外部知识。模型只能基于训练数据中的知识来回答问题。如果你的 Prompt 要求模型回答它不知道的信息,它要么老老实实说不知道,要么编造一个答案。对于后者,写更好的 Prompt 并不能解决问题——你需要 RAG。
Prompt 不能替代工程系统。Prompt 是文本,它不能查数据库、不能调 API、不能发邮件。这些能力需要通过 Tool Calling 等机制来实现,Prompt 只能告诉模型”什么时候该用什么工具”。
Prompt 不能自我验证。模型无法判断自己输出的内容是否正确。即使你在 Prompt 里写了”确保所有信息准确无误”,模型仍然可能输出错误信息——因为它不知道自己不知道什么。
理解这些局限不是要贬低 Prompt 的价值,而是要在正确的范围内使用它。Prompt 是 AI 应用开发中的重要工具,但不是唯一的工具。
三、System Prompt 与 User Prompt
在大模型的 API 调用中,消息通常分为两种角色:System 和 User。
System Prompt 是系统级别的指令,它定义了模型的角色、行为规范和输出要求。System Prompt 在整个对话过程中保持不变(除非你主动修改),它像是给模型的一份”工作手册”。所有在这个对话中的交互都会受到 System Prompt 的约束。
System Prompt 的典型内容包括:角色定义(你是一个专业的行业分析师)、能力范围(你擅长行业分析、岗位拆解、流程优化)、行为规范(基于事实分析,不编造数据)、输出格式(使用 Markdown 格式,包含摘要和详细分析)。
User Prompt 是用户级别的输入,它包含了具体的任务或问题。User Prompt 在每次对话中可以不同,它像是给模型的一个”具体任务单”。
User Prompt 的典型内容包括:具体任务(分析半导体行业的 AI 提效机会)、输入数据(以下是某半导体企业的业务数据…)、补充要求(重点关注良率分析和工艺优化)。
System Prompt 和 User Prompt 的配合关系可以这样理解:System Prompt 定义了”你是谁、你怎么工作”,User Prompt 定义了”你现在要做什么”。一个好的设计是让 System Prompt 处理通用规则,User Prompt 处理具体任务,两者配合产生高质量输出。
在实际的企业应用中,System Prompt 通常由开发者维护,用户看不到也不需要关心。User Prompt 则可能来自用户的直接输入,也可能由系统根据用户输入和模板自动生成。
四、Role / Task / Context / Constraint 框架
这是设计高质量 Prompt 的四个核心要素。
Role(角色):告诉模型它应该以什么身份来回答问题。
角色定义会影响输出的风格、深度和视角。同样是分析半导体行业,“你是一个半导体行业资深工程师”和”你是一个投资分析师”会产生完全不同风格的输出。前者更关注技术细节和工艺参数,后者更关注市场规模和投资回报。
好的角色定义应该具体且专业。不要写”你是一个 AI 助手”——这太泛了,等于没定义。要写”你是一个有 10 年经验的半导体行业咨询顾问,擅长为企业设计 AI 提效方案”。
Task(任务):明确告诉模型要做什么。
任务描述要清晰、具体、可执行。不要写”帮我分析一下”——分析什么?从哪些维度?输出什么格式?要写”分析半导体行业中 AI 可以提效的 5 个核心场景,每个场景包括:场景描述、当前痛点、AI 解决方案、预期效果、实施难度”。
好的任务描述像一份需求文档——它详细到不需要追问就能开始工作。
Context(上下文):提供模型完成任务所需的背景信息。
上下文信息的多少和质量直接影响输出的质量。常见的上下文包括:业务背景(这家半导体企业主要做功率器件,月产能 10 万片)、目标受众(报告给老板看,需要简洁有力)、已有数据(以下是最近三个月的良率数据)、约束条件(只分析生产环节,不涉及销售)。
一个常见错误是提供的上下文太多或太少。太多会让模型抓不住重点(上下文窗口也是有限的),太少会让模型缺乏足够信息来做出好的输出。合适的上下文应该是”刚好够用”——包含所有必要信息,但排除所有冗余信息。
Constraint(约束):告诉模型不能做什么或者必须遵守什么规则。
约束是 Prompt 的安全带。没有约束的 Prompt 就像没有护栏的高速公路——模型可能跑得很快,但也可能跑偏。常见的约束包括:格式约束(输出必须是 JSON 格式,包含以下字段)、内容约束(不要编造任何数据,如果信息不足就说”信息不足”)、长度约束(分析不超过 1000 字)、风格约束(使用专业但通俗的语言,避免学术化表达)。
这四个要素不是必须全部包含,但一个完整的企业级 Prompt 通常四者兼备。缺少任何一个都可能导致输出质量下降。
五、Few-shot Prompting(少样本提示)
Few-shot Prompting 是在 Prompt 中提供几个示例,让模型学习你期望的输入-输出模式。
人是通过例子学习的,模型也是。当你给模型展示几个”问题-答案”的例子时,它能从这些例子中推断出你期望的输出模式——格式、风格、深度、逻辑结构。
举个例子,你想让模型分析行业的 AI 机会。与其用大量文字描述你想要什么样的分析,不如直接给它一两个示例:
示例输入:分析制造业质检岗位的 AI 机会 示例输出:岗位名称:质检工程师。核心任务:对产品进行外观和性能检测。高频痛点:人工检测速度慢、漏检率高、疲劳后准确率下降。AI 机会:基于视觉模型的自动缺陷检测系统,预计可将检测速度提升 3 倍,漏检率降低 80%。实施难度:中等,需要采集缺陷样本并训练视觉模型。优先级:高。
模型看到这个示例后,会模仿这种结构和风格来分析其他岗位。这比纯文字描述有效得多。
Few-shot 的几个使用技巧:
示例质量比数量重要。三个高质量的示例比十个低质量的示例效果好。
示例应该覆盖不同的情况。如果只给一种类型的示例,模型可能无法处理其他类型的输入。
示例的格式要和你期望的输出格式完全一致。模型会严格模仿示例的格式。
在复杂任务中,Few-shot 的效果通常优于 Zero-shot(不给示例)。但 Few-shot 会占用更多的 Token 空间,需要权衡。
六、输出格式控制
控制模型的输出格式是 Prompt 工程中非常重要的一部分,尤其当输出需要被程序处理时。
常见的格式控制方式:
指定文本格式——要求模型用列表、表格、分级标题等结构化文本格式输出。适用于需要人阅读的场景。
指定数据格式——要求模型输出 JSON、XML 等机器可解析的格式。适用于需要程序处理的场景。
指定模板——给模型一个输出模板,要求它按照模板填充内容。这是最精确的格式控制方式。
格式控制的难点在于:模型不总是能严格遵守格式要求。有时候它会多加一些解释性文字,有时候会遗漏某些字段,有时候会生成格式不正确的 JSON。这就是为什么需要结构化输出机制(明天会深入讲)和格式校验。
七、Prompt Contract 思维
Prompt Contract 是今天最重要的概念。
什么是 Prompt Contract?它是一种思维方式,把 Prompt 看作你与大模型之间的一份契约。这份契约包含:
输入约定(你承诺提供什么):你会给模型提供哪些信息?格式是什么?范围是什么?输入的信息质量如何保证?
输出约定(模型承诺返回什么):模型应该返回什么格式的内容?包含哪些字段?每个字段的含义和约束是什么?输出的质量标准是什么?
边界约定(什么情况怎么处理):当输入不完整时怎么做?当信息不足无法回答时怎么做?当任务超出能力范围时怎么做?当遇到安全风险时怎么做?
为什么需要 Prompt Contract 思维?
因为它把 Prompt 从一段”随意的文字”变成了一份”可管理的规范”。在企业应用中,一个 Prompt 不是写完就结束的——它需要被测试、被评估、被迭代、被版本管理。如果你没有一个清晰的 Contract,你根本不知道怎么评估 Prompt 的好坏,更不知道该往哪个方向优化。
举个例子。你写了一个行业分析 Prompt,模型输出了分析结果。你怎么判断这个结果好不好?如果你有 Contract,你可以对照 Contract 来检查:输出包含了约定的所有字段吗?格式符合约定吗?当信息不足时有按照约定标注吗?没有 Contract,你只能凭感觉说”看起来不错”或”好像不太行”。
Prompt Contract 思维的另一个价值是它让 Prompt 变成了团队协作的基础。如果多个开发者都在维护同一套 Prompt,没有 Contract 就会出现不一致。有了 Contract,每个人都知道这个 Prompt 的输入是什么、输出是什么、边界是什么,协作效率会高得多。
八、企业级 Prompt 的结构
一个企业级 Prompt 不是一段文字,而是一个有结构的文档。它通常包含以下几个部分:
元数据——Prompt 的 ID、名称、版本号、创建者、最后更新日期、用途描述。这些信息用于管理和追踪 Prompt。
输入定义——这个 Prompt 接受哪些输入参数?每个参数的类型、格式、取值范围是什么?哪些是必填的,哪些是选填的?
System Prompt 模板——包含角色定义、行为规范、输出格式要求等固定内容,其中可以嵌入变量(比如行业名称、公司名称等),在运行时动态替换。
Few-shot 示例——提供 2-3 个高质量的输入输出示例,帮助模型理解期望的模式。
质量标准——怎么判断这个 Prompt 的输出质量?有哪些评估维度?每个维度的合格标准是什么?
边界处理——遇到异常输入怎么处理?信息不足时怎么输出?任务超出范围时怎么回复?
测试用例——一组用于验证 Prompt 效果的输入输出对,每次修改 Prompt 后都要跑一遍测试用例,确保没有退化。
变更记录——每次修改了什么、为什么修改、修改前后的效果对比。
这种结构化的 Prompt 管理方式,把 Prompt 从”一段文字”升级成了”一个可管理的组件”。在企业应用中,你可能需要维护几十个甚至上百个 Prompt,没有这种结构化管理,Prompt 就会变成一团乱麻。
九、Prompt 版本管理意识
Prompt 是需要迭代的。你写了第一版,测试后发现效果不理想,修改出第二版,再测试,再修改,直到满意。这个过程和软件开发的迭代过程一模一样。
但很多团队不重视 Prompt 的版本管理,随意修改 Prompt 而不记录变更历史。这就导致几个问题:
无法回滚。新版本 Prompt 效果更差了,你想回到旧版本,但旧版本的内容已经找不到了。
无法评估。你不知道这次修改到底改了什么,无法评估修改的效果。
无法协作。其他团队成员不知道 Prompt 被修改了,可能会基于旧版本做开发。
无法复现。用户报告了一个问题,但你无法复现当时的 Prompt 版本,无法诊断问题。
版本管理的基本实践:
给每个 Prompt 一个唯一 ID 和版本号。每次修改都更新版本号。
记录每次修改的内容、原因、修改人。
保留旧版本的完整内容。
每次修改后跑一遍测试用例,记录结果。
建立一个 Prompt 库,集中管理所有 Prompt 的版本。
概念关系图
Prompt 工程体系
+------------------------------------------------------------+
| Prompt Contract |
| |
| 输入约定 输出约定 边界约定 |
| +-----------+ +-----------+ +-----------+ |
| | 提供什么 | | 返回什么 | | 异常怎么 | |
| | 参数格式 | <---> | 输出格式 | <---> | 处理 | |
| | 质量保证 | | 质量标准 | | 安全边界 | |
| +-----------+ +-----------+ +-----------+ |
| |
+------------------------------------------------------------+
Prompt 四要素
+-------+ +-------+ +---------+ +------------+
| Role | | Task | | Context | | Constraint |
| 角色 | | 任务 | | 上下文 | | 约束 |
+-------+ +-------+ +---------+ +------------+
| | | |
v v v v
+----------------------------------------------+
| 完整的 Prompt |
| |
| [System Prompt] + [User Prompt] |
| + [Few-shot 示例] + [格式控制] |
+----------------------------------------------+
企业级 Prompt 结构
+------------------+
| 元数据 | <- ID, 版本, 用途
+------------------+
| 输入定义 | <- 参数, 类型, 范围
+------------------+
| Prompt 模板 | <- System + User + Few-shot
+------------------+
| 质量标准 | <- 评估维度, 合格线
+------------------+
| 测试用例 | <- 输入输出对
+------------------+
| 变更记录 | <- 修改历史, 效果对比
+------------------+
实战分析
设计 Prompt Contract 模板
模板应该是一个标准化的文档结构,包含以下部分:Contract 名称和版本、输入约定(参数名、类型、是否必填、格式要求、示例值)、输出约定(输出格式、字段定义、字段约束、示例输出)、边界约定(信息不足时的处理方式、超出范围时的回复方式、安全风险的处理策略)、质量标准(准确率要求、完整性要求、格式合规率要求)。
这个模板不是写一次就固定的,它应该随着你的实践不断迭代。每次使用后发现新的边界情况,就补充到 Contract 里。
写 10 个企业级 Prompt
这 10 个 Prompt 覆盖了 AI 咨询的核心工作流:行业分析、岗位拆解、流程拆解、机会评分、方案生成、ROI 粗算、风险审查、客户访谈、报告生成、销售话术。
每个 Prompt 的设计思路:
行业分析 Prompt:角色是行业咨询顾问,任务是分析指定行业的结构、价值链、关键痛点,输出是结构化的行业分析报告。关键在于提供足够的上下文(行业名称、关注维度、目标受众),同时约束模型不要编造具体数据。
岗位拆解 Prompt:角色是岗位分析专家,任务是拆解指定岗位的日常任务、高频痛点、AI 机会,输出是岗位分析表。关键在于引导模型从”岗位目标-日常任务-痛点-AI机会”这条线来分析,而不是泛泛地描述岗位。
流程拆解 Prompt:角色是流程优化顾问,任务是拆解指定业务流程的步骤、参与角色、系统依赖、AI 优化点,输出是流程分析表。关键在于要求模型识别每个步骤的输入输出和人工判断点。
AI 机会评分 Prompt:角色是 AI 投资分析师,任务是对给定的 AI 场景做多维度评分,输出是评分表。关键在于定义清晰的评分维度和评分标准,让评分结果可量化、可比较。
解决方案生成 Prompt:角色是 AI 解决方案架构师,任务是根据给定的场景和痛点设计 AI 解决方案,输出是方案文档。关键在于要求方案包含技术架构、实施路径、成本估算、风险评估。
ROI 粗算 Prompt:角色是商业分析师,任务是粗略计算给定 AI 方案的投资回报率,输出是 ROI 分析表。关键在于要求模型明确列出所有假设条件,因为估算结果的可信度取决于假设的合理性。
风险审查 Prompt:角色是风险评估专家,任务是对给定 AI 方案进行全面的风险审查,输出是风险评估报告。关键在于覆盖多个风险维度:技术风险、数据风险、安全风险、合规风险、运营风险。
客户访谈 Prompt:角色是客户成功经理,任务是根据给定的客户信息生成访谈问题清单,输出是结构化的访谈大纲。关键在于问题要有层次:从宏观(业务现状)到微观(具体痛点),从现状到期望。
报告生成 Prompt:角色是商业报告撰写专家,任务是根据给定的分析数据生成可读性强的报告,输出是 Markdown 格式的报告。关键在于指定报告结构、风格(专业但通俗)、受众(老板能看懂)。
销售话术 Prompt:角色是资深销售顾问,任务是根据给定的客户画像和产品信息生成销售沟通话术,输出是分场景的话术脚本。关键在于要求话术关注客户价值而不是技术细节。
每个 Prompt 的设计过程都应该遵循 Role-Task-Context-Constraint 框架,写完后用至少 3 个不同的输入测试,根据测试结果迭代优化。
当日产物说明
《Prompt Contract 模板》
一个标准化的 Prompt Contract 文档模板,包含输入约定、输出约定、边界约定、质量标准四个部分。每个部分有清晰的字段定义和填写说明。质量标准:模板本身结构清晰、字段完整,可以作为团队标准使用。
《企业级 Prompt 模板 10 个》
10 个按照 Role-Task-Context-Constraint 框架设计的企业级 Prompt。每个 Prompt 包含:Prompt ID、用途描述、System Prompt 内容、User Prompt 模板、输入参数定义、输出格式要求、至少一个 Few-shot 示例。质量标准:每个 Prompt 都经过实际测试,输出质量基本满足要求。
《Prompt 评分表》
一份用于评估 Prompt 质量的评分标准,包含以下维度:意图清晰度(Prompt 是否清晰传达了意图?)、格式合规率(模型输出是否遵守了格式要求?)、内容准确性(输出内容是否准确?)、完整性(输出是否包含了所有要求的要素?)、边界处理(Prompt 是否覆盖了异常情况?)。每个维度 1-5 分,附带评分说明。
《Prompt 使用边界说明》
一份说明 Prompt 能做什么和不能做什么的文档。核心内容包括:Prompt 的能力范围、Prompt 的局限、什么情况下需要从 Prompt 升级到 RAG/Agent 等更复杂的架构、如何判断一个任务是否超出了 Prompt 的能力边界。
常见误区与避坑
误区一:Prompt 越长越好
有些人觉得 Prompt 写得越长、越详细,模型输出就越好。实际上,过长的 Prompt 可能导致模型困惑,抓不住重点。好的 Prompt 应该精确而不是冗长。每一句话都应该有明确的目的,没有一句话是多余的。
误区二:一个 Prompt 解决所有问题
有些人想写一个万能 Prompt 来处理所有任务。这在实践中行不通。不同的任务需要不同的 Prompt。行业分析和报告生成的 Prompt 应该分开设计,因为它们的角色、任务、输出格式都不同。正确的做法是为每种任务设计专门的 Prompt,然后通过系统来管理这些 Prompt。
误区三:忽视 Prompt 的测试和维护
写完 Prompt 就不管了,这是一个常见错误。Prompt 需要持续测试和维护。模型的更新可能导致 Prompt 效果变化,新的边界情况需要补充处理逻辑,业务需求的变化可能要求调整 Prompt。Prompt 是活文档,不是写完就结束的。
误区四:把 Prompt 当成系统设计的替代品
有些人觉得只要写好了 Prompt,其他都不重要了。实际上,Prompt 只是系统的一部分。一个好的 Prompt 搭配一个好的系统(RAG、评估、安全),效果远好于一个精心打磨的 Prompt 搭配一个简陋的系统。系统设计应该和 Prompt 设计同步进行。
误区五:在 Prompt 里堆砌约束
有些人喜欢在 Prompt 里写大量的”不要做这个、不要做那个”。过多的否定约束可能让模型过度保守,什么都不敢输出。更好的做法是用正向的方式描述你想要什么,而不是不断强调不想要什么。比如”基于提供的数据进行分析”比”不要编造数据”效果更好。
延伸思考
今天的 Prompt 工程学习为后续内容打下了直接基础。
明天的结构化输出,是在 Prompt 格式控制的基础上,进一步学习如何通过 JSON Schema 等机制来强制控制输出格式。Prompt 里写的”请输出 JSON 格式”是软约束,模型可能不遵守;而 JSON Schema 是硬约束,通过机制来保证输出格式。
后续学习 RAG 时,你会看到 RAG 系统中大量使用 Prompt 来引导模型基于检索到的文档回答问题。RAG 的 Prompt 设计需要特别注意:如何把检索到的文档片段自然地嵌入 Prompt,如何引导模型基于文档内容回答而不是凭记忆回答,如何处理检索结果为空的情况。
学习 Agent 时,Prompt 会变成更复杂的系统指令——Agent 的目标、可用的工具、决策逻辑都通过 Prompt 来定义。Agent 的 Prompt 设计比普通应用 Prompt 难得多,因为你需要在一个 Prompt 里定义 Agent 的完整行为规范。
从个人发展角度看,Prompt 工程是 AI 应用开发的基本功。但不要把它看得太高——它只是众多技能中的一个。一个优秀的 AI 应用开发者需要同时掌握 Prompt 工程、系统架构、数据处理、评估优化、安全管理等多方面能力。Prompt 工程是起点,不是终点。
自测问题
-
Prompt 的作用是什么?它能解决哪些问题?不能解决哪些问题?
-
System Prompt 和 User Prompt 的区别是什么?各自适合放什么内容?
-
Role-Task-Context-Constraint 框架中,每个要素的作用是什么?缺少任何一个会导致什么问题?
-
什么是 Few-shot Prompting?它和 Zero-shot 的区别是什么?在什么场景下应该用 Few-shot?
-
什么是 Prompt Contract?它和普通 Prompt 的本质区别是什么?为什么企业应用需要 Contract 思维?
-
企业级 Prompt 和个人使用的 Prompt 有什么区别?至少说出三个差异。
-
为什么需要 Prompt 版本管理?不做版本管理会出现什么问题?
-
如果一个 Prompt 的输出格式经常不符合要求,你会从哪些方面排查问题?
-
在设计行业分析 Prompt 时,如何避免模型编造具体数据?
-
Prompt 工程在 AI 应用开发中扮演什么角色?它的重要性被高估了还是低估了?为什么?
关键词
- Prompt:用户输入给大模型的指令文本,是与模型沟通的核心方式
- System Prompt:系统级别的固定指令,定义模型的角色和行为规范
- User Prompt:用户级别的具体任务输入
- Role(角色):Prompt 中定义模型身份的要素,影响输出风格和视角
- Task(任务):Prompt 中明确告知模型要做什么的要素
- Context(上下文):Prompt 中提供的背景信息,帮助模型做出更好的输出
- Constraint(约束):Prompt 中定义的规则和限制,控制输出的边界
- Few-shot Prompting:通过提供示例来引导模型学习输入输出模式的技术
- Prompt Contract:把 Prompt 当作契约来设计管理的思维方式
- 格式控制:通过 Prompt 约束模型输出格式的方法
- 版本管理:对 Prompt 的修改历史进行追踪和管理的实践
- Zero-shot:不提供示例,仅通过指令让模型完成任务的方式