AI 开发入门之 LangChain.js 与 LCEL

这几年 AI 火的一塌糊涂,各家大模型竞争如火如荼,我有一种强烈的感觉,现在正是 AI 大模型应用爆发的前夜,或者说已经到了爆发的点。所以除了使用 AI 工具提效外,我也非常想加入 AI 应用开发的浪潮,所以就有了这篇文章,千里之行始于足下,记录自己学习过程的同时,希望也能帮到同样感兴趣的你。

一、大模型很火,开发却很难

2023 年以来,大语言模型(如 GPT-4、Claude、Gemini 等)横空出世,引爆了 AI 技术的新一轮浪潮。但如果作为开发者,尝试动手调用一下这些大模型时,就会碰到下面这种问题:

  • 翻文档半小时,只为找到一个简单的 API 调用方式;
  • 想把模型回答“连起来用”,发现流程控制、状态维护全靠自己写逻辑;
  • 每家模型厂商接口都不一样,代码越写越乱,维护困难;
  • 加点搜索、调用数据库、整理上下文?直接让你头大;

这就像你站在了一座 AI 金矿前,兴奋又无从下手。

这正是 LangChain 诞生的初衷:帮开发者用“人类思维”方式构建 AI 应用,而不是用“API 拼图”的方式。


二、LangChain 是什么?它解决了什么问题?

LangChain(JavaScript/TypeScript 版本即 langchain.js)是一个用于构建大模型驱动应用的开发框架

说白了,它让你更轻松地把大模型接入业务,像写流程图一样编排复杂的 AI 应用逻辑。

它主要解决了三个问题:

  1. 模型调用抽象化
    你不用再关心每个模型的底层调用细节,LangChain 提供统一接口,屏蔽底层差异。

  2. 上下文管理和链式调用
    可以把多个步骤串联成思考链(Chain),像这样:

    用户提问 → 让模型分析 → 查询数据库 → 整理回答 → 输出给用户

  3. 工具集成能力
    模型不只是语言生成器,还可以调用工具。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)

1. 什么是“链式思维”?(Chain-Based Thinking)

链式思维是 LangChain 最初提出的理念:

人类的复杂思考过程,其实可以被拆解为多个小步骤,每一步都可以由一个模型(或工具)来完成。

比如你要问一个问题:“特斯拉的创始人是谁,他最近有什么新闻?”

人类的思考可能是这样的:

  1. 理解问题
  2. 提取实体:特斯拉
  3. 查询知识:创始人是谁?
  4. 查新闻:和这个人相关的最近动态
  5. 整理信息,形成自然语言回答

在 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 调试。

### LangChainLCEL工作原理解释 #### 三、LangChain框架概述 LangChain是一个用于构建对话应用的强大框架,它不仅提供了丰富的功能组件还支持灵活的扩展机制。通过集成多种模型和服务,能够快速搭建起具备自然语言处理能力的应用程序[^1]。 #### 四、LCEL表达式的定义及其作用 LCEL (LangChain Expression Language) 是一种专门为简化操作而设计的小型领域特定语言(DSL),允许开发者以更直观的方式编写逻辑流程。这种表达式可以被解析成一系列可执行的操作序列,在运行时按照预定规则顺序执行各个节点上的任务[^2]。 #### 五、运算符重载技术在LCEL中的体现 为了使代码更加简洁易读,LCEL引入了Python风格的魔术方法来实现运算符重载。特别是对于管道(`|`)符号对应的`__or__()`函数进行了特殊定制,使得多个Runnable对象之间可以通过简单的竖线连接形成复杂的数据流控制结构[^3]: ```python from langchain import Runnable, LCELExpression class CustomRunnable(Runnable): pass expr = ( CustomRunnable() | CustomRunnable() ) print(expr) ``` 上述例子展示了如何利用`__or__`方法创建由两个自定义Runnable实例组成的流水线。当这条语句被执行时,输入数据会先传递给第一个CustomRunnable处理完毕后再交给下一个继续加工直至整个链条结束为止。 #### 六、不同场景下的接口选用策略 针对不同的业务需求,LangChain提供了一系列优化过的API供选择。例如,在面对高并发量的在线客服系统时推荐采用异步版本;而对于大规模离线分析作业则更适合批量提交方式;至于那些对响应速度要求不高但追求简易性的内部管理平台来说同步调用无疑是最优解之一[^4]。 #### 七、总结 综上所述,LangChain借助于其独特的架构设计——尤其是内置DSL的支持——实现了高度模块化的同时保持了良好的性能表现。无论是初学者还是经验丰富的工程师都能从中受益匪浅,轻松驾驭复杂的AI项目开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值