基于 FastGPT 的 LangChain.js + RAG 系统实现

基于 FastGPT 的 RAG 系统实现

系统概述

本文介绍如何基于 FastGPT 构建的知识库实现 LangChain.js + RAG 系统。

核心流程

go 复制代码
FastGPT
文档处理
向量存储
PostgreSQL
MongoDB
RAG系统
用户问答

FastGPT 的作用

FastGPT 负责:

  • • 文档管理:上传、切分、向量化文档

  • • QA 生成:自动从文档生成问答对

  • • 数据存储:向量存储在 PostgreSQL,文本存储在 MongoDB

  • • 可视化管理:Web 界面管理知识库

LangChain.js + RAG 系统负责:

  • • 读取数据:从 FastGPT 的数据库读取知识

  • • 向量检索:找到相关的 QA 对

  • • 增强生成:基于检索结果回答用户问题

为什么要使用 LangChain.js + RAG

既然 FastGPT 已经提供了完整的知识库管理和问答能力,为什么还需要构建 LangChain.js + RAG 系统?

核心优势

1. 深度定制化

  • • FastGPT:提示词和交互逻辑固定,难以深度定制

  • • LangChain.js + RAG:完全控制提示词、Agent 行为、响应格式

2. 工具生态集成

  • • FastGPT:也可以集成工具,但集成方式有限

  • • LangChain.js + RAG:更方便地集成 MCP 工具、自定义 API、数据库操作、业务系统等

3. Agent 编排能力

  • • FastGPT:简单的问答交互

  • • LangChain.js + RAG:使用 LangGraph 构建复杂 Agent 工作流,支持多步推理、工具链、条件分支等

4. 可扩展性

  • • FastGPT:功能受限于 FastGPT 的更新节奏

  • • LangChain.js + RAG:随时集成最新的 AI 能力和工具,快速响应业务需求


系统架构

整体架构

go 复制代码
LangChainRAG
Storage
FastGPT
文档上传
文档切分
QA生成
向量化
PostgreSQL
MongoDB
读取知识库
向量检索
生成回答

数据流转

FastGPT 到 LangChain.js + RAG 系统的完整流程:

阶段 1:知识库构建(FastGPT 负责)
    1. 用户通过 FastGPT Web 界面上传文档
    1. FastGPT 自动将文档切分为小段落
    1. 为每个段落生成对应的问答对
    1. 调用 OpenAI Embedding API 将问题向量化
    1. 向量存储到 PostgreSQL,QA 对存储到 MongoDB
阶段 2:知识检索(LangChain.js + RAG 负责)
    1. 用户在 LangChain.js + RAG 系统中提问
    1. LangChain.js + RAG 系统读取问题,向量化后查询 PostgreSQL
    1. PostgreSQL 返回最相似的向量 ID
    1. LangChain.js + RAG 系统用向量 ID 从 MongoDB 读取完整 QA 对
    1. LangChain.js + RAG 系统将 QA 内容作为上下文,发送给 AI 模型生成回答

FastGPT 数据结构

PostgreSQL 向量表

FastGPT 使用 PostgreSQL 存储文档的向量表示:

