资讯详情

【AI智能体】Langchain 工具调用实战操作详解

📅 2026/10/12 3:45:31 | 华诺云谱 👁 阅读
【AI智能体】Langchain 工具调用实战操作详解
目录一、前言二、Tools 工具介绍2.1 Tools 是什么2.1.1 Tool 组成结构2.1.2 Tool 的重要性2.2 Tools 有什么作用2.3 Tool 的特点2.4 Tool 使用场景三、工具的调用方式3.1 工具的两种调用3.1.1 直接调用3.1.2 绑定到模型主流调用3.1.3 工具调用完整流程3.2 从Message流转看工具的调用3.3 工具描述的各部分参数详解3.3.1 convert_to_openai_to3.3.2 description 说明3.3.3 参数说明3.3.4 参数类型说明3.3.5 参数默认值3.4 使用tool装饰器定义工具3.4.1 自定义工具描述description3.4.2 添加工具描述description3.4.3 更改工具名称3.5 自定义args_schema3.5.1 pydantic类型的定义3.5.2 限定参数取值范围3.6 使用Json Schema定义四、写在最后一、前言在使用Langchain 进行智能体开发中会涉及到一个非常重要的组件调用就是工具Tool工具作为AI应用与大模型的中间层承载着非常重要的角色可以说搞清楚了Tool在其中的作用对AI智能体调用的完整过程就有了一个深刻全面的理解本篇将详细介绍下Langchain 中的工具使用。二、Tools 工具介绍2.1Tools 是什么LangChain 工具Tool是赋予大模型调用外部能力的标准化接口。大模型本身只能生成文本无法主动联网、查数据库、执行代码。工具就是把这些外部能力封装成 LLM 能理解、能调用的函数让模型从“只会说”变成“能动手做”。2.1.1 Tool 组成结构一个工具通常包含三部分名称name唯一标识描述descriptionLLM 据此判断何时调用最关键功能function实际执行的代码逻辑工具包Toolkit则是一组相关工具的集合比如SQLDatabaseToolkit把列表、查结构、执行查询等工具打包在一起。2.1.2 Tool 的重要性要构建更强大的AI工程应用只有生成文本这样的“ 纸上谈兵 ”能力自然是不够的。工具是赋予大语言模型 与外部世界交互能力 的关键组件从而能让智能体执行搜索、计算、数据库查询、邮件发送或调用第三方API等进而构建功能强大的AI应用。借助工具大模型才能从“ 认识世界 ”走向“ 改变世界 ”。从图中可以看到工具是构建智能体的核心要素之一具有非常重要的地位2.2Tools 有什么作用Tool的核心作用是扩展大模型的能力边界具体包括突破知识时效性通过搜索工具获取实时信息弥补训练数据截止的局限。突破能力限制通过计算器、代码执行工具完成精确计算和复杂逻辑。连接私有数据通过数据库、文件系统工具访问企业或个人私有数据。对接外部系统通过 API 工具调用第三方服务完成真实业务操作。让 Agent 自主决策工具是 Agent 的“手脚”Agent 根据任务自主选择并调用合适的工具。2.3 Tool 的特点Tool 主要有如下特点描述驱动LLM 完全依赖工具的description来决定是否调用、如何调用描述写得越清楚调用越准确。标准化接口所有工具都遵循统一调用方式如.invoke()便于组合和替换。可自定义用tool装饰器就能把普通 Python 函数变成工具扩展成本低。可组合多个工具可同时提供给 Agent由 Agent 按需调度。安全可控工具的执行逻辑由开发者定义可以对输入输出做校验和限制。2.4 Tool 使用场景场景典型工具解决的问题实时信息查询DuckDuckGo、SerpAPI获取最新新闻、股价、天气知识问答WikipediaQueryRun补充百科类知识数据分析/计算PythonREPLTool精确计算、数据处理数据库交互SQLDatabaseToolkit自然语言查数据库文件操作FileManagementToolkit读写、管理本地文件业务系统对接OpenAPIToolkit按规范调用 REST API多工具协作Agent 多工具复杂任务自动拆解执行一句话总结LangChain 工具是让大模型“能做事”的桥梁通过标准化封装和描述驱动机制使 LLM 能自主调用外部能力适用于一切需要模型与真实世界交互的场景。三、工具的调用方式在LangChain中工具Tools实际上是指明确定义了输入和输出的 可调用函数 。因此 工具调用(Tool Calling) 也被称为 函数调用(Function Calling) 。具体来说主要有2种调用方式下面分别介绍。3.1 工具的两种调用3.1.1 直接调用直接调用这种方式适合测试时使用下面是一个基础的工具调用案例代码from langchain_core.tools import Tool, tool tool def get_weather(city: str) - str: 获取指定城市的天气信息 参数: city: 城市名称如北京、上海 返回: 天气信息字符串 # 你的实现 return city 晴天温度 15°C # 使用 .invoke() 方法 result get_weather.invoke({city: 北京}) print(result)运行一下效果如下3.1.2绑定到模型主流调用这种方式让AI来调用开发中使用最多的方式from dotenv import load_dotenv import os from langchain_openrouter import ChatOpenRouter # 1、加载配置文件 load_dotenv(overrideTrue) OPENROUTER_API_KEY os.getenv (OPENROUTER_API_KEY) OPENROUTER_API_BASE os.getenv (OPENROUTER_API_BASE) # 2、模型初始化 model ChatOpenRouter( modeldeepseek/deepseek-v3.2, api_keyOPENROUTER_API_KEY, base_urlOPENROUTER_API_BASE, ) from langchain_core.tools import tool # 定义工具 tool def get_weather(city: str) - str: 获取指定城市的天气 # 你的实现 return 晴天温度 15°C # 绑定工具 model_with_tools model.bind_tools([get_weather]) # AI 可以决定是否调用工具 response model_with_tools.invoke(北京天气如何) # response model_with_tools.invoke(2 3 ) # 检查 AI 是否要调用工具 if response.tool_calls: print(AI 想调用工具, response.tool_calls) else: print(AI 直接回答, response.content)调用一下看到下面的效果在真实的业务场景下可能会在tool的方法内部对接外部厂商的API 以获取天气为例就可以拿到真实的天气信息数据3.1.3 工具调用完整流程大模型能根据对话上下文决定何时调用工具以及传递哪些参数。上面编写的LangChain应用正好对应图中的AI助手或应用经典流程如下3.2从Message流转看工具的调用接下来深入了解一下工具内部在代码中是怎么调用的前提代码中配置模型初始化from dotenv import load_dotenv from langchain.messages import HumanMessage, ToolMessage import os from langchain_openrouter import ChatOpenRouter # 1、加载配置文件 load_dotenv(overrideTrue) OPENROUTER_API_KEY os.getenv (OPENROUTER_API_KEY) OPENROUTER_API_BASE os.getenv (OPENROUTER_API_BASE) # 2、模型初始化 model ChatOpenRouter( modeldeepseek/deepseek-v3.2, api_keyOPENROUTER_API_KEY, base_urlOPENROUTER_API_BASE, )1、不使用tool修饰通过定义普通的方法形式使用完整代码如下from dotenv import load_dotenv from langchain.messages import HumanMessage, ToolMessage import os from langchain_openrouter import ChatOpenRouter # 1、加载配置文件 load_dotenv(overrideTrue) OPENROUTER_API_KEY os.getenv (OPENROUTER_API_KEY) OPENROUTER_API_BASE os.getenv (OPENROUTER_API_BASE) # 2、模型初始化 model ChatOpenRouter( modeldeepseek/deepseek-v3.2, api_keyOPENROUTER_API_KEY, base_urlOPENROUTER_API_BASE, ) from langchain_core.tools import tool def get_weather(city: str): 获取天气的工具 return f{city}天气晴朗 # 模型与工具绑定 model_with_tools model.bind_tools([get_weather]) messages [ HumanMessage(今天北京天气如何) ] # 模型生成调用工具请求 response model_with_tools.invoke(messages) # 添加AIMessage messages.append(response) tool_calls response.tool_calls for tool_call in tool_calls: if tool_call[name] get_weather: # 拼接出ToolMessage实例 tool_response ToolMessage( contentget_weather(**tool_call[args]), tool_call_idtool_call[id], nametool_call[name] ) messages.append(tool_response) print( messages ) for msg in messages: msg.pretty_print() print( messages ) final_response model_with_tools.invoke(messages) print(ffinal_response: \n{final_response})上述代码对应的完整调用流程如下图2、使用tool修饰使用tool修饰之后完整的调用代码如下from langchain_core.tools import tool tool def get_weather(city: str): 获取天气的工具 return f{city}天气晴朗 # 模型与工具绑定 model_with_tools model.bind_tools([get_weather]) messages [ HumanMessage(今天北京天气如何) ] # 模型生成调用工具请求 response model_with_tools.invoke(messages) # 添加AIMessage messages.append(response) tool_calls response.tool_calls for tool_call in tool_calls: if tool_call[name] get_weather: tool_response get_weather.invoke(tool_call) print(type(tool_response)) messages.append(tool_response) print( messages ) for msg in messages: msg.pretty_print() print( messages ) final_response model_with_tools.invoke(messages) print(ffinal_response: \n{final_response})说明被 tool 修饰的函数可以调用 invoke 接收模型返回的入参信息执行函数并返回ToolMessage 实例我们不再需要手动拼接 ToolMessage 。工具流程调用总结如果真正要大模型根据工具调用结果进行回复完整的调用流程包括如下四个步骤步骤1模型绑定工具 通过model.bind_tools([...])绑定一个或者多个工具步骤2模型生成工具调用请求 用户输入问题调用模型比如invoke()。如果需要调用工具模型返回包含工具调用信息如工具名称和参数的AIMessage步骤3开发者手动执行工具 用户从响应中提取工具调用信息并手动调用对应的工具比如工具.invoke()步骤4将工具执行结果ToolMessage传递给模型生成最终结果 将之前用户提问内容和手动执行工具结果ToolMessage返回模型模型最终生成回复特别注意大模型调用工具是单次推理直接响应需要开发者手动执行工具并管理循环适合简单、确定的任务。3.3工具描述的各部分参数详解3.3.1convert_to_openai_to在上面的代码中执行 model.bind_tools([get_weather]) 其底层最终会调用 convert_to_openai_tool 生成工具描述。所以可以直接调用后者查看解析后的工具描述。from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city: str): return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))输入结果如下上面的结果字段说明type定义当前数据节点必须是什么数据类型。常见类型有 string, number, integer, boolean, object, array, null。object即是json对象properties用于定义JSON 对象Object中可以包含哪些属性键以及每个属性对应的值类型和说明required当 type为 object时使用是一个数组列出了对象中必须存在的属性名到这里有同学有疑问了为什么不使用tool装饰器修饰的函数也可以理解为工具呢查看 convert_to_openai_tool 底层源码elif isinstance(function, langchain_core.tools.base.BaseTool): oai_function cast(dict, _format_tool_to_openai_function(function)) elif callable(function): oai_function cast( dict, _convert_python_function_to_openai_function(function) )相当于加了tool修饰的函数走上面的分支没有加tool修饰的函数走下面的分支后者会基于函数定义和docstring生成pydantic模式的描述然后转换为规范的tool_schema。3.3.2description 说明convert_to_openai_tool 会从 docstring(文档字符串) 加载工具的描述信息上面的案例中docstring 为空所以抽取的 description 为空。docstring文档字符串使用三个双引号表示开始和结束from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city: str): 天气查询工具 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))再次运行此时在输出结果的描述字段中就可以看到有信息了3.3.3 参数说明convert_to_openai_tool 会从 docstring 加载参数说明这里的 docstring 必须遵循 Google 风格 。Google 风格 docstring 说明styleguide | Style guides for Google-originated open-source projectsGoogle 风格 docstring 示例新建标签页Python docstring 通用约定PEP 257 – Docstring Conventions | peps.python.org基础用法不必完整阅读规范只需要按照下面的示例仿写即可。from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city: str): 天气查询工具 Args: city: 城市名称 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))在输出结果中可以看到参数的详细信息都输出了使用 Args: 、 Returns: 、 Raises: 等关键字这种方式可读性强。Agent通过工具的这些注释来理解工具的用途和调用时机因此清晰、准确的文档字符串是工具能被正确调用的前提。AI 依赖 docstring 来理解工具下面就是一个好的示例tool def search_products(query: str) - str: 在产品数据库中搜索产品 Args: query: 搜索关键词如笔记本电脑、手机 Returns: 产品列表的 JSON 字符串 ...3.3.4参数类型说明参数类型来源于函数的类型注解比如下面的代码from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city): 天气查询工具 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))删除了参数类型注解则工具描述中也不包含参数类型说明注意如果docstring中包含参数说明则对应的参数必须有类型注解否则报错比如下面的代码from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city): 天气查询工具 Args: city: 城市名称 return 天气晴朗 rprint(convert_to_openai_tool(get_weather))运行直接报下面的错误3.3.5 参数默认值如果参数没有默认值则会包含 在required对应的列表 中。反之则参数的描述信息会包含 default 字段并且 不会出现在required列表 中。下面的代码中给入参增加一个默认值from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint def get_weather(city : str 北京): 天气查询工具 Args: city: 城市名称 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))在输出的结果中在default 这里就能看到这个参数默认值了3.4 使用tool装饰器定义工具使用 tool 装饰器修饰可以自动将普通 Python 函数转化为智能体可调用的工具。此方式 最直接 代码量极少非常适合快速验证想法或创建参数简单的工具。3.4.1 自定义工具描述description在下面的代码中方法使用tool 修饰但是没有描述docstring信息运行的时候将会报错from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint from langchain_core.tools import tool tool def get_weather(city): return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))添加上去之后就正常了小结在bind_tools()调用时先将函数封装为 BaseTool 类型的对象再传递给 convert_to_openai_tool 函数生成工具的描述。tool 会从 docstring 生成描述信息同样要求遵循 Google docstring 规范 。如果没有 docstring 则报错如下。Traceback...ValueError: Function must have a docstring if description not provided.3.4.2 添加工具描述descriptiontool 的参数 description 可以更改工具描述优先级高于 docstring 的函数说明from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint from langchain_core.tools import tool tool(description获取具体城市的天气信息) def get_weather(city): 获取城市天气信息 Args: city: 城市名称 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))运行一下可以看到tool后面的描述信息被输出了解析docstringparse_docstring当我们没有向 tool 传递 description 参数时默认情况下 tool 会将 docstring 整体视为 description 通过将 parse_docstring 设置为Truedocstring会被解析填充到相应的字段描述中不使用 tool 装饰器时docstring不合法会被视为普通文本作为 description 但如果使用了 tool 时 docstring 不合法将会抛出异常from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint from langchain_core.tools import tool tool(description获取具体城市的天气信息,parse_docstringTrue) def get_weather(city): 获取城市天气信息 Args: city: 城市名称 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))下面这样被认定为不合法的话会抛出异常3.4.3 更改工具名称默认情况使用函数名作为工具名称但可以向tool 传参 name_or_callable 以更改工具名称如下代码通过name_or_callable 这个参数重新赋值给工具名称注意虽然有这种方式能对工具重命名但在开发中习惯使用函数名作为工具名称不推荐自定义工具名称from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint from langchain_core.tools import tool tool(description获取具体城市的天气信息,name_or_callableweather_tool) def get_weather(city): 获取城市天气信息 Args: city: 城市名称 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))此时工具的名称已经变了3.5自定义args_schema当工具的参数变得复杂需要 枚举值 、 范围限制 或 更复杂的业务逻辑验证 时Pydantic 模型是理想的选择提供强大的类型检查和数据验证。使用Pydantic 的主要优势在于能够精确控制工具参数的格式和验证规则让大模型更准确地理解如何调用工具。3.5.1pydantic类型的定义通过继承核心基类 BaseModel 定义数据模型从而声明字段结构、类型约束、默认值以0及校验规则。from pydantic import BaseModel from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint from langchain_core.tools import tool class WeatherInput(BaseModel): city: str tool(args_schemaWeatherInput) def get_weather(city): 获取城市天气信息 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))WeatherInput 对象中还可以补充更多的信息如下增加描述和默认值class WeatherInput(BaseModel): city: str Field( description具体的城市, default北京 )3.5.2 限定参数取值范围某些情况下为了安全起见对参数的取值范围做限定可以使用 Literal类型限定参数为固定选项Literal 表示字段不能是任意某种类型的值而只能是几个固定字面量之一class WeatherInput(BaseModel): city: str Field( description具体的城市, default北京 ), unit: Literal[celsius, fahrenheit]3.6使用JsonSchema定义在 LangChain 中还可以直接使用 JSON Schema 字典 来定义工具的参数模式。这种方式提供了极大的灵活性。因为工具参数模式可以基于数据库配置或用户输入在 运行时动态生成 所以这种方式特别适合参数结构需要动态生成的场景。如下完整的代码from langchain_core.tools import tool from langchain_core.utils.function_calling import convert_to_openai_tool from rich import print as rprint json_schema { parameters: { properties: { city: {type: string}, unit: {enum: [celsius, fahrenheit], type: string} }, required: [unit], type: object } } tool(args_schemajson_schema) def get_weather(city): 获取城市天气信息 return f{city}天气晴朗 rprint(convert_to_openai_tool(get_weather))运行一下效果与上面的输出效果一致四、写在最后本文详细介绍了Langchain 中工具的调用并通过 案例的方式详细演示了内部的参数使用希望对看到的同学有用本篇到此结束感谢观看。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