LangChain v1Note 10

第 5 章:流式输出与观测

ainvoke 适合只要最终 state;astream 适合 UI 或实时日志;astreamevents(version="v2") 适合查看 Runnable/Agent 的嵌套生命周期。三者都执行真实工作,不要为了“流式”重复调用 Agent。

ainvoke 适合只要最终 state;astream 适合 UI 或实时日志;astream_events(version="v2") 适合查看 Runnable/Agent 的嵌套生命周期。三者都执行真实工作,不要为了“流式”重复调用 Agent。

async for chunk in agent.astream(input, stream_mode="updates"):
    print(chunk)  # 节点 state 更新,不等同于纯文本 token

async for event in agent.astream_events(input, version="v2", config=config):
    if event["event"] == "on_chat_model_start":
        print(event["name"])
参数/概念 用法
stream_mode="updates" 节点完成后的 state patch;最适合 Agent 调试
stream_mode="messages" 模型消息 token/metadata 流;最适合聊天 UI
astream_events(..., version="v2") event 名称、run id、parent ids、tags、metadata;用于链路诊断
config["tags"] 非敏感分类,如 learningagent;可在 LangSmith 筛选
config["metadata"] 非敏感诊断键值;可能被追踪后端保存

LangSmith 只在环境变量启用后接收 trace;本地 event 流不要求远端观测服务。禁止把 API key、JWT、完整用户消息、检索全文写进 tags/metadata。当前项目的 langsmith:nostream 是其 trace 标签约定,不是 Python 的 async 开关。

运行 09_streaming_observability.py 会进行一次很短的 Agent 调用,同时打印 node update 和模型启动事件。

相关资源

  • 查看示例代码:docs/langchain/examples/09_streaming_observability.py
    """Chapter 5: inspect one Agent run as updates and Runnable events."""
    
    import asyncio
    
    from dotenv import load_dotenv
    from langchain.agents import create_agent
    from langchain.chat_models import init_chat_model
    
    from open_deep_research.configuration import Configuration
    
    
    load_dotenv()
    
    
    async def main() -> None:
        settings = Configuration.from_env()
        agent = create_agent(
            init_chat_model(model=settings.research_model, max_tokens=60),
            system_prompt="用一句中文回答。",
            name="learning_stream_agent",
        )
        input_value = {"messages": [("user", "什么是 Agent state?")]}
        config = {"tags": ["learning", "agent-stream"], "metadata": {"lesson": "05"}}
    
        updates = []
        async for update in agent.astream(input_value, config=config, stream_mode="updates"):
            updates.extend(update)
        assert "model" in updates
    
        model_starts = []
        async for event in agent.astream_events(input_value, config=config, version="v2"):
            if event["event"] == "on_chat_model_start":
                model_starts.append(event["name"])
        assert model_starts
        print("更新节点: " + ", ".join(updates))
        print("模型事件: " + ", ".join(model_starts))
    
    
    if __name__ == "__main__":
        asyncio.run(main())