跳至主要内容

如何在无服务器环境中等待回调

先决条件

本指南假定你熟悉以下概念

@langchain/[email protected] 开始,LangChain.js 回调在后台运行。这意味着执行 **不会** 等待回调返回,然后再继续。在 0.3.0 之前,此行为正好相反。

如果你在 无服务器环境(如 AWS LambdaCloudflare Workers)中运行代码,则应将回调设置为阻塞,以使它们有时间完成或超时。

要使回调阻塞,请将 LANGCHAIN_CALLBACKS_BACKGROUND 环境变量设置为 "false"。或者,你可以导入全局 awaitAllCallbacks 方法,以确保在必要时所有回调都完成。

为了说明这一点,我们将创建一个 自定义回调处理程序,它需要一些时间来解析,并显示有无 LANGCHAIN_CALLBACKS_BACKGROUND 设置为 "false" 的时间。以下是未设置变量以及全局 awaitAllCallbacks 的代码

import { RunnableLambda } from "@langchain/core/runnables";
import { awaitAllCallbacks } from "@langchain/core/callbacks/promises";

const runnable = RunnableLambda.from(() => "hello!");

const customHandler = {
handleChainEnd: async () => {
await new Promise((resolve) => setTimeout(resolve, 2000));
console.log("Call finished");
},
};

const startTime = new Date().getTime();

await runnable.invoke({ number: "2" }, { callbacks: [customHandler] });

console.log(`Elapsed time: ${new Date().getTime() - startTime}ms`);

await awaitAllCallbacks();

console.log(`Final elapsed time: ${new Date().getTime() - startTime}ms`);
Elapsed time: 1ms
Call finished
Final elapsed time: 2164ms

我们可以看到,最初的 runnable.invoke() 调用在很短的时间内完成,然后大约两秒钟后,回调完成。

以下是关闭后台处理的代码

process.env.LANGCHAIN_CALLBACKS_BACKGROUND = "false";

const startTimeBlocking = new Date().getTime();

await runnable.invoke({ number: "2" }, { callbacks: [customHandler] });

console.log(
`Initial elapsed time: ${new Date().getTime() - startTimeBlocking}ms`
);
Call finished
Initial elapsed time: 2002ms

这次,初始调用本身需要两秒钟,因为 invoke() 调用会在回调返回之前返回。

下一步

你现在已经了解了如何在后台运行回调以减少延迟。

接下来,查看本节中的其他操作指南,例如 如何创建自定义回调处理程序


此页面有帮助吗?


你也可以在 GitHub 上留下详细的反馈 在 GitHub 上.