跳到主要内容

如何在serverless环境中等待回调

先决条件

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

@langchain/core@0.3.0 开始,LangChain.js 回调在后台运行。这意味着执行将不会等待回调返回后再继续。在 0.3.0 之前,此行为是相反的。

如果您在 serverless 环境(如 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 上.