设想你走进一家口碑极好的私房菜馆,大厨手艺一流,却有一个怪癖:从不主动揣测你的心思,你说什么,他就做什么。你说“随便来点好吃的”,他端上来的可能是一盘你碰都不碰的香菜拌折耳根;你说“来份番茄炒蛋,少油少盐,不要葱花,半小时内上桌”,他就能一次做出让你竖起大拇指的菜。这家菜馆就是今天的大语言模型,那张“点菜单”就是提示词(Prompt)。Prompt 设计原则,正是教你写好这张点菜单的学问:如何把需求说清楚、怎么告诉大厨你希望他以什么身份来做、划清哪些不能碰的红线、把常用菜单固化成模板反复复用,以及上桌后如何通过测试迭代让味道越来越好。 这篇文章会用这套点菜逻辑,带你零基础掌握 Prompt 设计原则与工程规范。你不需要懂任何数学或代码背景,只需要跟着“大厨做菜”这条故事线,就能理解 AI 应用开发者每天都在研究的提示词工程。
对 AI 应用开发者、技术团队和产品经理而言,掌握 Prompt 设计原则意味着能用最少的 token 成本换来最稳定、最可控的模型输出,把“看运气”的 AI 交互变成可测试、可复用、可迭代的工程能力。
可视化演示
展示Prompt设计的三大核心原则、结构化模板构建流程与测试迭代闭环,帮助建立系统化的Prompt工程规范。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Prompt三大设计原则 清晰性:指令明确无歧义,模型能准确理解任务目标 具体性:提供充足上下文与示例,减少模糊空间 质量 = f(清晰,具体,可验) 可验证性确保输出可量化评估
核心设计原则
你第一次走进那家私房菜馆,服务员递过菜单,你随口说“随便来点好吃的”——大厨端上来一碗你最讨厌的香菜。第二次你学乖了,说要点番茄炒蛋,但他不知道你要咸口还是甜口、要不要辣、几个人吃。直到你说:“来一份番茄炒蛋,两人份,少油少盐,微辣,不要葱,30 分钟内上桌。”他一次就做对了。区别不在菜本身,而在于你写的点菜单是否够清楚。
大语言模型本质上就是那位“才华横溢但不读心”的大厨。它见过海量文本知识,却没有任何读心术,只能根据你给出的文字推测意图。Prompt 设计的第一条主线,就是让指令具备三个核心属性:清晰性(clarity)、具体性(specificity)、可验证性(verifiability)。清晰指任务目标没有歧义,“写个文案”远不如“写一段 50 字以内的朋友圈文案”;具体指给出情境、对象、载体等关键信息,“介绍产品”远不如“用比喻向 40 岁的家庭主妇介绍这款豆浆机”;可验证指输出能被客观检查,“至少列出 3 个理由”“每条不超过 20 字”“结尾附对比表格”都是可验证的描述。
三者可以量化为一个简易评分模型:给每条提示词的清晰度、具体度、可验证度分别打分(0~1),再按你的业务侧重配权重,加权求和就是这条提示词的质量分。质量分高,说明“一次做对”的概率大。
记住那张点菜单:清晰是“不要香菜”这种无歧义的短句,具体是“两人份、微辣”这种可执行的细节,可验证是“30 分钟上桌”这种能掐表检查的承诺。三把尺子量一遍,大厨几乎不可能端错菜。
- 质量总分 Q整条提示词的文本质量得分,取值通常在 0~1 之间,得分越高说明越接近“一次做对”。
- 清晰度权重项 w_c×CC 表示清晰度评分(0~1),w_c 是它的权重,比如你设 w_c=0.4,说明你最怕产生歧义。
- 具体度权重项 w_s×SS 表示具体度评分,w_s 是权重。给足情境与细节,大厨才知道往哪个方向发挥而不跑偏。
- 可验证度权重项 w_v×VV 表示可验证度评分,w_v 是权重。输出能否被客观检查,决定了你后续做测试时是否容易。
角色设定法
同一道番茄炒蛋,你告诉大厨“按家常做法”,他会做出你妈妈的味道;你说“请以五星级酒店主厨的身份来设计”,他会开始考虑摆盘和层次感;你补一句“我口味偏清淡,是第一次吃这道菜的外地人”,他会放弃重油改走温和路线。同样一个大厨、同样一道菜,只因“身份设定”不同,出品风格截然不同。
大模型在训练时接触了大量不同身份、不同场景的文本,因此“角色”是它切换知识范围与语言风格的开关。在 Prompt 中显式声明角色,相当于给模型安装了一个“视角滤镜”,这就是角色设定法(Role Prompting)。一个完整的角色设定通常包含四件事:角色定义(“你是一名资深英文校对”)、知识范围(“只依据我提供的产品资料回答,不引用外部数据”)、输出风格(“用正式书面语,不使用表情符号”)、身份一致(“全程保持该身份,不要跳出角色解释你是 AI”)。角色设定不是装饰性客套话,它直接改变模型从参数空间中检索知识的路径,相当于告诉大厨“今天你按哪个菜系、哪套标准来掌勺”。
下次点菜时别只报菜名,先说清“我是谁、希望你以谁的标准来做”。给大厨一个身份,比催促他一百遍“做好吃一点”更管用。
- 输出 Y模型最终生成的回答文本,就是那道“上桌的菜”。
- 模型能力 f_θθ 代表大模型的数十亿级参数,它决定了模型“厨艺”的天花板,但具体如何发挥由输入决定。
- 角色 R你在开头设定的身份,如“资深文案编辑”,它让模型进入对应的知识子空间,切换说话的腔调。
- 任务 T 与范例 ET 是具体要完成的事,E 是给的一两个范例(few-shot),相当于告诉大厨“上次这样做就很好”。
约束条件书写
你在点菜单上写“多加辣”,大厨照做了,结果你被辣哭——因为没写“辣度控制在微辣”。写“不要香菜”,他确实没放香菜,却放了一把你同样讨厌的芹菜。约束条件就是厨房墙上挂的“红线清单”:白纸黑字写明哪些不能碰、输出长什么样、边界在哪里。没有红线的点菜单,等于把自由发挥权全交给了大厨。
约束条件(Constraints)是 Prompt 中限定输出范围的指令,包括四类:边界限定(“仅基于以下文本回答”)、格式要求(“用 Markdown 表格输出”)、禁止事项(“不得提供法律建议”)、长度控制(“不超过 200 字”)。约束写得越明确,模型的自由度越小,输出越可控。需要特别注意的是,负面指令(“不要……”)威力有限,因为模型并不真正执行“取反”逻辑,它只是在概率上避开某些词。更稳妥的做法是“正面规定 + 强格式约束”:与其说“不要啰嗦”,不如说“每段不超过 3 句”;与其说“不要编造”,不如要求“每一步附数据来源”。你可以用一个完备度公式检查四类约束是否齐全,任何一类缺失,整条约束体系都视为不合格。
就像在点菜单背面印上“厨房红线”:不放香菜、微辣、20 分钟内、必须热盘上桌。四条红线写全,大厨的自由发挥就被锁进了安全区,出错的概率大幅下降。
- 约束完备度 M整体约束是否覆盖四个维度,取值为 0 或 1,任何一项缺失,乘出来的结果直接归零。
- 边界项 m_boundary是否声明了回答的信息来源边界,例如“仅依据文档回答”,防止大厨自由发挥。
- 格式项 m_format是否指定了输出的结构,例如标题、表格、编号列表,让结果便于解析与排版。
- 禁止项 m_forbid是否列明禁区,例如“不得给出投资建议”,明确告知哪些事绝对不能做。
- 长度项 m_length是否限制了字数或篇幅,例如“正文 300 字以内”,把成本的缰绳握在自己手里。
模板复用
常客发现,每次手写点菜单太累,而且不同服务员转述容易走样。于是菜馆干脆印了一批“标准点菜单”:菜名、口味、辣度、忌口、期望时间都是空栏,客人只需勾选填数。填空的过程快、一致、不容易漏项。如果某道菜改进了做法,就把旧表单作废,发新版。Prompt 工程也是一样:把验证过的高质量提示词固化成模板,让团队里的每个人都在同一张“表单”上填空。
在工程实践中,Prompt 模板(Prompt Template)就是把高质量提示词固化成“填空表单”。模板由固定指令段和占位符(Placeholder)组成,运行时用真实参数替换占位符。复用模板能统一团队的提示词标准,降低每次编写的心智负担。一个规范的模板结构通常包含:角色声明段、任务描述段、约束列表段、示例段、输出格式段,各段之间用清晰的分隔符(如 ### 或 XML 标签)隔开。占位符要语义化命名,如 {{product_name}}、{{target_audience}}。版本管理建议遵循语义化版本号:1.0.0 → 1.1.0 表示功能增强,2.0.0 表示破坏性修改,并配套 changelog 记录每次改了什么、为什么改。
标准点菜单让每位新客人都能在一分钟内点好菜,还防止服务员记错。团队里每人维护一份带版本号的 Prompt 模板库,效果也一样:稳定、一致、可回溯,换任何一个人来填空,出品都不走样。
- 最终提示词 P_final模板渲染后真正发送给模型的完整文本,也就是最后那张写满答案的点菜单。
- 渲染函数 render把占位符替换成实际值的运算,本质就是一次字符串替换,把空栏填上内容。
- 模板本体 T_tpl包含固定指令与占位符的模板文本,固定部分是经过验证的“框架”,不可随意改动。
- 键值对集合并集一组参数映射,如 {product_name: “豆浆机”},一个占位符对应一个值,缺一个模板就填不完整。
测试与迭代
菜端上来了,你尝了一口,发现盐放多了。你不会掀桌子,而是对服务员说:“请回锅加一小勺糖去咸,另外汤里别放姜。”大厨照着调整,第二版终于完美。这就是测试迭代:把每一版菜当作可评审的版本,给出具体的、可执行的反馈,一轮轮逼近满意。Prompt 很少能一次写对,高手与新手的分水岭,往往在于谁会系统地迭代。
正规做法是建立“测试用例集”——一组覆盖典型场景的输入输出对,像单元测试一样运行。每次修改 Prompt 后,在同一组用例上回归,对比新旧版本的输出质量,这叫对比评估。发现问题后要分析失败原因:是格式漂移、信息缺失,还是越界发挥?然后针对性修改,再回归。评估分数可以由两部分组成:客观规则分(格式是否符合、关键词是否缺失)加上人工评分(语气、逻辑是否自然)。每次迭代都计算新旧版本在固定用例集上的平均分差,只有正收益的改动才值得合并进正式模板。测试用例要兼顾正常场景和边界场景:超长输入、敏感词、空值,一样都不能少。
回锅、试吃、再回锅——一道菜稳定下来通常要三四轮。Prompt 迭代也是这样:先有基线,再改,再测,用数字而不是感觉决定这次改动留还是不留。每一次“回锅”都要有具体改法,正如每一版 Prompt 都要有明确的修改理由。
- 迭代增量 Δ新版与旧版在同一套用例上的平均得分之差,正数说明这次改动确实有效。
- 新版平均分把新版 Prompt 在 n 个用例上的得分 s_i^new 求和再取平均,代表新版整体水平。
- 旧版平均分旧版本在同一批用例上的平均得分,作为对比的基线(baseline)。
- 用例数 n测试用例集的大小,n 越大,评估结果越可信,偶然性越小。
工程规范
菜馆火了,每天几百桌客人,不能再靠大厨临场发挥。老板开始立规矩:复杂的菜拆成备料、烹饪、装盘三道工序;每道菜核算固定成本;所有客人的忌口统一登记;后厨保留每个版本的菜单台账。这样即便换了新厨师,出品依然稳定。Prompt 工程进入团队协作阶段,也需要同样的规矩。
工程规范是把 Prompt 设计从“个人手艺”升级为“团队流水线”的保障,主要包括四个方面。任务分解:把复杂任务拆成多个子 Prompt(如先规划、再改写、最后润色),降低单次输出的失误率,就像大菜拆工序一样。成本控制:用 token 估算每次调用的费用,控制 Prompt 长度与调用次数,给每个模块设 token 预算。用户沟通:面向非技术用户时,把 Prompt 封装成表单或按钮,用户只需要点选,不接触原始模板。隐私合规:不把敏感信息写进模板,日志做脱敏处理,避免用户数据进入不可控的传输链路。一次完整的第三方模型调用费用,可以按下面的公式估算,模板固定部分加上变量输入部分都会消耗 token,都要计入预算。
就像饭店的标准化流水线,Prompt 工程规范把“大厨的手艺”沉淀为“餐厅的制度”:分解工序、核算成本、登记忌口、保存菜单台账。做到这四件事,AI 应用才能从一个人的灵感变成一家公司的稳定出品。
- 总成本 Cost一段时间内调用该 Prompt 的总花费,单位是元,是工程上要定期核算的指标。
- Token 消耗 N_token单次请求消耗的 token 数量,中文汉字约为“汉字数×1.7”,英文单词约为“单词数×1.3”。
- 单价 P_token每千 token 的价格,由模型供应商定价,不同模型差异很大,选型时要对比。
- 调用次数 N_calls单位时间内的请求次数,三者相乘即总成本,任何一个乘数翻倍,成本就跟着翻倍。
AI 应用场景
智能客服的 Prompt 规范池
阶段:提示词工程(角色设定 + 约束条件 + 模板复用)
解决的问题:传统客服机器人使用松散 prompt,“自由度”太高导致回答风格飘忽、甚至超纲承诺。通过角色设定(“资深客服专员”)、约束条件(“仅依据知识库回答,不承诺赔付”)和模板复用,输出变得稳定可控,就像给大厨规定了菜系和红线。
具体案例:某电商售后团队建立 20 个 prompt 模板(退款咨询、物流查询、发票申请等),每个模板带占位符和版本号,每次发版前用测试用例集回归,答非所问率从 18% 降到 4%。
内容团队的统一文案模板
阶段:模板复用 + 版本管理
解决的问题:市场部五个文案各自写 prompt,风格不一、效果看运气。把优秀的 prompt 固化为模板库,配合占位符(产品名、卖点、平台),新员工也能产出合格的投放文案,相当于把“老师傅的点菜单”印成标准表单。
具体案例:某 SaaS 公司用“角色 + 任务 + 示例 + 格式”四段模板生成小红书种草文,模板 v1.2 在 100 条用例上通过率 91%,随即写入部门内容生产规范。
Prompt 回归测试平台
阶段:测试与迭代
解决的问题:模型升级或系统改版后,老 prompt 可能悄悄失效。建立 prompt 测试平台,定期用固定用例集回归,自动输出质量分变化报告,分数掉点就预警,就像定期让老顾客回店试菜,确保味道没有变。
具体案例:某金融问答机器人每月对 300 条用例自动回归,覆盖空输入、敏感词、超长问题等边界场景,基线分掉点超过 5% 即触发人工 review,曾在一次模型升级后提前三天发现格式漂移问题。
Python 演示
# -*- coding: utf-8 -*-"""Prompt template rendering and quality scoring demo.""" class PromptTemplate: def __init__(self, name, version, template): self.name = name self.version = version self.template = template def render(self, **kwargs): prompt = self.template for key, value in kwargs.items(): prompt = prompt.replace("{{" + key + "}}", str(value)) return prompt def quality_score(prompt): """Score a prompt from 0 to 1 by design principles.""" score = 0.0 if len(prompt) >= 60: score += 0.30 # 信息量足够 if "你是一位" in prompt or "你是" in prompt: score += 0.25 # 有角色设定 if "不要" in prompt or "避免" in prompt: score += 0.20 # 有禁止项 if "格式" in prompt: score += 0.15 # 有格式要求 if "例如" in prompt or "不超过" in prompt: score += 0.10 # 有示例或长度控制 return round(score, 2) def main(): tpl = PromptTemplate( name="种草文案", version="1.2", template=( "你是一位资深小红书编辑, 擅长写种草文案.\n" "请介绍产品: {{product}}, 目标用户: {{audience}}.\n" "要求: 突出卖点{{feature}}, 语气轻松, 不超过{{limit}}字,\n" "不要使用夸大词汇, 输出格式: 标题+正文.\n" "例如: 标题有趣, 正文分三段." ), ) prompt = tpl.render( product="AI 自动摘要笔", audience="职场白领", feature="一键生成会议纪要", limit="80", ) print(prompt) print("---- 质量分:", quality_score(prompt), "----") if __name__ == "__main__": main()
class PromptTemplate:定义模板类,name / version / template 分别对应模板库里的名称、版本号和文本。prompt = prompt.replace("{{" + key + "}}", str(value))把模板中的占位符替换为真实参数,这是模板复用的核心操作。score += 0.30 # 信息量足够按规则累计质量分,对应“清晰、具体、可验证”的设计原则。tpl = PromptTemplate(新建一个带版本号的模板实例,模拟团队模板库中的一条记录。
常见误区
误区“我把背景、历史、注意事项全都写进去,三五千字的大长 prompt 肯定最稳,输出质量跟字数成正比。”
正解信息密度比字数重要。满屏冗余背景就像点菜单上写满整页废话,大厨反而抓不住重点。关键信息应该结构化、前置;无关信息会稀释模型的注意力,甚至诱发“过度关联”式的发挥。刻意加长往往徒增 token 成本,收益却趋近于零。
为何常见:人们把“大模型能处理长文本”误解为“长文本 = 高质量”,忽略了指令聚焦才是关键。
误区“你是一名资深专家”这种开头就是心理暗示,跟写“请认真回答”没区别,加不加无所谓。"
正解角色设定会真实改变模型生成的条件概率分布:它把回答空间从“通用模式”切换到“专家模式”,影响用词深度和论述框架。没有角色设定的输出更像百科全书,有角色设定的输出更像一个具体岗位的人在干活。
为何常见:角色设定没有立竿见影的格式变化,效果主要体现在风格与语气上,容易被误认为装饰。
误区“我写得很详细,模型第一次就给出了满意的答案,直接上线就行。”
正解单次成功不等于稳定可靠。模型有随机性,不同输入、不同版本下同一 prompt 都可能漂移。正规做法是建立测试用例集做回归,就像只凭一次试吃就把菜写进正式菜单,是对口碑的不负责任。
为何常见:开发者在 demo 阶段看到一次好结果,就形成了“已经写好了”的错觉,忽略了样本量的重要性。
误区“我写了'不要编造数据',模型就一定不会编。”
正解负面指令更像是“降低概率”而不是“执行取反”。模型仍可能犯错。更可靠的是正面规定加格式约束:要求“每个数据标注来源”,或限定“只能从文档摘录”。把不想要的行为替换成想要的行为,比单纯禁止更有效。
为何常见:人们习惯用人类思维理解“不要”,但语言模型没有真正的否定逻辑,它只是在字符层面做概率选择。
面试题
Q1. Prompt 设计的三大核心原则通常指( )
- A.清晰性、具体性、可验证性← 正确答案
- B.简单化、自动化、抽象化
- C.快速、稳定、低成本
- D.情感、节奏、感染力
答案:A。三大核心原则是清晰性、具体性、可验证性,对应正文里“点菜单”的三种写法:无歧义、给细节、能检查。B 的自动化是工程手段而非原则,C 是工程指标,D 是风格维度,都不属于设计原则的范畴。
Q2. 在 Prompt 中声明“你是一位资深英文校对”属于哪类设计?( )
- A.角色设定法的一种应用← 正确答案
- B.约束条件法的典型应用
- C.测试迭代流程的一个步骤
- D.成本控制策略的重要手段
答案:A。这句声明是在给大厨设定身份,让他按“资深英文校对”的知识范围和风格来输出,正是角色设定法。约束条件法侧重限定范围与格式,测试迭代是后续验证环节,成本控制是工程规范,均与此句无关。
Q3. 负面指令“不要啰嗦”效果有限,更可靠的做法是( )
- A.增加更多感叹号强调语气
- B.正面规定格式和字数限制← 正确答案
- C.把提示词翻译成英文再写
- D.重复写三遍不要啰嗦
答案:B。模型没有真正的否定逻辑,“不要啰嗦”只是在概率上避开部分字词。正面规定“每段不超过 3 句”“正文 300 字以内”提供了可执行的边界,效果远好于反复强调“不要”,这正是约束条件书写中“正面规定 + 强格式约束”的原则。
Q4. Prompt 模板中"{{product_name}}"这类标记称为( )
- A.占位符,运行时替换成真实参数← 正确答案
- B.注释符,用于解释模板用途
- C.分隔符,用于切分模板段落
- D.转义符,用于特殊字符处理
答案:A。双花括号包裹的内容是占位符(Placeholder),渲染时用真实参数替换,就像点菜单上的空栏。注释符、分隔符、转义符在模板中是其他符号承担的职责,不用于参数填充。
Q5. 一份完整的角色设定通常包含哪些要素?( )
- A.角色定义与身份描述← 正确答案
- B.知识范围与数据来源← 正确答案
- C.输出风格与语言习惯← 正确答案
- D.模型参数量与训练数据
答案:ABC。角色设定四要素是角色定义、知识范围、输出风格、身份一致,对应 A、B、C。D 的模型参数量与训练数据是模型本身的属性,不写在用户侧的角色设定里,属于工程选型范畴。
Q6. 关于 Prompt 测试迭代中的基线分(baseline),正确的是( )
- A.每次修改后都必须严格高于旧版本
- B.基线分是衡量迭代有效性的参照← 正确答案
- C.基线分越高说明提示词一定越好
- D.基线分只能由人工打分来计算
答案:B。基线分是旧版本在固定用例集上的得分,作为本次改动的对比参照。A 太绝对,持平或微降的改动有时也要保留;C 忽略了基线只在同一用例集内有意义;D 不对,客观规则也可以自动打分,人工只是其中一部分。
Q7. 下列哪些属于 Prompt 工程规范的内容?( )
- A.复杂任务拆分为多个子提示词← 正确答案
- B.估算 token 成本与控制调用次数← 正确答案
- C.对用户敏感信息进行脱敏处理← 正确答案
- D.把提示词写得越长越显专业
答案:ABC。工程规范包含任务分解、成本控制、用户沟通、隐私合规四项。A 是任务分解,B 是成本控制,C 是隐私合规。D 与“信息密度比字数重要”的原则相悖,不是规范而是误区。
Q8. 模型升级后旧 Prompt 输出质量明显下滑,首先应做什么?( )
- A.立即停用全部旧模板避免风险
- B.在固定用例集上回归定位差距← 正确答案
- C.直接回滚到上一个模型版本
- D.把所有提示词长度再增加一倍
答案:B。模型升级导致输出漂移是常见问题,正确做法是先跑固定用例集做回归,量化“哪里变了、变多少”,再针对性修改 Prompt。一上来就停用或回滚是过度反应,加长提示词更是无依据的猜测。
Q9. “每段不超过 3 句,结尾必须给出两个备选标题”属于哪类约束?( )
- A.长度控制与格式要求← 正确答案
- B.边界限定与禁止事项
- C.角色设定与知识范围
- D.模板复用与版本管理
答案:A。“不超过 3 句”是长度控制,“给出两个备选标题”是格式要求,两者同属约束条件书写。边界限定管信息来源,禁止事项管禁区,角色设定管身份,均与题干描述不符。
Q10. 编写高质量 Prompt 时可以验证输出的手段包括( )
- A.要求输出结构化格式方便校验← 正确答案
- B.要求每个结论附带数据出处← 正确答案
- C.限定只从给定文档中摘录← 正确答案
- D.完全依赖模型自我感觉是否准确
答案:ABC。可验证性来自可检查的约束:结构化格式让程序能校验,数据出处让事实有据可查,限定摘录范围让内容可回溯,分别对应 A、B、C。D 把验证责任完全交给模型本身,既不可靠也无法自动化,正是要避免的做法。