Home » AI » LangChain JS/TS

LangChain JS/TS

编 辑:Y ┊ 时 间:2024年12月11日 ┊ 访问: 24 次

安装和设置

支持的环境

LangChain 是使用 TypeScript 编写的,可以在以下环境中使用:

  • Node.js (ESM 和 CommonJS) - 18.x, 19.x, 20.x
  • Cloudflare Workers
  • Vercel / Next.js (浏览器, 无服务器和边缘函数)
  • Supabase Edge 函数
  • 浏览器
  • Deno

安装

npm:

npm install -S langchain

Yarn:

yarn add langchain

pnpm:

pnpm add langchain

加载库

ESM

LangChain 为 Node.js 环境提供了一个 ESM 构建版。您可以使用以下语法导入它:

import { OpenAI } from "langchain/llms/openai";

如果您在一个 ESM 项目中使用 TypeScript,我们建议您更新您的 tsconfig.json,并包含以下设置:

{

  "compilerOptions": {

    ...

    "target": "ES2020", // or higher

    "module": "nodenext",

  }

}

CommonJS

LangChain提供了面向Node.js环境的CommonJS构建。你可以使用以下语法进行导入:

const { OpenAI } = require("langchain/llms/openai");

Cloudflare Workers

LangChain可以在Cloudflare Workers中使用。你可以使用以下语法进行导入:

import { OpenAI } from "langchain/llms/openai";

Vercel / Next.js

LangChain可以在Vercel / Next.js中使用。我们支持在前端组件、无服务器函数和Edge函数中使用LangChain。你可以使用以下语法进行导入:

import { OpenAI } from "langchain/llms/openai";

Deno / Supabase Edge Functions

LangChain可以在Deno / Supabase Edge Functions中使用。你可以使用以下语法进行导入:

import { OpenAI } from "https://esm.sh/langchain/llms/openai";

我们推荐查看我们的Supabase模板以查看在Supabase Edge Functions中如何使用LangChain的示例。

浏览器

LangChain可以在浏览器中使用。在我们的CI中,我们使用Webpack和Vite测试了LangChain的捆绑,但其他捆绑器也应该可以使用。你可以使用以下语法进行导入:

import { OpenAI } from "langchain/llms/openai";

从版本<0.0.52进行更新

如果您正在更新LangChain的0.0.52之前的版本,您需要更新导入以使用新的路径结构。

例如,如果您以前执行的是

import { OpenAI } from "langchain/llms";

现在,您需要执行以下操作

import { OpenAI } from "langchain/llms/openai";

适用于下列6个模块的所有导入,这些模块已分割为每个集成的子模块。组合模块已被弃用,在 Node.js 之外不起作用,并将在将来的版本中删除。

  • 如果您使用的是 langchain/llms,请参见 LLMs 以获取更新后的导入路径。
  • 如果您使用的是 langchain/chat_models,请参见 Chat Models 以获取更新后的导入路径。
  • 如果您使用的是 langchain/embeddings,请参见 Embeddings 以获取更新后的导入路径。
  • 如果您使用的是 langchain/vectorstores,请参见 Vector Stores 以获取更新后的导入路径。
  • 如果您使用的是 langchain/document_loaders,请参见 Document Loaders 以获取更新后的导入路径。
  • 如果您使用的是 langchain/retrievers,请参见 Retrievers 以获取更新后的导入路径。

其他模块不受此更改影响,您可以继续从同一路径导入它们。

此外,为了支持新的环境,需要进行一些重大更改:

  • import { Calculator } from "langchain/tools"; 现已移至

import { Calculator } from "langchain/tools/calculator";

  • import { loadLLM } from "langchain/llms"; 现已移至

import { loadLLM } from "langchain/llms/load";

  • import { loadAgent } from "langchain/agents"; 现已移至

import { loadAgent } from "langchain/agents/load";

  • import { loadPrompt } from "langchain/prompts"; 现已移至

import { loadPrompt } from "langchain/prompts/load";

  • import { loadChain } from "langchain/chains"; 现已移至

import { loadChain } from "langchain/chains/load";

不受支持: Node.js 16

我们不支持 Node.js 16,但如果您仍然希望在 Node.js 16 上运行 LangChain,您需要按照本节中的说明进行操作。我们不能保证这些说明在未来仍能工作。

快速入门, 使用LLMs

本教程将快速介绍如何使用LangChain构建端到端语言模型应用程序。

选择LLM

使用LangChain通常需要与一个或多个模型提供程序,数据存储,API等进行集成。

对于这个例子,我们将使用OpenAI的API,因此不需要其他设置。

构建语言模型应用程序

现在我们已经安装了LangChain,可以开始构建我们的语言模型应用程序。

LangChain提供了许多模块,可用于构建语言模型应用程序。可以将模块结合起来创建更复杂的应用程序,也可以单独用于简单的应用程序。

