回调函数
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()
方法。