流式处理与异步机制
LangChain JS 默认异步:I/O 型 LLM 调用、Retriever、Tool 均为 Promise;流式用 AsyncGenerator / AsyncIterable 逐级传递 chunk。
1. 设计原则
| 原则 | 原因 |
|---|---|
| 全非阻塞 | 单线程 Node 不被长推理堵死 |
| 流式一等 | Token 级 UX |
| 可取消 | AbortSignal 贯穿 config |
2. 流式层次
| 层级 | 消费者得到 |
|---|---|
Model stream | AIMessageChunk |
Chain stream | 最后一环 chunk 或聚合 chunk |
streamEvents | on_chat_model_stream 等事件 |
3. 链上流式
RunnableSequence 对 stream:逐环传递或合并;中间环若不支持 stream 可能缓冲后一次性输出(视实现)。
4. 背压与并发
batch+maxConcurrency控制并行请求数。- 消费慢时 AsyncIterable 由运行时缓冲;极高吞吐场景注意内存。
5. 错误与取消
- 流中途抛错:迭代器
throw,调用方try/finally清理。 config.signal.aborted:中止 HTTP 与后续 tool。
6. 实践
- UI 用
for await (const chunk of stream)追加文本。 - 调试全链路用 LangSmith +
streamEvents。 - 工具与模型不要共用无界并行,避免 rate limit。
7. 总结
invoke = 要结果,stream = 要体验,streamEvents = 要观测;三者共用同一 Runnable 图。