在大型语言模型(LLM)引领的革命浪潮中,搜索与大模型的紧密结合已成为推动知识进步的关键要素。作为开源搜索引擎排名第一的 Elasticsearch(ES),结合沉淀多年的文本搜索能力和强大的向量检索能力实现混合搜索,使搜索变得更准、更全、更智能。腾讯云 ES 多年来持续对开源 ES 的性能、成本、稳定性以及分布式架构进行深度增强优化,并在海量规模的云业务中接受考验。腾讯云基于 ES 实现了一站式 RAG 解决方案,具备了 RAG 技术规模化落地能力。本次分享将深入探讨腾讯云 ES 在搜索领域的最新探索,详细解析腾讯云 ES 的一站式 RAG 方案,并介绍围绕该方案架构落地所进行的一系列内核性能和稳定性增强优化措施。
一、生活处处有搜索
1. 生活中的搜索
搜索技术与 RAG 紧密相连,因此在深入讨论 RAG 之前,让我们先来回顾一下生活中的搜索场景。在我们的日常生活中,搜索无处不在,包括网站目录、视频搜索、音频搜索引擎等多种类型。
2. 搜索技术的演进
现在,让我们来审视一下搜索技术的发展轨迹。互联网早期的信息量较少,简单的分类整理和人工查找即可满足需求。然而,随着互联网信息的爆炸式增长,文本检索技术应运而生,其核心是基于倒排索引的方法。这一技术能够高效处理海量数据(如 PB 级数据),进行精准的文本检索。然而,文本检索的缺点在于缺乏语义理解能力。
为弥补这一不足,向量检索技术开始发展。向量检索通过提取对象特征,将其表示为向量,利用这些向量实现语义层面的搜索。近年来,随着大语言模型(LLM)和神经网络技术的飞速发展,我们可以借助大模型对海量知识进行搜索,并进一步生成总结性答案。这不仅拓展了搜索的深度与广度,也开启了生成式搜索的新时代。
3. 业界趋势:生成式搜索
让我们比较一下传统搜索与生成式搜索的区别。传统搜索的核心工作机制是通过爬虫抓取网页,并将这些网页按关键词进行排序展示。用户在需要获取知识时,必须逐一阅读和分析这些网页,最终归纳出所需的信息。这种模式虽然能够提供丰富的数据来源,但学习效率较低,耗费大量时间和精力。
相比之下,生成式搜索依托大模型的强大总结能力,能够对搜索到的知识进行快速归纳整理,直接生成结构化的答案或总结内容。这种方式显著提高了学习效率,因此成为当前非常主流的学习方式。然而,生成式搜索也面临一些问题,我们将在后续章节中展开讨论。
二、初识检索模型
接下来,让我们一同回顾检索模型的发展历程。
1. 分词算法与倒排索引
首先来了解两项关键技术:分词算法和倒排索引。分词技术的核心是将连续的文本切割成单独的单词或词组。目前,分词技术主要分为三个类别:
- 基于词典的分词算法:这类算法依赖于预先定义的词典,通过匹配词典中的词条来识别和分割文本中的单词。
- 基于概率的分词算法:这种算法不仅仅依赖词典,还结合了统计概率方法,以确定文本中单词的分界。
- 基于机器学习的分词算法:这类算法使用机器学习技术,通过训练数据学习分词规则,以实现更准确的文本分割。
完成分词后,我们可以构建一个从单词到文本的映射关系,这被称为倒排索引。倒排索引是一种索引结构,它允许我们快速根据关键词定位到包含这些关键词的文档,从而实现对海量数据的高效检索。这种索引机制是现代搜索引擎能够快速响应用户查询的关键技术之一。
2. 经典检索模型
接下来介绍经典的检索模型。在此列举四种最基础的模型,首先是布尔检索模型。这种模型基于布尔逻辑来组合关键词,其返回结果是满足特定布尔表达式的文档集合。布尔检索模型的优点在于结构简单且查询精确,但同时也存在一些缺点,如缺乏灵活性,不提供结果排序功能,且对用户的查询能力要求较高,需要用户能够准确表达他们的查询需求。
继布尔检索模型之后,概率空间模型应运而生。概率空间模型基于概率论,尤其是贝叶斯理论,它通过利用文档集合中的统计信息来估算文档满足用户查询的概率。这种模型的优点在于,它提供了概率解释,可以根据文档与查询之间的相关性概率进行排序。然而,它也存在一些缺点,包括参数选择和模型调整过程较为复杂,且在面对缺乏足够统计信息的小型文档集合时,其性能可能不尽如人意。
接下来,详细介绍 TF-IDF 权重模型和向量空间模型。TF-IDF 模型主要基于词频(Term Frequency)和逆文档频率(Inverse Document Frequency)来评估一个词在文档中的重要性。这种技术目前被广泛应用于文档检索和文本挖掘领域。尽管其核心仍然是基于关键词的检索,但它的优势在于能够评估词语在文档集合中的重要性。
向量空间模型则基于向量检索,它将文本转换为向量空间中的点,通过计算向量之间的距离或相似度来进行检索。这种模型的主要优势在于能够进行语义检索,因为它考虑了词项之间的相对关系和上下文。然而,它的缺点在于高维空间可能导致计算成本较高。此外,由于我们目前描述向量的特征维度有限,最多达到4096维,因此结果的准确性可能不如基于文本的检索方法高。这意味着在处理高维数据时,向量空间模型可能会遇到性能瓶颈,且在准确性上可能有所妥协。
3. 全文检索
接下来介绍的是全文检索。全文检索结合了前面介绍的概率空间模型和 TF-IDF 模型,通过分词、倒排索引以及贝叶斯算法等技术来统计词语与文档的相关性,进而找到包含特定关键词或短语的文档。以 TF-IDF 为例,TF 指的是词条在文档中出现的频率,即词频;IDF 则是词条在所有文档中出现的逆频率,它是通过取词条出现次数的倒数再取对数得到的。总体而言,一个词语在一篇文章中出现的次数越多,同时在所有文档中出现的频率越低,它就越能代表该文档。这种检索方式相较于传统的关键词文本检索,具有评分和评估相关性的功能,因此其精准性得到了显著提升,并且能够应对关键词的缺失。然而,它的局限性在于仍然基于文本,缺乏较好的语义理解能力。例如,“计算机”和“电脑”在语义上是相同的,但在全文检索中仍然被视为两个独立的词。
4. 向量检索
向量检索,也称为近似检索或语义检索,它通过将文档和查询表示为向量空间中的向量,并利用这些向量之间的相似度来检索出与查询最相关的文档。这种检索方式的优点在于其良好的语义理解能力。然而,由于描述向量时特征维度的限制,其精准性可能存在不足。此外,向量检索无法有效应对关键词检索,且难以表达文档的额外属性。这些局限性表明,尽管向量检索在语义层面有所突破,但在精确性和功能性方面仍有改进的空间。
三、从 Lucene 到 ES
接下来,将进入今天的主题——Elasticsearch(ES)。
首先来介绍一下 Lucene。Lucene 是 Apache 软件基金会下的一个开源全文检索引擎工具包。它为软件开发人员提供了一个简单易用的类库,以便在目标系统中实现全文检索的功能。
Lucene 基于倒排索引,提供了一系列的文本处理和搜索功能,包括分词、停用词处理、评分排序、高亮显示以及近实时搜索等。此外,Lucene 还提供了丰富的查询方式,例如范围查询、前缀匹配、模糊匹配和布尔查询等,这些功能使得它在全文检索领域非常强大和灵活。通过这些高级搜索特性,Lucene 能够满足各种复杂的搜索需求,为用户提供快速而准确的搜索结果。基本上在业界只要提全文检索,Lucene 就是第一选择。
尽管 Lucene 是一个非常强大的全文检索库,但它是为单机环境设计的。为了解决大规模数据和分布式环境的需求,Elasticsearch 应运而生。Elasticsearch(简称 ES)是一个开源的、基于 Lucene 的分布式全文检索和数据分析引擎。它能够处理海量数据,并提供实时的检索和统计分析功能。Elasticsearch 的设计使其成为处理大数据场景的理想选择,尤其是在需要快速响应和高吞吐量的环境中。
Elasticsearch 的社区非常庞大,全球有超过 10 万的社区参与者,其中在中国就有 1 万。这个数字体现了 Elasticsearch 在全球范围内的广泛受欢迎和应用。此外,Elasticsearch 的下载量达到了 3.5 亿次,在全球搜索引擎的排名中,Elasticsearch 位居第一,在全球数据库的排名中位列第七。这些排名数据源自 DB-Engines,这是一个广受认可的数据库管理系统排名网站。其排名依据涵盖多个维度,包括社区活跃度、下载量、专业出版物中的提及次数等,从而为数据库管理系统的流行度和影响力提供了权威的参考。Elasticsearch 在这些排名中的卓越表现,进一步彰显了其在全文检索和数据分析领域的重要地位。
当前 Elasticsearch 提供了一个 ELK 套件。Elasticsearch 作为 ELK 栈的中心,主要负责数据的存储和分析。ELK 栈包括以下三个主要组件:
- Elasticsearch:负责存储、搜索和分析数据。它是一个强大的搜索引擎,能够处理大量数据,并提供快速的数据检索能力。
- Kibana:负责数据的可视化展示。Kibana 允许用户通过图表、地图和仪表板等形式直观地查看和理解 Elasticsearch 中的数据。
- Logstash:负责数据采集和处理。Logstash 是一个服务器端数据处理管道,可以同时从多个来源采集数据,转换数据,然后将数据发送到 Elasticsearch。
有时,ELK 栈也会包括 Beats,这是一个轻量级的数据采集器,用于向 Elasticsearch 或 Logstash 发送数据。Beats 有多种类型,每种类型都针对特定的数据类型或使用场景进行了优化。
ELK 栈提供了一个完整的解决方案,从数据采集、处理到存储和可视化,使得用户能够轻松地从大量数据中提取有价值的信息。这个栈因其灵活性、可扩展性和易用性而受到许多企业和开发者的青睐。
Elasticsearch 一直是日志场景中的首选解决方案,因为它能够提供高性能的海量数据全文检索。同时,Elasticsearch 提供了商业套件 X-Pack,该套件增强了 Elasticsearch 的功能,包括数据安全、告警、监控、报表、图查询以及机器学习等高级功能。这些功能使得 Elasticsearch 不仅能够处理和检索数据,还能够提供更深层次的数据洞察和安全保障。
四、大模型与 RAG
接下来探讨大模型与 RAG(Retrieval Augmented Generation)。
大模型主要分为两类:
- 决策式大模型:这类模型主要根据数据输入进行决策,其规模相对较小,主要应用于人脸识别、推荐系统、风控系统等场景。它们学习数据中的条件概率分布,用于分类、预测和决策任务。
- 生成式大模型:这类模型学习数据中的联合概率分布,用于生成新的数据实例,如文本、图像或音频。它们通常具有较大的规模,因为生成新内容需要深入洞察数据。生成式大模型通常拥有上亿甚至上万亿的参数,主要应用于智能问答、智能客服、智能写作等场景。
随着混元 GPT、通义千问等大型模型的相继问世,这些先进的人工智能技术如今已在全球范围内引发广泛关注与热议。在此背景下,我们迫切期望能够将这些大模型技术引入实际生产环节,以期推动产业升级与创新发展。
尽管大模型在人工智能领域取得了显著的进展,但它们也面临着一些挑战。首先,大模型的训练数据是静态的,这意味着它们在训练完成后无法实时更新,无法纳入训练之后发生的新信息。因此,大模型在面对后续出现的事件和信息时,可能会表现出认知上的滞后性,从而导致其知识体系逐渐过时。
其次,大模型通常拥有上亿甚至上万亿的参数,这使得每次更新都需要大量的计算资源,尤其是高性能显卡。因此,新信息的引入对于已经学习了海量数据的模型来说,短期内的少量数据基本上无法产生足够的信号来影响其输出,这使得模型更新成本极高。
此外,许多企业的私域知识库不会暴露到公网,而大模型大多基于公网数据进行训练。这导致大模型对私域知识库的表现能力较差,限制了其在企业生产中的应用。
鉴于上述问题,RAG(Retrieval-Augmented Generation)技术应运而生。RAG 技术通过结合检索和生成的方法,能够更好地处理和利用私域知识库,从而提升大模型在企业生产中的应用效果。
RAG 技术,即检索增强生成技术,是一种通过检索外部知识库来提升大模型生成效果的技术方案。该技术在大模型基础上,通过对本地知识库进行检索,以增强大模型输出的准确性和相关性。
RAG 技术主要应用于知识问答、智能客服、专家系统等场景,其工作流程主要包括以下五个步骤:
①发起问题:用户提出问题,RAG 系统首先对问题进行处理,包括改写、扩写或优化,并将其转换为向量形式,以便于后续处理。
②搜索文档:在 RAG 系统的知识库中进行检索,寻找与问题相关的文档或信息片段。
③Prompt 组装:将检索到的结果与原始问题进行整合,形成一个 prompt 提示,该提示将作为输入发送到大模型。
④模型生成:大模型根据 prompt 生成答案,这一步骤依赖于模型的预训练知识和检索到的外部信息。
⑤答案返回:生成的答案经过格式处理后,返回给用户,完成整个问答流程。
这一流程展示了 RAG 技术如何通过结合检索和生成的方法,提升大模型在特定场景下的应用效果。
五、一站式向量检索与 RAG 方案
下面通过一个具体的落地案例来进一步探讨 RAG 技术的应用。
以 Langchain 为代表的众多公开 RAG 解决方案,倾向于采用纯向量检索方式。正如前文所述,纯向量检索的优点在于流程简单、语义理解能力强,但其缺点是精准性较差,因为其依赖于相似度检索,难以处理关键词,且无法表达文档的额外属性。
相比之下,基于倒排索引的全文检索虽然精准度高,但语义理解能力较弱。因此,腾讯 ES 在 RAG 领域提出了一种基于混合检索的一站式解决方案,即结合向量检索和文本检索的多路召回方式,以充分发挥两者的优势,取长补短。
该方案的先进性体现在以下几个方面:首先,全文检索基于 Lucene 的 BM25 评分算法,这是在 TF-IDF 基础上的一次升级,增加了与问题相关性的评分。同时,引入了多语言分词,包括中文、日文、韩文、拼音等,并设计了 QQ 分词,内含百万级中文词汇,基本覆盖了绝大多数的中文场景,分词效果显著。
其次,向量检索基于原生 HNSW 算法,并在此基础上自研构建了高性能、高召回率的向量索引。经过验证,我们的多路召回方案在召回率上相对于纯向量检索和文本检索有大幅提升,最高达到了 95%,基本满足了大部分商用场景和 ToB/ToC 场景的召回率要求。因此,我们的方案已被混元收录为 RAG 多路召回的标准解决方案,并在公司内外部支持了 WXG、PCG、TEG 等大型在线知识库的 RAG 项目。
接下来将详细介绍在大型项目中遇到的一些挑战。自年初开始,我们接手了内部的一个大型在线知识库项目,该项目涉及海量书籍构成的百亿级向量检索数据规模,且要求检索延迟在百毫秒以内。原生 ES 基于 HNSW 算法,这是一种主流的基于图结构的向量近似搜索算法,其优点在于召回率和性能都较高,同等召回率下性能可达 Faiss 的 20 倍。然而,其缺点在于纯内存操作,资源消耗极高。在百亿知识库的场景下,资源使用几乎无法满足,预估可能需要五六百台机器,这是一个巨大的规模。
为了实现降本增效,我们通过对 ES 进行深度改造,核心原理是进程内存与系统 MMAP 文件映射的动态结合。具体流程如下:当数据写入内存时,首先在内存中构建上层向量索引和倒排索引,然后将细粒度的向量数据和字段信息进行持久化,编码存放到磁盘上,再通过预加载 Preload 到 MMap FS,在 MMap FS 中进行快速检索。通过这种方式,大幅降低了 HNSW 的内存资源消耗。同时,通过高效的文件编码、MMAP 文件的动态管理以及向量的标量化,提升了检索性能。
这样做的目的是:
- 当进程内存充足时,当纯内存向量&倒排索引检索库使用,以保证最佳的性能;
- 当进程不足以存放全部索引时,可以利用 MMapFS 来做内存的压缩跟热索引的访问加速;
- 当进程 + MMapFS 文件系统都存放不下全部向量索引时,此时自动降级为磁盘向量检索算法。
这种深度改造的架构突破了传统的 HNSW 算法受内存资源的限制,只需要原本的 1/10 ~ 1/20 左右的内存就可以将向量索引全部加载进内存。向量规模越大,实际上可压缩节省的内存就越多。同时我们通过高效的文件编码、MMapFS 文件的动态管理,向量的 int/byte 量化,依然保持了基本无损的写入跟查询性能。不足之处在于首次读取时预加载到 MMapFS 有一个过程,但可以通过主动触发 PreLoad 来加速这个过程。
经过验证,我们的方案在内存资源消耗上降低了 80%,在同等资源情况下,性能提升了 5 到 10 倍。相对于开源 ES 版本,腾讯 ES 能够实现 10 倍的性能提升,达到了业界领先水平。
随后,我们将资源优化部分回馈到开源 ES 社区和 Lucene 社区,得到了社区的高度认可和广泛宣传。这不仅提升了我们的技术影响力,还收到了 Elasticsearch 创始人的感谢信。未来,我们将在 AI 时代继续与开源 ES 社区保持紧密合作,共同推动技术的进步与发展。
为了更好地服务于更多客户,我们与中国信通院云计算大数据研究所联合40余家企业的 70 多位专家,共同编制完成了 RAG 技术标准。腾讯 ES 作为国内公有云首个从自然语言到向量生成、存储、检索并以大模型集成端到端的一站式平台,腾讯云作为核心参与企业,也是首个通过 RAG 权威认证的标准企业。该标准主要包含五个能力域:知识库构建能力、知识检索能力、内容生成能力、质量评估能力和平台能力。
接下来,我们将介绍腾讯云 ES 的功能,并探讨其与业界现有数据库的区别。目前,业界已有许多相关数据库,如 Milvus 和 Chroma 等向量数据库,以及 MySQL 和 PostgreSQL 等传统数据库,它们也集成了向量检索功能。然而,腾讯云 ES 主要为 RAG 应用提供了丰富的功能,超越了传统向量数据库和其他数据库的解决方案范围。
我们在存储、搜索和生成向量的基础上,还提供了一个开箱即用的训练模型,并支持混合搜索,即基于文本和向量的检索。用户可以灵活选择嵌入模型,并享受过滤、切片、聚合、自动补全、搜索分析、文档级安全以及本地云混合等功能。
用户在使用腾讯 ES 时,还可以选择我们提供的自有优化模型 ELSER,这是一个基于稀疏模型的优化方案。此外,ES 还内置了微软的 Multilingual-e5 模型,用户也可以上传自己微调训练好的 Transformer Bert 模型到 ES 中进行部署。同时,用户还可以调用 OpenAI 和 Hugging Face 上的模型接口,进行数据的向量化处理。
在结果重排方面,ES 提供了一种倒数融合排序算法,该算法主要根据每个结果在结果集中的排序位置,而不是基于相关性分数。这种方式的好处在于,不需要进行归一化调整,就能实现相对较好的排序效果。用户可以减少对相关性的细微调整,从而大大提高便利性。
ES 的混合搜索功能并非简单地将文本搜索和向量搜索拼凑在一起。在底层引擎方面,不仅提供了文本索引、向量索引和数值索引,还在查询分析理解方面提供了分词、同义词词库、词权重调整、文本分类、命名实体识别等功能。在多路召回方面,可以对每个查询的文本相关性、相似度和类目相关性进行微调。对于多路召回的结果,进行混合打分,并提供了 RF 算法和 LTR(Learning to Rank)模型,用于结果的重排序。
ES 还提供了一个专有的机器学习节点,用户可以使用这些专有机器学习节点来上传、管理和部署向量模型,一站式完成向量生成和检索,从而有效提升向量推理能力。同时,这些节点与数据节点隔离,保障了在线业务的稳定性。
为了满足微信、QQ 等海量数据推理的需求,ES 与公司自研的紫霄 AI 芯片相结合。由于原生 ES 基于 CPU 推理,目前不支持 GPU,因此我们采用了自研 AI 芯片紫霄的最新 V2 版本。相对于社区 ES,原生 ES 的性能提升了 18 倍。我们提供了一站式解决方案,用户只需输入一条命令,即可完成从向量生成、向量检索到混合检索,直至输出结果的全流程操作。
六、案例实践
接下来将详细介绍一个具体的应用案例。
该平台提供了海量数字书籍阅读服务,并最近推出了一个新功能——AI 问书。AI 问书主要提供书籍内容的智能检索,用户在阅读过程中遇到不理解的内容时,可以通过 AI 问书功能在当前书籍中搜索相关答案,而不是依赖于混元等大模型。这是因为大模型可能无法根据特定书籍的内容给出准确回答,而 AI 问书则基于 RAG 技术,能够根据书籍的语义尝试回答用户的问题。举个例子,用户在 AI 问书中输入“马克思”,系统会输出马克思在某本书中的详细资料,并引用相关书籍。此外,系统还会根据用户的问题进行拓展,提供更多相关信息。
这个知识库平台最初并未使用腾讯云 ES,因此遇到了以下技术挑战:
- 整体数据超 10 亿级向量规模,存储成本高。早期评估的非 ES 方案,为了满足毫秒级查询,需要缓存全部数据到内存中,则 30 亿 768 维的向量,需要超过 400 台 64G 机器,运营成本百万级。
- 运维成本高:除了全文检索,同时还需部署向量化服务,在外部进行向量化后,写入到向量数据库,同时向量数据库不存储原始文本信息,还需要额外存放到全文数据库,跟文本的索引信息,相当于需要同时四套系统。
- 开发成本高:调试召回过程中,需要在外部进行向量化后,从向量数据库召回,然后再用召回 id 访问正排获取原始文本。相当于每一次召回调试需要 3 次操作,跨越 4 个系统。
- 稳定性要求高:在线读书平台超亿级用户,稳定性要求 5 个 9 以上。
- 查询性能要求高:高并发场景下查询延迟需要毫秒级返回,数亿量级数据全链路多路召回需控制在 100ms 以内。
在与业务沟通后,我们采用了如下方案,首先,他们将微调好的模型上传到腾讯 ES 的机器学习节点,然后将书籍进行入库。入库过程中,文本首先会进行分词、分段和语义切分,然后输入到机器学习节点进行数据的向量化。同时,数据还会进行基于 Lucene 的分词,分词完成后进行文本检索,向量化完成后进行向量检索。在 ES 中,用户只需一条命令即可完成文本检索和向量检索。搜索到的结果与问题相结合,拼成 Prompt 提示后发送到 LLM 大模型生成答案。这种方式大幅降低了成本,并使运维变得非常方便。
腾讯云 ES 提供了一站式的 RAG 方案,具体而言,AI 问书在实现过程中,主要应用了以下能力:
- 知识向量化:通过上传自定义的 embedding 模型到腾讯云 ES 提供的机器学习节点中,实现书籍内容与搜索词的向量化(embedding)。
- 混合搜索:腾讯云 ES 提供了全文检索与向量检索能力,只需要简单的一条查询语句,即可从 ES 中实现混合搜索与多路召回。
- 与大模型集成:腾讯云 ES 支持通过 API 与混元大模型进行集成,深度打通混元一站式,从 ES 召回的数据,可与 Prompt 一起送进到大模型中进行生成式整合,最终完成智能问答。
- Kibana 调试:作为与 ES 天然集成 Web 页面,Kibana 提供了丰富的可视化能力,能帮助开发运维人员快速进行召回调试,并在 Kibana 上完成模型的部署与管理。
- 安全高可用:腾讯云 ES 自研全链路熔断限流方案,同时支持多副本、多可用区部署,能够有效保障在线业务稳定性。
目前腾讯 ES 已在官网上公开售卖,近期将推出 RAG 一站式服务的 AI 搜索,帮助用户直接使用一整套方案。欢迎大家试用腾讯 ES,感谢大家的关注。
七、Q&A
Q:在做文本检索时会使用既有向量又有关键词的混合检索,混合检索会得到多种类型的结果,请问如何对这些结果进行重排序来选出其中高价值的结果。
A:对于多路召回的结果第一块是一个前面介绍过的倒数排序的融合,它主要对多路的结果进行融合,例如这个例子中有两路结果,基于每一路的排名结果对最终结果进行融合。另一种是重排模型(Reranker),例如利用 LLM 大模型提供的功能对结果进行重排。
文章来自:51CTO