要让千问AI自动调用外部工具,必须完成结构化工具声明与运行时联动:先用符合OpenAI格式的JSON Schema定义工具(含name、description、parameters三字段),再通过DashScope SDK注册Python函数,最后发起带tools的API请求并按四步流程解析响应。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要让千问AI在对话中自动调用外部工具执行真实操作,比如查天气、发邮件或读取数据库,必须完成结构化工具声明与运行时联动两个核心环节。
定义符合OpenAI格式的工具描述
第一步是用JSON Schema写清楚工具能干什么、叫什么、要什么参数。模型只认这种格式,写成自然语言说明它看不懂。
工具描述必须包含 【name、description、parameters 三个字段缺一不可】,其中 description 要用具体动词开头,比如“获取北京当前温度”,不能写“提供气象服务”这种模糊表达。
parameters 字段必须是 type: "object",且 properties 中每个参数都要标明类型(string/number/boolean)和是否 required。漏掉 required 会导致模型传空值,调用直接失败。
把写好的工具对象放进 tools 数组里,例如:[{"type":"function","function":{"name":"get_weather","description":"获取指定城市的当前天气","parameters":{"type":"object","properties":{"city":{"type":"string","description":"城市名称,如上海"}},"required":["city"]}}} ]
通过DashScope SDK注册Python函数
如果你本地已有现成的Python函数,用 DashScope SDK 注册比手写 JSON Schema 更快更稳,它会自动从函数签名和 docstring 提取 name、description 和 parameters。
方法一:用 @tool 装饰器注册
在函数上方加 @tool,函数名自动成为 tool name,文档字符串第一行作为 description,类型注解生成 parameters 结构。这一步操作起来很简单,直接把文件拖进去就行。
方法二:用 dashscope.Tool.register() 显式注册
调用 dashscope.Tool.register(get_weather),SDK 会扫描函数体并生成完整工具定义。注意函数必须有明确的 type hint,否则 parameters 会缺失类型信息,导致模型调用时报错。
发起带工具的API请求并解析响应
第一步:构造请求体
调用 dashscope.Generation.call() 时,传入 messages(含 user 输入)、tools(上一步定义的工具列表)、tool_choice="auto"。
第二步:判断是否触发调用
检查 response.choices[0].message.tool_calls 是否存在。如果为空,说明模型认为无需调用工具,直接返回 content 即可。
第三步:提取并执行工具
遍历 tool_calls,用 function.name 匹配已注册工具,用 json.loads(function.arguments) 解析参数,再以关键字方式调用对应函数。
第四步:注入工具结果并二次请求
把函数返回值构造成 tool_message,格式为:{"role": "tool", "content": '{"temperature": 32.1, "unit": "celsius"}', "tool_call_id": "call_abc123"},连同原始 messages 一起发起第二轮 call,模型才能基于真实数据生成最终回答。


















