AI AGENT · DATA FLOW TRACING

AI Agent 数据流追踪

通过三个测试用例,逐步追踪 Agent 的 Think → Act → Observe 循环中,messages 与 tool_calls 的数据变化。

Think 思考 Act 执行 Observe 观察 Decide 决策
用例 A

"OpenAI最近有什么新闻?"

🔎 需要工具:web_search
1THINK

构造 messages(system + user)连同 TOOLS 工具列表一起发给 LLM。

# 发给 LLM 的请求体 { "messages": [ {"role": "system", "content": "你是一个AI助手..."}, {"role": "user", "content": "OpenAI最近有什么新闻?"} ], "tools": TOOLS # [web_search, calculate, ...] }
2THINK

LLM 判断需要搜索,返回 tool_calls(注意此时 content 为空)。

# LLM 响应 { "tool_calls": [{ "name": "web_search", "arguments": '{"query":"OpenAI最新新闻"}' }], "finish_reason": "tool_calls" }
3ACT

代码解析 tool_calls 并真正执行搜索函数,拿到结构化结果。

# 代码执行 result = web_search(query="OpenAI最新新闻") # result = [ {"title": "OpenAI完成100亿美元融资", ...}, {"title": "OpenAI发布GPT-5", ...} ]
4OBSERVE

把工具结果以 role:"tool" 的形式追加回 messages,让 LLM "看到" 观察结果。

# messages 追加 messages.append({ "role": "tool", "content": '[{"title":"OpenAI完成100亿美元融资"...}, {"title":"OpenAI发布GPT-5"...}]' # JSON结果 })
5DECIDE · 第二轮 LLM

带着工具结果再次调用 LLM,这次生成最终自然语言回复。

{ "content": "根据搜索结果,OpenAI最近完成100亿美元融资...", "finish_reason": "stop" }
用例 B

"15乘以37等于多少?"

🧮 需要工具:calculate
1THINK

同用例 A 开头:构造 messages(system + user)连同 TOOLS 发给 LLM。

{ "messages": [ {"role": "system", "content": "你是一个AI助手..."}, {"role": "user", "content": "15乘以37等于多少?"} ], "tools": TOOLS }
2THINK

LLM 决定调用计算工具,把自然语言转成结构化表达式。

{ "tool_calls": [{ "name": "calculate", "arguments": '{"expression":"15*37"}' }] }
3ACT

代码执行计算函数,返回精确数字结果。

result = calculate(expression="15*37") # result = 555
4OBSERVE

计算结果追加进 messages,供下一轮 LLM 读取。

messages.append({ "role": "tool", "content": "555" })
5DECIDE · 第二轮 LLM

LLM 基于工具结果组织最终回复。

{ "content": "15乘以37等于555", "finish_reason": "stop" }
用例 C

"你好,你是谁?"

💬 不需要工具
1THINK

构造 messages 发给 LLM(TOOLS 依然携带,由 LLM 自行判断用不用)。

{ "messages": [ {"role": "system", "content": "你是一个AI助手..."}, {"role": "user", "content": "你好,你是谁?"} ] }
2DECIDE · 直接回答 跳过 Act 和 Observe

LLM 判断无需工具:finish_reason == "stop" 且 content 有值 → 直接 return,循环结束。

# LLM 响应 { "content": "你好!我是一个AI助手...", "finish_reason": "stop" } # 关键分支判断 if finish_reason == "stop" and content: return content # ← 不进入 Act / Observe

📊 三个用例对比

核心差异: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

← 左右滑动查看完整表格 →