大模型Prompt工程实战:系统提示词设计与结构化输出优化指南

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/

(0)
小编小编
上一篇 1天前
下一篇 22小时前

相关推荐