现象

本地 Demo 点「运行」后界面静默十几秒,最后突然一大段。体验像假死。

原因:只用了 invoke,等整轮 Agent 跑完才返回。

改法

用流式接口逐步拿状态快照/事件,把过程映射到 UI:

  • 用户消息
  • 模型思考/文本片段
  • 正在调用的工具名
  • 工具结果摘要(可折叠)
  • 最终答案

概念上:

stream = agent.stream_events(
    {"messages": [{"role": "user", "content": "查资料并总结"}]},
    version="v3",
)
for event in stream:
    # 依据事件类型更新 UI
    ...

具体字段以你当前 LangChain 版本文档为准;关键是 不要只等最终 message。

UI 怎么显示才不吵

  1. 工具调用显示短标签:search_notes("ReAct")
  2. 原始 JSON 默认折叠
  3. 失败重试要有可见状态,不要静默转圈
  4. 最终答案与过程用视觉层级分开

踩坑

  • 流式事件类型多,先打日志再映射 UI
  • 中文长句流式时注意光标与分段
  • 不要把每个 token 都当「重要进度」刷屏

结论

Agent 的「快」感,一半来自真实速度,一半来自 过程可见。
先解决可观察性,再优化模型延迟。