工具调用
工具调用允许模型请求你的程序执行函数。模型只生成结构化参数,真正的数据库查询、网络请求或写操作仍由你的代码负责。
声明工具
bash
# 先声明一个无副作用的天气查询工具,验证模型是否支持工具调用。
curl https://sprelaytoken.com/v1/chat/completions \
-H "Authorization: Bearer $SPRELAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"messages": [
{"role": "user", "content": "查询上海今天的天气。"}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"],
"additionalProperties": false
}
}
}
]
}'工具定义逐项说明
| 字段 | 作用 |
|---|---|
tools | 把当前允许模型请求的工具列表发给模型 |
type: function | 表示这是一个函数式工具 |
name | 程序用于匹配处理函数的稳定名称 |
description | 帮助模型判断何时应该调用工具 |
parameters | 使用 JSON Schema 约束参数结构 |
properties.city | 声明 city 必须是字符串 |
required | 要求模型必须给出 city |
additionalProperties: false | 拒绝 Schema 中没有声明的额外参数 |
JSON 代码块本身不能加入注释。复制后只修改模型、用户问题和工具定义中的值,并保持括号、引号和逗号完整。
标准执行循环
- 发送用户消息和工具定义。
- 检查模型是否返回工具调用。
- 按 JSON Schema 验证参数。
- 在服务端执行允许的工具。
- 把工具结果连同调用 ID 回传模型。
- 读取模型的最终答复。
安全边界
不信任模型参数
模型生成的工具名称和参数都属于不可信输入。必须使用允许列表、Schema 校验、权限检查和超时。不要直接拼接 SQL、Shell 命令或任意 URL。
- 写操作应要求业务确认或幂等键。
- 为工具设置独立超时和结果大小限制。
- 不把数据库凭证和内部错误堆栈返回给模型。
- 日志记录调用名称、耗时和结果状态,不记录敏感结果全文。
- 限制单轮最大工具调用次数,避免失控循环。
模型兼容性
并非所有模型都支持工具调用,支持程度也可能不同。先用一个简单、无副作用的工具验证;模型不支持时,移除 tools 后确认普通文本请求仍然正常。
