如何在无服务器环境中等待回调
先决条件
本指南假定你熟悉以下概念
从 @langchain/[email protected]
开始,LangChain.js 回调在后台运行。这意味着执行 **不会** 等待回调返回,然后再继续。在 0.3.0
之前,此行为正好相反。
如果你在 无服务器环境(如 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()
调用会在回调返回之前返回。
下一步
你现在已经了解了如何在后台运行回调以减少延迟。
接下来,查看本节中的其他操作指南,例如 如何创建自定义回调处理程序。