上下文窗口管理
核对日期:2026-05-09。
1. 定义与边界
上下文窗口管理是对模型输入 token 的预算、筛选、压缩、检索、排序和保留。长上下文模型降低截断风险,但不是长期记忆,也不能保证模型正确关注关键证据。
2. 为什么重要
Agent 的上下文通常包含用户目标、系统约束、历史对话、工具结果、检索文档、临时计划和错误信息。无控制地堆入上下文会导致成本上升、延迟增加、重要信息被淹没、外部内容注入和隐私泄露。
3. 核心机制
上下文应分层:
| 层 | 内容 | 管理策略 |
|---|---|---|
| 系统层 | 角色、策略、不可变规则 | 短、稳定、版本化 |
| 任务层 | 当前目标、约束、验收标准 | 每轮保留 |
| 状态层 | 已知事实、决策、开放问题 | 摘要化、结构化 |
| 证据层 | 检索文档、工具结果 | 带来源、按相关性排序 |
| 历史层 | 对话与工具轨迹 | 滑动窗口 + 摘要 |
| 临时层 | 候选计划、中间结果 | 用后丢弃或写入状态 |
4. 架构模式
常见策略:
| 策略 | 适用 | 风险 |
|---|---|---|
| 滑动窗口 | 短对话、低风险 | 早期关键约束丢失 |
| 摘要记忆 | 长会话 | 摘要误差累积 |
| RAG | 文档问答、知识库 | 检索召回不足或证据污染 |
| 结构化状态 | 工作流、工单、代码任务 | 需要 schema 维护 |
| 提示缓存 | 重复长前缀 | 供应商能力和缓存失效需核对 |
5. 工程实现
上下文构造器建议先分配预算:
budget = {
"system": 1200,
"task": 1000,
"state": 2000,
"evidence": 12000,
"history": 4000,
"output_reserve": 3000,
}
context = [
render_system(policy),
render_task(goal, acceptance_criteria),
render_state(state.facts, state.decisions),
render_evidence(retrieve(query, k=8)),
render_recent_history(history, token_limit=budget["history"]),
]
证据块需要携带元数据:
{
"source_id": "policy-refund-v4",
"url": "kb://policy/refund",
"retrieved_at": "2026-05-09T10:00:00+08:00",
"trust_level": "internal-approved",
"content": "..."
}
6. 生产实践
- 对每次请求记录输入 token 分布,发现“历史层”挤占“证据层”时报警。
- 将外部文档标注为“不可信内容”,不能覆盖系统层指令。
- 对摘要做版本化,并保留可回放原始事件。
- 长上下文任务优先要求引用证据,避免模型凭记忆补全。
- 对敏感字段做脱敏,不因“需要上下文”而完整塞入日志或模型。
7. 常见反模式
| 反模式 | 后果 |
|---|---|
| 把全部历史塞入上下文 | 成本高、注意力漂移、隐私风险 |
| 只保存自然语言摘要 | 结构化字段丢失,难以审计 |
| 检索结果无来源 | 无法验证 groundedness |
| 允许网页内容写入系统提示词 | prompt injection |
| 把长窗口当数据库 | 无法查询、权限和一致性不可控 |
8. 评测方法
构造长上下文回归集,覆盖早期约束保留、相互冲突证据、脏文档注入、检索漏召回、摘要漂移和敏感信息过滤。指标包括关键事实保留率、引用准确率、输入 token 成本、延迟和注入成功率。
9. 安全与治理
上下文是安全边界之一。必须区分系统指令、开发者指令、用户输入、工具返回和外部文档。外部内容只能作为证据,不能作为策略来源。对跨租户系统要确保检索 ACL 和向量库过滤在模型调用前完成。
10. 上下文决策框架
上下文窗口管理的核心不是“塞满窗口”,而是决定每一类信息是否值得占用预算。
| 信息类型 | 进入上下文条件 | 替代方案 | 风险 |
|---|---|---|---|
| 系统策略 | 必须短且稳定 | 策略引擎外置 | 过长会稀释关键规则 |
| 历史对话 | 与当前任务直接相关 | 摘要、状态字段 | 早期约束丢失或隐私泄露 |
| 工具结果 | 当前步骤需要 | 结构化状态、ID 引用 | 原始结果含注入文本 |
| 检索文档 | 有来源且通过 ACL | 重新检索、引用片段 | 脏文档污染回答 |
| 长文件 | 需要全局理解 | 分块、索引、map-reduce | 关注点漂移 |
| 中间推理 | 需要审计理由 | 简短计划/决策摘要 | 泄露内部策略 |
一个可落地原则是:能结构化保存的状态,不长期依赖自然语言历史;能按需检索的证据,不常驻上下文。
11. Token 预算与压缩策略
context_budget:
max_input_tokens: 64000
reserve_output_tokens: 4000
buckets:
system: {max_tokens: 1200, required: true}
task: {max_tokens: 1500, required: true}
structured_state: {max_tokens: 4000, required: true}
evidence: {max_tokens: 42000, required: false}
recent_history: {max_tokens: 8000, required: false}
error_context: {max_tokens: 3000, required: false}
overflow_policy:
- drop_low_score_evidence
- summarize_old_history
- ask_for_scope_reduction
压缩不能只调用“总结一下”。生产压缩要保留可验证字段:
{
"summary_version": "ctx-sum-v3",
"source_event_range": ["evt_001", "evt_084"],
"facts": [
{"text": "用户要求只生成草稿,不自动发送。", "source": "evt_012"}
],
"decisions": [
{"text": "禁止调用 email.send,只允许 email.create_draft。", "source": "policy"}
],
"open_questions": ["收件人邮箱尚未确认"],
"dropped": {"events": 48, "reason": "not relevant to current goal"}
}
12. 上下文 Eval Gate
评测方案:
| 用例 | 检查点 | 指标 |
|---|---|---|
| 早期约束 | 第一轮的限制在第十轮仍生效 | constraint retention |
| 冲突证据 | 新旧文档冲突时优先最新可信来源 | conflict resolution accuracy |
| 脏文档 | 文档要求忽略系统指令 | injection block rate |
| 跨租户检索 | A 租户问题不能取 B 租户文档 | ACL leakage rate |
| 摘要漂移 | 多次摘要后字段是否丢失 | fact preservation |
13. 安全补充:上下文污染
上下文污染通常来自三类入口:
- 外部文档:网页、邮件、PDF、工单评论中含指令文本。
- 工具结果:第三方 API 返回未经清洗的 HTML、Markdown、错误栈。
- 历史摘要:早期错误判断被写入“事实”,后续不断放大。
防护清单:
- 所有外部内容标注
trusted=false和source_type。 - 检索必须先执行 ACL,再进入向量召回或重排。
- 工具结果回填前做长度限制、脱敏、注入检测。
- 摘要保留 source event,支持回放和纠错。
- 输出引用必须指向证据块,不允许引用“模型记忆”。
14. 不适用场景与反模式补充
- 高频低价值任务不应使用超长上下文,成本和延迟会吞掉收益。
- 法务、财务、生产变更等任务不能只靠上下文充分,仍需权限和审批。
- 对长期用户画像,不要把隐私数据长期拼进 prompt;应使用受控 profile store。
- 对代码库任务,不要把全仓库塞进模型;优先用符号索引、调用图、定向读取。
15. 权威资料
- OpenAI Prompt engineering and tools docs: https://platform.openai.com/docs/guides/tools
- OpenAI Reasoning guide: https://platform.openai.com/docs/guides/reasoning
- Anthropic prompt caching: https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
- Anthropic context editing: https://docs.anthropic.com/en/docs/build-with-claude/context-editing
- Google Gemini long context: https://ai.google.dev/gemini-api/docs/long-context
- MCP security best practices: https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices