Prompt Engineering 进阶:多轮上下文、结构化输出与 GPT-5.6 调优
Prompt Engineering 第二篇:多轮上下文管理、结构化输出(JSON Schema)、few-shot 模式、长上下文策略与 GPT-5.6 reasoning.effort 调优。
操作步骤
用 JSON Schema 强制结构化输出
在 Responses API 的 text.format 里设 type='json_schema' 与 strict schema;模型保证 token 级别符合 schema,无需正则后处理。
设计 few-shot 提示
挑 3-5 个边界案例,按难度递增排;每个示例包含 input 与期望 output;放在 user 消息里而非 system。
管理多轮上下文
静态规则放 system、对话只保留最近 5-10 轮;超阈值用摘要压缩;关键决策显式回引历史条目。
启用 Prompt Caching
重复前缀(system 指令、长文档)启用 caching,重复命中部分按缓存价计费,通常是原价 1/2。
联动 reasoning.effort
日常 medium,难任务 high;effort 拉到 high 通常比把 prompt 改长更有效;最后才考虑换到 Sol。
第一篇 Prompt Engineering 讲了 8 个基础模板(角色、目标、约束、示例、格式…)。这篇是其进阶版:多轮上下文、结构化输出、few-shot 实战、长上下文策略、以及和 reasoning.effort 的协同。GPT-5.6 + Responses API 让这些模式比 GPT-4o 时代更稳。
1. 多轮上下文管理
GPT-5.6 上下文窗口 1.05M token,但实际成本按 token 计费,且越远的内容模型注意力越弱。多轮管理三件套:
滑动窗口
只保留最近 N 轮(通常 5-10)。最简单,缺点是丢失早期上下文。
messages = [
{"role": "system", "content": STATIC_INSTRUCTION}, # 不变
*messages[-10:] # 只留最近 10 轮
]
摘要压缩
把早轮用一次独立调用摘要成 1-2 段,再塞回 history。保留关键信息但省 token。
def summarize(messages):
summary_resp = client.responses.create(
model="gpt-5.6-luna",
input=messages,
instructions="总结以下对话为 2-3 句话,保留决策、事实、未解决的问题:"
)
return summary_resp.output_text
# 每 N 轮触发一次摘要
if len(messages) > 20:
summary = summarize(messages[:-10])
messages = [{"role": "system", "content": STATIC_INSTRUCTION},
{"role": "system", "content": f"对话摘要:{summary}"},
*messages[-10:]]
静态指令移出 system
不变的规则(角色、约束、风格)放 system;对话只放最新几条。system 占的 token 少、易于调试。
生产建议组合:滑动窗口 + system 静态指令,超过 15-20 轮再加摘要。
2. 结构化输出(Structured Outputs)
GPT-5.6 + Responses API 支持 strict JSON Schema 强制——模型在 token-by-token 解码时就保证符合 schema,几乎不可能格式错。比正则后处理稳定 100 倍。
schema = {
"type": "object",
"properties": {
"intent": {"type": "string", "enum": ["search", "order", "cancel", "other"]},
"confidence": {"type": "number", "minimum": 0, "maximum": 1},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"qty": {"type": "integer", "minimum": 1}
},
"required": ["name", "qty"],
"additionalProperties": False
}
}
},
"required": ["intent", "confidence"],
"additionalProperties": False
}
response = client.responses.create(
model="gpt-5.6",
input="我要订两杯美式咖啡",
text={"format": {"type": "json_schema", "json_schema": {"schema": schema, "strict": True}}}
)
# response.output_text 一定符合 schema,无需校验
关键细节:
additionalProperties: False—— 防止模型塞额外字段- enum 类型严格收敛输出空间
required显式列出所有必填字段
3. Few-shot 实战
3-5 个示例最佳。挑边界情况,不是挑你希望它怎么输出的那一个——挑它容易翻车的几个。
[示例 1 - 简单正面]
输入: "我要一杯拿铁"
输出: {"intent": "order", "items": [{"name": "拿铁", "qty": 1}]}
[示例 2 - 改单]
输入: "改成两杯"
输出: {"intent": "modify", "items": [{"name": "拿铁", "qty": 2}]}
[示例 3 - 取消]
输入: "算了不要了"
输出: {"intent": "cancel", "items": []}
[示例 4 - 闲聊]
输入: "你推荐什么咖啡好喝?"
输出: {"intent": "other", "items": []}
[示例 5 - 多意图]
输入: "再来一杯美式,加一份糖"
输出: {"intent": "order", "items": [{"name": "美式", "qty": 1}, {"name": "糖", "qty": 1}]}
排版按难度递增;示例放 user 消息(不是 system),让模型视它为"对话的一部分"。
4. 长上下文策略
1.05M token 听起来很多,但单次 1M input × Sol $5/MTok = $5/次。三条省钱杠杆:
- Prompt Caching:重复前缀(system 指令、长文档)按缓存价计费(约原价 1/2)
- 分块处理:长文档先分块,Luna + effort=none 跑提取,再聚合;比一次性塞满便宜 10 倍
- 分层摘要:详细放最后(注意力强)、摘要放最前;不要指望模型精确读中间位置
启用 Prompt Caching:
response = client.responses.create(
model="gpt-5.6",
input=[
{"role": "system", "content": LONG_DOCUMENT}, # 缓存命中
{"role": "user", "content": "文档里提到了哪几个产品?"}
],
prompt_cache_key="doc-product-overview", # 同 key 命中缓存
prompt_cache_options={"mode": "explicit"}, # explicit / implicit(默认)
)
两种模式:
implicit(默认):OpenAI 自动决定缓存边界explicit:你在 content block 上显式标prompt_cache_breakpoint,告诉模型缓存到哪结束——更可控
每个请求最多 4 次缓存写入、50 个 breakpoints;每 key 建议 ≤15 次/分钟。
5. 与 reasoning.effort 的协同
reasoning.effort 决定"想多深",prompt 决定"想什么"。先 effort 再 prompt。
| 任务类型 | effort | prompt 复杂度 |
|---|---|---|
| 分类抽取 | none | 极简(1-2 行) |
| 日常对话 | medium | 中等(4-8 行) |
| 复杂规划 | high | 中等(4-8 行) |
| 多步推理 | xhigh | 中等(prompt 越短模型越能发挥) |
经验:把 effort 拉到 high 比把 prompt 写得天花乱坠更有效。模型想得深的时候,prompt 反而要短——给它清晰的子问题比给一堆规则强。
6. 常见错误与排查
- 多轮上下文超限 → 报错 400 → 启用滑动窗口 + 摘要
- JSON 解析失败 → 改用结构化输出 + strict schema;不要正则
- few-shot 不起作用 → 示例太少(
<3)或全是相似案例;按难度递增排 - 长上下文效果差 → 启用 Prompt Caching + 摘要前置;不要把关键信息塞中间
- 模型答非所问 → effort 调高 + 约束清晰化;别在 prompt 里堆规则
7. 下一步
- 《Prompt Engineering 核心模式:8 个让 GPT 表现翻倍的模板》— 基础篇
- 《GPT-5.6 选型指南:Sol / Terra / Luna 到底怎么选(2026)》
- 《OpenAI API 函数调用实战:Responses API 工具使用完全指南》
关键要点
- 多轮上下文:定期裁剪早轮、用摘要压缩、把静态指令移到 system、滑动窗口保留最近 N 轮
- 结构化输出:Responses API + strict JSON Schema,模型保证字段类型与必需字段;不要正则后处理
- few-shot:给 3-5 个边界案例比给 20 个相似案例更有效;按难度递增排
- 长上下文:1.05M token 不便宜;Prompt Caching 缓存重复前缀;分块处理比塞满更好
- reasoning.effort 与 prompt 是协同关系:先 effort 再 prompt,不要 effort=max + 一句话指令
常见问题
官方参考
相关文章
订阅 GPTMap Weekly
每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。