如何在 LangChain 中分发自定义回调事件

如何在 LangChain 中分发自定义回调事件

引言

在使用 LangChain 构建复杂的 AI 应用时,我们经常需要监控长时间运行的任务进度或向最终用户提供实时反馈。自定义回调事件为此提供了一个强大的解决方案。本文将详细介绍如何在 LangChain 中分发和处理自定义回调事件,帮助你更好地控制和监控你的 AI 工作流程。

自定义回调事件基础

什么是自定义回调事件?

自定义回调事件是一种机制,允许你在 LangChain 的 Runnable 对象中触发自定义的事件。这些事件可以包含任意数据,用于传递进度信息、中间结果或其他重要的状态更新。

事件属性

每个自定义事件包含两个主要属性:

  1. name (str): 事件的名称,由用户自定义。
  2. 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]})

常见问题和解决方案

  1. 事件不显示: 确保使用 version="v2" 参数调用 astream_events

  2. Python 3.10 及以下版本的兼容性: 在这些版本中,你需要手动传播 RunnableConfig:

    @RunnableLambda
    async def task(x: str, config: RunnableConfig) -> str:
        await adispatch_custom_event("event", {"data": x}, config=config)
        return x
    
  3. 事件数据序列化: 始终使用 JSON 可序列化的数据作为事件数据,以确保兼容性。

总结

自定义回调事件为 LangChain 应用提供了强大的监控和反馈机制。通过本文介绍的技术,你可以在复杂的 AI 工作流程中实现细粒度的进度跟踪和状态报告。

进一步学习资源

参考资料

  1. LangChain 文档: “Custom Callback Events”, https://python.langchain.com/docs/modules/callbacks/custom_events
  2. Python 官方文档: “asyncio — Asynchronous I/O”, https://docs.python.org/3/library/asyncio.html

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值