Skip to content

回调Callbacks

在 LangChain 中,回调(Callbacks)是一种机制,允许你在模型执行的不同阶段插入自定义逻辑。回调可以用于记录日志、监控性能、处理异常、收集数据等。

LangChain 提供了多种回调处理器(Callback Handlers),你可以根据需要选择或自定义。

1. 回调的基本概念

回调处理器是 LangChain 中处理回调逻辑的组件。它们可以在以下事件发生时被触发:

  • on_chain_start: 当链(Chain)开始执行时。
  • on_chain_end: 当链执行结束时。
  • on_llm_start: 当语言模型(LLM)开始执行时。
  • on_llm_end: 当语言模型执行结束时。
  • on_tool_start: 当工具(Tool)开始执行时。
  • on_tool_end: 当工具执行结束时。
  • on_agent_action: 当代理(Agent)执行一个动作时。
  • on_agent_finish: 当代理完成执行时。

2. 使用内置回调处理器

LangChain 提供了一些内置的回调处理器,例如:

  • StdOutCallbackHandler: 将回调信息输出到标准输出。
  • FileCallbackHandler: 将回调信息写入文件。
  • WandbCallbackHandler: 将回调信息发送到 Weights & Biases 进行监控。

示例:使用 StdOutCallbackHandler

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

# 创建回调处理器
callback_handler = StdOutCallbackHandler()

# 创建 LLM 实例
llm = OpenAI(temperature=0.7, callbacks=[callback_handler])

# 创建 Prompt 模板
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

# 创建 LLMChain 实例
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[callback_handler])

# 运行链
chain.run("colorful socks")

在这个例子中,StdOutCallbackHandler 会在链和 LLM 执行的不同阶段输出信息到控制台。

3. 自定义回调处理器

你可以通过继承 BaseCallbackHandler 来创建自定义的回调处理器。

示例:自定义回调处理器

python
from langchain.callbacks.base import BaseCallbackHandler

class CustomCallbackHandler(BaseCallbackHandler):
    def on_llm_start(self, serialized, prompts, **kwargs):
        print(f"LLM started with prompts: {prompts}")

    def on_llm_end(self, response, **kwargs):
        print(f"LLM ended with response: {response}")

    def on_chain_start(self, serialized, inputs, **kwargs):
        print(f"Chain started with inputs: {inputs}")

    def on_chain_end(self, outputs, **kwargs):
        print(f"Chain ended with outputs: {outputs}")

# 使用自定义回调处理器
custom_handler = CustomCallbackHandler()

llm = OpenAI(temperature=0.7, callbacks=[custom_handler])
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[custom_handler])

chain.run("colorful socks")

在这个例子中,CustomCallbackHandler 会在 LLM 和链的不同阶段输出自定义信息。

4. 多个回调处理器

你可以同时使用多个回调处理器,只需将它们放入一个列表中传递给 callbacks 参数。

python
from langchain.callbacks import StdOutCallbackHandler

# 创建多个回调处理器
stdout_handler = StdOutCallbackHandler()
custom_handler = CustomCallbackHandler()

# 使用多个回调处理器
llm = OpenAI(temperature=0.7, callbacks=[stdout_handler, custom_handler])
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[stdout_handler, custom_handler])

chain.run("colorful socks")

5. 回调的异步支持

LangChain 还支持异步回调处理器。你可以通过继承 AsyncCallbackHandler 来实现异步回调。

示例:异步回调处理器

python
from langchain.callbacks.base import AsyncCallbackHandler

class AsyncCustomCallbackHandler(AsyncCallbackHandler):
    async def on_llm_start(self, serialized, prompts, **kwargs):
        print(f"Async LLM started with prompts: {prompts}")

    async def on_llm_end(self, response, **kwargs):
        print(f"Async LLM ended with response: {response}")

# 使用异步回调处理器
async_handler = AsyncCustomCallbackHandler()

llm = OpenAI(temperature=0.7, callbacks=[async_handler])
chain = LLMChain(llm=llm, prompt=prompt, callbacks=[async_handler])

chain.run("colorful socks")

6. 回调的应用场景

  • 日志记录: 记录模型执行的详细信息,便于调试和分析。
  • 性能监控: 监控模型执行的时间和资源消耗。
  • 异常处理: 在模型执行出错时进行自定义处理。
  • 数据收集: 收集模型生成的中间结果或最终输出。

回调是 LangChain 中非常强大的工具,可以帮助你在模型执行的不同阶段插入自定义逻辑。通过使用内置的回调处理器或自定义回调处理器,你可以灵活地控制和管理模型的执行过程。