LLM:从语言模型获取预测

LangChain的最基本构建模块是针对某些输入调用LLM。 让我们通过一个简单的示例来介绍如何执行此操作。 为此,假设我们正在构建一项服务,该服务根据公司生产的产品生成公司名称。

为了做到这一点,我们首先需要导入LLM包装器。

import { OpenAI } from "langchain/llms/openai";

然后,我们将需要设置OpenAI密钥的环境变量。 这里有三个选项:

我们可以通过在.env文件中设置值,并使用dotenv软件包来读取它。

1.1. For OpenAI Api

OPENAI_API_KEY="..."

1.2. For Azure OpenAI:

AZURE_OPENAI_API_KEY="..."

AZURE_OPENAI_API_INSTANCE_NAME="..."

AZURE_OPENAI_API_DEPLOYMENT_NAME="..."

AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME="..."

AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME="..."

AZURE_OPENAI_API_VERSION="..."

或者我们可以使用以下命令在你的shell中导出环境变量。

2.1. For OpenAI Api

export OPENAI_API_KEY=sk-....

2.2. For Azure OpenAI:

export AZURE_OPENAI_API_KEY="..."

export AZURE_OPENAI_API_INSTANCE_NAME="..."

export AZURE_OPENAI_API_DEPLOYMENT_NAME="..."

export AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME="..."

export AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME="..."

export AZURE_OPENAI_API_VERSION="..."

或者我们可以在初始化wrapper时一起执行。在这个例子中,我们可能希望输出更随机,因此我们将使用高温度进行初始化。

3.1. For OpenAI Api

const model = new OpenAI({ openAIApiKey: "sk-...", temperature: 0.9 });

3.2. For Azure OpenAI:

const model = new OpenAI({

  azureOpenAIApiKey: "...",

  azureOpenAIApiInstanceName: "....",

  azureOpenAIApiDeploymentName: "....",

  azureOpenAIApiVersion: "....",

  temperature: 0.9,

});

初始化wrapper后,我们现在可以在一些输入上调用它!

const res = await model.call(

  "What would be a good company name a company that makes colorful socks?"

);

console.log(res);
{ res: 'Fantasy Sockery' }

提示模板: 管理LLMs的提示

调用LLM是一个很好的第一步,但这只是开始。通常当你在应用程序中使用LLM时,你不会直接将用户输入发送到LLM。相反,你可能会使用用户输入来构建一个提示,然后将它发送到LLM。

例如,在前面的示例中,我们传递的文本是硬编码的,询问制作彩色袜子的公司名字。在这个想象中的服务中,我们只需要使用描述公司所做的事情的用户输入,并使用该信息格式化提示。

使用LangChain很容易实现!

首先让我们定义提示模板:

import { PromptTemplate } from "langchain/prompts";
const template = "What is a good name for a company that makes {product}?";

const prompt = new PromptTemplate({

  template: template,

  inputVariables: ["product"],

});

现在让我们看看它的工作原理!我们可以调用.format方法进行格式化。

const res = await prompt.format({ product: "colorful socks" });

console.log(res);
{ res: 'What is a good name for a company that makes colorful socks?' }

链: 在多步骤工作流中组合LLMs和提示

到目前为止,我们只是单独使用了PromptTemplate和LLM原语。但是,一个真正的应用程序不仅仅是一个原语,而是它们的组合。

LangChain中的链是由链接组成的,可以是像LLMs这样的原语,也可以是其他chains。

链的最核心类型是LLMChain,它由PromptTemplate和LLM组成。

扩展前面的例子,我们可以构建一个LLMChain,它采用用户输入,用PromptTemplate格式化它,然后将格式化的响应传递给LLM。

import { OpenAI } from "langchain/llms/openai";

import { PromptTemplate } from "langchain/prompts";



const model = new OpenAI({ temperature: 0.9 });

const template = "What is a good name for a company that makes {product}?";

const prompt = new PromptTemplate({

  template: template,

  inputVariables: ["product"],

});

现在我们可以创建一个非常简单的链条,它将采用用户输入,用它格式化提示,然后将其发送给LLM:。


import { LLMChain } from "langchain/chains";



const chain = new LLMChain({ llm: model, prompt: prompt });

现在我们可以仅指定产品运行该链条!

const res = await chain.call({ product: "colorful socks" });

console.log(res);
{ res: { text: 'ColorfulCo Sockery.' } }

这就是第一条链 - LLM Chain。这是比较简单的链条之一,但是了解它的工作原理将为您更好地处理更复杂的链条打下基础。

Agents: 根据用户输入动态运行链

到目前为止,我们看过的链是以预定顺序运行的。

代理不再执行它们使用LLM来确定要执行的操作以及顺序。动作可以是使用工具并观察其输出,或者返回给用户。

