前端也能从0搭建知识库并实现RAG!(非常详细)从零基础到精通,收藏这篇就够了!

手把手教你用Node.js搭建自己的知识库并实现一个RAG

大家好,我是Peter Tan,今天为大家带来一篇技术文章,教你如何用Node.js搭建自己的知识库,并实现一个RAG(Retrieval-Augmented Generation)系统。

最后我们还会加入Rerank(重排序)混合查询功能,并通过Mock数据演示整个流程。

我们将使用Node.js、Express.js、Qdrant数据库等技术栈,一步步实现这个系统。

整体架构

image

image

graph TD A[前端] -->|发送查询| B[后端] B -->|检索| C[知识库] C -->|返回文档| B B -->|重排序| D[Rerank模块] D -->|返回重排序结果| B B -->|生成文本| E[生成模型] E -->|返回生成结果| B B -->|返回结果| A subgraph 后端 B[后端] D[Rerank模块] end subgraph 知识库 C[Qdrant数据库] end subgraph 生成模型 E[OpenAI GPT] end

流程

graph TD A[用户输入查询] --> B[检索相关文档] B --> C[重排序文档] C --> D[生成文本] D --> E[返回生成结果]

image

image


技术栈
  • Node.js: 作为后端运行时环境,提供高效的异步I/O操作。

  • Express.js: 用于构建RESTful API,处理HTTP请求和响应。

  • Qdrant: 一个高性能的向量数据库,用于存储和检索知识库中的向量数据。

  • ReACT架构: 一种结合了检索和生成的AI模型架构。

  • Rerank: 对检索结果进行重排序,提升结果的相关性。

  • 混合查询: 结合关键词搜索和向量搜索,提升检索效果。

  • Mock数据: 用于模拟真实数据,方便开发和测试。


步骤一:搭建Node.js环境

如果你还没有搭建Node.js环境,可以直接使用以下命令初始化项目:

# 创建一个新的Node.js项目 mkdir my-knowledge-base cd my-knowledge-base npm init -y # 安装必要的依赖 npm install express qdrant-client openai axios


步骤二:创建Express.js服务器

我们创建一个简单的Express.js服务器来处理HTTP请求。

const express = require('express'); const app = express(); const port = 3000; app.use(express.json()); app.get('/', (req, res) => { res.send('Hello, World!'); }); app.listen(port, () => { console.log(`Server is running on http://localhost:${port}`); });


步骤三:集成Qdrant数据库

Qdrant是一个高性能的向量数据库,非常适合用于存储和检索知识库中的向量数据。我们需要安装Qdrant客户端并连接到数据库。

const { QdrantClient } = require('qdrant-client'); const qdrant = new QdrantClient({ url: 'http://localhost:6333' }); // 创建一个新的集合 qdrant.createCollection('knowledge-base', { vectors: { size: 768, // 假设我们使用768维的向量 distance: 'Cosine', }, });


步骤四:实现RAG系统

RAG系统的核心是结合检索和生成。我们首先需要从知识库中检索相关信息,然后使用生成模型生成文本。

const openai = require('openai'); openai.apiKey = 'your-openai-api-key'; // 检索相关文档 async function retrieveDocuments(query) { const queryVector = await getQueryVector(query); // 获取查询的向量表示 const searchResults = await qdrant.search('knowledge-base', { vector: queryVector, top: 10, // 返回前10个最相关的文档 }); return searchResults; } // 生成文本 async function generateText(query, documents) { const prompt = `Query: ${query}\nDocuments: ${documents.join('\n')}`; const response = await openai.Completion.create({ model: 'text-davinci-003', prompt: prompt, max_tokens: 150, }); return response.choices[0].text; } // 获取查询的向量表示 async function getQueryVector(query) { // 这里可以使用预训练的模型将查询转换为向量 // 例如,使用OpenAI的Embedding API const response = await openai.Embedding.create({ input: query, model: 'text-embedding-ada-002', }); return response.data[0].embedding; }


步骤五:实现Rerank功能

Rerank功能可以对检索结果进行重排序,提升结果的相关性。我们可以使用开源的Rerank模型(如Cohere Rerank)或自定义规则来实现。

// 使用Cohere Rerank API进行重排序 async function rerankDocuments(query, documents) { const cohere = require('cohere-ai'); cohere.init('your-cohere-api-key'); const response = await cohere.rerank({ query: query, documents: documents, top_n: 5, // 返回前5个最相关的文档 }); return response.results; }


步骤六:实现混合查询

混合查询结合了关键词搜索和向量搜索,可以提升检索效果。我们可以使用Qdrant的混合查询功能来实现。

// 混合查询:结合关键词搜索和向量搜索 async function hybridSearch(query) { const queryVector = await getQueryVector(query); // 向量搜索 const vectorResults = await qdrant.search('knowledge-base', { vector: queryVector, top: 10, }); // 关键词搜索(假设我们有一个关键词索引) const keywordResults = await qdrant.search('knowledge-base', { filter: { must: [ { key: 'text', match: { value: query, }, }, ], }, top: 10, }); // 合并结果并去重 const combinedResults = [...vectorResults, ...keywordResults]; const uniqueResults = Array.from(new Set(combinedResults.map(JSON.stringify))).map(JSON.parse); return uniqueResults; }


步骤七:使用Mock数据进行测试

为了测试我们的系统,我们可以使用Mock数据来模拟真实场景。

// 生成Mock数据 async function generateMockData() { const mockData = [ { id: 1, text: 'Node.js是一个基于Chrome V8引擎的JavaScript运行时。', vector: await getQueryVector('Node.js是一个基于Chrome V8引擎的JavaScript运行时。') }, { id: 2, text: 'Express.js是一个基于Node.js的Web应用框架。', vector: await getQueryVector('Express.js是一个基于Node.js的Web应用框架。') }, { id: 3, text: 'Qdrant是一个高性能的向量数据库。', vector: await getQueryVector('Qdrant是一个高性能的向量数据库。') }, ]; // 将Mock数据插入Qdrant await qdrant.upsert('knowledge-base', { points: mockData, }); } // 初始化Mock数据 generateMockData();


步骤八:整合所有功能

最后,我们将所有功能整合到一个API中,用户可以通过发送HTTP请求来获取生成的文本。

app.post('/rag', async (req, res) => { const { query } = req.body; // 混合查询 const documents = await hybridSearch(query); // Rerank const rerankedDocuments = await rerankDocuments(query, documents); // 生成文本 const generatedText = await generateText(query, rerankedDocuments); res.json({ generatedText }); });


总结

通过以上步骤,我们成功搭建了一个基于Node.js的知识库,并实现了RAG系统。通过加入Rerank和混合查询功能,我们进一步提升了系统的检索效果。希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。

感谢大家的阅读,我们下次再见!

2024最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2024最新版优快云大礼包:《AGI大模型学习资源包》免费分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值