本文用于在AI辅助及参考某技术博客上铺天盖地的、未经验证的AI文下快速入门langchain时的一些踩坑
1.如果想展示Agent的具体流程 包括模型的流式输出、工具调用判断 则必须使用
astream_events 为什么呢
-
AgentExecutor 的 astream() 方法默认情况下只会流式传输最终的 LLM 回复。 它不会在工具调用进行时中断并给你中间反馈。这意味着,如果 Agent 需要调用工具,它会先等待工具执行完毕,然后 LLM 生成最终回复时,才会开始流式输出。你不会在工具调用期间看到任何流式文本。
-
局限性: 对于 Agent 这种需要在工具调用过程中也给用户反馈的场景,astream() 就不够用了,因为它只提供最终的流式输出,缺乏中间步骤的可见性。stream()同理。
然而AI们总喜欢幻觉出一个 stream_events
这并非langchain版本、环境所致,而是langchain根本就没有这个。参考有人去年提过一个issue:Runnables have `astream_events`, but no synchronous `stream_events` · Issue #21918 · langchain-ai/langchain
event返回的事件 (StreamEvent) 通常包含以下关键信息:
-
event (事件类型): 这是一个字符串,指示事件的类型,例如:
-
on_chain_start, on_chain_end, on_chain_stream (链的开始/结束/流式输出)
-
on_chat_model_start, on_chat_model_end, on_chat_model_stream (聊天模型的开始/结束/流式输出,通常是 LLM 生成 token)
-
on_tool_start, on_tool_end (工具的开始/结束执行)
-
on_retriever_start, on_retriever_end (检索器的开始/结束执行)
-
on_llm_start, on_llm_end, on_llm_stream (底层 LLM 的开始/结束/流式输出)
-
on_agent_action (Agent 决定执行某个动作,如调用工具)
-
on_agent_finish (Agent 完成思考并准备给出最终答案)
-
on_parser_start, on_parser_end (输出解析器的开始/结束)
-
-
run_id: 每次执行的唯一标识符。
-
name: 正在执行的 Runnable (见后文)的名称。
-
data: 包含事件的具体数据。这通常是最重要的部分,它根据事件类型而变化:
-
对于 on_chat_model_stream,data 会包含 chunk (LLM 生成的文本块)。
-
对于 on_tool_start,data 会包含 input (工具的输入参数)。
-
对于 on_tool_end,data 会包含 output (工具的输出结果)。
-
-
Runnable 接口: LangChain 将所有可执行的组件(如 LLM、PromptTemplate、Chain、Tool、AgentExecutor 等)都抽象为 Runnable。这意味着它们都共享一套标准的方法,包括:
-
invoke(): 同步执行一次。
-
ainvoke(): 异步执行一次。
-
stream(): 同步流式传输最终结果(如果支持)。
-
astream(): 异步流式传输最终结果(如果支持)。
-
astream_events(): 异步流式传输执行过程中的所有事件。
-
astream_log(): 异步流式传输结构化的执行日志。
-
batch()/abatch(): 批量执行。
-
with_types(): 强制输入输出类型。
-
bind(): 绑定参数。
-
pipe(): 链式调用。
-



暂无评论