返回 AI编程

一次 AI 编程请求背后,可能发生了多少轮模型调用?

一次 AI 编程请求背后,可能发生了多少轮模型调用?

你在 AI 编程工具里输入一句:

帮我分析这个项目有没有架构问题,并给出修改建议。

屏幕上看起来像是一次对话。

你提问。
AI 思考。
AI 回复。

但如果你打开底层日志,会发现事情没有这么简单。

一次“回复”背后,可能发生了多轮模型调用、多次工具执行、多次上下文重组。

用户看到的是一段自然语言。
系统内部跑的是一个任务执行循环。

这篇文章,我们就把这件事拆开。


一、用户眼里的一次请求,不等于底层的一次模型调用

普通聊天产品里,我们容易形成一个直觉:

用户发一条消息
模型回一条消息

但 AI 编程工具不是普通聊天。

因为它需要读文件、搜索代码、执行命令、修改文件、运行测试。

模型自己不能直接读取你的项目,也不能直接执行命令。它必须通过工具。

于是一次用户请求,可能变成这样的链路:

用户消息
  ↓
模型调用 1:判断需要搜索项目
  ↓
工具调用:搜索文件
  ↓
模型调用 2:根据搜索结果决定读哪些文件
  ↓
工具调用:读取配置和源码
  ↓
模型调用 3:发现还需要看数据库或测试
  ↓
工具调用:继续读取
  ↓
模型调用 4:整理结论并回复用户

所以,“一次请求”只是用户界面的概念。

底层真正发生的是:

模型 → 工具 → 模型 → 工具 → 模型

二、为什么需要多轮?

因为模型一开始不知道答案。

它不知道当前项目有哪些文件,不知道入口在哪里,不知道业务逻辑在哪个 Service,也不知道测试是否通过。

它只能先做一个判断:

为了回答这个问题,我需要先获取哪些信息?

然后它调用工具拿信息。

工具返回以后,模型再基于新信息继续判断。

这和人类工程师很像。

你接手一个陌生项目时,也不会第一秒就知道架构问题在哪里。你可能会先看:

  • 构建文件
  • README
  • 启动入口
  • 路由
  • 核心服务
  • 数据库表
  • 测试
  • 最近改动

看完一部分以后,你才知道下一步该看哪里。

AI 编程工具也是这样。

它的强大,不是一次性知道所有东西,而是能持续发起“下一步探索”。


三、工具调用结果会变成下一轮上下文

这是理解 AI Agent 的关键。

假设模型调用了一个读取文件工具。

工具返回:

src/service/UserService.ts 的内容如下……

这段结果不会只显示给用户,它还会作为下一轮消息放进上下文,再发给模型。

于是模型下一轮就能基于真实文件内容继续推理。

可以理解成:

工具结果 = 模型下一轮思考的材料

如果工具执行失败,失败信息也会进入上下文。

比如:

Edit 失败:old_string 没有匹配到文件内容。

模型下一轮看到这个错误,就可能重新读取文件、调整替换片段、再次调用 Edit。

所以工具调用不是旁路操作,而是对话的一部分。

它会改变后续模型的判断。


四、底层消息长什么样?

不同平台格式不同,但大体会有几类消息:

  • system:系统规则和工具使用规范
  • user:用户输入
  • assistant:模型回复,可能包含工具调用
  • tool_result:工具执行结果
  • summary:压缩后的历史摘要
  • attachment:图片、文件、结构化输出等附加信息

一次内部对话可能类似:

user: 分析项目架构

assistant: 我需要先查看项目结构
assistant tool_use: grep / glob / ls

tool_result: 返回文件列表

assistant: 我需要读取 pom.xml 和启动类
assistant tool_use: read files

tool_result: 返回文件内容

assistant: 我还需要看 Service 和 Mapper
assistant tool_use: read files

tool_result: 返回更多源码

assistant: 根据源码,架构如下……

用户最终看到的,可能只是最后一段总结。

但底层消息已经积累了很多轮。


五、为什么有些日志看不到完整请求?

很多人抓 AI 编程工具日志时会困惑:

我明明看到它分析了代码,为什么请求里没有完整项目内容?

原因可能有几个。

第一,你抓到的是某一轮请求,不是整个任务链路。

AI Agent 底层可能发了多次请求。你只看其中一条,自然看不全。

第二,工具调用和模型请求可能分开记录。

