现象
本地 Demo 点「运行」后界面静默十几秒,最后突然一大段。体验像假死。
原因:只用了 invoke,等整轮 Agent 跑完才返回。
改法
用流式接口逐步拿状态快照/事件,把过程映射到 UI:
- 用户消息
- 模型思考/文本片段
- 正在调用的工具名
- 工具结果摘要(可折叠)
- 最终答案
概念上:
stream = agent.stream_events(
{"messages": [{"role": "user", "content": "查资料并总结"}]},
version="v3",
)
for event in stream:
# 依据事件类型更新 UI
...
具体字段以你当前 LangChain 版本文档为准;关键是 不要只等最终 message。
UI 怎么显示才不吵
- 工具调用显示短标签:
search_notes("ReAct") - 原始 JSON 默认折叠
- 失败重试要有可见状态,不要静默转圈
- 最终答案与过程用视觉层级分开
踩坑
- 流式事件类型多,先打日志再映射 UI
- 中文长句流式时注意光标与分段
- 不要把每个 token 都当「重要进度」刷屏
结论
Agent 的「快」感,一半来自真实速度,一半来自 过程可见。
先解决可观察性,再优化模型延迟。