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