流式与可观测
生产级 agent 的两个基本要求:响应要流式(用户体验)、行为要可观测(可信赖)。面试主线:流式怎么实现、容错怎么做、追踪看什么。
streaming:边跑边出
for chunk in graph.stream({"messages": "写一篇短文"}):
print(chunk) # 按节点产出: {'model': {...}, 'tools': {...}}| 流式层次 | API | 粒度 |
|---|---|---|
| 节点级 | graph.stream() |
每个节点完成后产出 |
| 消息级 | stream_mode="messages" |
LLM token 流(打字机效果) |
| 事件级 | astream_events / stream_events |
任意内部事件(含工具调用) |
- 节点级适合进度展示,消息级适合聊天 UI 逐字输出
stream_events还暴露中断信息(stream.interrupts),驱动人机协同界面(见人机协同篇)- 流式与 checkpoint 配合:恢复后继续流式输出
fault tolerance:容错
| 手段 | 说明 |
|---|---|
| checkpoint 续跑 | 崩溃后从最近存档恢复(见持久化篇) |
| 重试(retry_policy) | 节点失败自动重试(指数退避) |
| 错误处理节点 | 节点内 try/except,失败转降级逻辑 |
| 超时控制 | 节点级超时(timeout=),防模型卡死 |
from langgraph.pregel.retry import RetryPolicy
builder.add_node("model", call_model,
retry=RetryPolicy(max_attempts=3, initial_delay=1.0))面试要点:agent 的故障分两种:基础设施故障(LLM 超时、工具报错)用重试和超时;业务失败(结果不对)靠评估和人工兜底,重试解决不了逻辑错误。
LangSmith 追踪
LangSmith: 每次调用自动可观测
| 能力 | 解决什么 |
|---|---|
| 追踪 | 单次调用完整链路:模型输入输出、工具调用、状态变化、耗时成本 |
| 数据集 | 沉淀评测集,改代码后回归测试 |
| 评估 | 自动评估器(正确性、工具使用合理性) |
| 在线监控 | 生产延迟、错误率、token 成本告警 |
追踪是 agent 开发的必需品:模型决策不可直接调试,只能靠链路回放。看到“模型为什么调了这个工具、结果为什么不对”才能迭代。
面试追问
- 流式怎么实现? graph.stream(节点级)到 stream_mode=“messages”(token 级)。聊天 UI 用消息级
- agent 容错怎么做? checkpoint 续跑 + 节点重试(RetryPolicy)+ 超时。基础设施故障用重试,逻辑错误靠评估
- LangSmith 追踪的价值? 完整链路回放:模型决策、工具调用、状态流转。agent 不可直接调试,只能看链路
- stream_events 和 stream 的区别? stream 节点级产出,stream_events 全事件(含中断 payload),驱动 HITL 界面
- 生产上线 agent 前必备? 持久化(checkpoint)、流式、追踪、评估集。缺可观测性的 agent 没法迭代