其他资讯
使用
使用教程
Calling实战
通义千问Function Calling实战指南:从入门到精通的API调用教程
摘要
通义千问的FunctionCalling功能使其能调用外部工具。实现需五个步骤:首先,用JSONSchema定义
# 解锁通义千问 Function Calling:从对话模型到智能执行体
想让你的通义千问模型直接执行外部操作,例如查询实时数据或处理结构化计算吗?关键在于精准配置其 Function Calling 能力。本指南将详解实现这一功能的核心流程。
## 一、定义工具函数与 JSON Schema
实现 Function Calling 的第一步,是为模型提供一份精确的“工具接口规范”。你需要以 JSON Schema 格式,明确声明每个可用工具的名称、功能描述以及参数结构。
一个完整的工具定义必须包含 `type`、`function.name`、`function.description` 和 `function.parameters` 等关键字段。
以下是一个天气查询函数的定义示例:
```json
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "查询指定城市的实时天气状况,包括温度、湿度和天气现象",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "需要查询天气的城市名称,例如:上海、纽约"
}
},
"required": ["location"]
}
}
}
```
定义时需重点关注:
1. `parameters.properties` 中声明的参数类型必须与后端函数实现完全匹配。例如,`location` 参数定义为 `string` 类型。
2. 所有必须提供的参数都应在 `required` 数组中明确列出,例如 `["location"]`,以指导模型生成完整的调用参数。
3. 工具描述 (`description`) 应清晰具体,这直接影响模型对调用时机的判断准确性。
## 二、构造包含工具定义的提示词
模型需要同时接收用户指令和可用工具列表,才能决策是否调用以及调用哪个工具。
正确的做法是:在构建包含 system 指令和 user 查询的 messages 列表后,**通过 API 请求的 `tools` 参数传入定义好的工具列表**。
例如,在使用 `client.chat.completions.create` 方法时,设置 `tools=[weather_tool_definition, calculator_tool_definition]`。同时,建议设置 `response_format={"type": "json_object"}` 以确保模型输出结构化的 JSON 响应,便于后续程序化解析。
## 三、解析并执行模型返回的调用指令
当模型决定调用工具时,其响应特征为:`content` 字段为空,而 `tool_calls` 字段包含调用信息。
你的程序应按以下逻辑处理:
1. 检查响应中 `response.choices[0].message.tool_calls` 是否存在。
2. 遍历 `tool_calls` 列表,根据每个 `function_call` 的 `name` 属性(如 `"get_current_weather"`)匹配本地注册的函数。
3. 使用 `json.loads` 解析 `function_call.arguments` 字符串,获得参数字典,并以此调用对应的本地函数。
## 四、将工具执行结果注入上下文并获取最终回复
工具执行后,需将结果反馈给模型,由其生成面向用户的最终回答。
这是一个关键的多轮交互步骤,消息格式必须规范:
1. 创建一条新的 message,设置其 `role` 为 `"tool"`。
2. 将工具函数返回的实际结果字符串填入 `content` 字段。
3. 此消息必须包含 `tool_call_id` 字段,其值需与触发调用的原始 `tool_calls` 项中的 `id` **严格一致**。
4. 将此工具消息追加到历史对话列表末尾,再次调用模型接口,即可获得整合了工具执行结果的最终回复。
## 五、处理无需工具调用的直接回复场景
并非所有用户请求都需要调用外部函数。模型自身即可处理大量查询。
在此场景下,模型响应中不包含 `tool_calls` 字段,其 `content` 字段即为有效答案。因此,你的程序**必须同时兼容两种响应路径**。
推荐的处理逻辑是:
1. 首先检查 `response.choices[0].message.tool_calls` 是否为 `None` 或空列表。
2. 若未触发工具调用,则直接提取 `response.choices[0].message.content` 作为最终回复。
3. **关键点**:避免预设每次响应都包含 `tool_calls`。务必对 `content` 字段进行空值判断和异常处理,以构建健壮的对话流。
遵循这五个步骤,你便能成功激活通义千问的 Function Calling 能力,使其从对话模型进阶为可调度外部资源的智能体,高效处理动态、实时的任务。
来源:互联网
免责声明
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。