Callbacks
LangChain 提供了一个回调系统,允许您在 LLM 应用程序的各个阶段进行钩子操作。这对于记录、监控、流式传输和其他任务非常有用。
您可以通过使用 API 中可用的 callbacks 参数来订阅这些事件。该参数是一个处理程序(handler)对象的列表,这些对象需要实现以下更详细描述的一个或多个方法。
回调事件
| 事件类型 | 事件触发条件 | 关联方法 |
|---|---|---|
| 聊天模型启动 | 当聊天模型启动时 | on_chat_model_start |
| LLM 启动 | 当 LLM 启动时 | on_llm_start |
| LLM new token | 当 LLM 或聊天模型生成新 token 时 | 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 |
| 代理动作 | 当代理采取行动时 | on_agent_action |
| 代理结束 | 当代理结束时 | on_agent_finish |
| 检索器启动 | 当检索器启动时 | on_retriever_start |
| 检索器结束 | 当检索器结束时 | on_retriever_end |
| 检索器错误 | 当检索器出错时 | on_retriever_error |
| 文本 | 当执行任意文本时 | on_text |
| 重试 | 当重试事件执行时 | on_retry |
回调处理程序(Callback handlers)
回调处理程序可以是同步的或异步的:
- 同步回调处理程序实现BaseCallbackHandler接口。
- 异步回调处理程序实现AsyncCallbackHandler接口。
在运行时,LangChain会配置一个合适的回调管理器(例如CallbackManager或AsyncCallbackManager),当事件被触发时,回调管理器负责调用每个“已注册”回调处理程序上的相应方法。
传递回调callbacks
API中的大多数对象(模型Models、工具Tools、代理Agents等)在两个不同的位置都提供 callbacks 属性:
请求时回调:与输入数据一起在请求时传递。适用于所有标准的
Runnable对象。这些回调会被它们定义的对象的所有子对象继承。例如:chain.invoke({"number": 25}, {"callbacks": [handler]})。构造函数回调:例如
chain = TheNameOfSomeChain(callbacks=[handler])。这些回调作为对象构造函数的参数传递。回调仅限于定义它们的对象作用域内,不会被对象的子对象继承。
危险
构造函数回调仅限于它们定义的对象作用域内,不会被对象的子对象继承。
如果您创建自定义chain或runable,您需要记得将请求时回调传递给任何子对象。
Async in Python<=3.10
在 Python 3.10 及以下版本中,任何 RunnableLambda、RunnableGenerator 或调用其他可运行对象并以异步方式运行的工具,都必须手动将回调传递给子对象。这是因为在这种情况下,LangChain 无法自动将回调传递给子对象。
这也是为什么您可能无法从自定义可运行对象或工具中看到事件发出的常见原因。
有关如何使用回调的具体信息,请参阅此处相关的操作指南。