Skip to content

106. 工具执行流程与多 Agent 边界

学习目标

这一节继续梳理工具调用的完整流程,并讨论多工具、多 Agent 和上下文长度带来的真实问题。

学完后,你应该能理解:

  • 工具调用为什么要在稳定性和体验之间取舍;
  • 多个工具能不能并发调用取决于业务场景;
  • 查询代码时为什么要带行号;
  • 按行更新为什么比整文件替换更适合 AI 编辑;
  • 上下文窗口为什么会限制复杂 Agent;
  • 多 Agent 修改同一代码库时为什么会出现冲突。

回复结束后执行工具

课程里采用的工具执行方式是:等模型回复结束后,再解析工具块并执行工具。

这种方式不是最快的。

更激进的做法是在模型流式输出过程中,一发现完整工具块就立刻执行。

但流式执行更容易出错,因为工具块可能夹在普通文本、推理内容或多个片段之间。

当前课程选择稳定优先:

  • 模型完整回复;
  • 系统解析所有工具块;
  • 匹配工具;
  • 执行工具;
  • 把结果发回模型。

对刚入门的人来说,先把这条稳定链路跑通,比追求极致实时体验更重要。

多工具并发

模型有时会一次性返回多个工具调用。

这些工具能不能并发执行,没有固定答案。

如果工具只是读取信息,例如查询模块信息、读取代码、读取技能,通常可以并发。

如果工具会修改数据,例如执行 SQL、更新代码、保存配置,就要谨慎。

课程里强调要根据场景判断:

  • 读操作可以更开放;
  • 写操作要考虑顺序;
  • 有依赖关系的工具不能乱并发;
  • 容易冲突的工具要限制并发。

这和前端并发请求类似。不是所有 Promise.all 都安全。

查询代码为什么要带行号

AI 要编辑代码,第一步通常是读取代码。

课程里为读取前端代码的工具设计了 showLine、起始行、结束行等参数。

原因是后面要支持按行更新。

如果 AI 读取代码时看不到行号,它就会自己数行。

模型自己数行很容易数错,一旦行号错了,按行替换就会改错位置。

所以工具应该主动把行号提供给模型。

这不是为了人看得舒服,而是为了降低 AI 后续编辑代码的错误率。

按行更新代码

整文件替换看起来简单,但风险很高。

如果每次修改都替换整个文件,会带来几个问题:

  • diff 变得很大;
  • 容易误删无关内容;
  • 模型容易重写不该动的代码;
  • 审查修改成本变高。

按行更新更适合 AI 编辑。

AI 先读取带行号的代码,再指定要替换的起止行,最后只替换局部内容。

这和你在 IDE 里只改几行代码是同一个思路。

换行符细节

读取代码时还要处理不同系统的换行符。

macOS 和 Linux 常见换行是 \n

Windows 常见换行是 \r\n

如果工具没有处理好这些差异,模型看到的行号和实际替换的行号可能会不一致。

这种细节很小,但在 AI 自动编辑代码时会放大成真实错误。

上下文窗口限制

Agent 不是无限聪明。

当代码、技能、工具结果、历史对话都塞进上下文后,上下文会越来越长。

上下文太长会带来几个问题:

  • 模型成本上升;
  • 速度变慢;
  • 容易忽略重要信息;
  • 幻觉概率变高;
  • 复杂任务更容易失败。

所以课程反复强调要通过工具按需读取,不要一次性把所有东西都塞给模型。

多 Agent 的冲突问题

课程还讨论了多 Agent。

多个 Agent 并行开发听起来很强,但问题也很多。

如果多个 Agent 修改同一个文件,就会产生冲突。

如果每个 Agent 修改不同模块,问题会少一些。

更复杂的策略是让每个 Agent 像程序员一样使用 Git:

  • 拉取代码;
  • 在自己的分支修改;
  • 提交变更;
  • 尝试合并;
  • 冲突交给专门的 Agent 或人处理。

但合并冲突的 Agent 需要理解所有业务,否则它也可能合错。

阶段重点

这一节不是让你马上做一个多 Agent 平台。

重点是建立边界感:

工具调用要先求稳,多工具并发要看场景,AI 编辑代码要给足定位信息,多 Agent 协作一定会遇到上下文和冲突问题。

这些问题提前想清楚,后面做真正的 Agent 系统时才不会只停留在概念演示。

AI Agent 课程学习文档。