一、核心概念:Tool + invoke 工具调用机制 先理清两个核心关键词,这是 LangChain 工具调用的底层基础:
Tool(工具):LangChain 中工具是对外部能力的封装,通过 @tool 装饰器或 BaseTool 子类定义,包含功能描述和参数约束,供 Agent 调用。 invoke:LangChain Runnable 接口的统一执行方法。AgentExecutor.invoke() 是整个 Agent 执行的入口,内部会驱动模型决策、工具调用、结果返回全流程。 简单总结:工具负责封装能力,invoke 负责驱动执行。
1.1 工具必须的两个标准化描述(核心重点) 大模型无法自动识别工具功能和入参,必须通过两个属性完成工具注册,缺一不可:
docstring:工具功能描述,告诉模型「这个工具能做什么、什么时候调用」。 args_schema:参数结构约束(自动从函数注解生成),规范入参类型、必填项,避免模型输出非法参数。 1.2 工具调用触发逻辑 Agent 基于消息流(message)驱动工具调用:
解析用户提问 + 历史对话消息。 结合工具的 docstring 和 args_schema,自主判断是否调用工具、调用哪个工具、传入什么参数。 工具执行后,结果返回给模型,模型整理成自然语言回复用户。 二、完整实战代码:自定义标准化工具调用 以下为可直接运行的 Python 代码,基于 LangChain 最新稳定版,实现「自定义工具 + 标准化注册 + 模型自动调用 + invoke 执行」全流程。
前置依赖安装 pip install langchain langchain-openai python-dotenv Lobster AI bash 完整业务代码 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}")
- 初始化大模型(支持工具调用) llm = ChatOpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL"), model="gpt-3.5-turbo")
- 自定义标准化工具 通过 @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]
- 构建 Agent 提示词模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专业的工具调用助手,优先使用工具处理用户的数值计算、单位换算问题。"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}") ])
- 创建工具调用 Agent agent = create_tool_calling_agent(llm, tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=False, # 生产环境建议关闭 handle_parsing_errors=True)
- 执行调用(invoke 驱动整个流程) if name == "main": try: res = agent_executor.invoke({"input": "帮我换算100公里等于多少英里"}) print("最终输出结果:", res["output"]) except Exception as e: print(f"调用失败:{e}") Lobster AI python 运行
三、代码核心逻辑解析 3.1 工具标准化原理 通过 @tool 装饰器修饰函数后,LangChain 会自动完成:
函数注释(docstring)自动转为工具描述,供模型理解功能。 函数参数类型注解自动生成 args_schema(基于 Pydantic),约束入参格式。 工具自动适配 LangChain 工具调用协议,可被 create_tool_calling_agent 识别调度。 3.2 invoke 执行机制 代码中 agent_executor.invoke() 是统一执行入口,底层流程:
用户输入 → 模型判断需调用工具 → 按工具 schema 生成结构化参数 → 工具执行(tool.invoke) → 返回结果给模型二次整理 → 输出最终回复 Lobster AI text 3.3 扩展:MCP 协议的补充说明 MCP(Model Context Protocol)是由 Anthropic 推出的开放标准协议,用于大模型与外部工具、数据源之间的标准化通信。LangChain 社区已提供 langchain-mcp-adapters 库,可将 MCP 服务端工具无缝转换为 LangChain 工具。若需使用 MCP 协议,需额外安装 langchain-mcp-adapters,通过 MCPToolkit 连接 MCP Server,其余调用逻辑与本文一致。