前言

调用大模型接口的响应,可能是文字,也可能是工具调用,此处所说的流式工具调用,指的是流式调用大模型接口,针对这种场景如何完成工具调用。也就是下方的stream参数设置为True的时候,工具调用如何处理:

from openai import OpenAIclient = OpenAI()resp = client.chat.completions.create(    model=model_name,    messages=[        {'role': 'user', 'content': 'Hi'}    ],    tools=tools,    # 开启流式调用    stream=True)

在实际场景中,如果有些用户输入可以直接用大模型内置知识回答,有些输入需要借助外部工具回答,则这个时候面临一个选择:

  • 使用流式调用:此时用户体验是比较好的,因为无需等待所有结果生成完再返回,用户可以实时看到模型生成,整个应用的响应性是比较好的,但面临的问题是,工具调用信息也是流式的,而且有时候会存在并行工具调用的情况,就是模型在同一次对话或一次响应里同时提出多个函数调用tool_calls
  • 使用非流式调用:此时工具调用信息(工具名、参数)非常容易获取的,但由于不能流式输出,所以如果响应是文字,用户体验是不好的,因为需要等待所有内容生成完才能看到结果

本文介绍如何在启用流式调用的情况下,处理文字和工具调用信息。

准备工作

准备工作与动手学Agent:工具使用(2)工具使用基础&强制模型选择特定工具中的一致。

代码

本文对应代码已开源,地址在https://github.com/Steven-Luo/hands-on-agents

首先我们来看一下流式调用情况下,工具使用信息是怎样的,为了让结果短一些,使用/no_think关闭模型思考:

from openai import OpenAImodel_name = 'qwen3-8b'client = OpenAI(    base_url='http://localhost:1234/v1',    api_key='1234')resp = client.chat.completions.create(    model=model_name,    messages=[        {'role': 'user', 'content': '北京、上海今天天气怎么样 /no_think'}    ],    stream=True,    # 开启工具调用    tools=tools,    # 自动选择工具    tool_choice='auto')for ch in resp:    print(ch.choices[0].delta.model_dump())

输出:

可以看出,工具使用的部分也流式返回了,此处就需要对这部分流式输出内容进行处理,处理方法也比较简单,就是字符串拼接,但需要注意,存在并行工具调用的情况时,需要按照index对应拼接,以免出现错位,下面这段处理逻辑,是本文的核心代码:

from IPython.display import Markdownmessages = [    {'role': 'user', 'content': '北京、上海今天天气怎么样 /no_think'}]resp = client.chat.completions.create(    model=model_name,    messages=messages,    stream=True,    # 开启工具调用    tools=tools,    # 自动选择工具    tool_choice='auto')tool_calls = {}full_response = ''for ch in resp:    delta = ch.choices[0].delta    print(delta.model_dump())    if delta.content isnotNone:        full_response += delta.content        # 此处使用Markdown输出模拟业务系统中对文字内容的处理,实际系统中可能会直接流式发送给用户        Markdown(delta.content)    if delta.tool_calls isnotNoneand len(delta.tool_calls) > 0:        for tool_call_delta in delta.tool_calls:            tool_call_index = tool_call_delta.index            if tool_call_index notin tool_calls:                tool_calls[tool_call_index] = {                    'call_id': None,                    'function': '',                    'arguments': ''                }            fc_params = tool_calls[tool_call_index]            call_id = tool_call_delta.id            function_name = tool_call_delta.function.name            arguments = tool_call_delta.function.arguments            if call_id isnotNone:                fc_params['call_id'] = call_id            if function_name isnotNone:                fc_params['function'] += function_name            if arguments isnotNone:                fc_params['arguments'] += arguments

这样处理后的tool_calls如下,可以看到,已经是正常的工具调用信息了:

{0: {'call_id': '313769221',  'function': 'get_current_weather',  'arguments': '{"city": "北京"}'}, 1: {'call_id': '730673467',  'function': 'get_current_weather',  'arguments': '{"city": "上海"}'}}

接下来跟基础使用方法一样,组织历史记录,将工具调用信息、工具调用结果加入到历史记录中:

# 文字内容非空时,也需要把这部分发回给模型,但不需要包含think的部分full_response = full_response.split('</think>')[-1].strip()if full_response.strip() != '':        messages.append({        "role": "assistant",        "content": full_response    })    for tool_call_index in tool_calls:    fc_params = tool_calls[tool_call_index]    fn_name = fc_params['function']    arguments = json.loads(fc_params['arguments'])    # 工具调用信息    messages.append({        "role": "assistant",        "tool_calls": [{            "id": fc_params["call_id"],            "type": "function",            "function": {                "name": fn_name,                "arguments": json.dumps(arguments, ensure_ascii=False)            }        }]    })        # 工具调用结果    tool_call_res = fn_map[fn_name](**arguments)    messages.append({        "tool_call_id": fc_params["call_id"],        "role": "tool",        "name": fn_name,        "content": tool_call_res if isinstance(tool_call_res, str) else json.dumps(tool_call_res, ensure_ascii=False)    })

处理好messages后,再次发起请求:

resp = client.chat.completions.create(    model=model_name,    # 历史记录,要带上原始输入 + LLM返回的工具调用信息 + 工具调用结果    messages=messages,    # 开启工具调用    stream=True,    tools=tools,    # 自动选择工具    tool_choice='auto')

检查一下响应,此处简单打印,实际系统中,会使用类似上面的核心代码,将流式输出的文字,直接推送到前端展示给用户:

for ch in resp:    print(ch.choices[0].delta.model_dump())

此时的返回,就是最终结果了:

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年 AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享

👇👇扫码免费领取全部内容👇👇

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势

想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI

1. 100+本大模型方向电子书

在这里插入图片描述

2. 26 份行业研究报告:覆盖多领域实践与趋势

报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:

  • 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
  • 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
  • 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
  • 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。

3. 600+套技术大会 PPT:听行业大咖讲实战

PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

在这里插入图片描述

  • 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
  • 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
  • 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
  • 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。

二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走

想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位

面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析

2. 102 道 AI 大模型真题:直击大模型核心考点

针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题

专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:


三、路线必明: AI 大模型学习路线图,1 张图理清核心内容

刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

在这里插入图片描述

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img
四、资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!

Logo

更多推荐