流式输出
你将学会: 用 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__。
练习
- 把
stream_mode改成["updates", "messages"],按chunk["type"]分支打印。 - 只问不需要工具的问题,对比 updates 的步数。
本章验收
- 能独立写出
stream(..., version="v2") - 能区分 updates 和 messages
对照仓库:07-流式输出/Streaming流式输出.py
下一课:测试
JavaWeb
Spring
MyBatis
linux
消息队列
JavaSE
工具
片段
AI
搜索
dy