工具调用(Tool Calling)¶
工具调用是 LLM Agent 与外部世界交互的核心机制。由于大语言模型本身只能处理文本,工具调用框架允许模型识别何时需要调用外部功能,并正确执行这些调用。
函数调用机制的工作原理¶
JSON Schema 定义¶
现代 LLM 支持通过 JSON Schema 定义工具接口,模型可以理解工具的参数结构和类型约束。
{
"name": "search_web",
"description": "搜索互联网获取最新信息",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"},
"max_results": {"type": "integer", "description": "最大结果数量", "default": 5}
},
"required": ["query"]
}
}
调用流程¶
工具注册:开发者向 Agent 注册可用的工具
意图识别:LLM 分析用户请求,判断是否需要调用工具
参数生成:LLM 生成符合工具 Schema 的参数
工具执行:Agent 执行工具调用并获取结果
结果整合:LLM 将工具结果整合到最终响应中
如何设计和注册自定义工具¶
工具设计原则¶
单一职责:每个工具只做一件事
明确接口:参数和返回值要清晰定义
错误处理:提供有意义的错误信息
安全性:验证输入参数,防止恶意调用
工具注册示例(Python + LangChain)¶
from langchain.tools import Tool
def calculator(expression: str) -> str:
"""安全的数学计算工具"""
try:
# 验证表达式安全性
allowed_chars = set('0123456789+-*/(). ')
if not all(c in allowed_chars for c in expression):
return "错误:表达式包含不支持的字符"
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误: {str(e)}"
calculator_tool = Tool(
name="calculator",
func=calculator,
description="执行数学计算,支持加减乘除和括号"
)
工具参数验证和错误处理¶
参数验证策略¶
验证类型 |
描述 |
示例 |
|---|---|---|
类型验证 |
确保参数类型正确 |
字符串、数字、布尔值 |
范围验证 |
检查数值范围 |
年龄 0-150,页码 ≥1 |
格式验证 |
验证数据格式 |
邮箱、电话、日期格式 |
业务规则 |
应用特定规则 |
用户权限、配额限制 |
错误处理最佳实践¶
友好的错误消息:避免技术细节,提供用户可理解的信息
重试机制:对于临时性错误(如网络超时),提供重试选项
降级处理:当工具不可用时,提供替代方案
日志记录:记录错误详情用于调试和监控
常见工具类型¶
信息获取类¶
Web 搜索:获取最新信息
数据库查询:访问结构化数据
API 调用:集成第三方服务
数据处理类¶
文件操作:读写、转换文件
数据计算:数学运算、统计分析
格式转换:JSON、XML、CSV 等格式互转
系统操作类¶
命令执行:执行系统命令(需谨慎)
文件系统:目录遍历、文件管理
网络操作:HTTP 请求、WebSocket 通信
工具调用的安全考虑¶
权限控制¶
最小权限原则:工具只拥有完成任务所需的最小权限
用户授权:敏感操作需要用户明确授权
审计日志:记录所有工具调用用于安全审计
输入验证¶
白名单验证:只允许已知安全的输入模式
长度限制:防止缓冲区溢出攻击
特殊字符过滤:防止注入攻击
输出过滤¶
敏感信息过滤:移除 API 密钥、密码等敏感数据
内容审查:过滤不当内容
格式标准化:确保输出格式一致
调试和测试工具¶
测试策略¶
单元测试:测试单个工具的功能
集成测试:测试工具与 LLM 的交互
端到端测试:模拟真实用户场景
调试技巧¶
详细日志:记录工具调用的完整过程
模拟工具:在开发环境中使用模拟工具
性能监控:跟踪工具调用的响应时间和成功率
工具调用是构建强大 Agent 的基础,掌握这些概念和最佳实践将帮助你创建安全、可靠、高效的 LLM 应用。