--- title: "面试官皱眉:\"你的 Agent 跑了10轮之后还靠谱吗\"——上下文漂移与工具调用幻觉深度解析" source_url: https://mp.weixin.qq.com/s/4SebcRmlVlJ_MECOv7_3PQ sha256: e8146b4d3ee4 type: raw created: 2026-05-15 updated: 2026-05-15 tags: [agent, reliability, context-drift, tool-hallucination, transformer, attention, interview] review_value: 8 review_confidence: 8 review_score: 64 review_stars: 4 review_recommendation: "入库" ingested: 2026-05-15 source: "卡码大模型" source_authors: ["程序员Carl"] source_date: "2026-05-15" --- # 面试官皱眉:"你的 Agent 跑了10轮之后还靠谱吗"——上下文漂移与工具调用幻觉深度解析 > 来源:卡码大模型(程序员Carl),代码随想录,2026年5月15日 ## 核心问题 Agent 跑几步就偏了,忘了原始任务;该调工具的时候调错了,不该调的时候瞎调。 不稳在哪?就两个核心问题:**上下文漂移**和**工具调用幻觉**。 --- ## 一、上下文漂移 ### 现象:目标悄悄变了 理想流程:读数据 → 分析趋势 → 定位原因 → 输出报告。 实际可能:读数据 → 发现格式有问题,开始修格式 → 修完格式又发现字段缺失,去查文档 → 查文档时被另一段内容吸引,开始做竞品分析 → 跑了10步,原始任务一个字没碰。 **上下文漂移**:Agent 的执行方向,悄悄偏离了原始目标。不是模型"变傻了",是它在每一步都在做"当前上下文下最合理的下一步",但"最合理"不等于"最符合原始目标"。 ### 根因:从注意力机制理解"为什么偏" Transformer Self-Attention 的两个直接后果: 1. **注意力有"近因效应"**:Self-Attention 权重不是均匀分配的,模型倾向于给最近的 Token 更高的权重。原始指令在最前面,中间隔着大量中间结果,到后面几步时,原始指令的注意力权重已经被"稀释"了。Agent 不是"忘了"目标,是目标在它的注意力里占比越来越低。 2. **中间结果会"抢焦点"**:Agent 每一步的输出都追加到上下文里,这些中间结果本身就是新的刺激信号。上下文越长,干扰信号越多,原始目标越容易被淹没。 这和 Transformer 论文讲的 **"Lost in Middle"** 是同一类问题:上下文中间的信息最容易被忽略,而原始指令恰好被推到了"中间"甚至"开头"的位置。 > **总结**:上下文漂移的本质,是原始目标在注意力分配中逐渐失焦。 ### 漂移的三种模式 | 模式 | 描述 | |------|------| | **目标漂移** | Agent 从任务 A 滑到任务 B。原始目标被新刺激完全替代 | | **优先级漂移** | 任务没变,但主次倒置。支线花了大半步骤,主线没推进 | | **风格漂移** | 目标和优先级没偏,但输出风格变了(最隐蔽) | ### 检测信号 - **当前动作与原始目标的关联度**:连续两步的输出和原始目标没有直接关系 - **步骤重复率**:Agent 反复执行同一类操作,卡在子任务里 - **目标完成进度**:跑了 N 步,原始目标完成度还是 0% 工程解法:每执行 K 步,把当前状态和原始目标丢给模型,让它判断"当前是否还在朝目标前进"。 ### 解法分层 | 层次 | 方案 | 代价 | |------|------|------| | 第一层 | 任务分解 + 子目标检查点 | 需要提前设计任务分解,对简单任务增加开销 | | 第二层 | 上下文压缩 | 压缩可能丢失细节 | | 第三层 | 定期 Re-Planning | 额外 LLM 调用,增加延迟和成本 | --- ## 二、工具调用幻觉 ### 现象:不是不会调,是调错了 你给 Agent 配了 3 个工具:search_database、search_web、send_email。 实际可能发生的事: - Agent 调了 search_api——你的工具列表里根本没有这个 - Agent 调了 search_database,但参数传了 date: "明天"——接口要求 YYYY-MM-DD 格式 - 用户只是闲聊"今天天气不错",Agent 硬是调了 search_web 去搜天气 **工具调用幻觉**:Agent 在工具调用上产生了"虚构"行为。 ### 根因:从概率生成理解"为什么幻觉" 核心关键事实:模型选工具,不是在查表,是在**猜**。 大模型的每一步输出都是概率采样。工具调用也一样——模型不是从工具列表里"查找"最匹配的工具,而是根据上下文预测"下一个最可能出现的工具名"。 这意味着: - 如果工具描述模糊,多个工具看起来"都可能对",模型就靠概率选 - 如果参数类型没约束,模型按"感觉"填值 - 如果模型被训练得"太积极",它会在不需要工具的时候也硬调一个 > **总结**:工具调用幻觉的本质,是概率生成遇到了结构性约束不足。 ### 幻觉的三种类型 | 类型 | 现象 | 根因 | |------|------|------| | **Type 1** | 调了不存在的工具(search_api 但只有 search_database) | 工具描述和任务描述之间存在"语义缝隙",模型根据任务"编"了一个合理的工具名 | | **Type 2** | 参数类型或格式错误(limit: "十个" 而非 integer) | 参数的类型约束和格式约束没有明确声明,模型按自然语言习惯生成 | | **Type 3** | 无意义的工具调用(用户问"你好"却去搜天气) | 模型有"工具使用倾向",训练数据中调用工具的对话得到更高奖励信号,导致过度使用 | ### 解法 | 类型 | 对应策略 | |------|---------| | **Type 1** | 工具描述结构化(明确边界+Few-shot示例);调用前校验工具名必须在注册列表 | | **Type 2** | 参数 Schema 约束(JSON Schema 定义类型/枚举/格式/必填);利用结构化输出能力 | | **Type 3** | 显式加入"无工具需要调用"选项;调用前判断必要性;设置调用频率阈值 | ### 通用防线:调用全流程校验(三段式) **调用前**:校验工具名是否在注册列表,参数是否符合 Schema,是否满足调用必要性 **调用中**:设置超时和异常捕获,工具执行失败不要直接暴露原始错误给模型(容易触发下一轮幻觉),而是转化为结构化的错误信息 **调用后**:校验返回结果是否符合预期格式,异常结果触发重试(最多 2-3 次),超过重试次数则降级处理 --- ## 面试怎么答 参考思路: > "Agent 的核心可靠性问题,我认为最关键的是上下文漂移和工具调用幻觉。 > > 上下文漂移的根因在注意力机制——上下文越长,原始目标在注意力分配中占比越低,Agent 被'近因效应'带偏。我的解法是分层处理:短任务用任务分解加检查点,长任务加定期 Re-Planning 做航向校正,超长任务用上下文压缩控制信息量。 > > 工具调用幻觉的根因在概率生成——模型不是查表选工具,是预测下一个最可能的工具名,约束不足就会猜错。我的解法是按幻觉类型对症下药:调错工具靠描述结构化,参数错误靠 Schema 约束,无意义调用靠必要性判断。再叠加调用前中后的三段式校验做兜底。 > > 这两个问题的共同点是:都是概率生成模型的固有特性,需要在工程层面做约束和兜底。" --- ## 相关资源 - [卡码笔记](https://notes.kamacoder.com)(大模型八股文) - 代码随想录