在不少开发者刚开始接触大模型时,最常见的体验是发送请求后等待数秒甚至更久,直到完整答案一次性返回。但在 ChatGPT 等成熟产品中,文字往往是逐字出现的。这种差异背后的技术,就是流式输出。近日,掘金专栏《从零手撸 Agent》系列发布第四篇,围绕 Agent 开发中的流式输出工程,讲解了如何接住模型“逐字生成”的结果,以及这一能力为何会成为后续聊天界面和前后端联动的基础。
大模型本来就是一个 token 一个 token 生成的
文章首先解释了流式输出的底层逻辑。大模型生成文本的方式通常被称为自回归生成:模型并不能一次性“想好”完整答案,而是基于已有内容不断预测下一个 token。例如,当输入“今天天气真”后,模型可能先预测出“不”,再预测出“错”,再补上标点,逐步组成完整句子。
这意味着,服务器端原本就是边生成、边产出内容。非流式模式下,服务会等所有 token 生成完毕后再打包返回;而在流式模式下,每生成一个 token 或一小段内容,就可以立即发送给客户端。两者的总生成时间未必改变,但用户感知差异明显。
文章提到一个关键指标:TTFT,即 Time To First Token,首 token 时间。流式输出的价值不在于让模型更快完成全部回答,而是把“等待 20 秒后看到全部内容”变成“1 秒后开始逐字看到内容”。对于聊天产品、Agent 交互界面来说,这是影响体验的重要因素。
流式代码的核心:循环、判空和拼接
在实现层面,文章以 OpenAI Python SDK 调用 DeepSeek 接口为例,展示了流式请求的基本写法。与普通调用相比,关键变化是把 stream 参数设为 True。随后,客户端不再拿到一个完整响应,而是进入一个 chunk 流,每个 chunk 代表一次返回的小片段。
开发者需要做的并不是直接展示每个片段,而是围绕三件事展开:
- 循环读取 chunk,因为流式响应不是一次性对象,而是连续片段。
- 判断 delta.content 是否存在,因为部分 chunk 可能只包含元信息,并没有实际文本。
- 自行拼接完整文本,因为模型不会替客户端维护最终回答,客户端必须把新增内容累加起来。
文章强调,流式输出中的 delta 表示“这次新增的内容”,而不是完整回答。如果开发者把每个 delta 误当作整体结果处理,就容易出现内容重复或界面显示错误。
结束信号与对象、字典取值是常见工程坑
除了“接住内容”,流式输出还要处理“什么时候结束”。文章指出,不同厂商接口的结束方式可能不同,常见信号有两类:一类是最后一个 chunk 中的 finish_reason 变为 stop 或 length,分别代表正常结束和因 max_tokens 被截断;另一类是迭代器自然耗尽,即 for 循环自动退出。
工程上更稳妥的做法是同时处理两种情况:在循环内检查 finish_reason,用于触发收尾动作,例如通知前端生成完成;在循环外做资源清理。这种写法有助于避免状态丢失,也方便后续与 SSE 等服务端推送机制衔接。
文章还提到一个容易踩的细节:在有些场景下,例如使用 FastAPI 向前端转发数据时,开发者可能会把 chunk 转成字典形式,再通过键名取值。这时如果仍然使用对象属性方式访问,就可能出现 AttributeError。换句话说,chunk.choices 是对象访问,而 d[“choices”] 是字典访问,两者不能混淆。
Agent 内部通常不用流式,面向用户时才需要流式
这篇教程的一个关键观点是:Agent 内部的 LLM 调用大多使用非流式,只有面向用户的“最后一公里”才需要流式。原因在于,Agent 执行任务时往往需要拿到完整回答,才能解析工具调用、判断下一步动作或进入下一轮推理。如果中间环节文本尚未生成完整,程序可能无法稳定解析结构化信息。
因此,更常见的架构是:后端 Agent 内部仍然以非流式方式运行完整推理流程,而在最终输出环节,将结果以流式方式推送给浏览器或客户端。这样既能保证 Agent 逻辑可控,又能让用户获得逐字显示的交互体验。
文章还将流式输出与多轮对话中的缓存机制联系起来。流式生成过程中,服务器已经计算出的 KV 信息可以自然成为下一轮对话的前缀,因此多轮对话与流式输出在工程上具有一定亲和度。这一部分也为后续讲解 KV Cache 埋下伏笔。
从《从零手撸 Agent》系列的脉络看,流式输出并不只是一个“看起来更像 ChatGPT”的前端效果,而是 Agent 工程中连接模型生成、后端转发和前端展示的基础环节。对于希望构建可用 AI 应用的开发者来说,理解如何接收片段、维护中间状态、处理结束信号,比单纯追求界面动效更重要。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/liu-shi-shu-chu-bu-shi-jia-su-mo-fa-er-shi-agent-gong-cheng