流式输出

  |   0 评论   |   0 浏览

你将学会:stream 看清每一步,而不是干等最终结果。
前置: L02。

聊天产品需要边生成边显示。version="v2" 的块统一为 {type, ns, data}

完整代码

from dotenv import load_dotenv

load_dotenv()

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model

model = init_chat_model(
    "deepseek:deepseek-chat",
    temperature=0.5,
    max_tokens=2500,
    timeout=300,
    max_retries=6,
)


def get_weather(city: str) -> str:
    """获取某城市的天气。"""
    print(f"  [tool] {city}", flush=True)
    return f"{city}今天晴,25°C。"


agent = create_agent(
    model=model,
    tools=[get_weather],
    system_prompt="需要事实时调用工具。回答要短。",
)

print("=== updates:每一步状态 ===")
for chunk in agent.stream(
    {"messages": [{"role": "user", "content": "用工具查杭州天气。"}]},
    stream_mode="updates",
    version="v2",
):
    print(chunk.get("type"), list((chunk.get("data") or {}).keys()))

print("=== messages:逐 token ===")
for chunk in agent.stream(
    {"messages": [{"role": "user", "content": "用五个字形容杭州。"}]},
    stream_mode="messages",
    version="v2",
):
    data = chunk.get("data")
    text = getattr(data, "content", None) or ""
    if text:
        print(text, end="", flush=True)
print()

updates 适合进度条;messages 适合打字机效果。HITL 时从流里读 __interrupt__

练习

  1. stream_mode 改成 ["updates", "messages"],按 chunk["type"] 分支打印。
  2. 只问不需要工具的问题,对比 updates 的步数。

本章验收

  •  能独立写出 stream(..., version="v2")
  •  能区分 updates 和 messages

对照仓库:07-流式输出/Streaming流式输出.py

下一课:测试


标题:流式输出
作者:llp
地址:https://llinp.cn/articles/2026/08/23/1787493123158.html