文章

langchain不看教程快速入门的踩坑

本文用于在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) 通常包含以下关键信息:

  1. event (事件类型): 这是一个字符串,指示事件的类型,例如:

    • on_chain_starton_chain_endon_chain_stream (链的开始/结束/流式输出)

    • on_chat_model_starton_chat_model_endon_chat_model_stream (聊天模型的开始/结束/流式输出,通常是 LLM 生成 token)

    • on_tool_starton_tool_end (工具的开始/结束执行)

    • on_retriever_starton_retriever_end (检索器的开始/结束执行)

    • on_llm_starton_llm_endon_llm_stream (底层 LLM 的开始/结束/流式输出)

    • on_agent_action (Agent 决定执行某个动作,如调用工具)

    • on_agent_finish (Agent 完成思考并准备给出最终答案)

    • on_parser_starton_parser_end (输出解析器的开始/结束)

  2. run_id: 每次执行的唯一标识符。

  3. name: 正在执行的 Runnable (见后文)的名称。

  4. data: 包含事件的具体数据。这通常是最重要的部分,它根据事件类型而变化:

    • 对于 on_chat_model_streamdata 会包含 chunk (LLM 生成的文本块)。

    • 对于 on_tool_startdata 会包含 input (工具的输入参数)。

    • 对于 on_tool_enddata 会包含 output (工具的输出结果)。

  • Runnable 接口: LangChain 将所有可执行的组件(如 LLM、PromptTemplate、Chain、Tool、AgentExecutor 等)都抽象为 Runnable。这意味着它们都共享一套标准的方法,包括:

    • invoke(): 同步执行一次。

    • ainvoke(): 异步执行一次。

    • stream(): 同步流式传输最终结果(如果支持)。

    • astream(): 异步流式传输最终结果(如果支持)。

    • astream_events()异步流式传输执行过程中的所有事件

    • astream_log(): 异步流式传输结构化的执行日志。

    • batch()/abatch(): 批量执行。

    • with_types(): 强制输入输出类型。

    • bind(): 绑定参数。

    • pipe(): 链式调用。

暂无评论

发表评论