需启用流式function calling以实现工具调用未完成时持续输出中间结果,具体包括:一、启用模型原生流式响应接口;二、客户端分阶段渲染与状态标记;三、服务端代理层异步调度与结果注入;四、使用qwen-agent框架内置流式钩子;五、模型侧微调增强早期识别能力。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在使用千问进行Function Calling时希望工具调用尚未完成就持续输出中间结果,则需打破传统“调用-等待-返回”的同步阻塞模式。以下是实现流式Function Calling的具体方法:
一、启用模型原生流式响应接口
千问API提供stream参数支持逐token输出,可在工具调用决策生成阶段即开始流式返回,无需等待工具执行结束。该方式依赖模型对function call意图的早期识别能力。
1、向/qwen/v1/chat/completions接口发起POST请求,请求体中设置"stream": true。
2、在messages数组末尾添加用户最新指令,确保system提示词中已声明支持工具调用及流式反馈机制。
3、解析SSE响应流,当收到包含"delta.function_call.name"或"delta.function_call.arguments"字段的数据块时,立即提取并透传至前端。
4、若后续数据块中出现"delta.content"非空值,说明模型已在生成工具调用前的自然语言过渡句,应实时渲染该部分内容。
二、客户端侧分阶段渲染与状态标记
前端需区分模型输出的不同语义阶段,在function call未触发前即可展示推理过程片段,避免界面长时间空白。关键在于识别function call起始信号并保持上下文连贯性。
1、监听流式响应中首个含"function_call"字段的数据包,将其"name"和已接收的"arguments"片段拼接为待执行工具描述。
2、在UI中插入占位提示:正在调用「天气查询」工具获取北京实时温度…。
3、继续接收后续token,将所有"delta.content"内容追加至当前消息区块,即使function call尚未完成。
4、当工具执行结果返回后,将结果注入同一消息区块末尾,并标记为tool_response类型以区分模型原生输出。
三、服务端代理层实现异步工具调度与结果注入
通过自定义API网关拦截模型输出流,在检测到function call结构后,立即异步发起工具请求,并将工具返回数据按时间顺序混入原始流,使模型与工具输出形成交织式响应。
1、部署轻量级代理服务,接收客户端发来的流式请求,并转发至千问后端。
PHP中文网提供Qwen-1.0.2.6 MacOS官方客户端下载,专为苹果电脑优化的阿里通义千问桌面应用。本版本深度适配Mac系统,支持本地高效运行与多模态交互,集成超长上下文处理、AI写作、代码生成及智能体构建等核心功能。通过官方渠道下载,确保安全稳定,助您实现智能办公与创作升级。
2、代理层解析每个SSE事件,识别出function call参数后,立即启动对应工具的HTTP异步调用。
3、工具响应到达后,构造伪造的SSE事件:data: {"delta":{"content":"当前气温23℃,湿度65%。"}}, 并插入原始流的合适位置。
4、代理确保所有注入事件的时间戳早于后续模型生成的token,避免前端渲染错序,注入内容必须携带"tool_execution_id"字段以供前端关联。
四、使用Qwen-Agent框架内置流式钩子
Qwen-Agent提供on_tool_start与on_tool_end回调接口,允许开发者在工具生命周期各节点插入自定义逻辑,包括即时推送中间状态。
1、初始化Agent实例时传入callback_handlers参数,注册继承自BaseCallbackHandler的自定义处理器。
2、在on_tool_start方法中调用send_message接口,向客户端WebSocket连接推送{"status":"running","tool":"search_news","query":"AI政策"}。
3、在on_tool_end方法中再次推送完整结果,同时附带"is_final": false标识,通知前端此为阶段性输出。
4、前端监听WebSocket消息,对is_final=false的消息执行增量追加渲染,禁止覆盖已有内容或清空历史消息流。
五、模型侧微调增强function call早期识别能力
标准千问模型可能延迟输出function call结构,导致流式起始点滞后。可通过LoRA微调优化其在对话中期即准确触发tool calling token的概率。
1、构建含明确function call触发信号的监督数据集,例如用户说“查一下”后紧接结构化参数的样本。
2、使用Qwen-7B-Chat作为基座,加载Qwen-7B-Chat-FunctionCall-lora适配器进行增量训练。
3、在推理时启用enable_function_calling=True与early_stopping=True参数组合。
4、验证输出中function_call字段首次出现在第8–12个token区间内,较原始模型提前至少5个token位置。