如果正确使用代理,它们可以非常强大。在本教程中,我们通过最简单的,最高级别的API向您展示如何轻松使用代理。

为了加载代理,您应该了解以下概念:

  • 工具(Tool):执行特定职责的函数。这些职责可能包括:Google 搜索、数据库查询、代码 REPL(Read-Eval-Print
  • Loop,读取-求值-输出循环)、其他链。目前工具的接口是一个期望输入字符串,并返回一个字符串的函数。
  • LLM: 代理使用的语言模型。
  • Agent: 所使用的代理。这应该是一个引用支持代理类的字符串。由于本教程重点介绍最简单的最高级API,因此仅涵盖使用标准支持的代理。

对于这个例子,你需要在.env文件中设置SerpAPI环境变量。

SERPAPI_API_KEY="..."

安装serpapi包(Google搜索API):
npm:

npm install -S serpapi

Yarn:

yarn add serpapi

pnpm:

pnpm add serpapi

现在我们可以开始了!

import { OpenAI } from "langchain/llms/openai";

import { initializeAgentExecutorWithOptions } from "langchain/agents";

import { SerpAPI } from "langchain/tools";

import { Calculator } from "langchain/tools/calculator";



const model = new OpenAI({ temperature: 0 });

const tools = [

  new SerpAPI(process.env.SERPAPI_API_KEY, {

    location: "Austin,Texas,United States",

    hl: "en",

    gl: "us",

  }),

  new Calculator(),

];



const executor = await initializeAgentExecutorWithOptions(tools, model, {

  agentType: "zero-shot-react-description",

});

console.log("Loaded agent.");



const input =

  "Who is Olivia Wilde's boyfriend?" +

  " What is his current age raised to the 0.23 power?";

console.log(`Executing with input "${input}"...`);



const result = await executor.call({ input });



console.log(`Got output ${result.output}`);
langchain-examples:start: Executing with input "Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?"...

langchain-examples:start: Got output Olivia Wilde's boyfriend is Jason Sudeikis, and his current age raised to the 0.23 power is 2.4242784855673896.

Memory: 在链和代理中添加状态

到目前为止,我们经历的所有链和代理都是无状态的。但是,通常情况下,您可能希望一个链或代理具有一些 "内存" 的概念,以便它可以记住其先前的交互信息。这是设计聊天机器人时的最明显和简单的例子 - 您希望它记住先前的消息,以便可以利用上下文进行更好的交流。这将是一种 "短期记忆"。在更复杂的情况下,您可以想象一个链/代理随着时间的推移记住关键信息 - 这将是一种 "长期记忆" 形式。

LangChain提供了几个专门为此目的创建的链。本节介绍了使用这些链之一(“ConversationChain”)。

默认情况下,“ConversationChain”具有一种简单的记忆类型,它会记住所有先前的输入/输出并将其添加到传递的上下文中。让我们来看看如何使用这个链。

import { OpenAI } from "langchain/llms/openai";

import { BufferMemory } from "langchain/memory";

import { ConversationChain } from "langchain/chains";



const model = new OpenAI({});

const memory = new BufferMemory();

const chain = new ConversationChain({ llm: model, memory: memory });

const res1 = await chain.call({ input: "Hi! I'm Jim." });

console.log(res1);
{response: " Hi Jim! It's nice to meet you. My name is AI. What would you like to talk about?"}
const res2 = await chain.call({ input: "What's my name?" });

console.log(res2);
{response: ' You said your name is Jim. Is there anything else you would like to talk about?'}

流媒体


您还可以使用流API,随着生成的单词的流式返回,这对于聊天机器人等场景很有用,您希望向用户显示正在生成的内容。注意: 目前OpenAI不支持启用流时的“tokenUsage”报告。

import { OpenAI } from "langchain/llms/openai";

// To enable streaming, we pass in `streaming: true` to the LLM constructor.
// Additionally, we pass in a handler for the `handleLLMNewToken` event.
const chat = new OpenAI({
  streaming: true,
  callbacks: [
    {
      handleLLMNewToken(token: string) {
        process.stdout.write(token);
      },
    },
  ],
});

await chat.call("Write me a song about sparkling water.");
/*
Verse 1
Crystal clear and made with care
Sparkling water on my lips, so refreshing in the air
Fizzy bubbles, light and sweet
My favorite beverage I can’t help but repeat

Chorus
A toast to sparkling water, I’m feeling so alive
Let’s take a sip, and let’s take a drive
A toast to sparkling water, it’s the best I’ve had in my life
It’s the best way to start off the night

Verse 2
It’s the perfect drink to quench my thirst
It’s the best way to stay hydrated, it’s the first
A few ice cubes, a splash of lime
It will make any day feel sublime
...
*/



Copyright © 2026 Y 版权所有.网站运行:13年238天19小时34分