LangChain 工具调用实战:规范定义、调用流程与完整代码示例
2026/9/6 5:48:33 网站建设 项目流程

一、核心概念:Tool + invoke 工具调用机制

先理清两个核心关键词,这是 LangChain 工具调用的底层基础:

  • Tool(工具):LangChain 中工具是对外部能力的封装,通过@tool装饰器或BaseTool子类定义,包含功能描述和参数约束,供 Agent 调用。
  • invoke:LangChain Runnable 接口的统一执行方法。AgentExecutor.invoke()是整个 Agent 执行的入口,内部会驱动模型决策、工具调用、结果返回全流程。

简单总结:工具负责封装能力,invoke 负责驱动执行。

1.1 工具必须的两个标准化描述(核心重点)

大模型无法自动识别工具功能和入参,必须通过两个属性完成工具注册,缺一不可:

  • docstring:工具功能描述,告诉模型「这个工具能做什么、什么时候调用」。
  • args_schema:参数结构约束(自动从函数注解生成),规范入参类型、必填项,避免模型输出非法参数。

1.2 工具调用触发逻辑

Agent 基于消息流(message)驱动工具调用:

  1. 解析用户提问 + 历史对话消息。
  2. 结合工具的 docstring 和 args_schema,自主判断是否调用工具、调用哪个工具、传入什么参数。
  3. 工具执行后,结果返回给模型,模型整理成自然语言回复用户。

二、完整实战代码:自定义标准化工具调用

以下为可直接运行的 Python 代码,基于 LangChain 最新稳定版,实现「自定义工具 + 标准化注册 + 模型自动调用 + invoke 执行」全流程。

前置依赖安装

pip install langchain langchain-openai python-dotenv

完整业务代码

from dotenv import load_dotenv import os from langchain_openai import ChatOpenAI from langchain.tools import tool from langchain.agents import create_tool_calling_agent, AgentExecutor from langchain_core.prompts import ChatPromptTemplate 加载环境变量 load_dotenv() 检查关键环境变量 required_vars = ["OPENAI_API_KEY", "OPENAI_BASE_URL"] for var in required_vars: if not os.getenv(var): raise ValueError(f"请设置环境变量 {var}") 1. 初始化大模型(支持工具调用) llm = ChatOpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL"), model="gpt-3.5-turbo") 2. 自定义标准化工具 通过 @tool 装饰器,docstring + 参数类型注解自动生成 args_schema @tool def calculate_distance(km: float) -> str: """ 公里转英里工具,用于距离单位换算。 当用户需要将公里转换为英里时使用。 Args: km: 公里数值,浮点类型,必填 Returns: 换算后的英里结果字符串 """ mile = km * 0.621371 return f"{km} 公里 = {round(mile, 2)} 英里" 注册工具列表 tools = [calculate_distance] 3. 构建 Agent 提示词模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专业的工具调用助手,优先使用工具处理用户的数值计算、单位换算问题。"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}") ]) 4. 创建工具调用 Agent agent = create_tool_calling_agent(llm, tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=False, # 生产环境建议关闭 handle_parsing_errors=True) 5. 执行调用(invoke 驱动整个流程) if name == "main": try: res = agent_executor.invoke({"input": "帮我换算100公里等于多少英里"}) print("最终输出结果:", res["output"]) except Exception as e: print(f"调用失败:{e}")

三、代码核心逻辑解析

3.1 工具标准化原理

通过@tool装饰器修饰函数后,LangChain 会自动完成:

  • 函数注释(docstring)自动转为工具描述,供模型理解功能。
  • 函数参数类型注解自动生成 args_schema(基于 Pydantic),约束入参格式。
  • 工具自动适配 LangChain 工具调用协议,可被create_tool_calling_agent识别调度。

3.2 invoke 执行机制

代码中agent_executor.invoke()是统一执行入口,底层流程:

用户输入 → 模型判断需调用工具 → 按工具 schema 生成结构化参数 → 工具执行(tool.invoke) → 返回结果给模型二次整理 → 输出最终回复

3.3 扩展:MCP 协议的补充说明

MCP(Model Context Protocol)是由 Anthropic 推出的开放标准协议,用于大模型与外部工具、数据源之间的标准化通信。LangChain 社区已提供 langchain-mcp-adapters 库,可将 MCP 服务端工具无缝转换为 LangChain 工具。若需使用 MCP 协议,需额外安装 langchain-mcp-adapters,通过 MCPToolkit 连接 MCP Server,其余调用逻辑与本文一致。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询