跳至主要内容

如何在后台运行回调

先决条件

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

默认情况下,LangChain.js 回调是阻塞的。这意味着执行将等待回调返回或超时,然后再继续。这样做有助于确保如果您在无服务器环境(如 AWS LambdaCloudflare Workers)中运行代码,这些回调总会在执行上下文结束之前完成。

但是,如果您在传统的、有状态的环境中运行,这可能会增加不必要的延迟。如果需要,您可以将回调设置为在后台运行,以避免这种额外的延迟,方法是将 LANGCHAIN_CALLBACKS_BACKGROUND 环境变量设置为 "true"。然后,您可以导入全局 awaitAllCallbacks 方法,以确保所有回调在必要时完成。

为了说明这一点,我们将创建一个 自定义回调处理程序,该处理程序需要一些时间才能解析,并显示设置和未设置 LANGCHAIN_CALLBACKS_BACKGROUND 时的计时。这是在未设置变量时的代码

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

Deno.env.set("LANGCHAIN_CALLBACKS_BACKGROUND", "false");

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`);
Call finished
Elapsed time: 2005ms

这是在开启后台运行时的代码

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

Deno.env.set("LANGCHAIN_CALLBACKS_BACKGROUND", "true");

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

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

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

await awaitAllCallbacks();

console.log(`Final elapsed time: ${new Date().getTime() - startTime}ms`);
Initial elapsed time: 0ms
Call finished
Final elapsed time: 2098ms

下一步

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

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


本页对您有帮助吗?


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