第 1.7.6 节:把上下文来源、优先级、裁剪和失败日志设计清楚
设计上下文工程时,关键是提前写清何时停止、怎样降级、由谁接手。完成本节后,你应该能够列出上下文工程的触发条件、兜底动作、日志字段和人工升级条件。
上一节已经把状态、记忆与会话整理成作品集证据。本节继续把这些材料收束成“上下文工程”:不是把更多历史塞给模型,而是决定每次模型调用时,哪些信息能进入上下文、按什么优先级进入、超预算时裁掉什么、失败时记录什么。
读完本节后,你应该能为每个作品集项目说清楚四件事:context(上下文)来源、优先级、裁剪策略和失败日志。
上下文工程的核心是把“模型本轮应该看到什么”变成可审计契约。工程边界是:上下文包只负责组织输入,不替代业务数据库、权限系统、工具结果和人工确认;真实事实必须来自可验证来源,不能由模型记忆自由补全。
上下文包是什么
上下文包是一次模型调用前的工程契约。它把原始用户输入、会话摘要、任务状态、工具结果、检索证据、系统约束和预算控制整理成可审计结构。
| 上下文来源 | 典型内容 | 优先级 | 生命周期 | 处理规则 |
|---|---|---|---|---|
| 系统约束 | 角色、权限、禁止事项、安全边界。 | 最高 | 长期稳定 | 不允许被用户覆盖。 |
| 当前用户输入 | 用户本轮问题、补充字段、确认或取消。 | 高 | 当前轮 | 必须保留原意,敏感信息需脱敏。 |
| 任务状态摘要 | 当前步骤、缺失字段、风险等级、停止原因。 | 高 | 当前任务 | 从状态表读取,不让模型猜。 |
| 工具结果摘要 | 订单状态、知识库检索、审批结果。 | 高 | 按工具结果有效期 | 只放摘要、来源、时间和关键字段。 |
| 检索证据 | 文档片段、引用来源、版本号。 | 中高 | 随资料版本变化 | 必须带来源,过期资料不能进入回答。 |
| 会话摘要 | 前几轮对话的任务相关摘要。 | 中 | 当前会话 | 只保留任务事实,不保留闲聊。 |
| 长期记忆 | 用户偏好、已确认的非敏感事实。 | 低到中 | 有过期时间 | 默认少用,必须有权限和删除机制。 |
| 预算与运行限制 | token 预算、成本、延迟、工具白名单。 | 最高 | 当前调用 | 用来决定裁剪和降级。 |
上下文优先级规则
| 冲突场景 | 处理方式 |
|---|---|
| 用户要求覆盖系统约束 | 拒绝覆盖,记录 unauthorized_context_override。 |
| 聊天历史和工具结果矛盾 | 以最新、可验证的工具结果为准。 |
| 长期记忆和当前输入矛盾 | 优先当前输入,并标记记忆需要复核。 |
| 检索证据版本过期 | 不进入最终上下文,改为缺证据或重新检索。 |
| 上下文超预算 | 先保留系统约束、当前输入、状态摘要和关键工具结果,再裁剪低优先级历史。 |
上下文包字段模板
{
"context_id": "ctx_20260703_001",
"trace_id": "trace_refund_001",
"user_input": {
"text": "我的耳机坏了,订单号是 A1001,我要退款",
"received_at": "2026-07-03T10:00:00+08:00"
},
"state_summary": {
"current_step": "policy_check",
"missing_fields": [],
"risk_level": "medium",
"stop_reason": null
},
"tool_summaries": [
{
"tool_name": "get_order_status",
"status": "success",
"summary": "订单 A1001 已签收 45 天",
"source_trace_id": "tool_001"
}
],
"retrieved_evidence": [
{
"source": "after_sales_policy_v3",
"version": "2026-06",
"summary": "耳机超过 7 天退货期后进入质保检测流程"
}
],
"budget": {
"max_context_tokens": 4000,
"used_context_tokens": 1800,
"cropping_strategy": "drop_low_priority_history_first"
},
"failure_log": []
}
这个模板不是要求读者马上写完整系统,而是训练工程表达:模型每次看到什么,为什么看到这些,看不到什么,失败时怎么复盘。
实现步骤或决策流程
实现上下文包时,先确定来源和权限,再做标准化、过滤、排序和裁剪。不要把所有历史对话直接塞给模型。
读图重点:裁剪顺序必须可解释:先保护系统约束、当前输入、状态和关键工具证据,低优先级历史最先退出上下文。
裁剪流程
- 收集:从用户输入、会话、状态、工具、检索和记忆读取候选上下文。
- 标准化:把候选内容整理成摘要、来源、时间、权限和版本。
- 过滤:去掉无权限、过期、未验证和与任务无关的信息。
- 排序:按系统约束、当前输入、状态、工具结果、检索证据、会话摘要、长期记忆排序。
- 裁剪:超预算时先裁掉闲聊、低优先级历史和重复证据。
- 组装:生成最终上下文包,并记录进入和被排除的项目。
- 复盘:模型失败时用
context_id回看上下文是否缺失、过期或过量。
失败日志分类
| 失败类型 | 触发条件 | 记录字段 | 处理方式 |
|---|---|---|---|
missing_context | 缺订单号、缺政策证据、缺工具结果。 | 缺失来源、影响步骤、用户是否可补充。 | 追问、重新检索或转人工。 |
stale_context | 证据版本过期、会话摘要不再成立。 | 旧版本、新版本、发现时间。 | 禁用旧上下文并重新获取。 |
unauthorized_context | 用户要求越权读取、记忆权限不足。 | 请求来源、被拒绝字段、权限规则。 | 拒绝并记录审计。 |
over_budget_context | 上下文超过预算。 | 预算、裁剪项、保留项。 | 按优先级裁剪或降级回答。 |
conflicting_context | 用户说法、记忆和工具结果冲突。 | 冲突来源、可信度、最终采用来源。 | 以可验证工具或人工确认结果为准。 |
六类作品集怎么映射
| 作品集项目 | 上下文重点 | 必备验收样例 |
|---|---|---|
| 智能客服 Agent 工作台 | 用户输入、订单状态、售后政策、工单状态。 | 缺订单号时追问;政策过期时不回答。 |
| RAG 企业知识库问答 | 检索证据、引用版本、拒答规则。 | 无证据不编造;引用必须能支撑答案。 |
| MCP(模型上下文协议) / Tool Calling(工具调用) 平台 | 工具权限、参数摘要、工具结果摘要。 | 未授权工具不进入上下文。 |
| 多 Agent 协作系统 | 任务交接摘要、角色边界、上一 Agent 输出。 | 下游 Agent 不读取无关私有上下文。 |
| 数据报表分析 Agent | 指标口径、查询结果、时间范围、权限。 | 没有指标定义时不生成结论。 |
| 办公自动化审批 Agent | 审批规则、申请材料、历史审批状态。 | 高风险审批必须人工复核。 |
常见错误
| 错误 | 后果 | 改法 |
|---|---|---|
| 把全部聊天历史塞给模型 | 成本高、噪声大、容易引用旧信息。 | 用会话摘要和状态摘要替代原文堆叠。 |
| 把记忆当数据库 | 业务事实可能过期或无权限。 | 订单、退款、审批以业务系统和工具结果为准。 |
| 检索到什么就回答什么 | 可能引用过期或不相关资料。 | 给证据加版本、来源和相关性门槛。 |
| 只记录模型输出,不记录上下文 | 失败时无法判断是模型问题还是上下文问题。 | 每次调用保存 context_id 和上下文包摘要。 |
本节交付物与面试讲法
| 交付物 | 要求 |
|---|---|
| 上下文来源表 | 列出当前项目有哪些上下文来源,以及各自权限和生命周期。 |
| 上下文优先级表 | 说明冲突时谁覆盖谁,超预算时裁掉谁。 |
| 上下文包模板 | 至少包含用户输入、状态摘要、工具摘要、证据摘要、预算和失败日志。 |
| 失败日志表 | 覆盖缺失、过期、越权、超预算和冲突上下文。 |
面试讲法:
我不会把上下文工程理解成“把更多内容放进 prompt”。在我的 Agent 项目里,每次模型调用前都会生成上下文包:系统约束、当前输入、状态摘要、工具结果和检索证据有不同优先级,长期记忆默认低优先级且受权限控制。超预算时按规则裁剪,失败时记录缺失、过期、越权或冲突上下文,方便回归和复盘。
小结
状态、记忆和会话解决“系统知道任务做到哪一步”;上下文工程解决“模型本轮应该看到哪些信息”。只有把来源、优先级、裁剪和失败日志工程化,Agent 才能从多轮对话走向可评估、可复盘的真实系统。