LangChain:让大模型开发像搭积木一样简单

82 阅读6分钟

LangChain:让大模型开发像搭积木一样简单

2022年,ChatGPT 的横空出世引爆了全球对生成式人工智能(AIGC)的关注。然而很多人可能不知道,在 ChatGPT 爆火之前,一个名为 LangChain 的开源框架就已经悄然诞生,并在 2023 年发布了 1.0+ 正式版本。LangChain 并不是大模型本身,而是一个面向大语言模型(LLM)应用开发的工程化框架,其核心理念是“Lang + Chain”——用自然语言驱动、通过可组合的链(Chain)构建复杂 AI 应用。

本文将从基础概念出发,结合实战代码,带你深入理解 LangChain 的设计哲学与使用方式,尤其适合前端工程师快速上手 AI 应用开发。


一、为什么需要 LangChain?

大模型如 DeepSeek、GPT、Claude 等虽然强大,但直接调用 API 存在几个痛点:

  • 模型接口不统一:不同厂商的 API 参数、格式、认证方式各异;
  • 提示词(Prompt)管理混乱:硬编码字符串难以维护和复用;
  • 业务逻辑复杂:真实场景往往需要多步推理、工具调用、记忆上下文等;
  • 模型迭代快:今天用 DeepSeek,明天可能换 Qwen,代码耦合度高。

LangChain 正是为解决这些问题而生。它通过适配器模式统一了 LLM 接口,通过模块化组件(如 PromptTemplate、RunnableSequence)让开发者像搭积木一样构建 AI 工作流。


二、LangChain 核心概念解析

1. lang:统一的大模型抽象层

LangChain 提供了对主流 LLM 的封装,例如 @langchain/deepseek@langchain/openai 等。你只需安装对应包,即可用完全一致的接口调用不同模型。

// main.js
import 'dotenv/config'; // 加载 .env 文件中的环境变量到 process.env
import { ChatDeepSeek } from '@langchain/deepseek';

const model = new ChatDeepSeek({
  model: 'deepseek-reasoner',
  temperature: 0,
});
const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);

注意:LangChain 会自动从环境变量(如 DEEPSEEK_API_KEY)读取密钥,无需手动传入 apiKeybaseURL。这种设计极大简化了配置,也便于切换模型——只需改一行 import 和构造函数。

💡 关于 dotenvdotenv 是一个轻量级 Node.js 工具,用于将项目根目录下的 .env 文件中的键值对自动加载到 process.env 中。这样我们就能安全地管理敏感信息(如 API Key),避免硬编码或提交到 Git。例如,在 .env 中写入 DEEPSEEK_API_KEY=sk-xxx,代码中即可通过 process.env.DEEPSEEK_API_KEY 访问,而 LangChain 会自动读取该变量,无需手动传参。

2. chain:可组合的工作流

真实 AI 应用很少是“问一句答一句”。比如面试系统可能需要:

  1. 生成结构化问题;
  2. 调用模型回答;
  3. 对答案打分总结。

LangChain 的 Chain 机制允许我们将多个步骤串联成流水线。这类似于低代码平台(如 n8n、Coze)中的节点连接,但以代码形式实现,更灵活可控。


三、LangChain 实战:从简单到复杂

示例 1:动态提示词 —— PromptTemplate

硬编码提示词难以复用。LangChain 提供 PromptTemplate,支持变量插值:

// 1.js
import 'dotenv/config';
import { PromptTemplate } from '@langchain/core/prompts';

const prompt = PromptTemplate.fromTemplate(`
  你是一个{role}。
  请用不超过{limit}字回答以下问题:
  {question}
`);

const promptStr = await prompt.format({
  role: '前端面试官',
  limit: '50',
  question: '什么是闭包?'
});

const res = await model.invoke(promptStr);
console.log(res.content);

通过模板,我们实现了提示词的参数化与复用,这是工程化的第一步。


示例 2:构建简单链 —— RunnableSequence

当提示词和模型调用频繁配对时,可以将其封装为一个“链”:

