langchain的流式事件监听astream_event()、todo运行机制

📅 发布时间:2026/7/13 1:52:29 👁️ 浏览次数:
langchain的流式事件监听astream_event()、todo运行机制
文章目录监听事件要点示例支持哪些事件astream_event()方法为什么没有return呢?langchain1.2的又一大新特性。监听事件要点1、要用.astream_event()方法来调用。2、循环要用asycn for来循环 # 否则捕捉不到event示例新建python文件event_demo代码importasynciofromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserimportos API_KEYos.getenv(DASHSCOPE_API_KEY,YOUR API KEY)print(f 代码读取到的API_KEY{API_KEY})llmChatOpenAI(api_keyAPI_KEY,# 替换为你的实际 Key (sk-...)base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1,modelqwen-plus)promptChatPromptTemplate.from_template(讲一个关于{topic}的短笑话)parserStrOutputParser()# 2. 构建链 (LCEL)chainprompt|llm|parser# 3. 定义异步主函数asyncdefmain():print( 开始流式监听事件...\n)# astream_events 是核心方法# versionv2 是 LangChain 1.0 推荐的事件流版本asyncforeventinchain.astream_events({topic:程序员},versionv2):# 事件类型 (kind) 决定了当前发生了什么kindevent[event]# --- 场景 A: 模型开始生成内容 (流式打字机效果) ---ifkindon_chat_model_stream:# 获取模型生成的文字片段contentevent[data][chunk].content# 实时打印end 防止换行flushTrue 确保立即显示print(content,end,flushTrue)# --- 场景 B: 链/工具开始执行 (用于显示状态) ---elifkindon_chain_start:nameevent.get(name)ifname:print(f\n\n [系统] 开始执行:{name})# --- 场景 C: 链/工具执行结束 ---elifkindon_chain_end:print(f\n✅ [系统] 执行完毕)# 4. 运行if__name____main__:asyncio.run(main())输出结果 代码读取到的API_KEYsk-e49bdf8d737549ffb6269b63bcff8a7a 开始流式监听事件...[系统]开始执行:RunnableSequence 当然可以**笑话**程序员去咖啡馆点单。 服务员“您好请问要什么” 程序员“我要一杯咖啡不加糖不加奶不加冰不加盖不加吸管……等等先别下单——我得先 git status 一下确认自己没在 develop 分支上点单。” 服务员“……您确定要的是咖啡不是 coffee.exe 的调试日志” 停顿两秒 程序员叹了口气“算了还是 git checkout--coffee_order 吧……我刚刚好像把‘加糖’改成了‘删糖’。” ☕️*——毕竟人生最大的 bug往往不是逻辑错误而是需求没写清楚。*需要再来一个比如 Python 版/前端版/摸鱼版 ✅[系统]执行完毕解读支持哪些事件也可以从chain.astream_events()这个方法跟代码跟进去查看往下滑几行就是。如下图事件名称 (event)触发时机关键数据 (event[data])典型用途on_chat_model_start模型接收到请求准备开始推理时input: 包含消息列表 (messages)记录请求参数统计 Token 消耗前的准备on_chat_model_stream模型生成新 Token 时 (高频触发)chunk: 包含新生成的文本片段 (AIMessageChunk)打字机效果实时显示 AI 回答on_chat_model_end模型完成所有推理返回最终结果时output: 完整的 AI 回复对象统计总耗时获取完整的回复内容on_tool_startAgent 决定调用某个工具时input: 工具调用的参数 (JSON)显示“正在调用搜索工具…”展示工具参数on_tool_end工具执行完毕返回结果给 Agent 时output: 工具返回的原始数据显示工具执行结果调试工具调用逻辑on_chain_start任意链 (Chain) 或自定义组件开始时input: 输入数据追踪复杂链的执行进度on_chain_stream链中的组件产生流式输出时chunk: 中间产生的数据块监听中间步骤的流式数据on_chain_end链或组件执行结束时output: 该步骤的最终输出确认步骤完成获取中间结果on_retriever_start检索器 (RAG) 开始查找文档时input: 查询语句 (query)显示“正在知识库中搜索…”on_retriever_end检索器返回文档列表时output: 找到的文档列表 (Documents)展示参考来源调试检索质量on_prompt_start提示词模板开始填充变量时input: 原始变量值调试 Prompt 模板是否正确接收了变量on_prompt_end提示词构建完成准备发给模型时output: 构建好的 Prompt 对象查看最终发送给 LLM 的完整 Promptastream_event()方法为什么没有return呢?好问题就是没有return因为它不是一个常规方法而是一个生成器。