1. Tool 的定义方式
LangChain 通过 @tool 装饰器将普通 Python 函数转化为 LLM 可调用的工具。装饰器自动提取函数的 docstring 作为工具描述,利用类型注解定义参数 schema,LLM 通过阅读工具描述来决定是否以及如何调用该工具:
from langchain_core.tools import tool
@tool
def get_weather(city: str, date: str = "today") -> str:
"""获取指定城市和日期的天气信息"""
...
2. 工具调用的执行流程
- LLM 在推理阶段分析用户请求和工具描述,决定是否需要调用工具以及调用哪个工具
- LLM 输出包含工具名称和参数的结构化消息(tool_calls)
- AgentExecutor 解析 tool_calls,找到对应的 Python 函数并传入参数执行
- 工具执行结果封装为 ToolMessage,回传给 LLM 作为下一轮推理的输入
- LLM 根据工具返回结果生成最终回答或继续调用其他工具
3. 高级工具特性
- 并行工具调用:LLM 可以在一条消息中同时发出多个 tool_calls,AgentExecutor 会并行执行这些独立工具调用,显著降低端到端延迟
- 异步工具调用:支持 asyncio 实现的异步工具执行,进一步提升并发性能
- 工具路由筛选:使用 RouterToolkit 或自定义 ToolSelector 根据用户意图预筛工具子集,避免 LLM 在大量工具中盲目尝试
- 工具结果验证:在 Observation 后插入校验链(如 JSON Schema 解析器),过滤非法返回防止下游工具崩溃
4. 工具安全与权限控制
v1.x 版本增强了工具调用的安全机制,包括工具级别的权限控制和沙箱隔离。企业场景中可通过中间件在 wrap_tool_call 钩子中拦截工具执行结果,实施内容审查和数据脱敏。