📕LangChain 全能手册 - 从零打造你的 AI 工作流

66 阅读5分钟

嗨,同学!欢迎来到 AIGC 的奇妙世界。

如果你还在纠结怎么用代码去调各个大模型的 API,如果你被各种复杂的提示词(Prompt)搞得头大,那么今天这篇文章就是为你准备的。我们要聊的是 AI 应用开发界的“瑞士军刀”——LangChain

2022 年底 ChatGPT 横空出世,Transformer 架构彻底改变了 AI 的格局。但很多人不知道,LangChain 其实比 ChatGPT 发布的 1.0 版本还要早一点。它不是一个模型,而是一个开发框架


一、 什么是 LangChain?为什么新手必学?

简单来说:LangChain = Lang(Language 模型) + Chain(链条)

  • Lang:代表大语言模型(LLM)。
  • Chain:就是把一个个“节点”(比如提示词、模型、数据处理逻辑)像 n8n 或 Coze 那样链接起来,形成一个自动化的工作流。

为什么不用官方 SDK,非要用 LangChain?

想象一下,今天你想用 DeepSeek(性价比之王!),明天你想换成 GPT-4o,后天你又想试试 Claude。如果你用官方 SDK,每次都要改一堆接口代码。

LangChain 最大的好处就是:适配器模式(Provider)。

它统一了市面上几乎所有主流 LLM 的接口。你只需要换一个包名,逻辑一行都不用动。这种“可拔插”的特性,在 LLM 更新换代极快的今天,简直是开发者的救命稻草。


二、 环境搭建:从 ESM 开始

现在的 Node.js 开发推荐使用 ESM (ES Modules) 模式,这样我们可以直接使用顶层的 await

  1. 初始化项目:

    在 package.json 中添加 "type": "module"。

  2. 安装依赖

    Bash

    pnpm i @langchain/deepseek dotenv
    

    这里我们选择了 @langchain/deepseek。LangChain 已经帮我们把复杂的模型适配工作做好了。


三、 实战演练:从单点调用到复杂工作流

先看看大模型调用传统写法

import "dotenv/config";
import OpenAI from "openai";

// 1. 手动实例化客户端
const openai = new OpenAI({
  // SDK 默认会去请求 https://api.openai.com/v1
  baseURL: 'https://api.deepseek.com', 
  apiKey: process.env.DEEPSEEK_API_KEY 
});

async function main() {
  const response = await openai.chat.completions.create({
    messages: [{ role: "user", content: "用一句话解释什么是RAG?" }],
    model: "deepseek-reasoner",
    temperature: 0,
  });

  // 原生返回结构很深:choices -> [0] -> message -> content
  console.log(response.choices[0].message.content);
}

main();

💡 关键点

  • 必须手动配置 baseURL
  • 必须手动传入 API Key
  • 调用 复杂的chat.completions 接口
  • 传入复杂的message
  • 层层解析返回对象才能获得目标信息

重复的工作并且流程复杂,让许多新手头疼,这个时候就该langchain闪亮登场了!!!

1. 初试化:一行代码调用 DeepSeek

我们先看最基础的调用。注意看代码里的注释

JavaScript

import "dotenv/config"; // 自动读取环境变量中的 API KEY
import { ChatDeepSeek } from "@langchain/deepseek";

const model = new ChatDeepSeek({
    model: 'deepseek-reasoner', // 使用 DeepSeek 的推理模型
    temperature: 0, 
})

// invoke 是 LangChain 的标准执行方法
const res = await model.invoke('用一句话解释什么是RAG?');
console.log(res.content);

💡 关键点:

  • LangChain 内部实现了适配器模式。
  • 我们不需要手动配置 baseURL(除非你用代理),
  • 它会自动识别环境变量中的 DEEPSEEK_API_KEY。
  • 返回的rescontent就是目标结果

2. 提示词工程:PromptTemplate 的妙用

在实际业务中,我们不可能手写所有的提示词。我们需要“模板”。PromptTemplate 类可以帮我们实现提示词的参数化。

JavaScript

import { PromptTemplate } from "@langchain/core/prompts";

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

