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