用 LangChain.js 快速构建 AI 应用:从 Prompt 到 Chain 的实战分享

110 阅读6分钟

前言

自 2022 年 ChatGPT 引爆 AIGC 热潮以来,大语言模型(LLM)能力飞速迭代,开发者迫切需要一套成熟的框架来工程化地构建 AI 应用。LangChain 正是为此而生——它最早于 ChatGPT 发布前就已启动,目前 JavaScript 版(LangChain.js)已推出 1.0+ 稳定版本,成为 Node.js 和前端项目中最流行的 AI 应用开发框架。

LangChain 的核心理念可以用公式概括:LangChain = Lang + Chain

  • Lang:指 Language Model,即各种大语言模型。
  • Chain:指将多个可执行步骤(Prompt、LLM、工具、输出解析等)链接起来的工作流,类似于 Coze 或 n8n 的可视化节点连接。

LangChain.js 采用 ESM 模块规范,生态完善,支持数十种主流 LLM 提供商(如 OpenAI、DeepSeek、Anthropic、Groq 等),通过统一的适配器接口,让开发者可以轻松切换底层模型,而无需改动业务代码。

本文通过四个逐步递进的实战 Demo,带你从零开始掌握 LangChain.js 的核心用法:

  1. 直接调用 LLM + PromptTemplate 基础使用
  2. 使用 pipe 构建简单 Chain
  3. 使用 RunnableSequence 组合多个 Chain 实现复杂流程
  4. 基础环境配置与最佳实践

环境准备

项目使用 ESM 模式,确保 package.json 中包含:

JSON

{
  "type": "module"
}

安装必要的包(以 DeepSeek 为例,性价比高且支持中文优秀):

Bash

pnpm i @langchain/deepseek @langchain/core dotenv

创建 .env 文件存放 API Key:

text

DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx

LangChain 会自动从环境变量读取对应的 Key,无需手动传入。

Demo1:基础调用与 PromptTemplate

最简单的 AI 应用就是“问答”。我们先直接调用模型,再引入 PromptTemplate 实现提示词复用。

JavaScript

import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.7,
});

// 先定义可复用的提示词模板
const prompt = PromptTemplate.fromTemplate(`
  你是一个{role},
  请用不超过 {limit} 字回答以下问题:
  {question}
`);

// 复用模板生成不同场景的提示词
const prompt1 = await prompt.format({
  role: '前端面试官',
  limit: '50',
  question: '什么是闭包',
});

const prompt2 = await prompt.format({
  role: '后端面试官',
  limit: '50',
  question: '什么是MVC?',
});

const prompt3 = await prompt.format({
  role: '熊二',
  limit: '50',
  question: '光头强为什么要砍树?',
});

// 调用模型
const res = await model.invoke(prompt3);
console.log(res.content);

核心要点

  • PromptTemplate.fromTemplate 是静态方法,直接在类上调用。
  • format 方法返回格式化后的字符串,可多次复用。
  • ChatDeepSeek 继承自统一的 chat model 接口,未来切换到其他模型只需改一行。

这个例子展示了 Prompt 工程的基础:通过角色扮演(role)和字数限制(limit)控制输出风格和长度。

Demo2:使用 pipe 构建简单 Chain

实际 AI 应用往往不止“提示 + 调用”这么简单。我们希望将 Prompt 和 LLM 封装成一个可复用的“链”(Chain)。

LangChain.js 提供了 pipe 方法,将多个 Runnable(可运行对象)连接起来。

JavaScript

import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.7,
});

const prompt = PromptTemplate.fromTemplate(`
  你是一个前端专家,用一句话解释:{topic}
`);

// prompt.pipe(model) 形成一个 RunnableSequence(顺序链)
const chain = prompt.pipe(model);

const response = await chain.invoke({
  topic: '什么是闭包?',
});

console.log(response.content);  // 注意:chat model 返回 AIMessage,内容在 .content

关键理解

  • prompt.pipe(model) 等价于:输入 → 格式化提示词 → 调用 LLM → 输出。
  • 返回的 chain 是一个 RunnableSequence 实例,具备 invoke、stream 等统一方法。
  • 整个链作为一个整体可以被再次组合,体现了 LangChain 的“可组合性”。

