需通过调用千问API并正确构造含function call的请求体:一、配置API凭证与环境,创建应用获取Key及Endpoint,安装dashscope SDK;二、定义JSON Schema函数并注册至functions字段;三、发送enable_function_calling为true的请求;四、安全解析function_call响应并校验参数后执行本地函数;五、将结果以tool message形式发起第二轮对话获取最终回复。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望将千问的Function Calling功能集成到自有业务系统中,需通过调用千问提供的API接口并正确构造包含function call能力的请求体。以下是具体接入步骤:
一、配置API访问凭证与基础环境
接入前需在阿里云百炼平台创建应用,获取API Key及千问模型服务地址,确保后端服务具备HTTPS请求能力,并安装支持OpenAI兼容格式的HTTP客户端库。
1、登录百炼控制台,进入“模型服务”页,选择Qwen-Max或Qwen-Plus等支持Function Calling的模型版本。
2、在“API密钥管理”中创建新密钥,记录API_KEY值,并确认所在地域对应的Endpoint(如https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation)。
3、在Python项目中执行pip install dashscope,确保使用dashscope SDK 1.18.0及以上版本。
二、定义业务函数并注册到请求结构中
Function Calling依赖于在请求中显式声明可调用函数的schema,模型据此生成含function name和arguments的响应,业务系统需预先定义对应函数并实现参数解析逻辑。
1、编写符合JSON Schema规范的函数描述,例如查询订单状态函数:
{"name": "get_order_status", "description": "根据订单号查询当前物流状态和预计送达时间", "parameters": {"type": "object", "properties": {"order_id": {"type": "string", "description": "16位数字字母组合的订单编号"}}}}
2、将多个函数定义组织为列表,作为functions字段传入请求体;注意字段名必须为functions,不可写作tools或available_functions。
3、确保每个函数的name值为纯ASCII字符且不含空格,与后端实际调用的函数标识完全一致。
三、发送支持Function Calling的请求
向千问API发起POST请求时,需设置enable_function_calling为true,并在messages中包含用户输入与系统角色指令,模型将返回含function_call字段的响应而非纯文本。
1、构造请求头:Authorization: Bearer YOUR_API_KEY,Content-Type: application/json。
2、构建请求体,包含model(如qwen-max)、input(含messages数组)、parameters(含enable_function_calling: true)及functions数组。
3、发送请求后检查响应中output.choices[0].message.function_call是否存在;若存在,则提取name与arguments字段用于后续本地函数调度。
四、解析模型响应并执行本地函数
千问返回的function_call内容为字符串格式的JSON,需安全解析arguments并传入对应业务函数,避免直接eval或exec,防止代码注入风险。
1、使用json.loads()解析function_call.arguments,捕获JSONDecodeError异常并记录原始字符串供调试。
2、依据function_call.name查表匹配预定义函数映射字典,例如{"get_order_status": get_order_status}。
3、对解析后的参数字典执行类型校验,确保order_id为非空字符串且长度为16,不满足则返回错误消息而非调用下游服务。
五、构造Tool Message并发起第二轮对话
当本地函数执行完成,需将结果以tool message形式附加到历史消息中,再次发送请求以获得最终自然语言回复,形成完整function calling闭环。
1、构造新的message对象:{"role": "tool", "name": "get_order_status", "content": "{\"status\": \"派送中\", \"estimated_delivery\": \"2024-06-15T14:30:00Z\"}"}。
2、将该message追加至原messages列表末尾,保持原有用户与assistant消息顺序不变。
3、再次调用API,此时请求中不再携带functions字段,模型将基于tool返回内容生成面向用户的自然语言应答。


















