回调
前提条件
LangChain 提供了一个回调系统,允许您hook到 LLM 应用的各个阶段。这对于日志记录、监控、流式传输和其他任务非常有用。
您可以使用整个 API 中可用的 callbacks
参数来订阅这些事件。此参数是处理程序对象列表,这些对象应实现以下更详细描述的一种或多种方法。
回调事件
事件 | 事件触发器 | 关联方法 |
---|---|---|
聊天模型启动 | 当聊天模型启动时 | on_chat_model_start |
LLM 启动 | 当 LLM 启动时 | on_llm_start |
LLM 新令牌 | 当 LLM 或聊天模型发出新令牌时 | on_llm_new_token |
LLM 结束 | 当 LLM 或聊天模型结束时 | on_llm_end |
LLM 错误 | 当 LLM 或聊天模型出错时 | on_llm_error |
链启动 | 当链开始运行时 | on_chain_start |
链结束 | 当链结束时 | on_chain_end |
链错误 | 当链出错时 | on_chain_error |
工具启动 | 当工具开始运行时 | on_tool_start |
工具结束 | 当工具结束时 | on_tool_end |
工具错误 | 当工具出错时 | on_tool_error |
Agent 操作 | 当 Agent 执行操作时 | on_agent_action |
Agent 完成 | 当 Agent 结束时 | on_agent_finish |
检索器启动 | 当检索器启动时 | on_retriever_start |
检索器结束 | 当检索器结束时 | on_retriever_end |
检索器错误 | 当检索器出错时 | on_retriever_error |
文本 | 当任意文本运行时 | on_text |
重试 | 当重试事件运行时 | on_retry |
回调处理程序
回调处理程序可以是同步的或异步的
- 同步回调处理程序实现 BaseCallbackHandler 接口。
- 异步回调处理程序实现 AsyncCallbackHandler 接口。
在运行时,LangChain 会配置一个适当的回调管理器(例如,CallbackManager 或 AsyncCallbackManager),它将负责在事件触发时调用每个“已注册”回调处理程序上的适当方法。
传递回调
callbacks
属性在整个 API 中的大多数对象(模型、工具、Agent 等)上都可用,并且在两个不同的位置
- 请求时回调:在请求时以及输入数据一起传递。在所有标准 Runnable 对象上可用。这些回调由定义它们的对象的所有子对象继承。例如,
chain.invoke({"number": 25}, {"callbacks": [handler]})
。 - 构造函数回调:
chain = TheNameOfSomeChain(callbacks=[handler])
。这些回调作为参数传递给对象的构造函数。回调的作用域仅限于定义它们的对象,并且不会被对象的任何子对象继承。
警告
构造函数回调的作用域仅限于定义它们的对象。它们不会被对象的子对象继承。
如果您正在创建自定义链或 runnable,则需要记住将请求时回调传播到任何子对象。
Python<=3.10 中的异步
任何 RunnableLambda、RunnableGenerator 或 Tool,如果在 python<=3.10 中以异步方式运行并调用其他 runnables,则必须手动将回调传播到子对象。这是因为在这种情况下,LangChain 无法自动将回调传播到子对象。
这是您可能无法看到从自定义 runnables 或工具发出的事件的常见原因。
有关如何使用回调的具体信息,请参阅此处的相关操作指南。