跳转到主要内容

TLDR:我们宣布支持在浏览器、Cloudflare Workers、Vercel/Next.js、Deno、Supadase Edge Functions中运行LangChain.js,同时支持Node.js ESM和CJS。请参阅安装/升级文档和中断更改列表。

上下文

最初,我们将LangChain.js设计为在Node.js中运行,Node.js是长期存在的服务器端JavaScript运行时。早在二月份(时间过得很快!),我们就开始从社区收集关于我们应该支持哪些其他JS运行时的反馈,并从那时起收到了大量关于让LangChain在浏览器、Deno、Cloudflare Workers、Vercel/Next.JS、Vite、Supadase Edge Functions等上运行的请求。

更改以启用多个环境

从那以后,我们一直在与社区贡献者一起,为尽可能多的JS环境提供支持,这一过程中有一些亮点

  • 在这里将我们的代码库转换为ESM(CJS用户不必担心,我们也提供CJS构建)
  • 在可能的情况下删除了仅节点API的使用
  • 转换流式处理和批处理OpenAI请求以在此处和此处使用fetch
  • 与Replicate的人员合作,将他们的SDK转换为使用fetch
  • 创建了在我们支持的所有运行时中测试导入LangChain的包,请参阅此处
  • 最后,我们更新了导出,以更好地支持可选的依赖项并生成更小的捆绑包,如下所示

一开始,我们设计了这个库,这样你就可以这样使用它了

import { LLMChain } from "langchain/chains";
import { PromptTemplate } from "langchain/prompts";
import { OpenAI } from "langchain/llms";
import { SupabaseVectorStore } from "langchain/vectorstores";
import { CohereEmbeddings } from "langchain/embeddings";
import { GithubRepoLoader } from "langchain/document_loaders";

老办法

但当在Node.js之外运行时,这带来了一些问题

  • 为了支持不断增长的人工智能生态系统,我们一直在添加新的集成,但我们不希望库的安装规模无限增长。因此,我们将第三方SDK作为langchain的可选依赖项。虽然这在Node.js、浏览器和其他捆绑代码的环境中运行良好,但最终的体验相当糟糕,因为许多捆绑器中的一些需要用户进行一些自定义配置,或者要求用户安装所有可选的依赖项。
  • 当代码被捆绑时,开发人员对捆绑包大小的担忧是正确的,并且由于并非所有捆绑器都支持开箱即用的树摇动,LangChain的用户最终会得到比他们预期的更大的代码捆绑包。

不再!我们重新设计了公开第三方集成的方式,上面的代码现在变成了

import { LLMChain } from "langchain/chains";
import { PromptTemplate } from "langchain/prompts";
import { OpenAI } from "langchain/llms/openai";
import { SupabaseVectorStore } from "langchain/vectorstores/supabase";
import { CohereEmbeddings } from "langchain/embeddings/openai";
import { GithubRepoLoader } from "langchain/document_loaders/web/github";

这确保了您不会引入未使用的代码,也不会像以前那样捆绑器阻塞可选的依赖关系。不包含第三方集成的模块(如链和提示)与以前一样。

有关如何升级的详细信息,请查看安装文档。

中断性更改

为了支持多个环境,我们不得不做出一些突破性的更改。这些仅限于:

  • import { Calculator } from "langchain/tools"; moved to import { Calculator } from "langchain/tools/calculator";
  • import { loadLLM } from "langchain/llms"; moved to import { loadLLM } from "langchain/llms/load";对于所有其他负载*功能也是如此

Deprecations

我们现在需要对所有第三方集成进行更精细的导入 import {OpenAI} from "langchain/llms"; 更改为import {OpenAI} from "langchain/llms/openai"。然而,旧的导入仍然保留,但已被弃用。请尽快转换您的代码以使用新的导入,因为我们计划逐步淘汰旧的导入!

测试

最后,介绍一下我们如何测试这一点,以确保将来不会破坏与任何环境的兼容性。对于我们想要支持的每一个新环境

  • 在我们的monorepo中创建了一个测试导出-*包,其中包含一个使用该环境的工具创建的启动项目。例如,对于带有npx的Next.jscreate-next-app@latest
  • 在该测试包中添加了一些LangChain的示例用法
  • 设置包,使其同时包含构建脚本和测试脚本
  • 添加到CI中在隔离docker容器中测试的包列表中。
  • 最终解决出现的任何问题,确保不会破坏任何其他环境

如果我们还没有使用您最喜欢的环境进行测试,我们对添加更多待测试环境的PR持开放态度。如果您在特定环境中运行LangChain.js时遇到任何问题,请告诉我们——我们很乐意提供帮助!