模型请求里有工具定义和工具调用意图,工具执行结果可能在另一条消息里。

第三,有些日志是 UI 视图,不是原始 API body。

它为了方便阅读,可能做了折叠、过滤或重组。

第四,历史可能已经被压缩。

长对话里,早期详细内容可能被总结成 summary,而不是原样保留。

第五,客户端可能只记录 response,不记录完整 request。

尤其是一些代理或查看器,只能抓到一部分链路。

所以想看完整过程,不能只盯着最终回答,要看每一轮模型请求、工具调用、工具结果和压缩边界。


六、一次代码修改请求的内部过程

假设你说:

帮我修复登录接口的空指针问题。

底层可能是这样:

第 1 轮模型调用:
判断需要定位登录接口。

工具调用:
搜索 login、auth、signin。

第 2 轮模型调用:
发现 LoginController,继续读取相关 Service。

工具调用:
读取 LoginController、AuthService、UserRepository。

第 3 轮模型调用:
定位空指针风险,构造修改方案。

工具调用:
Edit 修改 AuthService。

第 4 轮模型调用:
看到 Edit 成功,决定运行测试。

工具调用:
执行 mvn test 或 npm test。

第 5 轮模型调用:
根据测试结果总结修改内容。

用户看到的可能是:

已修复登录接口空指针问题,并通过测试。

但背后实际跑了很多步。


七、为什么模型有时会“自己纠错”?

因为错误也会成为上下文。

比如模型尝试编辑文件,但工具返回:

old_string 未找到。

模型下一轮看到这个结果,就知道:

我之前构造的替换片段不准确,需要重新读取文件。

于是它可能继续调用 Read,再重新 Edit。

再比如运行测试失败:

Expected 200 but got 500

模型下一轮会基于测试错误继续定位问题。

这就是 Agent 的一个核心能力:

行动 → 观察结果 → 修正行动

普通聊天模型只能一次性回答。
编程 Agent 可以在结果反馈中不断调整。


八、多轮调用会带来什么问题?

多轮调用很强,但也有成本。

第一,token 成本更高。

每一轮都要携带上下文。工具结果、文件内容、历史消息都会占 token。

第二,延迟更高。

一次回答可能需要多次模型请求和多次工具执行。

第三,上下文可能变乱。

如果工具结果太多,模型可能抓不住重点。

第四,压缩会带来信息损失。

长对话中,早期详细内容可能被 summary 替代。

第五,错误会被放大。

如果早期读错文件,后续推理可能沿着错误方向继续走。

所以好的 AI 编程工具不仅要会调用工具,还要会管理上下文。


九、如何判断一次回复是否靠谱?

不要只看回答写得是否流畅。

更重要的是看它有没有证据链。

一个靠谱的代码分析回答,通常应该能说清楚:

  • 它看了哪些文件
  • 哪些结论来自源码
  • 哪些只是推断
  • 哪些地方没有验证
  • 修改了哪些文件
  • 有没有运行测试
  • 测试结果是什么

如果它只给出很漂亮的总结,但没有任何文件依据,那就要小心。

因为 AI 编程工具真正的价值,不是语言流畅,而是能够通过工具获得证据。


十、给使用者的建议

如果你想让 AI 的多轮执行更可靠,可以这样提问:

请先定位相关文件,不要直接给结论。每个架构判断都引用文件依据。

如果是修改代码,可以说:

请先读相关文件,说明修改计划,再做最小范围修改,最后运行测试。

如果你想看底层过程,可以要求:

请列出你读取过的关键文件、执行过的命令,以及每一步得到的结论。

如果你担心它绕远,可以加:

优先沿主调用链分析,不要遍历无关文件。

这些提示能让模型的工具调用更聚焦。


结尾

一次 AI 编程请求,表面上是一问一答。

底层其实更像一个循环:

思考 → 调工具 → 观察结果 → 再思考 → 再调工具 → 总结

用户看到的是最终回复。
模型看到的是一段不断增长、不断重组的上下文。
工具负责把外部世界的信息带回来。
客户端负责调度、权限、压缩和结果回传。

所以,理解 AI 编程工具,不能只看“模型说了什么”。

更要看:

它调用了什么工具?
工具返回了什么?
这些结果如何进入下一轮上下文?
最终回答依据是什么?

这才是一次 AI 编程请求背后的真实过程。