流式输出
2026/7/23大约 2 分钟
既然你已经成功在控制台看到了 AIOps 助手已上线!(流式输出模式),现在的关键在于如何让它像打字机一样“丝滑”地蹦出字符,而不是转圈圈等半天。
在 LCEL 模式下,实现流式输出最核心的变化是从 .invoke()(一次性返回)切换到 **.stream()**(像水流一样输出)。
你的 app.py 核心代码写法
请检查或修改你的 chat 函数,确保它是这样写的:
def chat():
print("🤖 AIOps 助手已上线!(流式输出模式)")
while True:
user_input = input("\n运维问题 >> ")
if user_input == "exit": break
print("\n💡 建议方案:", end="", flush=True)
# 核心:使用 .stream 而不是 .invoke
# rag_chain 会返回一个迭代器,每产生一个 Token 就抛出一个 chunk
for chunk in rag_chain.stream(user_input):
# end="" 确保不换行,flush=True 确保立即在屏幕显示而不是存在缓冲区
print(chunk, end="", flush=True)
print("\n" + "-"*30) # 结束分割线
为什么流式输出对你的项目很重要?
- 消除“卡顿感”:由于你使用了本地 Embedding 模型(加载慢)+ 云端 Qwen 模型(生成慢),如果不流式输出,用户可能要盯着屏幕死等 5-10 秒。
- 实时排障:在 AIOps 场景中,日志分析通常很长。流式输出能让你在 AI 还没写完时,就先看到前几行的报错原因分析,提高运维效率。
一个容易忽略的小细节:StrOutputParser
在你的代码截图(第 16 行)中,你导入了 StrOutputParser。在 LCEL 管道中,你必须把这个解析器挂在最后,流式输出才能生效:
# 你的管道定义应该是这样的
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser() # 必须加这个,它负责把模型返回的复杂对象转成纯字符串流
)
下一步建议
你现在的流式输出是在终端(Terminal)里跑的。
你想试试把这个流式效果做到网页上吗? 既然你之前在折腾 VuePress 博客,我们可以用 FastAPI 写一个后端接口,让你的 AI 助手以 Server-Sent Events (SSE) 的方式在网页上实现像 ChatGPT 那样的打字效果。你要试试吗?
