Skip to main content

回调函数

info

请前往Integrations查看内置回调函数与第三方工具的集成文档。

LangChain提供了一个回调函数系统,允许您在LLM应用程序的各个阶段进行钩子操作。这对于日志记录、监控、流式处理和其他任务非常有用。

您可以通过使用API中的callbacks参数来订阅这些事件。该参数是一个处理程序对象的列表,这些处理程序对象应该实现下面更详细描述的一个或多个方法。

回调函数处理程序

CallbackHandlers是实现CallbackHandler接口的对象,该接口为每个可订阅的事件定义了一个方法。当触发事件时,CallbackManager将调用每个处理程序上的适当方法。

class BaseCallbackHandler:
"""用于处理来自LangChain的回调函数的基本回调函数处理程序。"""

def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
) -> Any:
"""LLM开始运行时运行。"""

def on_chat_model_start(
self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any
) -> Any:
"""Chat Model开始运行时运行。"""

def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
"""在新的LLM令牌上运行。仅在启用流式处理时可用。"""

def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:
"""LLM结束运行时运行。"""

def on_llm_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""LLM出错时运行。"""

def on_chain_start(
self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
) -> Any:
"""链开始运行时运行。"""

def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> Any:
"""链结束运行时运行。"""

def on_chain_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""链出错时运行。"""

def on_tool_start(
self, serialized: Dict[str, Any], input_str: str, **kwargs: Any
) -> Any:
"""工具开始运行时运行。"""

def on_tool_end(self, output: str, **kwargs: Any) -> Any:
"""工具结束运行时运行。"""

def on_tool_error(
self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any
) -> Any:
"""工具出错时运行。"""

def on_text(self, text: str, **kwargs: Any) -> Any:
"""在任意文本上运行。"""

def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:
"""在代理动作上运行。"""

def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:
"""在代理结束时运行。"""

入门

LangChain提供了一些内置处理程序,您可以使用它们来入门。这些处理程序在langchain/callbacks模块中可用。最基本的处理程序是StdOutCallbackHandler,它只是将所有事件记录到stdout

注意:当对象上的verbose标志设置为true时,即使没有显式传递,StdOutCallbackHandler也会被调用。

from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

handler = StdOutCallbackHandler()
llm = OpenAI()
prompt = PromptTemplate.from_template("1 + {number} = ")

# 构造函数回调:首先,在初始化链时明确设置StdOutCallbackHandler
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[handler])
chain.run(number=2)

# 使用verbose标志:然后,使用`verbose`标志来实现相同的结果
chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
chain.run(number=2)

# 请求回调:最后,使用请求的`callbacks`来实现相同的结果
chain = LLMChain(llm=llm, prompt=prompt)
chain.run(number=2, callbacks=[handler])

输出结果:

> 进入新的LLMChain链...
格式化后的提示:
1 + 2 =

> 完成链。

> 进入新的LLMChain链...
格式化后的提示:
1 + 2 =

> 完成链。

> 进入新的LLMChain链...
格式化后的提示:
1 + 2 =

> 完成链。

'\n\n3'

在哪里传递回调函数

callbacks参数在API中的大多数对象(链、模型、工具、代理等)上都可用,并且有两个不同的位置:

  • 构造函数回调:在构造函数中定义,例如LLMChain(callbacks=[handler], tags=['a-tag']),将用于该对象上进行的所有调用,并且仅限于该对象的范围。例如,如果您将处理程序传递给LLMChain构造函数,它将不会被附加到该链上的模型使用。
  • 请求回调:在发出请求的run()/apply()方法中定义,例如chain.run(input, callbacks=[handler]),将仅用于该特定请求以及其中包含的所有子请求(例如,对LLMChain的调用触发对模型的调用,该模型使用在call()方法中传递的相同处理程序)。

verbose参数在API中的大多数对象(链、模型、工具、代理等)上都可用作构造函数参数,例如LLMChain(verbose=True),它等效于将ConsoleCallbackHandler传递给该对象及其所有子对象的callbacks参数。这对于调试非常有用,因为它会将所有事件记录到控制台。

何时使用每个选项?

  • 构造函数回调函数最适用于日志记录、监控等与单个请求无关,而是与整个链相关的用例。例如,如果您想要记录所有发送到LLMChain的请求,可以将处理程序传递给构造函数。
  • 请求回调函数最适用于流式传输等用例,其中您希望将单个请求的输出流式传输到特定的WebSocket连接或其他类似的用例。例如,如果您想要将单个请求的输出流式传输到WebSocket,可以将处理程序传递给call()方法。