一、我第一次用 LangChain 流式的错觉

最开始我写的是这种代码:

result = chain.invoke({"question": user_input})
print(result)

看起来没问题,但在实际产品里,问题很大:

  • 用户要等 好几秒

  • 页面一片空白

  • 最后“啪”一下全出来

用户体验只有两个字:

像接口,不像 AI


二、流式响应的本质是什么?

一句话版本:

流式响应 = 模型一边生成,你一边消费

在 LangChain 里,链式调用不是只能 invoke,而是天然支持:

方法

行为

invoke

一次性返回最终结果

stream

逐个 token / chunk 返回

astream

异步流式(生产推荐)

⚠️ 很多人误以为:

“流式只是前端好看一点”

错。

在链式体系里,流式影响的是整个链的执行方式


三、最基础的流式链(你一定要会的)

✅ 标准写法(同步)

chain = prompt | model | StrOutputParser()

for chunk in chain.stream({"question": user_input}):
    print(chunk, end="", flush=True)

发生了什么?

Prompt → Model → Parser → 你

每一个 chunk:

  • 已经是 解析后的字符串

  • 不再是 AIMessage

  • 不再需要 .content

📌 这是我第一次觉得:

LCEL + Stream 是真的配


四、我踩的第一个坑:Parser 不支持流式

❌ 错误示例(我当时真这么写过)

chain = prompt | model | PydanticOutputParser(...)
for chunk in chain.stream(...):
    print(chunk)

结果直接报错 😅

原因很简单:

Pydantic / JSON 解析器必须“完整输出”才能解析

流式本质是“半成品”,它做不到。


五、正确的流式设计原则(非常重要)

我自己总结的一句话:

流式链 ≠ 结构化链

✅ 正确拆分方式

场景

链类型

聊天 / 解释 / 生成

✅ 流式

分类 / 抽取 / 判断

❌ 流式

最终业务决策

❌ 流式

推荐结构

# 流式:给用户看
chat_chain = prompt | model | StrOutputParser()

# 非流式:给系统用
struct_chain = prompt | model | PydanticOutputParser(...)

六、真实项目中我最常用的两种流式模式


✅ 模式 1:流式输出 + 非流式判断(90% 场景)

# 1️⃣ 先判断意图(非流式)
intent = intent_chain.invoke({"query": user_input})

# 2️⃣ 再流式回答
if intent.type == "chat":
    for chunk in chat_chain.stream({"query": user_input}):
        print(chunk, end="", flush=True)

📌 这是我现在的标准模板:

决策不流式,体验才流式


✅ 模式 2:中间变量 + 最后流式(Agent 雏形)

# 第一步:结构化抽取
info = extract_chain.invoke({"text": user_input})

# 第二步:流式解释
for chunk in explain_chain.stream(info.dict()):
    print(chunk, end="", flush=True)

这一步,其实已经接近 Agent 的工作方式​ 了。


七、异步流式(生产环境必会)

FastAPI 场景基本都是这个:

async for chunk in chain.astream({"question": user_input}):
    await websocket.send_text(chunk)

如果你现在还在用 stream()写后端服务:

建议直接升级 astream


八、我现在的流式设计原则

我自己总结的一条公式:

流式只负责“感知智能”,不负责“决策智能”

落地就是三条:

  1. 用户看到的内容 → 可以流式

  2. 业务逻辑依赖的数据 → 绝不流式

  3. 链式调用中,Parser 决定能不能用,Stream 决定能不能留人


九、一句话总结

Prompt 决定模型怎么想

Output Parser 决定能不能用

Chain 决定能不能上线

Stream 决定能不能留住用户

没有链式调用,LangChain 只是 Prompt 工具;

没有流式响应,AI 应用永远像后台接口。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