一、回调概念
LangChain 提供了一个回调系统,允许您连接到 LLM 应用程序的各个阶段。这对于日志记录、监控、流式处理和其他任务非常有用。 您可以通过使用 API 中的 callbacks
参数订阅这些事件。这个参数是处理程序对象的列表,这些处理程序对象应该实现下面更详细描述的一个或多个方法。
二、回调事件(Callback Events)
三、回调处理程序
CallbackHandlers
是实现了 CallbackHandler 接口的对象,该接口对应于可以订阅的每个事件都有一个方法。 当事件触发时,CallbackManager
将在每个处理程序上调用适当的方法。
1 | #示例:callback_run.py |
四、传递回调函数
callbacks
属性在 API 的大多数对象(模型、工具、代理等)中都可用,在两个不同的位置上:
构造函数回调:在构造函数中定义,例如
ChatOpenAI;(callbacks=[handler], tags=['a-tag'])
。在这种情况下,回调函数将用于该对象上的所有调用,并且仅限于该对象。 例如,如果你使用构造函数回调初始化了一个聊天模型,然后在链式调用中使用它,那么回调函数只会在对该模型的调用中被调用。请求回调:传递给用于发出请求的
invoke
方法。在这种情况下,回调函数仅用于该特定请求,以及它包含的所有子请求(例如,调用触发对模型的调用的序列的调用,该模型使用在invoke()
方法中传递的相同处理程序)。 在invoke()
方法中,通过config
参数传递回调函数。
五、在运行时传递回调函数
许多情况下,当运行对象时,传递处理程序而不是回调函数会更有优势。当我们在执行运行时使用 callbacks
关键字参数传递 CallbackHandlers 时,这些回调函数将由执行中涉及的所有嵌套对象发出。例如,当通过一个处理程序传递给一个代理时,它将用于与代理相关的所有回调以及代理执行中涉及的所有对象,即工具和 LLM。
这样可以避免我们手动将处理程序附加到每个单独的嵌套对象上。以下是一个示例:
1 | # 示例:callback_run.py |
1 | Chain started, inputs:{'number': '2'} |
六、自定义 callback handlers 自定义 Chat model
LangChain 具有一些内置的回调处理程序,但通常您会希望创建具有自定义逻辑的自定义处理程序。
要创建自定义回调处理程序,我们需要确定我们希望处理的 event(s),以及在触发事件时我们希望回调处理程序执行的操作。然后,我们只需将回调处理程序附加到对象上,例如通过构造函数或运行时。
在下面的示例中,我们将使用自定义处理程序实现流式处理。
在我们的自定义回调处理程序 MyCustomHandler
中,我们实现了 on_llm_new_token
处理程序,以打印我们刚收到的令牌。然后,我们将自定义处理程序作为构造函数回调附加到模型对象上。
1 | # 示例:callback_process.py |
1 | My custom handler, token: |
可以查看此参考页面以获取您可以处理的事件列表。请注意,handle_chain_*
事件适用于大多数 LCEL 可运行对象。