热闻岛
LangChain Tool Calling 原理:模型是怎么决定调用哪个工具的?
AI新闻

LangChain Tool Calling 原理:模型是怎么决定调用哪个工具的?

2026年6月14日 13:4014 阅读
一、模型不会真的调用工具 很多人第一次看 Tool Calling,会以为模型自己会查数据库、调接口、执行函数。错。模型没有直接执行你代码的权限。它能做的,是看懂你给它的工具说明,然后输出一段结构化数据。 这段结构化数据就是 tool_ca

一、模型不会真的调用工具

很多人第一次看 Tool Calling,会以为模型自己会查数据库、调接口、执行函数。错。模型没有直接执行你代码的权限。它能做的,是看懂你给它的工具说明,然后输出一段结构化数据。

这段结构化数据就是 tool_calls。它通常包含工具名、参数、调用 id。程序拿到它,再决定是否执行、怎么执行、是否拦截、是否需要人工确认。

二、模型为什么知道该调用哪个工具?

因为你把工具说明给了模型。这个说明不是一句随便写的注释,而是一份 Schema。它会告诉模型三个关键点:这个工具叫什么、什么时候该用、需要哪些参数。

LangChain 官方也明确说明:工具本质上是带有清晰输入输出的可调用函数,传给 Chat Model 后,模型会根据对话上下文决定是否调用工具,以及提供什么参数。

所以,工具调用的准确率,很大一部分不在模型,而在你的工具设计。工具名模糊,描述空泛,参数没有说明,模型就会乱选。

三、bind_tools 到底做了什么?

上一章我们讲了工具定义。这一章看更关键的一步:bind_tools。

bind_tools 的作用不是执行工具,而是把工具“挂”到模型调用上。也就是告诉模型:这轮对话里,你可以使用这些工具。

不同模型供应商要求的工具格式不一样。OpenAI、Anthropic、Gemini 的底层协议各有差异。LangChain 的价值,就是把 Python 函数、Pydantic 类、LangChain Tool、字典 Schema 统一转换成模型供应商能接受的工具描述。

# 你写的是 Python 函数

@tool

def get_weather(location: str) -> str:

"""Get the weather at a location."""

return f"It's sunny in {location}."

# LangChain 把工具绑定给模型

model_with_tools = model.bind_tools([get_weather])

# 注意:这一步只是“让模型知道工具存在”

# 工具不会在 bind_tools 这里执行

四、bind_tools:标准接口 + Provider 实现

源码上要分两层看。

第一层:BaseChatModel.bind_tools 定义统一接口。不是所有模型都天然支持工具调用。基础类里通常只是声明能力。

第二层:具体 Provider 实现,比如 ChatOpenAI.bind_tools。它会把工具转换成 OpenAI 能识别的 schema,再通过 bind(...) 挂到模型参数里。

第三层:模型调用时,messages 和 tools 一起发给模型,模型再决定是否返回 tool_calls。

# 源码思想压缩版,不是逐字源码

class BaseChatModel:

def bind_tools(self, tools, *, tool_choice=None, **kwargs):

raise NotImplementedError

class ChatOpenAI(BaseChatModel):

def bind_tools(self, tools, *, tool_choice=None, strict=None,

parallel_tool_calls=None, **kwargs):

formatted_tools = [

convert_to_openai_tool(tool, strict=strict)

for tool in tools

]

return self.bind(

tools=formatted_tools,

tool_choice=tool_choice,

parallel_tool_calls=parallel_tool_calls,

**kwargs

)

这段逻辑很重要:LangChain 不会神奇地让任意模型都具备工具调用能力。模型本身要支持工具调用,Provider 包也要实现 bind_tools。否则可能出现 NotImplementedError,或者模型明明收到了描述却不返回 tool_calls。

五、模型返回的 tool_calls 长什么样?

模型如果判断需要调用工具,它通常不会直接给最终答案,而是返回一个 AIMessage。这个 AIMessage 里面会带 tool_calls。

LangChain 把不同供应商的工具调用结果统一成标准结构:name、args、id、type。这样你不用为每个模型写一套解析逻辑。

# 模型返回的标准化调用意图

ai_msg.tool_calls

[

{

"name": "get_weather",

"args": {"location": "Boston"},

"id": "call_123",

"type": "tool_call"

}

]

看到这里要记住一句话:tool_calls 不是执行结果,它只是执行请求。真正执行还在下一步。

六、没有 Agent 时,工具调用需要你手动跑循环

