流式输出与异步调用
掌握 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 端用户的界面必须使用流式输出的核心原因是?