通过三个测试用例,逐步追踪 Agent 的 Think → Act → Observe 循环中,messages 与 tool_calls 的数据变化。
构造 messages(system + user)连同 TOOLS 工具列表一起发给 LLM。
LLM 判断需要搜索,返回 tool_calls(注意此时 content 为空)。
代码解析 tool_calls 并真正执行搜索函数,拿到结构化结果。
把工具结果以 role:"tool" 的形式追加回 messages,让 LLM "看到" 观察结果。
带着工具结果再次调用 LLM,这次生成最终自然语言回复。
同用例 A 开头:构造 messages(system + user)连同 TOOLS 发给 LLM。
LLM 决定调用计算工具,把自然语言转成结构化表达式。
代码执行计算函数,返回精确数字结果。
计算结果追加进 messages,供下一轮 LLM 读取。
LLM 基于工具结果组织最终回复。
构造 messages 发给 LLM(TOOLS 依然携带,由 LLM 自行判断用不用)。
LLM 判断无需工具:finish_reason == "stop" 且 content 有值 → 直接 return,循环结束。
核心差异:LLM 是否返回 tool_calls,决定了是否进入 Act/Observe 循环,以及 API 调用次数。
| 对比维度 | 用例 A · 搜索新闻 | 用例 B · 数学计算 | 用例 C · 闲聊 |
|---|---|---|---|
| LLM 判断 | 需要 web_search | 需要 calculate | 无需工具,直接回答 |
| 走了几步 | 5 步(Think×2 → Act → Observe → 二轮LLM) | 5 步(Think×2 → Act → Observe → 二轮LLM) | 2 步(Think → 直接 return) |
| 工具执行 | web_search(query="OpenAI最新新闻") |
calculate(expression="15*37") |
无 |
| API 调用次数 | 2 次(决策 + 总结) | 2 次(决策 + 总结) | 1 次 |
| 关键代码行 | messages.append({role:"tool", content:JSON结果}) |
messages.append({role:"tool", content:"555"}) |
if finish_reason=="stop": return content |
← 左右滑动查看完整表格 →