如何在 LangChain 中分发自定义回调事件
引言
在使用 LangChain 构建复杂的 AI 应用时,我们经常需要监控长时间运行的任务进度或向最终用户提供实时反馈。自定义回调事件为此提供了一个强大的解决方案。本文将详细介绍如何在 LangChain 中分发和处理自定义回调事件,帮助你更好地控制和监控你的 AI 工作流程。
自定义回调事件基础
什么是自定义回调事件?
自定义回调事件是一种机制,允许你在 LangChain 的 Runnable
对象中触发自定义的事件。这些事件可以包含任意数据,用于传递进度信息、中间结果或其他重要的状态更新。
事件属性
每个自定义事件包含两个主要属性:
name
(str): 事件的名称,由用户自定义。data
(Any): 与事件关联的数据。建议使用 JSON 可序列化的数据。
分发自定义事件
异步环境
在异步环境中,我们使用 adispatch_custom_event
函数来分发事件:
from langchain_core.callbacks.manager import adispatch_custom_event
from langchain_core.runnables import RunnableLambda
@RunnableLambda
async def async_task(x: str) -> str:
await adispatch_custom_event("progress", {"step": 1, "message": "Started processing"})
# 执行一些操作
await adispatch_custom_event("progress", {"step": 2, "message": "Halfway done"})
# 完成处理
await adispatch_custom_event("progress", {"step": 3, "message": "Completed"})
return x
# 使用 API 代理服务提高访问稳定性
async for event in async_task.astream_events("input data", version="v2"):
print(event)
同步环境
对于同步环境,我们使用 dispatch_custom_event
函数:
from langchain_core.callbacks.manager import dispatch_custom_event
from langchain_core.runnables import RunnableLambda
@RunnableLambda
def sync_task(x: int) -> int:
dispatch_custom_event("start", {"value": x})
# 执行一些操作
dispatch_custom_event("end", {"result": x * 2})
return x * 2
# 使用 API 代理服务提高访问稳定性
result = sync_task.invoke(5)
print(result)
处理自定义事件
使用 Astream Events API
astream_events
方法是处理自定义事件最便捷的方式:
async for event in async_task.astream_events("input", version="v2"):
if event['event'] == 'on_custom_event':
print(f"Custom event: {event['name']}, Data: {event['data']}")
else:
print(f"Other event: {event['event']}")
使用自定义回调处理器
你也可以创建自定义的回调处理器来处理这些事件:
from langchain_core.callbacks import AsyncCallbackHandler
class CustomEventHandler(AsyncCallbackHandler):
async def on_custom_event(self, name: str, data: Any, **kwargs):
print(f"Received custom event '{name}' with data: {data}")
handler = CustomEventHandler()
await async_task.ainvoke("input", {"callbacks": [handler]})
常见问题和解决方案
-
事件不显示: 确保使用
version="v2"
参数调用astream_events
。 -
Python 3.10 及以下版本的兼容性: 在这些版本中,你需要手动传播
RunnableConfig
:@RunnableLambda async def task(x: str, config: RunnableConfig) -> str: await adispatch_custom_event("event", {"data": x}, config=config) return x
-
事件数据序列化: 始终使用 JSON 可序列化的数据作为事件数据,以确保兼容性。
总结
自定义回调事件为 LangChain 应用提供了强大的监控和反馈机制。通过本文介绍的技术,你可以在复杂的 AI 工作流程中实现细粒度的进度跟踪和状态报告。
进一步学习资源
- LangChain 官方文档: https://python.langchain.com/docs/modules/callbacks/
- LangChain GitHub 仓库: https://github.com/langchain-ai/langchain
- Python 异步编程指南: https://realpython.com/async-io-python/
参考资料
- LangChain 文档: “Custom Callback Events”, https://python.langchain.com/docs/modules/callbacks/custom_events
- Python 官方文档: “asyncio — Asynchronous I/O”, https://docs.python.org/3/library/asyncio.html
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—