TLDR: 我们宣布支持在浏览器、Cloudflare Workers、Vercel/Next.js、Deno、Supabase Edge Functions 中运行 LangChain.js,以及现有的对 Node.js ESM 和 CJS 的支持。请参阅安装/升级文档和重大更改列表。
背景
最初,我们将 LangChain.js 设计为在 Node.js 中运行,Node.js 是长期存在的服务器端 JavaScript 运行时。早在二月份(时光飞逝!),我们开始收集社区的反馈,了解我们应该支持哪些其他 JS 运行时,并且此后收到了大量关于在浏览器、Deno、Cloudflare Workers、Vercel/Next.js、Vite、Supabase Edge Functions 等中运行 LangChain 的请求。
启用多种环境的更改
自那时以来,我们与社区贡献者一起踏上了旅程,以尽可能支持更多的 JS 环境,以下是一些过程中的亮点
- 将我们的代码库转换为 ESM 此处(CJS 用户不必担心,我们也提供 CJS 构建)
- 尽可能地移除了仅限 node 的 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 之外运行时,这带来了一些问题
- 为了支持不断增长的 AI 生态系统,我们不断添加新的集成,但我们不希望库的安装大小无限增长。因此,我们将第三方 SDK 作为
langchain
的可选依赖项。虽然这在 Node.js 中运行良好,但在代码捆绑的浏览器和其他环境中,最终的用户体验非常糟糕,许多捆绑器要么需要用户进行一些自定义配置,要么要求用户安装所有可选依赖项。 - 当代码被捆绑时,开发者理所当然地担心捆绑包大小,并且由于并非所有捆绑器都开箱即用地支持 tree-shaking,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";
这确保您不会拉入您不使用的代码,并且捆绑器不会像以前那样因为可选依赖项而阻塞。像 chains
和 prompts
这样不包含第三方集成的模块仍然和以前一样。
请查看安装文档以获取有关如何升级的更多信息。
重大更改
为了支持多种环境,我们不得不进行一些重大更改。这些更改仅限于
import { Calculator } from "langchain/tools";
移动到import { Calculator } from "langchain/tools/calculator";
import { loadLLM } from "langchain/llms";
移动到import { loadLLM } from "langchain/llms/load";
,所有其他 load* 函数也是如此
弃用
- 我们现在要求对所有第三方集成进行更细粒度的导入(即,将
import {OpenAI} from "langchain/llms";
更改为import {OpenAI} from "langchain/llms/openai";
)。但是,旧的导入仍然保留,但已被弃用。请尽快过渡您的代码以使用新的导入,因为我们计划逐步淘汰旧的导入!
测试
最后,稍微介绍一下我们如何进行测试,以确保我们将来不会破坏与任何环境的兼容性。对于我们想要支持的每个新环境
- 在我们的 monorepo 中创建了一个
test-exports-*
包,其中包含使用该环境的工具创建的入门项目。例如,对于 Next.js,使用npx create-next-app@latest
- 在测试包中添加了一些 LangChain 的示例用法
- 设置了包,使其包含
build
和test
脚本 - 添加到 CI 中在隔离的 docker 容器中测试的包列表中 此处。
- 最后修复出现的任何问题,确保它不会破坏任何其他环境
如果我们尚未测试您最喜欢的环境,我们非常欢迎 PR 来添加更多要测试的环境。如果您在特定环境中运行 LangChain.js 时遇到任何问题,请告知我们 – 我们很乐意提供帮助!