如果你只是 model.bind_tools(...),没有使用 Agent,那么模型只会把调用意图返回给你。你需要自己根据 tool_calls 找到工具、执行工具、创建 ToolMessage、再次调用模型。

messages = [{"role": "user", "content": "Boston 天气怎么样?"}]

# 1. 模型生成工具调用意图

ai_msg = model_with_tools.invoke(messages)

messages.append(ai_msg)

# 2. 程序执行工具

for tool_call in ai_msg.tool_calls:

tool_result = get_weather.invoke(tool_call)

messages.append(tool_result)

# 3. 把工具结果交回模型,生成最终答案

final_response = model_with_tools.invoke(messages)

这里最容易出错的是 ToolMessage。ToolMessage 必须带上 tool_call_id,而且要和 AIMessage.tool_calls 里的 id 对上。否则模型不知道这条结果对应哪次调用。

七、Agent 做了什么?它替你跑这个循环

Agent 的本质,就是“模型 + 工具 + 循环控制器”。

普通 bind_tools 只负责让模型会返回 tool_calls。Agent 会进一步处理:调用模型、发现 tool_calls、执行工具、追加 ToolMessage、再次调用模型,直到模型输出最终答案,或者达到迭代上限。

Agent 的底层逻辑
Agent 不是魔法。它只是把手动工具执行环封装起来,并加上中间件、状态、异常处理、终止条件。

官方文档也把 Agent 描述为模型调用工具的循环,直到任务完成;create_agent 则是一个可配置的 harness,负责把模型、工具、Prompt 和中间件组织在一起。

八、tool_choice、strict、parallel_tool_calls:控制模型怎么用工具

模型默认会自己判断是否调用工具。但在生产环境里,有时不能完全放开。比如订单查询必须查接口;高危操作不能让模型随便执行;多个工具有顺序依赖,不能并行乱跑。

这些控制参数不是所有模型都完全一致支持。OpenAI、Anthropic、Gemini、国产模型、开源模型的工具调用能力和参数语义可能不同。上生产前必须做兼容性测试。

九、源码深挖:ToolCall、ToolMessage、invalid_tool_calls

LangChain 里,ToolCall 是模型发出的调用请求。它至少要有 name、args、id。id 的意义很大:它用来把工具请求和工具结果绑定起来。

ToolMessage 是工具执行后的结果。模型第二次调用时,会读取 ToolMessage,并结合原始问题生成最终回答。

invalid_tool_calls 用来承接解析失败或格式不合法的工具调用。比如模型输出的参数不是合法 JSON,或者字段结构不符合预期,就可能被放到这里。

# ToolCall 思想压缩版

class ToolCall(TypedDict):

name: str # 要调用哪个工具

args: dict[str, Any] # 参数

id: str | None # 调用 id,用于匹配结果

# ToolMessage 的关键字段

ToolMessage(

content="工具执行结果",

tool_call_id="call_123"

)

从工程角度看,invalid_tool_calls 不是无关紧要的字段。它应该进入日志和告警。因为它往往意味着模型能力、Schema 描述、参数约束或者模型供应商解析逻辑出了问题。

十、为什么模型会选错工具?

工具选错,通常不是一个原因。更常见的是多个小问题叠加。

最常见的问题是工具太多、工具名太像、描述不清、参数字段太抽象。模型不是读你的源码,它只看你暴露出去的 schema。所以 schema 写得烂,模型选择就会烂。

另一个问题是:模型返回 tool_calls 后,程序没有做强校验,直接执行。这在 Demo 里没事,在真实业务里很危险。

十一、企业级落地:工具不能裸奔

生产环境里,Tool Calling 不能只是 LangChain 代码。它必须纳入业务治理。

工具白名单:只有允许暴露的工具,才能进入模型上下文。

参数校验:模型填的参数必须通过 Pydantic / JSON Schema / 业务规则校验。

权限控制:用户没有权限,就算模型选了工具也不能执行。

风险分级:查询类工具可以自动执行,修改类工具要人工确认。

审计日志:记录 tool name、args、result、耗时、requestId、userId。

异常兜底:工具失败后,模型不能胡编结果,要明确说明失败。

十二、Java + Python 架构里应该怎么落地?

如果你的主系统是 Java,AI 服务是 Python,我建议这样拆:

Java 主服务负责用户、权限、订单、资金、审计、幂等、风控。

Python AI 服务负责 Prompt、模型调用、工具 Schema、Agent 编排。

工具执行不要全部放在 Python 里。高价值业务工具应该回调 Java 接口,由 Java 做权限和业务校验。

Python 只拿到“可调用工具列表”和“安全调用入口”,不要绕过业务系统直接改数据库。

