GPTMap

Prompt Engineering 进阶:多轮上下文、结构化输出与 GPT-5.6 调优

Prompt Engineering 第二篇:多轮上下文管理、结构化输出(JSON Schema)、few-shot 模式、长上下文策略与 GPT-5.6 reasoning.effort 调优。

TL;DR
Prompt Engineering 第一篇讲了 8 个基础模板。本文是其进阶版:多轮上下文管理(裁剪、摘要、压缩)、结构化输出(JSON Schema + strict mode)、few-shot 实战、长上下文策略(百万 token 怎么用不爆)、以及用 reasoning.effort 联动 Prompt 调节。GPT-5.6 原生结构化输出与 Responses API 让这些模式更稳。
Prompt Engineering 是通过设计输入文本(指令、上下文、示例)来引导语言模型产生目标输出的实践。进阶层面关注的是多轮控制、结构化保证、上下文工程。

操作步骤

  1. 用 JSON Schema 强制结构化输出

    在 Responses API 的 text.format 里设 type='json_schema' 与 strict schema;模型保证 token 级别符合 schema,无需正则后处理。

  2. 设计 few-shot 提示

    挑 3-5 个边界案例,按难度递增排;每个示例包含 input 与期望 output;放在 user 消息里而非 system。

  3. 管理多轮上下文

    静态规则放 system、对话只保留最近 5-10 轮;超阈值用摘要压缩;关键决策显式回引历史条目。

  4. 启用 Prompt Caching

    重复前缀(system 指令、长文档)启用 caching,重复命中部分按缓存价计费,通常是原价 1/2。

  5. 联动 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

任务类型effortprompt 复杂度
分类抽取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 + 一句话指令

常见问题

正则后处理很脆弱——模型多一个逗号或少一个引号就全挂。GPT-5.6 的结构化输出(structured outputs)配合 strict JSON Schema,模型在生成时就保证 token-by-token 符合 schema,几乎不可能格式错。代价:必须用 Responses API 的 text.format 配置,且 schema 要写得清楚。

官方参考

相关文章

订阅 GPTMap Weekly

每周一封邮件,精选 OpenAI 重要更新、深度解读与最佳实践。无广告,可随时退订。

GPTMap Editorial发布于 2026-08-07 7 分钟阅读
测试环境(EEAT)
最后测试时间:2026-08-07
使用模型:gpt-5.6