LangChain.js 入门实战 | 前端如何构建 RAG 应用

一、背景:为什么前端也需要 RAG?

过去,前端工程师的工作大多集中在交互界面、状态管理和网络请求层面。但随着 大语言模型(LLM) 的爆发,前端开发者也逐渐站到了 AI 应用的第一线。

问题在于:大模型虽然强大,却常常“张口就来”。想要让它真正结合企业内部知识,就必须解决 幻觉(hallucination) 的问题。

而 RAG(Retrieval-Augmented Generation,检索增强生成) 正是解决方案:

  • R(Retrieval,检索):从外部知识库中找到相关信息

  • A(Augmented,增强):把这些信息注入到模型的上下文中

  • G(Generation,生成):让 LLM 基于增强后的上下文生成回答

在 Python 世界,LangChain 已经成为事实标准;而在 JavaScript / TypeScript 世界,LangChain.js 则是构建前端 RAG 应用的首选框架。


二、原理:LangChain.js 的核心机制

1. 模块化抽象

LangChain.js 的设计理念是 把大模型应用拆分成可组合的模块

  • LLM 接口:统一封装 OpenAI、Anthropic、DeepSeek 等模型

  • Prompt 模板:让提示词工程化,参数化拼装

  • Chain 调用链:组合多个步骤形成流水线

  • Retriever 检索器:从文档向量库中找到相关片段

  • Agent 智能体:支持模型动态调用工具和 API

2. 文档分块与向量检索

RAG 的关键步骤是 把长文档切成片段 → 生成向量 → 检索相似片段
LangChain.js 内置了 RecursiveCharacterTextSplitterOpenAIEmbeddingsMemoryVectorStore 等工具,帮助开发者快速搭建检索流程。

3. 运行环境的优势

与 Python 版本相比,LangChain.js 最大的亮点是 能直接运行在浏览器与 Cloudflare Workers 上,真正实现了边缘推理与前端直接调用。


三、实战:用 LangChain.js 构建一个前端 RAG 应用

接下来,我们通过三个示例,完整走一遍“RAG 应用开发”的流程。


示例一:最小化 RAG Demo

以下代码展示了如何用 30 行 LangChain.js 实现一个基于内存向量库的问答。

// rag-demo.mjs
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence } from "@langchain/core/runnables";
import { Document } from "@langchain/core/documents";

const docs = [
  new Document({ pageContent: "LangChain.js 是 LLM 应用的 JS 框架,支持 RAG、Agent、链式调用。" }),
  new Document({ pageContent: "它能运行在 Node.js、浏览器与 Cloudflare Workers,生态活跃。" }),
];

const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 100 });
const splitDocs = await splitter.splitDocuments(docs);

const vectorStore = await MemoryVectorStore.fromDocuments(
  splitDocs,
  new OpenAIEmbeddings({ model: "text-embedding-3-small" })
);

const retriever = vectorStore.asRetriever({ k: 2 });
const llm = new ChatOpenAI({ model: "gpt-4o-mini", temperature: 0 });

const prompt = ChatPromptTemplate.fromTemplate(
  `依据<context>回答用户问题,如无答案请说“不知道”。\n<context>\n{context}\n</context>\n问题:{question}`
);

const chain = RunnableSequence.from([
  {
    context: async (input) => (await retriever.getRelevantDocuments(input.question))
      .map(d => d.pageContent).join("\n"),
    question: (input) => input.question
  },
  prompt,
  llm
]);

const res = await chain.invoke({ question: "为什么 LangChain.js 适合前端开发者?" });
console.log(res.content);

运行效果:
👉 模型的回答会严格依赖于 docs 文档,而不是胡编。


示例二:加载企业 PDF 知识库

前端常见的需求是把公司文档(PDF/Markdown/HTML)加载进来,供 RAG 使用。LangChain.js 提供了 PDFLoader

import { PDFLoader } from "langchain/document_loaders/fs/pdf";
import { OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";

const loader = new PDFLoader("company-handbook.pdf");
const docs = await loader.load();

const vectorStore = await MemoryVectorStore.fromDocuments(
  docs,
  new OpenAIEmbeddings()
);

const retriever = vectorStore.asRetriever();
const results = await retriever.getRelevantDocuments("公司的加班制度是什么?");
console.log(results.map(r => r.pageContent));

效果:
👉 直接返回 PDF 中的相关内容,之后可交给 LLM 生成更自然的回答。


示例三:结合 Agent 调用外部工具

在前端 RAG 应用中,有时还需要调用外部 API(比如计算器、搜索引擎)。这时就要用到 Agent

import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { ChatOpenAI } from "@langchain/openai";
import { Calculator } from "langchain/tools/calculator";

const llm = new ChatOpenAI({ model: "gpt-4o-mini", temperature: 0 });
const tools = [new Calculator()];

const executor = await initializeAgentExecutorWithOptions(tools, llm, {
  agentType: "openai-functions",
  verbose: true,
});

const result = await executor.invoke({
  input: "今天是 2025 年 8 月 26 日,请计算 100 天后的日期。",
});

console.log(result.output);

结果:
👉 Agent 会调用计算器工具,而不是依赖 LLM 自己推算日期。


四、架构图示

1. RAG 工作流

graph TD
  A[用户问题] --> B[Retriever 检索器]
  B --> C[相关文档片段]
  C --> D[Prompt 模板]
  D --> E[LLM 生成]
  E --> F[增强后的答案]

2. Agent 调用流程

sequenceDiagram
  User->>Agent: 提问
  Agent->>Tools: 判断是否需要工具调用
  Tools->>Agent: 返回执行结果
  Agent->>LLM: 拼接上下文
  LLM->>User: 最终回答

五、LangChain.js 与 Python 版的对比

特性LangChain.jsLangChain (Python)
社区生态前端/全栈开发者,偏轻量数据科学/后端开发者,偏重
运行环境Node.js、浏览器、Cloudflare Workers本地/服务端/容器
API 风格TypeScript 风格,链式调用Pythonic,适合 Notebook
应用场景Web 前端 + Serverless + Edge AI数据管道、企业后端、研究

结论:
👉 如果你是 Web 开发者,LangChain.js 会更自然,能快速构建 AI 应用;如果你是数据科学家或研究员,则 Python 版更适合。


六、总结与展望

本文我们完成了从 背景 → 原理 → 实战 → 对比 的完整解析:

  1. 背景:RAG 解决了大模型的幻觉问题

  2. 原理:LangChain.js 把 LLM 应用抽象为模块,可组合可扩展

  3. 实战:通过内存向量库、PDF 加载、Agent 工具调用实现 RAG 应用

  4. 对比:LangChain.js 更适合前端/全栈,Python 更适合研究/后端

未来,随着 Cloudflare Workers / Vercel Edge Functions 普及,前端工程师将能在浏览器直接构建 AI Native 应用。LangChain.js 可能会成为 前端世界的 AI 基础设施,就像 React 之于 UI 开发。


参考链接


💬 如果这篇文章对你有帮助,记得 点赞 + 收藏,也欢迎评论区交流你在前端如何用 LangChain.js 构建 AI 应用的思路。下篇我会带来 Cloudflare Workers 上部署 LangChain.js RAG 应用的完整教程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值