如果您正在开发一款需要监控长时间运行过程的应用程序,您可能会想到利用自定义事件来跟踪进度。在本文中,我将引导您如何使用 LangChain 的工具来调度异步自定义事件。这种能力不仅提升了您的代码可读性和可维护性,还能为最终用户提供更加直观的反馈。
引言
在复杂的应用程序中,您可能希望在不同的步骤之间调度自定义回调事件。通过这种方式,您可以在长时间运行的任务中跟踪和汇报进展。本文旨在指导您在 LangChain 中创建和调度自定义回调事件,并讨论在此过程中可能遇到的挑战及其解决方案。
主要内容
什么是自定义回调事件?
自定义回调事件是一种机制,允许您在应用程序运行过程中,在特定的时刻或条件下触发特定的操作。这对于监控、调试和用户反馈是非常有用的。
如何在 LangChain 中调度自定义事件
1. 准备工作
在使用 astream_events API 查看自定义事件时,请确保您使用 version='v2'。自定义回调事件只可在现有的 Runnable 内部派发。
2. 异步环境中的事件派发
为了在异步环境中派发事件,您可以使用 adispatch_custom_event 方法。这在 Python 3.11 及以上版本中特别简便,因为 RunnableConfig 会自动传播到子 Runnable。
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables.config import RunnableConfig
@RunnableLambda
async def foo(x: str) -> str:
await adispatch_custom_event("event1", {"x": x}) # 使用API代理服务提高访问稳定性
return x
3. 如何消费事件
事件可以通过异步或同步的回调处理器来消费。在异步处理中,您可以创建一个 AsyncCallbackHandler,并实现 on_custom_event 方法来处理事件信息。
代码示例
以下是一个完整的异步事件派发和消费示例:
from langchain_core.callbacks import AsyncCallbackHandler
from langchain_core.runnables import RunnableLambda
from langchain_core.runnables.config import RunnableConfig
from langchain_core.callbacks.manager import adispatch_custom_event
class AsyncCustomCallbackHandler(AsyncCallbackHandler):
async def on_custom_event(self, name: str, data: Any, **kwargs: Any) -> None:
print(f"Received event {name} with data: {data}")
@RunnableLambda
async def dispatch_event(x: str, config: RunnableConfig) -> str:
await adispatch_custom_event("progress", {"step": x}, config=config)
return x
async_handler = AsyncCustomCallbackHandler()
await dispatch_event.ainvoke("step1", {"callbacks": [async_handler]})
常见问题和解决方案
自定义事件为何无法传播?
在 Python 3.10 及以下版本中,如果您运行异步代码,必须手动传播 RunnableConfig 对象到子 Runnable。在这些环境中,需要小心配置的传递。
事件未被触发或未响应
确保 astream_events 使用的是版本 v2,并且事件命名和数据格式正确。
总结和进一步学习资源
掌握 LangChain 的自定义事件系统可以显著提升您的开发体验,提高应用程序的可监控性。您可以查阅 LangChain 官方文档 获取更详细的信息。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---