Tool Calling是什么
普通的LLM调用只能基于训练数据回答问题。Tool Calling(工具调用)让LLM能主动调用外部函数:查数据库、调API、执行代码、发邮件。例如用户问「今天北京天气怎么样」,LLM不是编造回答,而是调用天气API获取真实数据再回答。这是从聊天机器人到AI Agent的关键能力跃迁。LangChain是2026年最成熟的LLM应用开发框架,其Tool Calling模块是搭建Agent系统的核心组件。
第一步:安装与环境配置
- 安装核心库:
pip install langchain langchain-openai langchain-core - 安装工具库:
pip install requests beautifulsoup4(用于网络请求和网页解析) - 设置环境变量:
export OPENAI_API_KEY=your-key - 验证安装:在Python中执行
from langchain.tools import tool无报错 - 选择模型:推荐使用支持原生Tool Calling的模型(GPT-5、Claude、DeepSeek V4 Pro)
第二步:用@tool装饰器定义工具
LangChain中最简单的工具定义方式是用装饰器:
- 导入:
from langchain.tools import tool - 定义函数并添加装饰器
- 函数的docstring就是工具描述,LLM根据描述决定何时使用
- 函数的参数类型注解帮助LLM正确传参
第一个工具示例——天气查询:
定义函数 get_weather,接收 city 参数(字符串类型),docstring写「获取指定城市的当前天气信息」,函数内部调用天气API返回结果。
第二个工具示例——数据库查询:
定义函数 query_database,接收 sql 参数,docstring写「执行SQL查询并返回结果」,函数内部连接数据库执行查询。
第三个工具示例——计算器:
定义函数 calculate,接收 expression 参数,docstring写「计算数学表达式」,函数内部用eval安全执行。
提示:工具的docstring质量直接决定LLM能否正确使用工具。描述要包含:工具做什么、什么时候用、参数含义、返回格式
第三步:用StructuredTool处理复杂参数
当工具需要复杂参数(如嵌套对象、列表)时,用StructuredTool:
- 导入:
from langchain.tools import StructuredTool和from pydantic import BaseModel, Field - 定义参数模型:用Pydantic BaseModel描述参数结构
- 每个字段用Field添加描述
- 创建StructuredTool:传入函数和参数模型
- 这样LLM能理解复杂参数结构并正确传参
StructuredTool适用场景:
- 搜索工具:需要query、num_results、language等多个参数
- 邮件工具:需要to、subject、body、cc等参数
- 数据库工具:需要table、columns、where_clause、order_by等参数
- 文件操作:需要file_path、operation、content等参数
第四步:创建Agent编排工具
有了工具后,用Agent让LLM自动决定何时调用哪个工具:
- 导入AgentCreator:
from langchain.agents import create_tool_calling_agent - 导入执行器:
from langchain.agents import AgentExecutor - 创建提示词模板:定义系统行为和工具使用规则
- 创建Agent:传入LLM、工具列表、提示词
- 创建执行器:AgentExecutor包装Agent,设置max_iterations和错误处理
- 运行:调用 executor.invoke({‘input’: ‘用户问题’})
Agent执行流程(以「查北京天气然后算温度差」为例):
- 用户问「北京比上海温度高多少度」
- LLM分析:需要先查两个城市的天气
- LLM调用 get_weather(city=’北京’) → 返回25度
- LLM调用 get_weather(city=’上海’) → 返回28度
- LLM调用 calculate(expression=’25-28′) → 返回-3
- LLM综合结果回答「北京比上海低3度」
第五步:数据库查询工具实战
让LLM能查数据库是最高频的企业需求:
- 安装SQLAlchemy:
pip install sqlalchemy - 定义数据库连接工具:接收SQL语句,返回查询结果
- 在docstring中描述数据库表结构:帮助LLM写正确的SQL
- 添加安全限制:只允许SELECT,禁止DROP/DELETE
- 设置行数限制:最多返回100行,防止大查询
- 格式化返回:将结果转为字典列表,LLM更容易理解
安全注意事项:
- 使用只读数据库账号,禁止DDL和DML
- 设置查询超时:避免LLM生成慢查询拖垮数据库
- SQL注入防护:用参数化查询,不直接拼接字符串
- 结果限制:每次最多返回100行,大数据量用分页
- 日志记录:记录所有LLM生成的SQL,方便审计
第六步:错误处理与重试
工具调用可能失败,需要健壮的错误处理:
- 在工具函数中用try-except捕获异常
- 返回友好的错误信息(而非原始异常堆栈)
- 在AgentExecutor中设置 handle_parsing_errors=True
- 设置 max_iterations=5:避免无限循环
- 设置 early_stopping_method=’generate’:超时后让LLM总结已有结果
- 添加重试装饰器:对网络请求类工具自动重试3次
常见问题与误区
- LLM不调用工具:检查工具docstring是否清晰,在系统提示词中强调「使用工具获取信息」
- LLM传参错误:确保参数类型注解准确,在Field描述中写清楚参数格式
- 工具执行超时:在工具函数中设置timeout,超时返回错误信息
- Agent陷入循环:设置max_iterations限制,设置early_stopping_method处理超时
- 多个工具冲突:确保工具名称唯一,docstring描述不重叠
- 本地模型不支持Tool Calling:需要选择支持function calling的模型,如GPT-5、Claude、DeepSeek V4 Pro
效率数据
- 开发效率:定义一个工具约5-10分钟,搭建完整Agent约1-2小时
- 调用准确率:描述良好的工具,LLM调用准确率约90%+
- 数据库查询场景:用户自然语言→SQL→结果,准确率约85%(简单查询)
- 多工具编排:3-5个工具的组合调用成功率约80%
- 某企业实测:用Tool Calling搭建内部数据查询Agent后,非技术人员自助查数据比例从10% → 65%