千问Function Calling功能详解:从入门到精通的实战指南
摘要
激活通义千问的FunctionCalling功能,需遵循五个步骤:首先,用JSONSchema定义工具函数及其参
要让通义千问模型执行实时任务,例如查询天气或计算数据,核心在于启用其“Function Calling”功能。这本质上是引导模型在识别到需求时,自动调用你预设的外部工具,并将返回的数据整合成流畅的自然语言答复。整个流程可拆解为五个关键环节。

一、定义工具函数与 JSON Schema
首先,你需要明确告知模型可用的工具集。这通过一份结构化的“说明书”——JSON Schema 来实现,它为每个工具提供标准化定义。
一份完整的 Schema 需涵盖几个要素:工具类型(type)、函数名称(function.name)、功能描述(function.description),以及核心的参数结构定义(function.parameters)。
以天气查询工具为例,function.name 建议与后端实际函数名保持一致。在 parameters 对象中,需精确声明每个参数的类型(如 location 为字符串)及其含义。务必通过 required 字段指明哪些是必填参数,确保模型调用时信息完整。
二、构造带工具描述的提示词
仅定义工具不够,还需在对话初始化阶段将其呈现给模型。模型需同时接收你的查询指令和可用工具列表,才能准确判断是否触发函数调用。
操作上,你需要构建包含系统指令与用户问题的消息列表。调用 API 时,关键是将上一步定义的工具数组通过 tools 参数传入。同时,建议将 response_format 设置为 JSON 对象格式,这能强制模型返回结构化响应,便于后续程序化解析,减少自由文本的噪音。
三、解析并执行模型返回的调用指令
当模型决定调用工具时,其响应并非最终答案,而是一个包含具体操作指令的中间态。典型特征是响应中的 content 字段为空,而 tool_calls 字段则包含了调用详情。
此时,你的程序需要接管流程:首先验证 tool_calls 是否存在且非空。随后遍历该列表,依据每个指令中的 function.name 匹配对应的本地函数,解析 arguments 中的参数字符串(通常为 JSON),并最终执行该函数。
四、将工具结果注入上下文并二次调用模型
工具执行后返回的是原始数据(例如包含温湿度的 JSON 字符串)。我们的目标并非直接输出这些数据,而是将其转化为“上海今日多云,气温 22 摄氏度”这样的自然语句。
因此,需将工具执行结果作为新上下文反馈给模型。具体做法是:创建一条角色(role)为 “tool” 的消息,将原始结果字符串填入 content 字段,并将其追加到现有对话历史中。然后,在不携带 tools 参数 的情况下再次调用模型。这一次,模型将基于真实的工具返回数据,生成最终的自然语言回答。
五、处理无工具调用的兜底场景
并非所有用户请求都需要调用外部工具。对于常规对话,模型会直接生成回复,此时 content 字段有内容,而 tool_calls 为空。
你的程序逻辑必须兼容这种常规对话流。一个健壮的实现策略是:优先检查 content 字段是否非空,且 tool_calls 字段不存在或为空列表。若条件满足,则直接将 content 作为最终响应返回。这里有一个关键注意事项:必须显式判断 tool_calls 字段的存在性,避免在默认其存在的情况下进行解析,否则极易引发程序异常。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。