Prompt工程的目的是让大模型输出稳定、可解析、可校验的结果,而不是碰运气。输出质量由任务定义、角色约束、工具调用与上下文管理共同决定。本文以OpenAI兼容接口为例,给出可以直接落到代码里的做法。
结构化提示词:角色、约束与输出格式三要素
一份可维护的提示词至少包含角色设定、硬性约束、输出格式三个部分。约束写得越具体,模型越不容易跑偏。
你是一个工单分类助手。任务:对用户工单文本分类。
约束:
- 只输出JSON,不输出解释文字
- 类别限定为:故障、咨询、投诉、其他
- 依据不足时归入其他
输出格式:
{"category": "故障", "confidence": 0.9, "reason": "一句话依据"}
输出格式约束是提示词里性价比最高的一项。多接口共用的系统里,字段命名要全站统一,避免同一字段在A接口叫category、在B接口叫cat_type,否则下游解析逻辑会跟着分裂。
少样本示例与思维链的取舍
少样本示例(few-shot)给3到5个即可,覆盖边界情况比只给标准答案更有价值。思维链(Chain-of-Thought)在数学、逻辑类任务上提升明显,但会拉长输出与延迟。只在确实需要多步推理的任务上启用,并要求模型先列出推理过程;简单的抽取和分类任务直接输出结果。
函数调用:让模型输出可执行的参数
把大模型接入业务系统,函数调用(Function Call)是最稳的机制。模型本身不执行代码,只输出结构化参数,由业务侧校验后执行。
tools = [{
"type": "function",
"function": {
"name": "search_docs",
"description": "检索内部知识库文档",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"limit": {"type": "integer", "minimum": 1, "maximum": 20}
},
"required": ["query"]
}
}
}]
resp = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
)
函数描述里要写清参数语义与取值范围,模型才能正确选参。工具执行完成后,把结果追加进对话历史,再请求模型生成最终回答,链路才算闭环。
输出解析与自动重试
模型输出出现格式错误的概率不为零,工程上需要两层防护:解析失败时把错误信息回传给模型修正一次,二次失败返回固定降级文案,不进业务流。
import json
def extract_json(text: str) -> dict:
start, end = text.find("{"), text.rfind("}")
if start == -1 or end == -1:
raise ValueError("no json in output")
return json.loads(text[start:end + 1])
关键字段再叠加JSON Schema校验,防止格式合法但内容非法(比如类别不在白名单里)的结果流入下游。
上下文压缩与提示词缓存
多轮对话越长输入token越多。把历史对话压缩成摘要上下文,控制单次请求长度;系统提示词不变时启用prompt caching,重复前缀命中后延迟和成本一起下降。这两个手段在长会话业务里收益最明显。
Prompt工程不是文案技巧,而是把约束、示例、校验三段逻辑放进代码流程。按这套节奏管理,业务场景的输出稳定性可以量化统计。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prompt-gong-cheng-shi-zhan-cong-jie-gou-hua-shu-chu-dao-han/