// 2.js
import { RunnableSequence } from '@langchain/core/runnables';

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

const response = await chain.invoke({ topic: '闭包' });
console.log(response.text);

这里,prompt.pipe(model) 创建了一个 RunnableSequence 实例。它代表一个顺序执行的工作流:输入 → 提示词渲染 → 模型调用 → 输出。这种声明式写法清晰表达了数据流向。


示例 3:多步复杂链 —— 组合多个 Runnable

更复杂的场景需要多阶段处理。例如:先详细解释概念,再提炼要点。

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

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

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

const fullChain = RunnableSequence.from([
  (input) => explainChain.invoke({ topic: input.topic }).then(res => res.text),
  (explanation) => summaryChain.invoke({ explanation }).then(res => 
    `知识点:${explanation}\n总结:${res.text}`
  ),
]);

const res = await fullChain.invoke({ topic: '闭包' });
console.log(res);

这个例子展示了 LangChain 的强大之处:

  • 分阶段处理:解释 → 总结;
  • 中间结果传递:前一步的输出作为后一步的输入;
  • 自定义逻辑嵌入:可在链中插入任意 JavaScript 函数。

这种模式非常适合构建Agent、RAG 系统、智能客服等复杂 AI 应用。


四、LangChain vs 传统做法:一场工程化革命

为了更直观地理解 LangChain 的价值,我们将其与“传统裸调 API”的方式做对比:

维度传统做法(裸调 API)LangChain 方式
模型切换需重写整个请求逻辑(URL、headers、body 结构都不同)只需更换 import 和构造函数,接口完全一致
提示词管理字符串拼接,易出错、难测试、无法复用使用 PromptTemplate,支持变量、版本控制、单元测试
多步流程手动嵌套 async/await,逻辑耦合严重RunnableSequence 声明式编排,清晰可读
错误处理 & 重试需自行封装 try-catch、指数退避等逻辑内置 retry、fallback、streaming 等高级能力
可测试性黑盒调用,难以 mock每个组件(prompt、model、chain)均可独立测试
扩展性添加新功能(如记忆、工具调用)需大量重构通过 LangChain 的 Memory、Tools、Agents 模块无缝集成

举个具体例子:

传统写法(伪代码)

const response = await fetch('https://api.deepseek.com/chat', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}` },
  body: JSON.stringify({
    model: 'deepseek-reasoner',
    messages: [{ role: 'user', content: `你是一个前端专家...` }]
  })
});
const data = await response.json();
console.log(data.choices[0].message.content);

一旦要换成 OpenAI,几乎整段都要重写。

LangChain 写法

// 只需改这一行
// import { ChatDeepSeek } from '@langchain/deepseek';
import { ChatOpenAI } from '@langchain/openai';

const model = new ChatOpenAI({ model: 'gpt-4o' });
// 后续代码完全不变!

这种“插件化模型接入”正是 LangChain 的核心优势——它把 LLM 变成了可拔插的“服务组件”,而非绑定死的基础设施。


五、结语:LangChain 是 AI 应用的“React”

如果说 React 让 UI 开发组件化,那么 LangChain 就是让 AI 开发工作流化。它不生产模型,而是让模型更好用;它不替代 Prompt Engineering,而是让 Prompt 可管理、可复用、可组合。

随着 AIGC 从“玩具”走向“生产力工具”,LangChain 这类工程化框架将成为连接大模型与真实业务的桥梁。无论你是前端、后端还是全栈工程师,掌握 LangChain 都将为你打开 AI 应用开发的新大门。

小贴士:本文所有代码基于 @langchain/deepseek,你也可以轻松替换为 @langchain/openai@langchain/anthropic 等,体验真正的“模型无关”开发。

别忘了在项目根目录创建 .env 文件并填入你的 API Key,例如:

text
编辑
DEEPSEEK_API_KEY=your-api-key-here

并确保 .gitignore 中包含 .env,防止密钥泄露。


这样,读者不仅能理解 LangChain 的强大,还能掌握安全使用 API 密钥的最佳实践。。


参考资源