Tool Calling是什么

普通的LLM调用只能基于训练数据回答问题。Tool Calling(工具调用)让LLM能主动调用外部函数:查数据库、调API、执行代码、发邮件。例如用户问「今天北京天气怎么样」,LLM不是编造回答,而是调用天气API获取真实数据再回答。这是从聊天机器人到AI Agent的关键能力跃迁。LangChain是2026年最成熟的LLM应用开发框架,其Tool Calling模块是搭建Agent系统的核心组件。

第一步:安装与环境配置

  1. 安装核心库:pip install langchain langchain-openai langchain-core
  2. 安装工具库:pip install requests beautifulsoup4(用于网络请求和网页解析)
  3. 设置环境变量:export OPENAI_API_KEY=your-key
  4. 验证安装:在Python中执行 from langchain.tools import tool 无报错
  5. 选择模型:推荐使用支持原生Tool Calling的模型(GPT-5、Claude、DeepSeek V4 Pro)

第二步:用@tool装饰器定义工具

LangChain中最简单的工具定义方式是用装饰器:

  1. 导入:from langchain.tools import tool
  2. 定义函数并添加装饰器
  3. 函数的docstring就是工具描述,LLM根据描述决定何时使用
  4. 函数的参数类型注解帮助LLM正确传参

第一个工具示例——天气查询:

定义函数 get_weather,接收 city 参数(字符串类型),docstring写「获取指定城市的当前天气信息」,函数内部调用天气API返回结果。

第二个工具示例——数据库查询:

定义函数 query_database,接收 sql 参数,docstring写「执行SQL查询并返回结果」,函数内部连接数据库执行查询。

第三个工具示例——计算器:

定义函数 calculate,接收 expression 参数,docstring写「计算数学表达式」,函数内部用eval安全执行。

提示:工具的docstring质量直接决定LLM能否正确使用工具。描述要包含:工具做什么、什么时候用、参数含义、返回格式

第三步:用StructuredTool处理复杂参数

当工具需要复杂参数(如嵌套对象、列表)时,用StructuredTool:

  1. 导入:from langchain.tools import StructuredTool 和 from pydantic import BaseModel, Field
  2. 定义参数模型:用Pydantic BaseModel描述参数结构
  3. 每个字段用Field添加描述
  4. 创建StructuredTool:传入函数和参数模型
  5. 这样LLM能理解复杂参数结构并正确传参

StructuredTool适用场景:

  • 搜索工具:需要query、num_results、language等多个参数
  • 邮件工具:需要to、subject、body、cc等参数
  • 数据库工具:需要table、columns、where_clause、order_by等参数
  • 文件操作:需要file_path、operation、content等参数

第四步:创建Agent编排工具

有了工具后,用Agent让LLM自动决定何时调用哪个工具:

  1. 导入AgentCreator:from langchain.agents import create_tool_calling_agent
  2. 导入执行器:from langchain.agents import AgentExecutor
  3. 创建提示词模板:定义系统行为和工具使用规则
  4. 创建Agent:传入LLM、工具列表、提示词
  5. 创建执行器:AgentExecutor包装Agent,设置max_iterations和错误处理
  6. 运行:调用 executor.invoke({‘input’: ‘用户问题’})

Agent执行流程(以「查北京天气然后算温度差」为例):

  • 用户问「北京比上海温度高多少度」
  • LLM分析:需要先查两个城市的天气
  • LLM调用 get_weather(city=’北京’) → 返回25度
  • LLM调用 get_weather(city=’上海’) → 返回28度
  • LLM调用 calculate(expression=’25-28′) → 返回-3
  • LLM综合结果回答「北京比上海低3度」

第五步:数据库查询工具实战

让LLM能查数据库是最高频的企业需求:

  1. 安装SQLAlchemy:pip install sqlalchemy
  2. 定义数据库连接工具:接收SQL语句,返回查询结果
  3. 在docstring中描述数据库表结构:帮助LLM写正确的SQL
  4. 添加安全限制:只允许SELECT,禁止DROP/DELETE
  5. 设置行数限制:最多返回100行,防止大查询
  6. 格式化返回:将结果转为字典列表,LLM更容易理解

安全注意事项:

  • 使用只读数据库账号,禁止DDL和DML
  • 设置查询超时:避免LLM生成慢查询拖垮数据库
  • SQL注入防护:用参数化查询,不直接拼接字符串
  • 结果限制:每次最多返回100行,大数据量用分页
  • 日志记录:记录所有LLM生成的SQL,方便审计

第六步:错误处理与重试

工具调用可能失败,需要健壮的错误处理:

  1. 在工具函数中用try-except捕获异常
  2. 返回友好的错误信息(而非原始异常堆栈)
  3. 在AgentExecutor中设置 handle_parsing_errors=True
  4. 设置 max_iterations=5:避免无限循环
  5. 设置 early_stopping_method=’generate’:超时后让LLM总结已有结果
  6. 添加重试装饰器:对网络请求类工具自动重试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%