📌 核心结论(TL;DR)
-
底层闭环 :大模型不直接执行代码。工具调用的本质是模型返回包含参数的
tool_calls(JSON),开发者本地执行后,将结果包装为ToolMessage再次发给模型。 -
第三方生态 :无需手搓所有工具,LangChain 生态提供了如
TavilySearch等现成的联网搜索工具,直接bind_tools即可突破大模型的知识时间限制。 -
状态追加 :在二次调用模型生成最终答案前,必须 将模型发出的
ai_msg和工具返回的tool_msg追加到messages历史中,否则模型会陷入死循环。
🔍 一、 原理图解与核心概念
1. 工具调用的协作流
-
Human:用户提问
-
AI :返回
tool_calls(发起请求) -
Tool :开发者本地执行函数,生成
ToolMessage(返回结果) -
AI:收到结果,生成最终自然语言答复。
2. 实时数据的破局之道
大模型有训练截止日期,无法获取最新资讯。引入 TavilySearch 工具后,大模型会判断是否需要联网,并自动生成搜索关键词。
💻 二、 精选核心代码片段
1. 工具调用的底层闭环(手动执行)
python
# 基于 test_18_tool_binding.py 的核心逻辑
messages = [HumanMessage("2乘3等于多少?")]
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)
# 手动执行工具
tools_map = {"multiply": multiply, "add": add}
for tool_call in ai_msg.tool_calls:
selected_tool = tools_map[tool_call["name"]]
tool_msg = selected_tool.invoke(tool_call)
messages.append(tool_msg)
final_result = model_with_tools.invoke(messages)
2. 第三方联网搜索工具(Tavily)
python
from langchain_tavily import TavilySearch
tool = TavilySearch(max_results=4)
model_with_tools = model.bind_tools([tool])
messages = [HumanMessage("最近人工智能有什么最新新闻?")]
# 1. 模型决策
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)
# 2. 执行搜索
for tool_call in ai_msg.tool_calls:
tool_message = tool.invoke(tool_call)
messages.append(tool_message)
# 3. 模型总结
print(model_with_tools.invoke(messages).content)


(完整的 test_18 闭环代码与 test_20 搜索实战代码已上传至 Gitee 仓库)
⚠️ 三、 踩坑排查排雷
-
报错
Invalid tool_call_id:二次请求时,忘记将ai_msg和tool_msg放入messages历史中。大模型看不到结果,会反复要求调用。 -
Tavily 网络超时 :Tavily 服务器在海外。排查:请检查网络代理配置,或在代码中设置环境变量。
-
模型不调用搜索工具:如果提问的问题过于简单(如"1+1"),模型会自己回答,不调用搜索。这是正常的模型自主决策。
