AI 入门开发之 LangChain.js 与 LCEL
目录
- 一、大模型很火,开发却很难
- 二、LangChain 是什么?它解决了什么问题?
- 三、langchain.js:为前端开发者量身打造的版本
- 四、LCEL(LangChain Expression Language)
- 1. 什么是“链式思维”?(Chain-Based Thinking)
- 2. LCEL 到底是什么?
这几年 AI 火的一塌糊涂,各家大模型竞争如火如荼,我有一种强烈的感觉,现在正是 AI 大模型应用爆发的前夜,或者说已经到了爆发的点。所以除了使用 AI 工具提效外,我也非常想加入 AI 应用开发的浪潮,所以就有了这篇文章,千里之行始于足下,记录自己学习过程的同时,希望也能帮到同样感兴趣的你。
一、大模型很火,开发却很难
2023 年以来,大语言模型(如 GPT-4、Claude、Gemini 等)横空出世,引爆了 AI 技术的新一轮浪潮。但如果作为开发者,尝试动手调用一下这些大模型时,就会碰到下面这种问题:
- 翻文档半小时,只为找到一个简单的 API 调用方式;
- 想把模型回答“连起来用”,发现流程控制、状态维护全靠自己写逻辑;
- 每家模型厂商接口都不一样,代码越写越乱,维护困难;
- 加点搜索、调用数据库、整理上下文?直接让你头大;
这就像你站在了一座 AI 金矿前,兴奋又无从下手。
这正是 LangChain 诞生的初衷:帮开发者用“人类思维”方式构建 AI 应用,而不是用“API 拼图”的方式。
二、LangChain 是什么?它解决了什么问题?
LangChain(JavaScript/TypeScript 版本即 langchain.js
)是一个用于构建大模型驱动应用的开发框架。
说白了,它让你更轻松地把大模型接入业务,像写流程图一样编排复杂的 AI 应用逻辑。
它主要解决了三个问题:
-
模型调用抽象化
你不用再关心每个模型的底层调用细节,LangChain 提供统一接口,屏蔽底层差异。 -
上下文管理和链式调用
可以把多个步骤串联成思考链
(Chain),像这样:用户提问 → 让模型分析 → 查询数据库 → 整理回答 → 输出给用户
-
工具集成能力
模型不只是语言生成器,还可以调用工具。LangChain 支持搜索引擎、向量数据库、网页抓取、代码执行等各种外部工具集成。
用一个比喻:LangChain 就像是 Node.js 里的 Express——不是模型本身,但可以帮你用模型造出强大 App 的基础框架。
三、langchain.js:为前端开发者量身打造的版本
LangChain 最早由 Python 实现,但 JavaScript/TypeScript 社区也迅速跟进,推出了 langchain.js
只要你熟悉 JS,就能快速上手。
来一些例子简单直观感受一下:
✅ 示例一:最简单的模型调用
import { ChatOpenAI } from "langchain/chat_models/openai";// 创建一个模型实例
const model = new ChatOpenAI({temperature: 0.7, // 控制模型回答的“随机性”:越高越有创造力,越低越稳定
});// 向模型发送一句话,得到回复
const res = await model.invoke("用一句话介绍 JavaScript");
console.log(res.content);
ChatOpenAI
:LangChain 封装的 ChatGPT 调用接口。你不用再手动写 HTTP 请求。invoke(prompt)
:调用模型,传入提示词(Prompt),返回完整回答对象。temperature
:控制模型输出的风格,是最常用的参数之一。
✅ 示例二:链式调用,把流程拆分成“拼图”
import { ChatOpenAI } from "langchain/chat_models/openai";
import { PromptTemplate } from "langchain/prompts";
import { StringOutputParser } from "langchain/schema/output_parser";// 1. 定义模型:ChatGPT 的封装调用方式
const model = new ChatOpenAI({temperature: 0.7,modelName: "gpt-3.5-turbo", // 可指定模型版本,默认也可以不写
});// 2. 创建一个提示词模板
const prompt = PromptTemplate.fromTemplate("请用简洁中文回答:{question}");// 3. 创建一个输出解析器,把模型返回处理成文本
const outputParser = new StringOutputParser();// 4. 用 pipe 串联步骤:提示词 → 模型 → 输出解析
const chain = prompt.pipe(model).pipe(outputParser);// 5. 执行整条链,传入变量
const result = await chain.invoke({ question: "React 是什么?" });console.log(result);
// 输出示例:React 是一个用于构建用户界面的 JavaScript 库。
PromptTemplate
:用于定义可复用的“模板提示词”,可以插入变量。pipe()
:LangChain 的精髓,用来把多个步骤串起来执行,每一步处理上一部的结果。(是不是很像 .then().catch() )StringOutputParser
:模型可能返回复杂 JSON、Markdown、代码块等,这个解析器可以提取最常见的纯文本。
✅ 示例三:接入搜索,做一个“智能问答助手”
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { RetrievalQAChain } from "langchain/chains";// 准备一些“知识”内容(文档、文章、FAQ)
const docs = [{ pageContent: "JavaScript 是一种浏览器端的脚本语言。" },{ pageContent: "React 是由 Facebook 开发的 UI 库。" },
];// 把文本转换成“向量”,便于后续搜索(embedding 处理)
const vectorStore = await MemoryVectorStore.fromDocuments(docs,new OpenAIEmbeddings()
);// 构建一个“检索 + 回答”的链条(Retrieval-Augmented QA)
const chain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever());// 进行问答
const res = await chain.call({ query: "谁开发了 React?" });
console.log(res.text); // → Facebook
MemoryVectorStore
:内存中的向量数据库,用于“相似内容搜索”。开发时可快速测试,生产可换 Pinecone/Supabase 等。OpenAIEmbeddings
:将文本转成向量的工具,类似为模型理解做准备。RetrievalQAChain
:LangChain 内建的一个链条,自动完成:“搜索 + 构造上下文 + 提问 + 回答”全过程。
从代码可以直观地体会到,以前这可能需要几十行代码,现在只要几行,你只需要关注业务逻辑。你写的不是“模型代码”,而是“业务逻辑”。LangChain.js 把大模型开发的门槛从“懂 AI 算法”降到了“懂函数组合”。
四、LCEL(LangChain Expression Language)
非常好的问题!你问到了 LCEL 的核心所在:它到底是个“什么东西”?和“链式思维”有什么本质区别?
我们就来深入拆解这个点,尽量把它讲透、讲清楚,让你不仅“看懂代码”,更要“理解思想”。
1. 什么是“链式思维”?(Chain-Based Thinking)
链式思维
是 LangChain 最初提出的理念:
人类的复杂思考过程,其实可以被拆解为多个小步骤,每一步都可以由一个模型(或工具)来完成。
比如你要问一个问题:“特斯拉的创始人是谁,他最近有什么新闻?”
人类的思考可能是这样的:
- 理解问题
- 提取实体:特斯拉
- 查询知识:创始人是谁?
- 查新闻:和这个人相关的最近动态
- 整理信息,形成自然语言回答
在 LangChain 中,每一步可以看作一个“链”(Chain):
const chain = new SequentialChain({chains: [entityExtractor, knowledgeSearcher, newsFetcher, summarizer],
});
这就是所谓的“链式编排”——你把多个组件像串糖葫芦一样串起来,形成一个 pipeline。
那么,问题来了:
- 每个环节都要 new 一个对象、设置 input/output key
- 想调试中间结果?麻烦
- 想组合多个逻辑流?臃肿
- 太多样板代码,阅读和维护成本高
于是,LangChain 团队决定用一种更简洁、更声明式的方式来描述这种链式组合。
2. LCEL 到底是什么?
LCEL 全称是:LangChain Expression Language。
它既不是一门“语言”(不用学新语法),也不是一个单独的框架。
它是 LangChain 推出的一种组合模型调用逻辑的新“表达方式”,本质上是一套语法糖 + 运行时抽象。
让我们用代码对比,感受一下差异:
传统 Chain 编排(冗长)
const chain = new SequentialChain({chains: [new LLMChain({ prompt: prompt1, llm }),new LLMChain({ prompt: prompt2, llm }),new StuffDocumentsChain({ documentCombiner }),],
});
LCEL 编排(清爽)👇
const chain = prompt1.pipe(llm).pipe(prompt2).pipe(llm).pipe(documentCombiner);
这里的 .pipe()
就是 LCEL 的核心操作符:管道式组合。
你只需要把输入和处理步骤按顺序“串”起来,它会自动帮你管理数据流、输入输出、异常处理等逻辑。每个环节都是独立组件,天然适合单元测试、mock 调试。