上下文工程与 Agent 工程¶
本章导读:2026 年的应用岗面试,RAG 和 Agent 的追问已经从前年的“是什么”升级到“上下文怎么压、权限怎么隔离、失败怎么恢复、成本怎么归因”。这一章覆盖公开面经里的新重灾区:上下文工程、Skill/Harness、MCP/A2A、HITL、ACL、记忆与可观测性。
阅读建议:不要把它们当成孤立概念。用一个统一的“Agent 运行时”视角理解:模型负责决策,Harness 负责约束,上下文负责信息,权限负责边界,观测负责归因。
核心要点¶
- 上下文工程的核心不是“塞更多”,而是“在 token 预算内放最小充分信息”,并控制污染与丢失。
- 压缩要分层:静态裁剪 → 检索去重 → 工具结果结构化 → 对话摘要 → 结构化状态;压缩后要校验可回答性。
- Harness 是模型之外的运行时:循环、工具、上下文、权限、预算、观测、恢复;模型能力不等于系统能力。
- Skill 是可复用的能力封装,MCP 是工具/上下文协议;两者解决不同层次的问题,不能互相替代。
- HITL 的关键是状态机与幂等:暂停可恢复、审批可审计、重复执行不产生副作用。
- ACL 要先过滤再检索/生成,租户隔离与最小权限是底线;事后脱敏不能替代事前授权。
- 记忆要有写入策略、检索策略、遗忘策略与评估指标;无节制记忆会带来污染与成本。
- Agentic RAG 的收益在多跳、歧义、需要验证的场景;代价是轮次、延迟与成本,固定 RAG 够用时不要升级。
- 可观测性要能回答“哪一层错了”:模型、工具、编排、数据、权限;trace 比日志更重要。
- 评估 Agent 不能只看最终答案,要看轨迹、步数、成本、安全与恢复能力。
1. 为什么上下文工程成为独立考点¶
三个变化:
- 上下文变长:128K/1M 窗口普及,但“能放”不等于“能用”,中间信息会被忽略,成本也线性上升。
- Agent 变多:多轮工具调用让上下文快速膨胀,工具结果、错误信息、历史轨迹都在抢占预算。
- 生产要求变高:token 成本、延迟、权限、审计、可复现,都要求对上下文做工程化管理。
一个常用类比:上下文是 Agent 的“内存”,Harness 是“操作系统”,工具是“外设”,权限是“内核态/用户态”。面试时用这个类比,能把零散概念串起来。
2. 上下文预算¶
2.1 预算拆分¶
给定模型窗口 \(W\),为一次请求分配:
| 部分 | 内容 | 优化手段 |
|---|---|---|
| System | 角色、规则、安全策略 | 精简、分层、按场景加载 |
| Tools | 工具 schema 与说明 | 只暴露相关工具、短描述、按需发现 |
| Memory | 用户偏好、历史事实 | 摘要、结构化、相关性过滤 |
| Retrieval | 文档 chunk | 去重、重排、压缩、父子块 |
| History | 多轮对话 | 滑窗、摘要、关键事实固定 |
| Scratch | 推理/计划/中间结果 | 结构化、外置到文件/状态 |
| Output | 生成预留 | max_tokens、停止条件 |
2.2 预算策略¶
- 静态上限 + 动态分配:给每类设上限,按任务类型调整;例如代码任务多给 retrieval,客服多给 history。
- 优先级:安全规则 > 当前任务证据 > 最近对话 > 长期记忆 > 历史摘要。
- 可观测:记录每类 token 占比,定位“上下文被谁吃掉”。
- 降级:超预算时先裁历史,再裁低分 retrieval,最后才动 system/security。
3. 上下文压缩¶
3.1 压缩放在哪一步¶
| 位置 | 压什么 | 方法 | 风险 |
|---|---|---|---|
| 入口 | system/tools | 精简描述、按需加载 | 规则丢失、工具选错 |
| 检索后 | chunks | 去重、重排、摘要、父子块 | 证据丢失 |
| 工具返回后 | JSON/日志/网页 | 字段提取、截断、错误归一化 | 关键错误被截掉 |
| 对话中 | 历史 | 滑窗、摘要、事实抽取 | 指代/约束丢失 |
| 生成前 | 全部 | 结构化重排、分节 | 顺序影响注意力 |
3.2 压缩方法¶
- 硬截断:按 token 截断,简单但容易丢关键信息;只适合低价值内容。
- 摘要:用模型压缩历史/文档;成本低,但可能失真,需保留原文引用。
- 结构化抽取:把工具结果转成字段(状态、错误码、关键数值),比自然语言摘要更可靠。
- 分层记忆:近期原文 + 中期摘要 + 长期事实;按需逐层展开。
- 外置状态:把计划、文件、任务状态放到外部存储,上下文只放索引/摘要。
- 选择性保留:保留用户约束、否定指令、数字、实体、未完成事项。
3.3 压缩后的校验¶
- 可回答性:压缩后能否回答原问题?用一个小模型/规则检查关键实体是否还在。
- 一致性:摘要是否与原文矛盾?数字/日期/人名是否保留?
- 可追溯:压缩内容能否映射回原文,便于引用与审计。
- 回归:压缩策略上线前跑评测集,比较答案质量与 token 成本。
4. 上下文污染¶
4.1 来源¶
- 错误记忆:把模型猜测写成事实;
- 过期检索:旧版本文档未失效;
- 工具错误:超时/异常被当成正常结果;
- 注入内容:网页/文档中的恶意指令;
- 多智能体:一个 Agent 的错误结论被另一个当成事实;
- 摘要失真:多轮压缩后语义漂移。
4.2 检测与隔离¶
- 来源标记:每条上下文带来源、时间、置信度、权限标签;
- 冲突检测:同一事实多个版本时,按时间/权威性排序,显式提示冲突;
- 信任分层:system > 用户 > 工具 > 检索 > 网页;低信任内容不做指令,只做数据;
- 隔离:不同租户/任务/会话的上下文不混用;工具结果放在独立区块;
- 清除:提供“忘记/重置”能力,避免错误记忆长期传播。
面试点:prompt injection 的本质是“数据被当成指令”。防御不能只靠一句“忽略恶意指令”,要靠权限、分隔、输出校验与最小工具集。
5. Harness:模型之外的运行时¶
5.1 定义¶
Harness(脚手架/运行时)是包裹模型的系统工程层,负责:
- 循环:ReAct/Plan-Execute 的步进、终止、重试;
- 上下文:组装、压缩、预算、隔离;
- 工具:注册、发现、schema、执行、错误处理;
- 权限:谁能调用什么、是否需要审批;
- 预算:token、时间、费用、步数;
- 观测:trace、日志、指标、回放;
- 恢复:checkpoint、幂等、断点续跑。
一句话:模型决定“想做什么”,Harness 决定“能做什么、怎么做、做完怎么证明”。
5.2 Skill¶
Skill 是可复用的能力封装,通常包含:
- 名称、描述、适用条件;
- 输入/输出 schema;
- 执行逻辑(脚本/工具链/提示模板);
- 权限与资源需求;
- 评测用例与版本。
管理上百个 Skill 的关键:
| 问题 | 做法 |
|---|---|
| 发现 | 分类、标签、语义检索、按场景加载 |
| 选择 | 描述清晰、负例说明、路由模型 |
| 版本 | 语义化版本、灰度、回滚 |
| 权限 | 最小权限、租户级授权 |
| 质量 | 单测、回归集、线上成功率 |
| 冲突 | 优先级、互斥声明、组合规则 |
5.3 Skill vs MCP vs Function Calling vs A2A¶
| 概念 | 层次 | 解决什么 | 不解决什么 |
|---|---|---|---|
| Function Calling | 模型输出协议 | 模型如何表达调用意图 | 工具发现、权限、复用 |
| MCP | 工具/上下文接入协议 | 标准化 server/client、跨应用复用 | 业务编排、权限策略 |
| Skill | 能力封装 | 可复用的任务能力、提示+工具组合 | 跨应用协议 |
| A2A | Agent 间协作协议 | 多 Agent 通信、任务委派 | 单 Agent 内部循环 |
| Harness | 运行时 | 循环、上下文、权限、观测 | 模型能力本身 |
面试表达:MCP 让工具“接得上”,Skill 让能力“用得好”,Harness 让系统“跑得稳”,A2A 让多个 Agent “协作得起来”。
6. HITL 与权限¶
6.1 HITL(Human-in-the-loop)¶
适用:不可逆操作(转账、删除、发送邮件)、高风险决策、合规审批、低置信度。
实现要点:
- 状态机:
running → waiting_approval → approved/rejected → resumed/failed。 - 持久化:暂停时保存上下文、计划、已完成步骤、工具结果。
- 幂等:审批后恢复不能重复执行副作用;用操作 ID/去重表。
- 超时:审批超时自动拒绝或升级。
- 审计:谁、何时、基于什么信息批准了什么操作。
- 最小惊讶:审批界面展示将要执行的具体参数与影响。
6.2 权限模型¶
- RBAC:按角色授权;
- ABAC:按属性(部门、密级、时间、地点)授权;
- 文档级 ACL:每个 chunk 带权限标签,检索前过滤;
- 租户隔离:物理/逻辑隔离,防止向量库跨租户召回;
- 工具权限:白名单、参数约束、沙箱、网络出口限制;
- 最小权限:只给完成任务所需的工具与数据。
6.3 先过滤还是后过滤¶
- 先过滤:在检索/生成前按 ACL 过滤,避免越权内容进入上下文;更安全,但可能影响召回与性能。
- 后过滤:先检索再过滤,召回更全,但有泄漏风险,且模型可能已经“看到”敏感内容。
- 推荐:权限过滤前置到索引/检索层;生成后再做输出脱敏与审计,双保险。
7. 记忆系统¶
7.1 分类¶
| 类型 | 内容 | 存储 | 生命周期 |
|---|---|---|---|
| 工作记忆 | 当前任务状态、计划 | 上下文/状态对象 | 单次任务 |
| 短期记忆 | 最近对话 | 上下文/缓存 | 会话 |
| 长期记忆 | 用户偏好、事实、经验 | 向量库/数据库/文件 | 长期 |
| 程序记忆 | 技能、流程 | Skill 库/提示 | 版本化 |
7.2 写、读、忘¶
- 写:什么值得记?用户明确偏好、稳定事实、任务结论、失败教训;不要记录模型猜测。
- 读:按相关性、时间、重要性、权限检索;避免把不相关记忆塞进上下文。
- 忘:过期、低置信度、用户撤回、冲突旧版本;定期清理与压缩。
- 评估:记忆召回相关性、污染率、过期率、对任务成功率的贡献、token 成本。
7.3 常见问题¶
- 记忆越多越好?不是,噪声会稀释注意力,增加成本。
- 记忆写入无审核?错误会长期传播。
- 记忆不区分租户?隐私泄漏。
- 记忆不做版本?冲突无法解决。
8. Agentic RAG¶
8.1 与固定 RAG 的区别¶
| 维度 | 固定 RAG | Agentic RAG |
|---|---|---|
| 检索次数 | 一次(或固定多路) | 模型决定何时/多次 |
| 查询 | 原始 query/改写 | 迭代改写、验证、补检 |
| 适用 | 单跳、事实问答 | 多跳、歧义、需要验证 |
| 成本 | 低、可预测 | 高、不可预测 |
| 失败模式 | 召回错 | 循环、过度检索、成本爆炸 |
8.2 何时升级¶
- 单跳问题占比高、固定 RAG 已满足 → 不升级;
- 多跳/比较/需要最新信息/答案需验证 → 可升级;
- 有明确停止条件与预算 → 才上生产。
8.3 控制成本¶
- 最大检索轮数(2–4);
- 查询去重与缓存;
- 低置信度才补检;
- 小模型做查询改写/相关性判断;
- 证据足够即停止,不要让模型“为了勤奋”反复检索。
9. 多智能体¶
9.1 常见模式¶
- 主管-工人:一个 planner 分派任务,多个 worker 执行;
- 辩论:多个 Agent 给观点,评审/投票;
- 流水线:按阶段串联(检索 → 分析 → 写作 → 审核);
- 市场/协商:按能力与成本竞标任务。
9.2 失败模式¶
- 责任扩散:没人对最终结果负责;
- 上下文不一致:各自看到不同信息;
- 通信开销:消息爆炸、重复劳动;
- 错误放大:一个 Agent 的幻觉被另一个引用;
- 成本失控:多 Agent 多轮调用。
9.3 什么时候值得¶
任务可分解、子任务需要不同工具/知识、需要并行探索、需要对抗性审查。若单 Agent + 好工具能解决,不要上多 Agent。
10. 可观测性与成本¶
10.1 Trace 要记录什么¶
- 请求 ID、会话 ID、租户 ID;
- 每步的模型、prompt 摘要、token 数、延迟;
- 工具名、参数摘要、返回状态、耗时;
- 检索 query、召回 ID、分数、权限过滤结果;
- 错误堆栈、重试次数、终止原因;
- 最终输出与用户反馈。
10.2 指标¶
| 层级 | 指标 |
|---|---|
| 服务 | QPS、P50/P99、错误率、超时率 |
| 模型 | TTFT、TPOT、token/s、上下文长度分布 |
| 工具 | 成功率、P99、重试率、限流率 |
| 业务 | 任务成功率、转人工率、满意度、成本/请求 |
| 安全 | 越权率、注入拦截率、敏感信息泄漏 |
10.3 成本归因¶
按租户/场景/步骤拆分,找出“谁在烧钱”:长上下文、重复检索、无效工具调用、过度重试。
11. Agent 评估¶
11.1 维度¶
- 结果:任务成功率、答案正确率;
- 过程:步数、工具调用次数、token、延迟;
- 鲁棒:工具失败/超时/歧义下的恢复率;
- 安全:越权、注入、泄漏;
- 体验:转人工率、满意度。
11.2 方法¶
- 固定任务集 + 模拟环境(网页、文件系统、API mock);
- 轨迹评估:是否走了必要步骤、有无多余/危险动作;
- LLM-as-judge + 人工抽检;
- 回归集:每次改 prompt/工具/模型都跑;
- 线上 A/B + 影子流量。
12. 面试高频问题¶
Q1:上下文工程的压缩放在哪一步?¶
- 入口裁 system/tools,检索后去重/重排/摘要,工具结果结构化,对话滑窗+摘要,生成前结构化重排。
- 原则:先保留决策所需的最小充分信息,压缩后校验关键实体与约束。
- 代价:摘要可能失真,必须可追溯与回归测试。
Q2:怎么判断上下文被污染了?¶
- 看来源、时间、权限、置信度标签;冲突检测;答案与证据不一致。
- 追踪错误传播链:哪条记忆/工具结果/文档进入了上下文。
- 处理:隔离、清除、降权、重新检索、人工复核。
Q3:Harness 和模型的关系?¶
- 模型负责理解与决策,Harness 负责循环、工具、上下文、权限、预算、观测、恢复。
- 模型能力再强,没有 Harness 也无法稳定完成长任务。
- 面试可类比:模型是 CPU,Harness 是操作系统。
Q4:MCP 和 Function Calling 的区别?¶
- FC 是模型表达调用意图的协议;MCP 是工具/上下文接入的标准化协议。
- MCP 让工具可发现、可复用、跨应用;FC 解决单次调用。
- MCP 不替代权限、沙箱、审计。
Q5:Skill 和 MCP 的边界?¶
- MCP 偏“接工具/数据”,Skill 偏“封装能力/流程”。
- 一个 Skill 可以调用多个 MCP 工具;MCP server 也可以暴露一个 Skill。
- 管理上:Skill 要版本、评测、权限;MCP 要注册、发现、连接。
Q6:HITL 怎么实现暂停与恢复?¶
- 状态机持久化:计划、上下文、已完成步骤、待执行操作。
- 审批后从检查点恢复,操作幂等,避免重复副作用。
- 超时、拒绝、升级路径都要定义;全程审计。
Q7:ACL 先过滤还是后过滤?¶
- 推荐先过滤:在索引/检索层按权限过滤,避免敏感内容进入上下文。
- 后过滤作为输出脱敏与审计的补充,不能替代事前授权。
- 多租户要物理/逻辑隔离,防止向量召回跨租户。
Q8:记忆系统怎么评估?¶
- 召回相关性、污染率、过期率、冲突率;
- 对任务成功率的贡献、token 成本、延迟;
- 用户反馈与人工抽检;定期清理与回归。
Q9:Agentic RAG 什么时候值得?¶
- 多跳、歧义、需要验证、答案需最新信息;
- 固定 RAG 的 badcase 集中在“一次检索不够”;
- 有停止条件与预算控制,否则延迟与成本会失控。
Q10:多智能体什么时候不值得?¶
- 任务线性、工具少、单 Agent 能完成;
- 通信成本高于并行收益;
- 责任边界不清、评估困难;
- 先用单 Agent + 好工具,再考虑拆分。
Q11:线上 Agent 失败怎么归因?¶
- 分层:模型(选错工具/幻觉)、工具(超时/参数错)、编排(循环/终止)、数据(检索错/权限)、用户(歧义)。
- 看 trace、工具日志、检索结果、token/步数。
- 修复后加入回归集,避免同类问题。
Q12:怎么控制 Agent 成本?¶
- 预算:最大步数、token、时间、费用;
- 路由:简单任务小模型,复杂任务大模型;
- 缓存:前缀、检索、工具结果;
- 压缩:上下文、工具输出、历史;
- 早停:证据足够即停止;并行工具调用减少轮次。
本文档为面试复习资料,2026 新考点来自公开面经与社区整理,具体实现请以目标公司/框架文档为准。