如何用NodeJS构建查询的RAG向量检索系统?

摘要:RAG Retrieval-Augmented Generation是一种用于自然语言处理的模型架构,结合了检索Retrieval和生成Generation两种技术。而RAG服务在知识问答、代码生成、事实验证、专业领域检索等任务中表现出色,
RAG Retrieval-Augmented Generation是一种用于自然语言处理的模型架构,结合了检索Retrieval和生成Generation两种技术。而RAG服务在知识问答、代码生成、事实验证、专业领域检索等任务中表现出色,能够通过检索相关知识来增强生成模型的回答质量和准确性。 实际上,当前RAG相关建设已经比较成熟,目前看起来其实并不太赶得上潮流,但学习RAG最好的时间是22年底,其次是现在。RAG服务和当前的AI Infra建设有着密切的关系,作为基础建设的RAG是一个以搜索为核心,围绕各种数据、知识、LLMs等服务协作运行的复杂系统。 描述 实际上我们当前聊的主要是RAG中的RA部分,这部分还是比较偏向于传统的NLP任务,本文中主要涉及的是文本的向量化和向量检索。而在G这部分则结合了检索和生成的框架,主要用于增强生成模型的能力,并且能够根据提问以及召回内容提高生成文本的质量和准确性。 向量检索是RAG服务的核心部分,但本质上的主要目标是内容检索,因此我们并非仅限于使用向量方法来检索内容。基于图数据库的GraphRAG,或者是ElasticSearch基于倒排索引的全文检索能力,都是可以来实现RAG的检索服务的,这样我们可以将相关检索方法来统一召回并排名。 此外,我们在使用LLMs的时候,是比较难以获取最新的知识的,毕竟GPT实际上是生成式预训练模型的缩写,既然是预训练模型自然是不能实时进行训练获取最新知识的。而如果我们使用RL强化学习、SFT监督微调等方式来进行微调训练,需要更高的标注内容以及计算资源等,成本比较高。 因此,RAG服务是较简单且成本低的模式,以此来提供给LLMs输入Context,而实际上我们调优Prompt的方式也可以算作是提供Context的一种方式,当然诸如Function Call、MCP也可以作为给予LLMs上下文的方式。而简单来说,RAG服务具有以下的使用场景: 需要获取较新的知识内容: 当需要查询特定领域的最新研究进展、或者企业内部实时更新的文档,包括我们常用的联网搜索场景,也可以认为是特定形式的RAG。当然如果需要获取最新的相关情况,还需要结合Function Call的方式,例如查询实时天气等。 需要提供特定领域的知识: 当需要查询特定领域的专业知识,例如医学、法律等领域的专业文档,或者是企业内部的知识库内容,这些内容通常是专业、私有、非公开或未包含在LLMs通用训练数据中的知识,因此可以结合RAG服务来提供相关内容。 增强透明性与可解释性: 在需要审核、溯源或理解LLMs决策依据的场景,例如金融分析报告、法律建议初稿、医疗信息查询等。RAG系统可以同时返回生成答案和其依据的检索来源,这为用户提供了验证答案正确性的途径,也增加了系统输出的透明度和可信度。 数据长尾分布的检索: 当数据分布呈现长尾形态时,通用LLMs可能因训练数据覆盖不足而无法给出满意答案。RAG能够通过检索覆盖到稀有或少见案例,提升模型在这些长尾数据上的表现,当然这本身也会比较依赖于RAG服务本身的检索能力。 垂直搜索与智能问答: 针对特定领域或企业内容的智能搜索和问答机器人,RAG天然适合此类场景。用户问题触发对专属知识库的检索,检索到的相关内容被用于生成精准、简洁、符合上下文的答案,提供比传统关键词匹配更自然、信息量更大。 本文实现了非常基础的RAG示例,Embedding使用轻量的all-MiniLM-L6-v2模型,向量检索的数据库使用轻量的hnswlib-node实现,以此可以在node中直接运行起来 https://github.com/WindRunnerMax/webpack-simple-environment/tree/master/packages/hnsw-rag。 实际上当前很多云服务商以及开源项目提供了开箱即用RAG服务的实现,而我们自然可以根据需求来决定是否可以接入开箱即用的服务。只是若是我们需要精细地调配很多功能,例如自定义分片策略等,就比较依赖服务是否暴露相关实现,因此我们不一定可以直接处理。 我们通常都会明确专业的人做专业的事,开箱即用并没有什么问题。但是如果之前看过我的 从零实现富文本编辑器 系列文章的话,就可能会感觉出来,越依赖浏览器的能力就越需要处理默认行为带来的复杂Case,我们使用开箱即用的服务也同样如此。如果自定义场景要求比较高,那么就会面临不受控的情况。 所以在这篇文章中我们实现了简单的RAG服务,也可以从侧面反映出来我们能够在RAG服务上做些什么精调的方案,来提高召回率和召回效果。在知道了我们可以对服务做哪些方面的参数和数据调整后,才能够比较有针对性地进行优化。
阅读全文