实战指南)
纲要Tool Call 的基本概念工具调用的工作流程支持 Tool Call 的模型在 LangChain 中定义工具使用tool装饰器继承BaseTool类绑定工具到模型执行工具调用与结果回传完整可运行代码示例总结Tool Call 是什么Tool Call工具调用是指大语言模型在推理过程中不是直接生成文本答案而是生成一个结构化的指令告诉外部系统“调用哪个工具、传什么参数”。这使模型能够突破训练数据的时间限制、获得实时信息、执行精确计算真正成为 AI Agent 的“大脑”。常见的应用场景包括调用天气 API、执行数学运算、查询数据库、操作文件、控制 IoT 设备等。可以说没有 Tool Call 就没有真正能够行动的智能体。Tool Call 的工作流程一次标准的工具调用交互包含以下步骤下图清晰展示了整个过程ToolExecutorModelUserToolExecutorModelUser用户提问如“北京今天天气怎么样”返回 AIMessage 含 tool_calls调用 get_weather(北京)返回天气数据将结果作为 ToolMessage 传回综合工具结果生成回答注意模型本身并不执行工具函数它只负责生成调用指令。开发者需要在代码中解析这些指令实际运行对应的函数再将结果返回给模型进行下一轮推理。支持 Tool Call 的模型并非所有大模型都具备工具调用能力。以下是一些已验证支持的模型OpenAI: GPT-4、GPT-3.5-turboAnthropic: Claude 3 系列Google: Gemini 系列部分本地部署模型如通过 Ollama 运行的特定版本使用前务必查阅对应厂商文档确认模型是否开放 Tool Call 功能。定义工具LangChain 提供两种定义工具的方式可根据复杂度选择。使用tool装饰器这是最简洁的方式只需在函数上添加装饰器并写好文档字符串作为工具描述fromlangchain_core.toolsimporttooltooldefmultiply(a:int,b:int)-int:将两个整数相乘returna*btooldefadd(a:int,b:int)-int:将两个整数相加returnab继承BaseTool类当需要更精细地控制参数 Schema 时可通过子类化实现fromlangchain_core.toolsimportBaseToolfrompydanticimportBaseModel,FieldclassMultiplyInput(BaseModel):a:intField(description第一个乘数)b:intField(description第二个乘数)classMultiplyTool(BaseTool):namemultiplydescription将两个整数相乘args_schemaMultiplyInputdef_run(self,a:int,b:int)-int:returna*b两种方式定义的工具有着相同的元数据结构绑定到模型时完全等价。绑定工具到模型定义好工具后使用bind_tools方法将它们注入模型fromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-3.5-turbo,temperature0)llm_with_toolsllm.bind_tools([multiply,add])此后调用llm_with_tools.invoke()时模型会自动判断是否需要调用工具并在生成的AIMessage中填充tool_calls字段。执行调用并回传结果当收到的AIMessage包含tool_calls时开发者需要依次执行对应的工具并将结果构造为ToolMessage对象连同原始对话历史再次发送给模型。下面是一个完整的可运行示例演示了从提问到最终答案的全过程。完整可运行代码首先安装依赖pipinstalllangchain-openai langchain-core确保已经设置环境变量OPENAI_API_KEY。importosfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessage,AIMessage,ToolMessage# 定义工具tooldefmultiply(a:int,b:int)-int:计算两个整数的乘积returna*btooldefadd(a:int,b:int)-int:计算两个整数的和returnab# 初始化模型并绑定工具llmChatOpenAI(modelgpt-3.5-turbo,temperature0,api_keyos.getenv(OPENAI_API_KEY))llm_with_toolsllm.bind_tools([multiply,add])# 用户输入user_question3乘以12再加上5的结果是多少print(f用户:{user_question})# 第一次调用模型决定是否调用工具responsellm_with_tools.invoke([HumanMessage(contentuser_question)])ifresponse.tool_calls:print(模型请求的工具调用)fortcinresponse.tool_calls:print(f{tc[name]}({tc[args]}))# 执行工具调用tool_messages[]fortcinresponse.tool_calls:iftc[name]multiply:resultmultiply.invoke(tc[args])eliftc[name]add:resultadd.invoke(tc[args])else:result未知工具print(f工具返回:{result})tool_messages.append(ToolMessage(contentstr(result),tool_call_idtc[id]))# 第二次调用传入工具结果获取最终答案final_answerllm_with_tools.invoke([HumanMessage(contentuser_question)][response]tool_messages)print(f助手:{final_answer.content})else:print(f助手直接回答:{response.content})运行该程序将输出类似用户: 3乘以12再加上5的结果是多少 模型请求的工具调用 multiply({a: 3, b: 12}) add({a: 36, b: 5}) 工具返回: 36 工具返回: 41 助手: 3乘以12等于36再加上5等于41。关键点说明模型自动将自然语言问题拆解为两步数学运算。工具的执行由开发者代码完成ToolMessage必须携带正确的tool_call_id以关联请求。最终答案由模型综合工具结果生成语言自然、结果准确。总结Tool Call 是 AI Agent 的灵魂它让模型从“能说”进化到“能做”。LangChain 提供了极其便利的工具定义与绑定方式推荐使用tool装饰器。完整的交互模式是模型生成 ToolCall → 开发者执行 → 结果回传 → 模型整合输出。在实际项目中工具的描述应清晰准确这会直接影响模型的调用决策质量。