go 复制代码
-- FastGPT 创建的向量表
CREATE TABLE modeldata (
    id BIGSERIAL PRIMARY KEY,
    vector VECTOR(1536) NOT NULL,
    team_id VARCHAR(50) NOT NULL,
    dataset_id VARCHAR(50) NOT NULL,
    collection_id VARCHAR(50) NOT NULL,
    createtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 向量相似度索引
CREATE INDEX ON modeldata
USING ivfflat (embedding vector_cosine_ops);

关键字段说明:

字段 类型 说明
id BIGSERIAL 向量唯一 ID
vector VECTOR(1536) 1536 维向量
dataset_id VARCHAR(50) 知识库 ID
collection_id VARCHAR(50) 集合 ID

MongoDB QA 表

FastGPT 使用 MongoDB 存储问答对和元数据:

go 复制代码
// FastGPT 的数据集数据集合
{
  "_id": ObjectId("..."),
  "q": "如何配置环境变量?",
  "a": "可以通过项目的 .env 文件配置...",
  "indexes": [
    {
      "dataId": "vector_id_123",
      "text": "环境变量配置包括 API 密钥..."
    }
  ],
  "datasetId": "683eab4063699a9c20d35ebb",
  "createTime": ISODate("2026-01-08T10:00:00Z")
}

数据关联流程

go 复制代码
用户问题
Embedding API
问题向量
PostgreSQL向量搜索
获取向量 ID
MongoDB查询QA
问答对内容

LangChain.js + RAG 系统实现

技术栈

本项目使用 LangChain.js 框架实现 RAG 系统。

系统分工:

  • FastGPT:负责知识库管理(文档上传、切分、向量化、存储)

  • LangChain.js + RAG:负责从 FastGPT 数据库读取和检索

1. 读取 FastGPT 知识库

连接数据库

LangChain.js + RAG 系统需要同时连接 FastGPT 使用的 PostgreSQL 和 MongoDB:

go 复制代码
// 连接 FastGPT 数据库
const pgPool = new Pool({
  connectionString: 'postgresql://host:5432/fastgpt'
});

const mongoClient = new MongoClient('mongodb://host:27017/fastgpt');
const datasetCollection = mongoClient.db('fastgpt').collection('dataset_datas');
查询知识库
go 复制代码
// 搜索知识库
async function searchFastGPTKnowledge(datasetId, query, limit = 5) {
  // Step 1: 向量化问题
  queryVector = await getEmbedding(query);

  // Step 2: 在 PostgreSQL 中搜索相似向量
  vectorResults = await searchVectors(datasetId, queryVector, limit);

  // Step 3: 从 MongoDB 获取 QA 内容
  qaPairs = await getQAPairs(datasetId, vectorResults.map(r => r.id));

  // Step 4: 合并结果
  return vectorResults.map(vectorResult => {
    const qaPair = qaPairs.find(qa =>
      qa.indexes.some(idx => idx.dataId === vectorResult.id)
    );

    return {
      question: qaPair?.q || '',
      answer: qaPair?.a || '',
      similarity: vectorResult.score
    };
  });
}

2. 向量检索

PostgreSQL 向量搜索
go 复制代码
// 向量相似度搜索
async function searchVectors(datasetId, queryVector, limit = 5) {
  const query = `
    SELECT
      id::text,
      collection_id,
      (vector <=> $1::vector) * -1 AS score
    FROM modeldata
    WHERE dataset_id = $2
    ORDER BY vector <=> $1::vector
    LIMIT $3
  `;

  return await pgPool.query(query, [
    JSON.stringify(queryVector),
    datasetId,
    limit
  ]);
}

查询说明:

  • vector <=> $1::vector:计算余弦距离

  • * -1:转换为相似度分数

  • ORDER BY:按相似度降序排列

MongoDB QA 查询
go 复制代码
// 获取 QA 对
async function getQAPairs(datasetId, vectorIds) {
  return await datasetCollection.find({
    datasetId: datasetId,
    'indexes.dataId': { $in: vectorIds }
  }).toArray();
}

3. Embedding 服务

go 复制代码
// 获取向量
async function getEmbedding(text) {
  const response = await openai.embeddings.create({
    model: 'text-embedding-3-large',
    input: text
  });

  return response.data[0].embedding;
}

LangChain.js 集成

为什么使用 LangChain.js?

LangChain.js 的优势:

  • • 工具封装:将知识库检索封装为 LangChain Tool

  • • Agent 编排:自动决定何时使用知识库

  • • 提示词管理:自动构建包含检索结果的提示词

  • • 多工具组合:知识库 + MCP 工具 + 其他工具

创建 LangChain Tool

go 复制代码
// 创建知识库工具
function createFastGPTKnowledgeTool(datasetId) {
  return new StructuredTool({
    name: 'search_fastgpt_knowledge',
    description: '从 FastGPT 知识库搜索相关信息',

    func: async ({ query }) => {
      // 调用 FastGPT 检索
      const results = await searchFastGPTKnowledge(datasetId, query, 5);

      // 格式化输出
      return results.map((result, index) => `
【来源 ${index + 1}】相似度: ${(result.similarity * 100).toFixed(1)}%
问题:${result.question}
答案:${result.answer}
      `).join('\n\n');
    }
  });
}

创建 LangChain Agent

go 复制代码
// 创建 Agent
async function createAgent() {
  const DATASET_ID = '683eab4063699a9c20d35ebb';

  // 创建知识库工具
  const knowledgeTool = createFastGPTKnowledgeTool(DATASET_ID);

  // 创建 AI 模型
  const model = new ChatOpenAI({
    model: 'gpt-4o',
    apiKey: process.env.OPENAI_API_KEY
  });

  // 创建 LangChain Agent
  const agent = await createReactAgent({
    name: 'fastgpt-rag-agent',
    model,
    tools: [knowledgeTool],
    systemPrompt: `你是一个技术支持助手。

## 工作流程
1. 用户提问时,首先使用知识库工具检索相关信息
2. 基于检索结果提供准确答案
3. 引用信息来源和相似度分数`
  });

  return agent;
}

LangChain 工作流程

go 复制代码
LLMFastGPT DBKnowledge ToolLangChain Agent用户LLMFastGPT DBKnowledge ToolLangChain Agent用户提问分析问题,决定使用工具调用知识库工具查询向量查询 QA返回结果返回 QA 内容构建提示词发送到 LLM生成回答返回答案 + 来源

总结

本系统通过结合 FastGPT 的知识库管理能力和 LangChain.js 的灵活编排能力,构建了一个可深度定制、易扩展的 RAG 系统。这种架构允许我们:

    1. 利用 FastGPT 的可视化界面管理知识库
    1. 通过 LangChain.js 实现复杂的 Agent 工作流
    1. 灵活集成各种工具和 API
    1. 完全控制提示词和响应格式

适用于需要深度定制化、复杂业务逻辑集成的企业级应用场景。

相关推荐
阿奇__18 小时前
elementUI table 多列排序并保持状态样式显示正确(无需修改源码)
前端·vue.js·elementui
小罗和阿泽18 小时前
java 【多线程基础 三】
java·开发语言
ulias21218 小时前
AVL树的实现
开发语言·数据结构·c++·windows
Van_captain18 小时前
rn_for_openharmony常用组件_Empty空状态
javascript·开源·harmonyos
想你依然心痛18 小时前
从x86到ARM的HPC之旅:鲲鹏开发工具链(编译器+数学库+MPI)上手与实战
java·开发语言·arm开发·鲲鹏·昇腾
zhengxianyi51518 小时前
数据大屏-单点登录ruoyi-vue-pro
前端·javascript·vue.js
967718 小时前
python基础自学
开发语言·windows·python
毕设源码-朱学姐18 小时前
【开题答辩全过程】以 基于Python的茶语店饮品管理系统的设计与实现为例,包含答辩的问题和答案
开发语言·python
Legendary_00818 小时前
LDR6020:单C口可充可放电PD协议芯片,开启USB2.0数据传输新体验
c语言·开发语言