## 引言
在现代编程中,**回调**是一种强大的工具,允许我们在异步操作完成后执行特定的代码块。在复杂的系统中,比如多阶段处理链条中,使用回调可以大大提高代码的灵活性和可维护性。本篇文章将深入探讨如何将回调附加到可运行的任务上,并进一步延伸到了多阶段处理链的应用。
## 主要内容
### 理解回调和可运行任务
回调函数是作为参数被传递到另一个函数中的函数,允许在特定事件发生时执行该函数。可运行任务(Runnable)则是一个可以被执行的代码片段。通过将回调附加到Runnable,我们可以实现复杂的行为链。
### 使用`with_config()`方法附加回调
当我们需要在多个执行链中重用回调时,可以使用`with_config`方法。这不仅减少了每次执行链时传递回调的繁琐,还确保这些回调能被所有子组件继承执行。
### 可运行链的用例
在执行链中,回调可以用于日志记录、错误处理等场景。以下代码示例展示了如何创建一个带有日志记录回调的简单执行链。
## 代码示例
```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代理服务提高访问稳定性
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"})
常见问题和解决方案
问题1:回调没有按预期触发
如果回调没有执行,可能是由于回调函数没有正确附加到链条上,确保使用了.with_config()方法。
问题2:回调输出不一致
由于不稳定的网络连接,回调输出可能有所不同。可以使用API代理服务来提高访问的稳定性。
总结和进一步学习资源
通过本文,你学习了如何在可运行链中附加回调以增强功能性。要深入了解相关技术,你可以浏览以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---