// 格式化模板,生成具体的字符串
const promptStr = await prompt.format({
    role: '前端面试官',
    limit: '50',
    question: '什么是闭包'
});

console.log(promptStr); // 打印出来的就是一段完整的提示词

💡 关键点:

  • 使用 static 方法 fromTemplate 快速创建模板
  • {role}、{limit} 是占位符,后续动态填充

PromptTemplate 的核心好处在于实现了提示词的“逻辑与内容分离”: 它将原本硬编码在代码里的乱麻字符串,转变成了可复用的“函数模板”,让你能像填充 Excel 表格一样动态注入变量(如用户输入、背景角色等),不仅避免了手动拼接字符串的低级错误,还让提示词版本管理和多场景适配变得像换个插件一样简单。


四、 核心黑科技:构建工作流(Chain)

这是 LangChain 的灵魂。AI 应用通常很复杂,需要分步处理。比如:先搜索 -> 再总结 -> 最后翻译

简单链:Pipe 管道操作

LangChain 提供了一个类似 Unix 管道的语法:.pipe()

JavaScript

import { ChatDeepSeek } from "@langchain/deepseek";
import { PromptTemplate } from "@langchain/core/prompts";

const model = new ChatDeepSeek({ model: 'deepseek-reasoner' });
const prompt = PromptTemplate.fromTemplate(`你是一个专家,用一句话解释:{topic}`);

const chain = prompt.pipe(model);

// invoke 时直接传入模板变量即可
const response = await chain.invoke({ topic: '闭包' });
console.log(response.content);

💡 关键点:

  • pipe 就像接水管,把 prompt 节点生成的 prompt提示词 像水一样流入 model 节点形成工作流(workflow)。
  • 任务的顺序是:输入 -> 格式化 Prompt -> 调用大模型 -> 输出结果

在这里打印chain会发现chain是一个RunnableSequence对象(可执行序列),那么RunnableSequence到底是什么呢?

复杂链:RunnableSequence 顺序流

当你的业务需要“环环相扣”时,RunnableSequence 就派上用场了。它可以把多个 Chain 组合成一个大的工作流。

场景:先让 AI 详细解释一个概念,再让 AI 对这个解释做三个要点的总结。

JavaScript

import { RunnableSequence } from "@langchain/core/runnables";

// 节点1:详细解释
const explainPrompt = PromptTemplate.fromTemplate(`请详细介绍概念:{topic}`);
const explainChain = explainPrompt.pipe(model);

// 节点2:核心总结
const summaryPrompt = PromptTemplate.fromTemplate(`请将以下内容总结为3个要点:{explanation}`);
const summaryChain = summaryPrompt.pipe(model);

const fullChain = RunnableSequence.from([
    // 第一步:执行解释链,并提取 text
    (input) => explainChain.invoke({ topic: input.topic }).then(res => res.content),
    
    // 第二步:将第一步的 text 传给总结链
    async (explanation) => {
        const summary = await summaryChain.invoke({ explanation });
        return `【详细解释】:${explanation}\n【核心总结】:${summary.content}`;
    }
]);

const result = await fullChain.invoke({ topic: 'MVC 架构' });
console.log(result);

💡 关键点:

  • 使用 RunnableSequence.from 将多个逻辑串联。
  • 上一个节点的输出会作为下一个节点的输入。

五、 总结:LangChain 到底帮我们解决了什么?

对于新手来说,你只需要记住这三点:

  1. 解耦(Adapter) :模型随便换,接口全统一。@langchain/deepseek 这种包让你几秒钟就能适配新模型。
  2. 工程化(Prompt Engineering) :不再是凌乱的字符串拼接,而是通过 PromptTemplate 进行模版管理。
  3. 流式处理(Workflow) :通过 pipeRunnableSequence,你可以把复杂的 AI 逻辑像搭积木一样组装起来,这就是所谓的 Agent(智能体) 的雏形。

AI 应用的开发不仅仅是“调接口”,更是一场工程化的变革。LangChain 就是那个帮你把“黑盒”变成“生产线”的神器。