这种方式让代码更清晰,也便于单元测试和复用。

Demo3:组合多个 Chain 实现复杂流程

真实场景中,我们常常需要多步处理。例如:先让模型详细解释一个概念,再将解释总结为几个要点。

这就需要将多个 Chain 串联起来。

JavaScript

import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';
import { PromptTemplate } from '@langchain/core/prompts';
import { RunnableSequence } from '@langchain/core/runnables';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0.7,
});

const explainPrompt = PromptTemplate.fromTemplate(`
  你是一个前端专家,请详细介绍以下概念:{topic}
  要求:覆盖定义、原理、使用方式,不超过300字
`);

const summaryPrompt = PromptTemplate.fromTemplate(`
  请将以下前端概念解释总结为3个核心要点(每点不超过20字):
  {explanation}
`);

const explainChain = explainPrompt.pipe(model);
const summaryChain = summaryPrompt.pipe(model);

// 使用 RunnableSequence.from 显式构建完整链
const fullChain = RunnableSequence.from([
  // 第一步:解释概念
  async (input) => {
    const res = await explainChain.invoke({ topic: input.topic });
    return res.content;  // 返回纯文本给下一步
  },
  // 第二步:基于解释文本进行总结
  async (explanation) => {
    const res = await summaryChain.invoke({ explanation });
    return `【详细解释】\n${explanation}\n\n【核心要点】\n${res.content}`;
  }
]);

const response = await fullChain.invoke({
  topic: '闭包',
});

console.log(response);

输出示例

text

【详细解释】
闭包是指函数与其周围的词法环境(变量)组合形成的实体...
...

【核心要点】
1. 函数嵌套定义
2. 内部函数引用外部变量
3. 外部函数执行后变量仍存活

进阶技巧

  • 中间步骤返回纯文本而不是完整 AIMessage,避免后续模板注入对象导致错误。
  • 使用 RunnableSequence.from 可以精确控制每一步的输入输出转换。
  • 未来可轻松扩展为三步、四步链(如解释 → 总结 → 生成面试题)。

这种多步 Chain 是 LangChain 最强大的特性之一,完美对应了 Agent、RAG、工具调用等复杂场景。

Demo4:最简调用方式(适合快速测试)

如果你只是想快速验证模型效果,最简方式如下:

JavaScript

import 'dotenv/config';
import { ChatDeepSeek } from '@langchain/deepseek';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0,
});

const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);

无需任何 PromptTemplate,直接传入字符串即可。LangChain 内部会自动包装成合适的聊天消息格式。

最佳实践总结

  1. 优先使用 ESM:享受现代 JS 特性,生态支持更好。
  2. 模型可拔插:通过 @langchain/* 系列包切换不同提供商(如 @langchain/openai、@langchain/anthropic)。
  3. Prompt 模板化:所有提示词都用 PromptTemplate 管理,便于维护和测试。
  4. Chain 组合优先:即使简单逻辑也建议封装成 Chain,方便后续扩展。
  5. 注意输出类型:Chat Model 返回 AIMessage,内容在 .content;Completion Model 返回字符串。
  6. 环境变量管理:敏感 Key 全部放在 .env,LangChain 自动识别。

结语

LangChain.js 把复杂的 AI 应用开发拆解为“提示词 + 模型 + 链”三个清晰层次,让开发者可以像搭积木一样构建智能应用。无论是快速原型、RAG 系统、Agent 工具调用,还是企业级 AI 工作流,LangChain 都提供了统一的、工程化的解决方案。

从本文的四个 Demo 你可以看到:入门门槛极低,只需几行代码就能调用最先进的模型;同时上层能力极强,支持任意复杂流程编排。

推荐大家立即动手搭建一个自己的 AI 知识问答助手、代码解释工具或内容生成器。AI 应用开发已不再是少数大厂的专利——有了 LangChain,每一个前端、Node.js 开发者都能轻松玩转大模型。

行动起来,开启你的 AI 应用开发之旅吧!