基于 FastGPT 的 RAG 系统实现
系统概述
本文介绍如何基于 FastGPT 构建的知识库实现 LangChain.js + RAG 系统。
核心流程
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 能力和工具,快速响应业务需求
系统架构
整体架构
LangChainRAG Storage FastGPT 文档上传 文档切分 QA生成 向量化 PostgreSQL MongoDB 读取知识库 向量检索 生成回答数据流转
FastGPT 到 LangChain.js + RAG 系统的完整流程:
阶段 1:知识库构建(FastGPT 负责)
1. 用户通过 FastGPT Web 界面上传文档
2. FastGPT 自动将文档切分为小段落
3. 为每个段落生成对应的问答对
4. 调用 OpenAI Embedding API 将问题向量化
5. 向量存储到 PostgreSQL,QA 对存储到 MongoDB
阶段 2:知识检索(LangChain.js + RAG 负责)
6. 用户在 LangChain.js + RAG 系统中提问
7. LangChain.js + RAG 系统读取问题,向量化后查询 PostgreSQL
8. PostgreSQL 返回最相似的向量 ID
9. LangChain.js + RAG 系统用向量 ID 从 MongoDB 读取完整 QA 对
10. LangChain.js + RAG 系统将 QA 内容作为上下文,发送给 AI 模型生成回答
FastGPT 数据结构
PostgreSQL 向量表
FastGPT 使用 PostgreSQL 存储文档的向量表示:
-- 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 存储问答对和元数据:
// FastGPT 的数据集数据集合 { "_id": ObjectId("..."), "q": "如何配置环境变量?", "a": "可以通过项目的 .env 文件配置...", "indexes": [ { "dataId": "vector_id_123", "text": "环境变量配置包括 API 密钥..." } ], "datasetId": "683eab4063699a9c20d35ebb", "createTime": ISODate("2026-01-08T10:00:00Z") }数据关联流程
用户问题 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:
// 连接 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');查询知识库
// 搜索知识库 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 向量搜索
// 向量相似度搜索 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 查询
// 获取 QA 对 async function getQAPairs(datasetId, vectorIds) { return await datasetCollection.find({ datasetId: datasetId, 'indexes.dataId': { $in: vectorIds } }).toArray(); }3. Embedding 服务
// 获取向量 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
// 创建知识库工具 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
// 创建 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 工作流程
LLMFastGPT DBKnowledge ToolLangChain Agent用户LLMFastGPT DBKnowledge ToolLangChain Agent用户提问分析问题,决定使用工具调用知识库工具查询向量查询 QA返回结果返回 QA 内容构建提示词发送到 LLM生成回答返回答案 + 来源总结
本系统通过结合 FastGPT 的知识库管理能力和 LangChain.js 的灵活编排能力,构建了一个可深度定制、易扩展的 RAG 系统。这种架构允许我们:
1. 利用 FastGPT 的可视化界面管理知识库
2. 通过 LangChain.js 实现复杂的 Agent 工作流
3. 灵活集成各种工具和 API
4. 完全控制提示词和响应格式
适用于需要深度定制化、复杂业务逻辑集成的企业级应用场景。