如何在serverless环境中等待回调
先决条件
本指南假定您熟悉以下概念
从 @langchain/core@0.3.0
开始,LangChain.js 回调在后台运行。这意味着执行将不会等待回调返回后再继续。在 0.3.0
之前,此行为是相反的。
如果您在 serverless 环境(如 AWS Lambda 或 Cloudflare 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()
调用在返回之前等待回调返回。
下一步
您现在已经学习了如何在后台运行回调以减少延迟。
接下来,查看本节中的其他操作指南,例如如何创建自定义回调处理程序。