AI 大模型 Stream 流式输出实战
在之前的 LangChain 实战中,我们调用大模型时都是「一次性获取完整结果」——比如生成一篇文案、回答一个问题,需要等模型把所有内容生成完才返回。但在实际场景中(如 ChatGPT 聊天界面、长文本生成),这种方式会让用户面对'空白加载页'等待几秒甚至更久,体验大打折扣。
本文将聚焦 LLM 的Stream 流式输出,从核心原理讲起,通过'故事小助手''科普助手'两个实战案例,带你掌握从基础调用到 LCEL 表达式的流式落地,最后分析流式输出的优劣势与实战注意事项。

1. 为什么需要流式输出?先搞懂'一次性输出'的痛点
在学习流式输出前,我们先明确:流式输出不是'让模型生成更快',而是'让用户感知更快'。
先看'一次性输出'的典型问题:
- 体验割裂:生成 1000 字的文章需要 5 秒,这 5 秒内用户看不到任何内容,容易误以为'程序卡住了';
- 内存压力大:如果生成超长文本(如万字报告),一次性加载完整结果会占用更多内存,甚至导致前端页面卡顿;
- 无法中断:一旦触发生成,必须等完整结果返回才能停止,若用户不想看了也无法中途取消。
而流式输出的解决思路很简单:模型生成一个字/一个短句,就立刻返回一个'片段(Chunk)',前端实时拼接展示——就像与人对话时'边说边听',而非'等对方说完一长段再回应'。
2. 流式输出核心原理:什么是 Stream?
LLM 的流式输出本质是基于HTTP 流式传输(或 WebSocket)实现的'增量返回'机制,核心逻辑可拆解为 3 步:
- 模型端'分段生成':大模型生成文本时,并非一次性计算所有内容,而是按'token 片段'(可理解为'词语/短句单元')逐步生成——比如生成'讲一个翠花的故事',模型会先算'翠花是山村里的',再算'一个小姑娘,每天帮妈妈',以此类推;
- 实时推送片段:每生成一个 token 片段,模型就通过'流式接口'将片段推送给调用方(如我们的 Python 代码),而非等待全部生成;
- 调用方'实时拼接':我们的代码接收到每个片段后,立即打印、展示或存储,最终拼接成完整结果。
类比生活场景:就像外卖小哥送 10 份餐,'一次性输出'是等 10 份餐全做好再一起送;'流式输出'是做好 1 份送 1 份,你收到后可以先吃,不用等全部到齐。
3. 基础实战:用 ChatOpenAI 实现'故事小助手'流式输出
首先从最基础的「直接调用大模型流式接口」入手,实现一个'输入关键词,流式生成故事'的小工具。我们依然用DeepSeek 作为示例模型,你也可以替换为 GPT-4、Llama 3 等支持流式的模型。
3.1 环境准备
确保已安装最新版 langchain-openai(流式功能依赖较新的 API 封装):
pip install --upgrade langchain-openai
3.2 完整代码:故事小助手(逐字生成故事)
# 1. 导入依赖:ChatOpenAI 是大模型客户端,支持流式调用
from langchain_openai import ChatOpenAI
# 2. 初始化大模型:关键是确保模型支持流式(qwen-plus、gpt-4 等均支持)
model = ChatOpenAI(
model_name=,
base_url=,
api_key=,
temperature=,
streaming=
)
()
()
chunk model.stream():
(chunk.content, end=, flush=)




