入门基础 入门

流式输出与异步调用

掌握 stream 流式输出降低首字延迟,理解 ainvoke 异步调用提升并发吞吐。

为什么流式输出很重要

完整回答可能要 5~20 秒,用户盯着白屏会直接流失。流式输出让模型边生成边返回,首字延迟降到 1 秒内,体验差距巨大。

# LCEL 链的流式:逐 token 打印
for chunk in chain.stream({"question": "解释一下 Agent"}):
    print(chunk, end="", flush=True)

# 异步流式(Web 后端常用)
async for chunk in chain.astream({"question": "解释一下 Agent"}):
    print(chunk, end="", flush=True)

批量并发:batch 与 abatch

上百条独立任务(批量摘要、批量分类)用 batch 并发执行:

results = chain.batch([{"q": "问题1"}, {"q": "问题2"}, {"q": "问题3"}])

注意并发过高会触发 API 限流,配合 max_concurrency 参数控制:

chain.batch(inputs, config={"max_concurrency": 5})

异步全家桶

  • ainvoke:单次异步调用;
  • astream:异步流式;
  • abatch:异步批量。
经验法则:C 端交互界面必用流式;后台任务用异步 + 受控并发。

📝 课后练习

quiz-1 面向 C 端用户的界面必须使用流式输出的核心原因是?