所有 tool_calls 都要落日志,方便复盘模型为什么选这个工具。

推荐边界
Python AI 服务负责“智能决策”。Java 业务服务负责“确定性执行”。不要让模型直接碰核心业务数据。

十三、总结

Tool Calling 让大模型从聊天机器人变成了业务系统的调度入口。它可以查数据库、调 API、跑计算、走搜索、生成工单。

但能力越大,风险越大。

真正靠谱的 Tool Calling,不是把一堆函数塞给模型。真正靠谱的是:工具少而准,Schema 清楚,权限明确,执行可控,日志可追。

大模型负责判断“要不要调用”。LangChain 负责把调用标准化。业务系统负责执行和兜底。三者边界清楚,Agent 才能上线。

相关推荐

PyTorch之Tensor 内存机制:为什么 contiguous 很重要
AI新闻

PyTorch之Tensor 内存机制:为什么 contiguous 很重要

这一章,专门解决一个 PyTorch 初学者最容易踩的坑:为什么明明只是改个形状,view() 却突然报错?为什么 transpose 之后,模型好像变慢了?为什么加一个 contiguous(),代码又能跑了? 答案不在表面形状里,而在

314 分钟前
Anthropic最强AI连夜“猝死”:亚马逊报告、白宫施压、90分钟期限
AI新闻

Anthropic最强AI连夜“猝死”:亚马逊报告、白宫施压、90分钟期限

Fable 5刚刚开放没几天,就被一纸出口管制令按下暂停键。看起来是模型安全事故,往深处看,是美国前沿AI第一次把“模型访问权”推到了国家安全和商业战争的交叉口。 这场风暴有三个关键词:亚马逊报告、白宫施压、Anthropic反击。它让所有

941 分钟前
LangChain 系列之Tools:让大模型真正连接业务系统
AI新闻

LangChain 系列之Tools:让大模型真正连接业务系统

前面几章,我们把 RAG 的底层链路讲完了:文档进来,切分,向量化,入库,检索,重排,最后把上下文交给模型。 但这还不够。 RAG 让模型会“查资料”。Tools 让模型能“办事情”。 没有 Tools,大模型只是一个会聊天的脑子。它能分析

163 小时前
LangChain 系列:从 0 搭一个企业知识库问答系统
AI新闻

LangChain 系列:从 0 搭一个企业知识库问答系统

这一章不再单讲一个组件,而是把前面所有 RAG 组件合起来:从文件上传,到向量入库,再到用户提问、检索证据、模型回答、日志追踪。 01 先搞清楚:企业知识库问答不是 Demo Demo 只要能回答。企业系统要能上传、能解析、能检索、能引用、

114 小时前
Tensor:PyTorch 世界里的一切都是张量
AI新闻

Tensor:PyTorch 世界里的一切都是张量

1. Tensor 是 PyTorch 的基本单位 PyTorch 里,模型吃进去的是 Tensor,参数保存的是 Tensor,梯度也是 Tensor,GPU 上跑的还是 Tensor。 你可以把 Tensor 理解成“加强版数组”。但这

84 小时前
Rerank 与上下文压缩:为什么召回 TopK 后还要重排?
AI新闻

Rerank 与上下文压缩:为什么召回 TopK 后还要重排?

RAG 最容易踩的坑,不是“没有召回”。 而是召回了一堆看起来相关、实际会干扰模型的资料。 所以,成熟的 RAG 链路不会把 TopK 直接塞进 Prompt。 它会先召回,再重排,再压缩。 1. 为什么召回 TopK 后还要重排? 向量召

105 小时前

阅读补充

一句话看懂

一、模型不会真的调用工具 很多人第一次看 Tool Calling,会以为模型自己会查数据库、调接口、执行函数。错。模型

事件背景

这篇内容围绕“LangChain”展开,热闻岛基于公开信息整理事件背景、主要进展与可继续关注的方向。

事件时间线

发布

相关信息进入公开传播

更新

热闻岛对内容进行整理与补充。

看点

  • · LangChain的最新进展是什么
  • · 相关信息对用户或行业会带来哪些影响
  • · 后续是否会有新的回应或处理结果

后续关注

  • · 后续官方回应或权威通报
  • · 相关主体的进一步说明
  • · 事件对普通用户和平台传播的持续影响

免责声明:本文仅代表作者观点,不构成投资建议、法律建议、医疗建议。财经类内容尤其需要注意风险;爆料类信息请以权威通报为准。

评论 (0)

登录后即可发表评论

去登录
暂无评论,快来抢沙发