Prompt工程(提示词工程)是影响大模型应用效果最直接、成本最低的优化环节。同一个模型名称下,系统提示词、少样本示例与输出格式约束的设计差异,可以让结果质量差出数量级。本文按照评测基线、提示词设计、示例组织、结构化输出、上下文控制、版本迭代六个环节,整理可直接复用的工程方法,代码示例基于OpenAI接口,其他厂商SDK的调用逻辑一致。
提示词工程效果评测:先定义指标再动提示词
优化提示词的前提是建立效果基线。每个业务场景先准备一份固定评测集,包含常规输入、边界输入和异常输入,用三个指标度量:格式合法率(输出能否被程序直接解析)、任务准确率(业务字段是否正确)、输出稳定性(相同输入多次调用的结果方差)。
import json
from openai import OpenAI
client = OpenAI()
cases = [
{"text": "这单我不要了,申请退款", "intent": "refund"},
{"text": "把收货地址改成杭州西湖区", "intent": "update_address"},
{"text": "物流三天没更新,什么情况", "intent": "query"},
]
def evaluate(system_prompt):
hit = 0
for c in cases:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": c["text"]},
],
response_format={"type": "json_object"},
)
try:
intent = json.loads(resp.choices[0].message.content)["intent"]
hit += 1 if intent == c["intent"] else 0
except Exception:
pass
return hit / len(cases)
评测集规模按业务覆盖度定,50到200条足以支撑迭代。每一版提示词改动都要重新跑完整评测集,得分下降的版本直接回退。除了准确率,生成耗时与Token消耗也记入对比,提示词工程不只是优化效果,也在优化成本。
系统提示词设计:角色、目标、约束与输出格式
系统提示词按“角色—目标—约束—输出格式”四段组织,比大段自由文本描述更易维护,模型遵循度也更稳定:
你是电商客服工单分类器。
目标:把用户留言归类为refund(退款)、update_address(改地址)、query(查询)、complaint(投诉),并提取订单号与金额。
约束:只输出JSON,不输出其他文字;金额保留两位小数;提取不到的字段填空字符串。
输出格式:{"intent": "refund", "order_id": "TA123456", "amount": "299.00"}
四段各司其职:角色划定领域与话术风格;目标说明输出用途,让模型围绕任务收敛;约束限定行为边界,包括格式、长度、禁止事项;输出格式直接给出可解析的结构。约束不要堆砌与任务无关的条目,约束之间互相冲突时,模型会顾此失彼。
少样本示例与思维链的适用场景判断
少样本示例(few-shot)对格式迁移和抽取类任务提升最明显。示例要与线上真实输入同分布,刻意挑选的示例会引入偏差。给两三个覆盖主要分支的示例即可:
messages = [
{"role": "system", "content": "把用户诉求归类并输出JSON。"},
{"role": "user", "content": "订单TA3210申请退款"},
{"role": "assistant", "content": '{"intent": "refund", "order_id": "TA3210"}'},
{"role": "user", "content": "发票什么时候能开出来"},
]
思维链(CoT)适合需要多步推导的任务,例如条件判断、数学计算、规则推理,让模型先输出推理过程再给结论。单步的信息抽取与意图分类任务用CoT属于浪费,Token成本上升而准确率不再提升。判断标准只有一条:任务是否需要中间步骤,不需要就关闭推理引导。
结构化输出约束:JSON Schema、strict与兜底解析
生产环境依赖模型输出时,必须启用接口层的结构化输出能力,而不是靠提示词“自觉”遵守格式:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是电商客服意图分类器"},
{"role": "user", "content": user_text},
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "intent_result",
"strict": True,
"schema": {
"type": "object",
"properties": {
"intent": {"type": "string", "enum": ["refund", "update_address", "query", "complaint"]},
"order_id": {"type": "string"},
"amount": {"type": "string"},
},
"required": ["intent", "order_id", "amount"],
},
},
},
)
content = resp.choices[0].message.content
try:
data = json.loads(content)
except Exception:
data = fallback_parse(content) # 正则等兜底解析
启用strict模式后字段枚举与必填项都由schema约束,解析失败率能压到很低,但兜底解析和解析失败告警仍然要保留。生产环境把格式合法率纳入监控,低于阈值自动告警,避免业务静默吃进脏数据。
上下文注入位置与Token预算管理
检索增强(RAG)场景下,检索片段放在用户消息末尾,用分隔符与原始问题隔开,能减少上下文之间的互相干扰。控制注入片段的数量与长度,优先截断而不是超长硬塞:
context = "\n".join(doc["text"][:500] for doc in results[:3])
user = f"以下为参考资料:\n{context}\n\n请基于以上资料回答:{question}"
Token预算按“输出预留+输入控制”规划:答复限制max_tokens,防止占用溢出;长文档用分块问答替代一次问完。上下文窗口顶满时,末尾关键信息容易被截断,注入顺序按重要度排。
提示词版本管理与AB验证
提示词属于线上资产,纳入版本控制。每次修改记录变更原因与评测数据。线上切换先做灰度,新版本承担10%流量,观察准确率、格式率、Token成本三项指标,稳定后再全量。旧版本保留便于回滚。
把提示词变成可评测、可复现、可回滚的资产,是Prompt工程的核心目标。评测基线、四段式系统提示词、少样本与思维链按场景选择、结构化输出加兜底、版本化灰度,五件事做扎实,大模型应用的输出质量就有保障。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-prompt-gong-cheng-shi-zhan-xi-tong-ti-shi-ci-she/