函数回调 | 豆包MarsCode AI 刷题

49 阅读3分钟

LangChain提供了一个回调函数系统,允许我们在LLM应用的各个阶段进行钩子处理。这对于日志记录、监控、流处理和其他任务非常有用。我们可以通过使用API中提供的callbacks参数来订阅这些事件。该参数是一个处理程序对象列表,这些处理程序对象应该实现下面更详细描述的一个或多个方法。主要有两种回调机制:

构造器回调将用于在该对象上进行的所有调用,并且将仅作用于该对象,即如果将处理程序传递给LLMChain的构造函数,则不会被附加到该链上的模型使用。 请求回调仅用于该特定请求,以及该请求包含的所有子请求(例如,对LLMChain的调用触发对模型的调用,使用的是通过传递的相同处理程序),这些回调是显式传递的。 当我们创建一个自定义链时,可以轻松设置它以使用与所有内置链相同的回调系统。链、LLM、聊天模型、代理工具上的_call、_generate、_run和等效的异步方法现在接收第二个名为run_manager的参数,该参数绑定到该运行,其中包含该对象可以使用的日志记录方法(例如on_llm_new_token)。这在构建自定义链时非常有用,我们还参阅创建自定义链并在其中使用回调的指南获取更多信息。

使用回调函数 callbacks参数在API的大多数对象(链、模型、工具、代理等)中都可以使用,在两个不同的位置:

构造器回调:在构造函数中定义,例如LLMChain(callbacks=[handler], tags=['a-tag']),将用于在该对象上进行的所有调用,并且将仅作用于该对象,例如,如果要记录发送到LLMChain的所有请求,可以在构造函数中传递一个处理程序。 请求回调:在发出请求的call()、run()、apply()方法中定义,例如chain.call(inputs, callbacks=[handler], tags=['a-tag']),仅用于该特定请求,以及该请求包含的所有子请求(例如,对LLMChain的调用触发对模型的调用,使用的是通过call()方法传递的相同处理程序)。 verbose参数在API的大多数对象(链、模型、工具、代理等)中作为构造函数参数可用,例如LLMChain(verbose=True),它等效于将ConsoleCallbackHandler传递给该对象及其所有子对象的callbacks参数。这对于调试非常有用,因为它会将所有事件记录到控制台。

构造器回调最适用于与单个请求无关的用例,例如日志记录、监控等。例如,如果要记录发送到LLMChain的所有请求,可以将处理程序传递给构造函数。 请求回调最适用于流处理等用例,其中您希望将单个请求的输出流式传输到特定的Websocket连接或其他类似的用例。例如,如果要将单个请求的输出流式传输到Websocket,可以在call()方法中传递一个处理程序。 标签 我们可以通过将tags参数传递给call()、run()、apply()方法来为回调函数添加标签。这对于筛选日志非常有用,例如,如果要记录发送到特定LLMChain的所有请求,可以添加一个标签,然后根据该标签筛选日志。您可以在构造器和请求回调中都传递标签,详细信息请参见上面的示例。这些标签然后传递给start回调方法(例如on_llm_start、on_chat_model_start、on_chain_start、on_tool_start)的tags参数。

使用现有处理程序 LangChain提供了一些内置处理程序,我们可以使用它们来开始使用。这些处理程序在langchain.callbacks模块中可用。最基本的处理程序是StdOutCallbackHandler,它简单地将所有事件记录到stdout。在将来,我们将向库中添加更多默认处理程序。