跳转至

上下文工程与 Agent 工程

本章导读:2026 年的应用岗面试,RAG 和 Agent 的追问已经从前年的“是什么”升级到“上下文怎么压、权限怎么隔离、失败怎么恢复、成本怎么归因”。这一章覆盖公开面经里的新重灾区:上下文工程、Skill/Harness、MCP/A2A、HITL、ACL、记忆与可观测性。

阅读建议:不要把它们当成孤立概念。用一个统一的“Agent 运行时”视角理解:模型负责决策,Harness 负责约束,上下文负责信息,权限负责边界,观测负责归因。

核心要点

  • 上下文工程的核心不是“塞更多”,而是“在 token 预算内放最小充分信息”,并控制污染与丢失。
  • 压缩要分层:静态裁剪 → 检索去重 → 工具结果结构化 → 对话摘要 → 结构化状态;压缩后要校验可回答性。
  • Harness 是模型之外的运行时:循环、工具、上下文、权限、预算、观测、恢复;模型能力不等于系统能力。
  • Skill 是可复用的能力封装,MCP 是工具/上下文协议;两者解决不同层次的问题,不能互相替代。
  • HITL 的关键是状态机与幂等:暂停可恢复、审批可审计、重复执行不产生副作用。
  • ACL 要先过滤再检索/生成,租户隔离与最小权限是底线;事后脱敏不能替代事前授权。
  • 记忆要有写入策略、检索策略、遗忘策略与评估指标;无节制记忆会带来污染与成本。
  • Agentic RAG 的收益在多跳、歧义、需要验证的场景;代价是轮次、延迟与成本,固定 RAG 够用时不要升级。
  • 可观测性要能回答“哪一层错了”:模型、工具、编排、数据、权限;trace 比日志更重要。
  • 评估 Agent 不能只看最终答案,要看轨迹、步数、成本、安全与恢复能力。

1. 为什么上下文工程成为独立考点

三个变化:

  1. 上下文变长:128K/1M 窗口普及,但“能放”不等于“能用”,中间信息会被忽略,成本也线性上升。
  2. Agent 变多:多轮工具调用让上下文快速膨胀,工具结果、错误信息、历史轨迹都在抢占预算。
  3. 生产要求变高:token 成本、延迟、权限、审计、可复现,都要求对上下文做工程化管理。

一个常用类比:上下文是 Agent 的“内存”,Harness 是“操作系统”,工具是“外设”,权限是“内核态/用户态”。面试时用这个类比,能把零散概念串起来。

2. 上下文预算

2.1 预算拆分

给定模型窗口 \(W\),为一次请求分配:

\[ W = W_{\text{system}} + W_{\text{tools}} + W_{\text{memory}} + W_{\text{retrieval}} + W_{\text{history}} + W_{\text{scratch}} + W_{\text{output}} \]
部分 内容 优化手段
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 压缩方法

  1. 硬截断:按 token 截断,简单但容易丢关键信息;只适合低价值内容。
  2. 摘要:用模型压缩历史/文档;成本低,但可能失真,需保留原文引用。
  3. 结构化抽取:把工具结果转成字段(状态、错误码、关键数值),比自然语言摘要更可靠。
  4. 分层记忆:近期原文 + 中期摘要 + 长期事实;按需逐层展开。
  5. 外置状态:把计划、文件、任务状态放到外部存储,上下文只放索引/摘要。
  6. 选择性保留:保留用户约束、否定指令、数字、实体、未完成事项。

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)

适用:不可逆操作(转账、删除、发送邮件)、高风险决策、合规审批、低置信度。

实现要点:

  1. 状态机:running → waiting_approval → approved/rejected → resumed/failed。
  2. 持久化:暂停时保存上下文、计划、已完成步骤、工具结果。
  3. 幂等:审批后恢复不能重复执行副作用;用操作 ID/去重表。
  4. 超时:审批超时自动拒绝或升级。
  5. 审计:谁、何时、基于什么信息批准了什么操作。
  6. 最小惊讶:审批界面展示将要执行的具体参数与影响。

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 成本归因

\[ \text{Cost}=\sum_{\text{model}}\text{tokens}\times\text{单价}+\text{工具/检索/存储/人力} \]

按租户/场景/步骤拆分,找出“谁在烧钱”:长上下文、重复检索、无效工具调用、过度重试。

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 新考点来自公开面经与社区整理,具体实现请以目标公司/框架文档为准。