1、RAG概述
ChatGPT、GLM等一众生成式人工智能在文本创作及文本至图像转换等领域,展现出了令人瞩目的能力。然而,这些尖端技术亦非尽善尽美,其固有的局限性如同暗礁,潜藏着诸如生成内容的虚幻性、解释性的缺失、专业知识的浅薄,以及对时代新知把握的不足等问题。为了跨越这些障碍,提升模型的效能,研究者们探索出两条主要路径:一是通过微调(Fine Tune)技术,让模型在既有基础上进一步精进;二是赋予模型与外界交互的能力,使其能够以多元的方式汲取新知。 微调技术,无疑如同一把锐利的手术刀,能够精准地雕琢模型,使其深谙私域知识之精髓。然而,这柄双刃剑亦有其锋利之外的隐忧。首先,模型的内隐知识(权重)如同其基因的烙印,难以彻底摆脱生成虚幻内容的宿命。在需要高度精确理解与严格准确性的场景下,这种虚幻性如同迷雾,让人难以窥见真相,用户往往难以从答案的字面捕捉到模型是否正在信口开河。其次,现实世界的数据洪流瞬息万变,概念与认知如同沙堡,随时可能被新的浪潮重塑。而微调,这个看似简单实则繁琐的过程,从数据搜集、算力配置、效果评估到训练时长,无一不是巨大的挑战。即便是每月一次的更新,也已是理想中的奢求,更遑论随时跟进最新的数据变动。 面对这些难题,RAG(Retrieval Augmented Generation)技术如同一束光,照亮了生成式模型与外界沟通的桥梁。RAG如同一个智慧的搜索引擎,能够精准地捕捉到用户问题的核心,从浩瀚的知识库中捞取最相关的信息或对话历史,再将这些素材与原始问题巧妙融合,编织成信息丰富的提示符,引导模型生成精准无误的回答。这一技术的核心,正是情境学习(In-Context Learning)的智慧结晶。 在大型语言模型(LLM)的广阔天地里,构建一个基本可用的原型或许不难,但要将之打造为生产级别的利器,却是一项艰巨而复杂的工程。尤其是高性能的RAG系统,更是需要跨越重重难关。然而,RAG的价值已得到了广泛的认可与应用,它在企业私域知识问答等领域大放异彩,成为了众多创新应用的基石。如今,主流的chat to PDF、chat to doc等工具,皆是RAG技术的璀璨成果。这些应用如同桥梁,连接着用户与知识的海洋,让信息的传递与转化变得更加便捷与高效。
2、RAG基本流程
如下图所示RAG可分为5个基本流程:知识文档的准备;嵌入模型嵌入模型(embedding model);向量数据库;查询检索和生产回答。下面会对每个环节进行详细描述:
NO.1 知识文档的准备
构建高效RAG系统的基石在于精心筹备知识文档。在实际操作中,我们需应对五花八门的知识来源,无论是Word、TXT的简洁文本,CSV、Excel的数据阵列,还是PDF的复杂布局,乃至图片与视频的视觉盛宴。为此,首要任务是借助专业工具——比如PDF解析利器,或是多模态技术如OCR,将这些多元知识载体转化为大语言模型能轻松解读的纯文本。面对PDF,PDF解析器能精准抽取其精髓;至于图像与视频,OCR则如同慧眼,捕捉并转化其中的文字脉络。 再者,鉴于文档冗长的普遍现象,文档切割成为不可或缺的一环。我们将浩瀚篇章细分为若干文本段落,以此优化信息处理与检索效率。此举不仅为模型减负,更提升了信息定位的精确度。后续篇章将深入探讨文档切割的奥秘及其内在逻辑,揭示其如何为构建高效RAG系统添砖加瓦。
NO.2 嵌入模型
将文本转化为向量形式,是嵌入模型的核心使命。在早前的文章《向量数据库于RAG中的奥秘》里,我们已深入探讨过文本向量化的诸多裨益。简而言之,日常言语中歧义丛生,助词泛滥,难以精准传达意义,而向量表示则更为紧凑、精确,能够细腻捕捉语句的上下文脉络与核心意涵。这种转化让我们仅凭向量间差异的简单计算,便能洞悉语义相近的句子。譬如,欲比较“苹果乃水果之属”与“香蕉身披黄裳”,嵌入模型可将这些句子幻化为向量,再经由相似度测算,便能洞察它们之间的关联深浅。那么,如此神奇的嵌入模型究竟如何铸就?作为典范,让我们以Google的Word2Vec模型为鉴,一探其训练究竟。在这个模型中,文本不再是单纯的文字堆砌,而是被转化为富含语义信息的向量,让我们得以在数字的海洋中遨游,探寻语言的奥秘。
Word2Vec,这一强大的词嵌入技术,拥有两种训练路径,但为了便于理解,我们将聚焦于图示中的CBOW模型进行阐述。CBOW模型的精髓,在于利用一句话中某个关键词的周边词汇(即其上下文)来推测这个关键词本身。以句子“The cat sat on the mat”为例,我们的目标是利用CBOW模型预测出关键词“sat”。下面,我们一步步揭开其训练的面纱: 首先,我们为上下文词汇“the”、“cat”、“on”、“the”和“mat”分别生成它们独特的one-hot编码。one-hot编码,一种直观的词汇表示方式,它在词汇表构成的巨大向量空间中,为每一个词汇分配一个位置,该位置为1,其余位置全为0。例如,“the”可能被编码为[1,0,0,0,…],这里的省略号代表词汇表中其余词汇的位置。 紧接着,这些one-hot编码会与一个形状为V×N的权重矩阵W相遇(V代表词汇表的广度,N代表词向量的深度)。每一次相遇,都会诞生一个新的词向量。随后,我们将这些词向量汇聚一堂,取它们的平均值,得到一个代表整个上下文情境的向量e,它位于projection layer之中,形状为1×N。 接下来,向量e将踏上新的旅程,与另一个权重矩阵W相乘,并通过SoftMax函数的洗礼,最终输出一个1×V的向量。这个向量,如同一面镜子,映照出模型对每个词汇成为中心词的概率。 而真正的挑战,在于如何使模型的预测与真实的中心词相吻合。这需要我们通过预测与实际之间的误差,不断调整两个权重矩阵W和W。经过无数次的迭代与优化,步骤二中得到的向量e将愈发精准地捕捉句子的深层含义。 当然,Word2Vec并非词嵌入领域的终点。BERT、GPT等高级模型,以其更为复杂的网络架构,捕捉着更为微妙的语义联系。这些嵌入模型,如同连接用户查询与知识库的桥梁,确保每一次回答都能精准地触达用户的需求,为智能系统的准确性和相关性保驾护航。
NO.3 向量数据库
同样的,我们在之前的文章《一文了解向量数据库在RAG中的扮演的角色》中详细介绍过向量数据库。顾名思义,向量数据库是专门设计用于存储和检索向量数据的数据库系统。在RAG系统中,通过嵌入模型生成的所有向量都会被存储在这样的数据库中。这种数据库优化了处理和存储大规模向量数据的效率,使得在面对海量知识向量时,我们能够迅速检索出与用户查询最相关的信息。
NO.4 查询检索
再经过上述几个步骤的准备后,我们就可以开始进行处理用户查询了。首先,用户的问题会被输入到嵌入模型中进行向量化处理。然后,系统会在向量数据库中搜索与该问题向量语义上相似的知识文本或历史对话记录并返回。
NO.5 生成回答
最终将用户提问和上一步中检索到的信息结合,构建出一个提示模版,输入到大语言模型中,静待模型输出答案即可。
3、RAG优化
刚才讲述的流程仅仅为基本的RAG流程,但是其中的各个环节均有着极大的优化空间。下面我们将从上述5个环节中穿插12个具体优化策略来依次讲解。下面介绍的方法均在AI开发框架langchain和LLamaIndex中有具体实现,具体操作方法可参考官方文档。
NO.1 数据清洗
高性能RAG系统依赖于准确且清洁的原始知识数据。一方面为了保证数据的准确性,我们需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。另一方面我们也需要对知识文档做一些基本数据清洗其中可以包括:
a)基本文本清理:规范文本格式,去除特殊字符和不相关信息。除重复文档或冗余信息。
b)实体解析:消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。
c)文档划分:合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。
d)数据增强:使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。
e)用户反馈循环:基于现实世界用户的反馈不断更新数据库,标记它们的真实性。
f)时间敏感数据:对于经常更新的主题,实施一种机制来使过时的文档失效或更新。
NO.2 分块处理
在RAG系统中,文档需要分割成多个文本块再进行向量嵌入。在不考虑大模型输入长度限制和成本问题情况下,其目的是在保持语义上的连贯性的同时,尽可能减少嵌入内容中的噪声,从而更有效地找到与用户查询最相关的文档部分。如果分块太大,可能包含太多不相关的信息,从而降低了检索的准确性。相反,分块太小可能会丢失必要的上下文信息,导致生成的回应缺乏连贯性或深度。在RAG系统中实施合适的文档分块策略,旨在找到这种平衡,确保信息的完整性和相关性。一般来说,理想的文本块应当在没有周围上下文的情况下对人类来说仍然有意义,这样对语言模型来说也是有意义的。
分块方法的选择:
固定大小的分块:这是最简单和直接的方法,我们直接设定块中的字数,并选择块之间是否重复内容。通常,我们会保持块之间的一些重叠,以确保语义上下文不会在块之间丢失。与其他形式的分块相比,固定大小分块简单易用且不需要很多计算资源。
内容分块:顾名思义,根据文档的具体内容进行分块,例如根据标点符号(如句号)分割。或者直接使用更高级的NLTK或者spaCy库提供的句子分割功能。
递归分块:在大多数情况下推荐的方法。其通过重复地应用分块规则来递归地分解文本。例如,在langchain中会先通过段落换行符(
)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(
)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。这种方法可以灵活地调整块的大小。例如,对于文本中的密集信息部分,可能需要更细的分割来捕捉细节;而对于信息较少的部分,则可以使用更大的块。而它的挑战在于,需要制定精细的规则来决定何时和如何分割文本。
从小到大分块:既然小的分块和大的分块各有各的优势,一种更为直接的解决方案是把同一文档进行从大到小所有尺寸的分割,然后把不同大小的分块全部存进向量数据库,并保存每个分块的上下级关系,进行递归搜索。但可想而知,因为我们要存储大量重复的内容,这种方案的缺点就是需要更大的储存空间,
特殊结构分块:针对特定结构化内容的专门分割器。这些分割器特别设计来处理这些类型的文档,以确保正确地保留和理解其结构。langchain提供的特殊分割器包括:Markdown文件,Latex文件,以及各种主流代码语言分割器。
分块大小的选择:
上述方法中无一例外最终都需要设定一个参数——块的大小,那么我们如何选择呢?首先不同的嵌入模型有其最佳输入大小。比如Openai的text-embedding-ada-002的模型在256 或 512大小的块上效果更好。其次,文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。实际场景中,我们可能还是需要不断实验调整,在一些测试中,128大小的分块往往是最佳选择,在无从下手时,可以从这个大小作为起点进行测试。
NO.3 嵌入模型
我们曾经提及,嵌入模型如同文本的魔法转换器,能将文字信息幻化成向量形式。然而,不同的嵌入模型施展的“魔法”亦有所不同。举例来说,先前我们热议的Word2Vec模型,尽管威力无边,却存在一道难以逾越的坎儿:它生成的词向量如同被施了定身咒,一旦模型训练尘埃落定,每个词的向量便一成不变。这样的特性,在处理那些身怀绝技、一词多义的词汇时,难免力不从心。比如,“我买了一张光盘”,这里的“光盘”是指实实在在的圆形盘片,而“光盘行动”中的“光盘”则摇身一变,成了倡导节约用餐的代名词。语义迥异,词向量却如出一辙,这显然是个棘手的问题。 相比之下,那些引入了自注意力机制的模型,如BERT,则如同拥有洞察人心的慧眼,能够提供灵活多变的词义理解。它可以根据上下文的不同,动态地调整词义,使得同一个词在不同的语境中,能够拥有独特的向量表示。在上述例子中,“光盘”一词在两个句子中便能拥有迥异的向量,从而更精准地捕捉其语义精髓。有些项目为了能让模型对特定垂直领域的词汇有更深入的理解,会尝试对嵌入模型进行微调。然而,这种做法我们并不推崇。一方面,它对训练数据的质量要求极高,稍有差池便可能功亏一篑;另一方面,也需要大量的人力物力投入,最终却未必能收获理想的效果,实在是得不偿失。那么,在面对嵌入模型的选择时,我们该何去何从呢?这里,我们不妨参考一下Hugging Face推出的嵌入模型行榜MTEB(https://huggingface.co/spaces/mteb/leaderboard)。这个排行榜如同一位公正的裁判,对各种模型的性能进行了全面比较,能够为我们提供有价值的参考。当然,在选择时我们也要注意,并非所有的嵌入模型都精通中文,因此在选择时应仔细阅读模型说明,确保所选模型能够满足我们的需求。
NO.4 元数据
当在向量数据库中存储向量数据时,某些数据库支持将向量与元数据(即非向量化的数据)一同存储。为向量添加元数据标注是一种提高检索效率的有效策略,它在处理搜索结果时发挥着重要作用。例如,日期就是一种常见的元数据标签。它能够帮助我们根据时间顺序进行筛选。设想一下,如果我们正在开发一款允许用户查询他们电子邮件历史记录的应用程序。在这种情况下,日期最近的电子邮件可能与用户的查询更相关。然而,从嵌入的角度来看,我们无法直接判断这些邮件与用户查询的相似度。通过将每封电子邮件的日期作为元数据附加到其嵌入中,我们可以在检索过程中优先考虑最近日期的邮件,从而提高搜索结果的相关性。此外,我们还可以添加诸如章节或小节的引用,文本的关键信息、小节标题或关键词等作为元数据。这些元数据不仅有助于改进知识检索的准确性,还能为最终用户提供更加丰富和精确的搜索体验。
NO.5 多级索引
元数据无法充分区分不同上下文类型的情况下,我们可以考虑进一步尝试多重索引技术。多重索引技术的核心思想是将庞大的数据和信息需求按类别划分,并在不同层级中组织,以实现更有效的管理和检索。这意味着系统不仅依赖于单一索引,而是建立了多个针对不同数据类型和查询需求的索引。例如,可能有一个索引专门处理摘要类问题,另一个专门应对直接寻求具体答案的问题,还有一个专门针对需要考虑时间因素的问题。这种多重索引策略使RAG系统能够根据查询的性质和上下文,选择最合适的索引进行数据检索,从而提升检索质量和响应速度。但为了引入多重索引技术,我们还需配套加入多级路由机制。
多级路由机制确保每个查询被高效引导至最合适的索引。查询根据其特点(如复杂性、所需信息类型等)被路由至一个或多个特定索引。这不仅提升了处理效率,还优化了资源分配和使用,确保了对各类查询的精确匹配。例如,对于查询“最新上映的科幻电影推荐”,RAG系统可能首先将其路由至专门处理当前热点话题的索引,然后利用专注于娱乐和影视内容的索引来生成相关推荐。
总的来说,多级索引和路由技术可以进一步帮助我们对大规模数据进行高效处理和精准信息提取,从而提升用户体验和系统的整体性能。
NO.6 索引/查询算法
我们可以利用索引筛选数据,但说到底我们还是要从筛选后的数据中检索出相关的文本向量。由于向量数据量庞大且复杂,寻找绝对的最优解变得计算成本极高,有时甚至是不可行的。加之,大模型本质上并不是完全确定性的系统,这些模型在搜索时追求的是语义上的相似性——一种合理的匹配即可。从应用的角度来看,这种方法是合理的。例如,在推荐系统中,用户不太可能察觉到或关心是否每个推荐的项目都是绝对的最佳匹配;他们更关心的是推荐是否总体上与他们的兴趣相符。因此查找与查询向量完全相同的项通常不是目标,而是要找到“足够接近”或“相似”的项,这便是最近邻搜索(ANN)。这样做不仅能满足需求,还为检索优化提供了巨大的优化潜力。下面我们会介绍一些常见的向量搜索算法以便大家在具体使用场景中进行取舍。
4、聚类
想象一下,当我们在网上购物时,通常不会在所有商品中盲目搜索,而是会选择进入特定的商品分类,比如“电子产品”或“服饰”,在一个更加细分的范畴内寻找心仪的商品。这个能帮我们大大缩小搜索范围。同样这种思路,聚类算法可以帮我们实现这个范围的划定。就比如说我们可以用K-mean算法把向量分为数个簇,当用户进行查询的时候,我们只需找到距离查询向量最近的簇,然后再这个簇中进行搜索。当然聚类的方法并不保证一定正确,如下图,查询距离黄色簇的中心点更近,但实际上距离查询向量最近的,即最相似的点在紫色类。
有一些缓解这个问题的方法,例如增加聚类的数量,并指定搜索多个簇。然而,任何提高结果质量的方法都不可避免地会增加搜索的时间和资源成本。实际上,质量和速度之间存在着一种权衡关系。我们需要在这两者之间找到一个最优的平衡点,或者找到一个适合特定应用场景的平衡。不同的算法也对应着不同的平衡。
5、位置敏感哈希
沿着缩小搜索范围的思路,位置敏感哈希算法是另外一种实现的策略。在传统的哈希算法中,我们通常希望每个输入对应一个唯一的输出值,并努力减少输出值的重复。然而,在位置敏感哈希算法中,我们的目标恰恰相反,我们需要增加输出值碰撞的概率。这种碰撞正是分组的关键,哈希值相同的向量将被分配到同一个组中,也就是同一个“桶”里。此外,这种哈希函数还需满足另一个条件:空间上距离较近的向量更有可能被分入同一个桶。这样在进行搜索时,只需获取目标向量的哈希值,找到相应的桶,并在该桶内进行搜索即可。
6、量化乘积
上面我们介绍了两种牺牲搜索质量来提高搜索速度的方法,但除了搜索速度外,内存开销也是一个巨大挑战。在实际应用场景中,每个向量往往都有上千个维度,数据数量可达上亿。每条数据都对应着一个实际的的信息,因此不可能删除数据来减少内存开销,那唯一的选择只能是把每个数据本身大小缩减。有一种乘积量化的方法可以帮我们完成这点。图像有一种有损压缩的方法是把一个像素周围的几个像素合并,来减少需要储存的信息。同样我们可以在聚类的方法之上改进一下,用每个簇的中心点来代替簇中的数据点。虽然这样我们会丢失向量的具体值信息,但考虑到聚类中心点和簇中向量相关程度,再加上可以不断增加簇的数量来减少信息损失,所以很大程度上我们可以保留原始点的信息。而这样做带来的好处是十分可观的。如果我们给这些中心点编码,我们就可以用单个数字储存一个向量来减少存储的空间。而我们把每个中心向量值和他的编码值记录下来形成一个码本,这样每次使用某个向量的时候,我们只需用他的编码值通过码本找到对应的的中心向量的具体值,虽然这个向量已经不再是当初的样子了,但就像上面所说,问题不大。而这个把向量用其所在的簇中心点表示的过程就是量化。
但是你可能会发现码本又引入了额外的开销。在真实的场景中因为维度爆炸的问题,更高的维度中数据分布更加稀疏,所以我们需要更多的聚类数量来减少丢失的细节,就比如一个128维的空间,我们需要2的64次方个聚类中心,所以最终这个码本所需的内存会变得非常恐怖,甚至超越量化本身所节省下来的内存。解决这个问题的办法是把高维的向量分割成多个低维的子向量,然后在这些低维的子向量中独立量化。比如把128维的向量分解成8个16维的子向量,然后独立的在8个独立的子空间进行量化形成自己子码本。
每个16维的空间只需要256个聚类就可以得到不错的效果,并且每个子码本将变得很小,即便8个子码本加在一起的大小也仍然足够的小,实际上我们是在把码本大小增长从指数模型分解为加法模式。最后,我们还可以把前面的提速度方法和减内存的乘积量化法结合使用,同时实现速度和内存的优化。
7、分层导航小世界
站在客户的立场审视,内存占用或许并非首要顾虑。他们更为倾心的是应用的终极表现——即解答用户疑问的迅捷度与精准性。导航小世界(NSW)算法,恰似一位智慧大师,以内存为筹码,换来了速度与质量的双重飞跃。其核心理念,宛若“六度分隔”的奇妙演绎:在这纷繁世界中,你我与任意陌生人之间,不过六步之遥。换言之,经由六人牵线,便能邂逅地球上的任何一个灵魂。 试想,将每个人喻为向量空间中的一粒点,搜索之旅便化作了一场人际寻觅。起始于点A,我们探寻与A毗邻且最接近查询向量的点B,跃迁至B,再次施展同样的寻觅魔法,循环往复,直至遇见点C——其周遭再无比它更贴近目标的邻点。此刻,点C便是那与我们心灵最为契合的向量,找到了它,便找到了答案。
NO.7 查询转换
在RAG系统的运作机制中,用户的查询被巧妙地转化为向量形式,随后在浩瀚的向量数据库里寻找匹配的火花。毋庸置疑,查询的措辞仿佛导航的罗盘,微妙地引导着搜索结果的航向。当搜索结果未能如愿以偿时,不妨尝试以下几种创新策略,对查询进行重塑,以期提升召回的精准度: a)融入历史对话的精炼重构:在向量空间这一神秘领域里,两个看似如出一辙的问题,其向量表征或许大相径庭。这时,我们可以借助LLM的智慧,对问题进行重新表述,探索新的搜索路径。更进一步的,在多轮对话的交织中,用户的某个词汇或许是对前文信息的巧妙引用。因此,将历史对话的精髓与用户的当前提问融合,交由LLM进行深度重构,往往能开启意想不到的新视野。 b)假设性文档嵌入(HyDE):HyDE的核心精髓在于,它鼓励LLM在无外部知识辅助的情况下,大胆构想一个假设性的回答。随后,这个充满创意的假设回答与原始查询携手并进,共同作用于向量检索的过程。尽管假设中可能蕴含着不实信息,但它却如同一盏明灯,照亮了LLM认为相关的信息和文档模式,为在知识库中捕捉相似文档提供了有力线索。 c)退后一步的启示(Step Back Prompting):面对复杂难解的原始查询,或是过于宽泛的搜索结果,我们或许需要一种超脱的智慧,生成一个更为抽象的“退后”问题。这个问题如同高屋建瓴的俯瞰,与原始问题并肩作战,共同拓宽搜索的边界,从而收获更多潜在的答案。例如,从“桌子君在特定时期的求学轨迹”这一具体问题,退后到更广阔的“教育历程”视角,或许能更容易地触及真相的轮廓。 d)多路并进的多查询检索:在LLM的协助下,我们可以生成多个搜索查询,这一策略尤其适用于那些需要拆解为多个子问题来解答的复杂情境。多条路径并进,无疑大大增加了触及正确答案的可能性。 通过这些匠心独运的方法,RAG系统得以更加敏锐地捕捉并响应用户的复杂需求,从而在搜索的征途中,不断提升效率与准确性的双重境界。
NO.8 检索参数
终于,我们精心准备的查询问题即将在向量数据库中大展身手,开启一场智慧的检索之旅。在深入探索这个数据库的过程中,我们可以依据其独特的配置,巧妙地调整一些检索参数,以优化我们的搜索体验。以下是一些常见且实用的参数设置: a) 稠密与稀疏搜索的权重分配:稠密搜索,简而言之,就是依赖向量的力量来探寻答案。然而,在某些特定情境下,我们或许会遇到一些限制,这时,稀疏搜索便成为了我们的备选方案。稀疏搜索通过原始字符串的关键字匹配来寻找信息,其中,最佳匹配25(BM25)算法尤为出色。它基于统计原理,对短语中的单词频率进行考量,赋予常见单词较低的分数,而将稀有词汇视为关键词,给予更高的评分。在实际操作中,我们可以巧妙地将稠密与稀疏搜索相结合,共同决定最终的结果。向量数据库允许我们为这两种搜索方式设定权重比例,例如0.6的权重可能意味着40%的分数来源于稀疏搜索,而剩余的60%则归属于稠密搜索。 b) 检索结果的数量(topK):这一参数同样至关重要。足够多的检索结果能够确保我们的查询涵盖用户关心的各个角落。在处理多元化或复杂问题时,丰富的结果集为我们提供了广阔的语境,有助于RAG系统更深入地理解问题的本质和隐含的微妙之处。然而,过多的结果也可能导致信息过载,削弱回答的精准度,同时增加系统的时间和资源消耗。 c) 向量相似度的计算方法:在衡量两个向量的相似度时,我们有多种选择。欧式距离和Jaccard距离可以用来计算向量之间的差异,而余弦相似度则通过衡量夹角来反映相似度。通常,余弦相似度因其不受向量长度影响、仅关注方向上的相似度而备受青睐。这使得模型能够超越文本长度的限制,专注于内容的语义层面。但请注意,并非所有嵌入模型都支持所有度量方法,因此,在选择时,请务必参考所用嵌入模型的详细说明。
NO.9 高级检索策略
终于,我们步入了整个系统中最为微妙且错综复杂的环节——探讨在向量数据库检索的基础上,如何精心策划并实施系统开发的深化或改良措施。这一领域的探讨,其深度与广度足以支撑起一篇独立的论述文章。但为了保持内容的精炼与聚焦,我们将聚焦于一系列备受推崇或新近提出的策略精华。 首先,让我们聚焦于“上下文压缩”这一策略。在面对体积庞大的文档块时,一个显而易见的问题是其中可能充斥着大量与查询无关的信息。如果直接将整个文档提交给大型语言模型(LLM),不仅会增加计算成本,还可能削弱响应的有效性与准确性。上下文压缩策略则巧妙地利用LLM的智能,对单个文档内容进行精简提炼,或是预先对检索结果进行筛选,仅保留那些与查询紧密相关的信息,从而显著提升检索效率与答案质量。 然而,文档块过小同样会带来问题——上下文的缺失。为了弥补这一缺陷,“句子窗口搜索”策略应运而生。其核心在于,当用户查询与某个文档块成功匹配后,不仅将该块本身,还将其周围的文档块作为上下文一同提交给LLM。这种策略能够增强LLM对文档整体语境的理解,从而更准确地回答用户问题。 与句子窗口搜索异曲同工的是“父文档搜索”策略。该策略首先将文档划分为更大的主文档单元,进而再将主文档细分为更小的子文档。当用户查询与子文档匹配时,不仅该子文档,其所属的主文档也将一同提交给LLM。这种分层级的检索方式有助于LLM在更广阔的语境中捕捉相关信息。 在父文档搜索的基础上,“自动合并”策略进一步提升了复杂性。它采用了一种树状结构的文档切割方式,如顶层节点块大小为1024,中间层为512,底层叶子节点为128。在检索过程中,仅将叶子节点与用户查询进行匹配。若某个父节点下的多个叶子节点均与查询匹配,则该父节点将被视为有效结果返回。这种策略能够在保持检索效率的同时,确保结果的全面性与准确性。 “多向量检索”策略则提供了一种更为灵活的文档表示方式。它将每个知识文档转化为多个向量并存入数据库,这些向量不仅涵盖了文档在不同粒度下的分块,还包括文档的摘要、用户可能提出的问题等有助于检索的信息。在查询时,每个向量都可能代表文档的不同方面,使得系统能够更全面地考虑文档内容,从而在回答复杂或多方面的查询时提供更精确的结果。例如,如果查询与文档的某个具体部分或摘要高度相关,那么相应的向量就能在检索过程中发挥关键作用,提升该部分内容的排名。 “多代理检索”策略则是一种融合了多种优化手段的综合解决方案。它选取我们之前提及的12大优化策略中的部分策略,交由一个智能代理进行合并使用。例如,可以结合子问题查询、多级索引和多向量查询等策略,先通过子问题查询代理将用户提问拆解为多个小问题,再让文档代理对每个子问题进行多向量或多索引检索,最后由排名代理将所有检索到的文档进行汇总并提交给LLM。这种策略的优势在于能够充分发挥各种方法的优势,弥补彼此的不足。例如,子问题查询引擎在探索每个子查询时可能缺乏深度,而文档代理在深入研究特定文档和检索详细答案方面则表现出色。通过综合多种方法,可以更有效地解决复杂问题。 最后,我们来谈谈一种全新的RAG框架——“自反思搜索增强”(Self-RAG)。与传统RAG相比,Self-RAG的最大创新在于引入了检索评分和反思评分两个机制来提升答案质量。它主要分为检索、生成和批评三个步骤。首先,Self-RAG利用检索评分来评估用户提问是否需要检索。如果需要,LLM将调用外部检索模块查找相关文档。接着,LLM为每个检索到的知识块生成答案,并生成反思评分来评估这些答案的相关性。最后,将评分较高的文档作为最终结果一并提交给LLM进行处理。这种自反思的机制使得Self-RAG能够在不断迭代中优化检索和生成过程,从而提供更高质量的答案。 综上所述,这些策略各具特色,共同构成了向量数据库检索系统开发与改良的坚实基石。在未来的实践中,我们将继续探索和完善这些策略,以期为用户提供更加高效、准确和智能的检索服务。
NO.10 重排模型(Re-ranking)
当我们完成了语义搜索的优化流程,系统确实能为我们捕捉到语义层面最为贴近的文档。然而,一个微妙却至关重要的问题悄然浮现:语义上的贴近,是否必然等同于信息的相关性?事实证明,这两者之间并不能划上等号。譬如,当用户渴望获取“最新上映的科幻电影推荐”时,系统却可能反馈给他们一篇探讨“科幻电影历史演变”的深度文章。尽管这篇文章与科幻电影有着千丝万缕的联系,但它显然未能精准捕捉用户对于最新电影资讯的渴求。 为了跨越这一鸿沟,重排模型应运而生,它如同一双慧眼,对初步检索结果进行更为细腻、深入的相关性剖析与排序,力求将用户的查询意图转化为屏幕上最直观、最贴合的展示。这一变革性的飞跃,往往依赖于深度学习模型的强大力量,诸如Cohere等前沿技术,它们能够洞察更多维度的信息,如用户的查询目的、词汇的丰富内涵、过往行为轨迹以及上下文环境等。 以“最新上映的科幻电影推荐”为例,在初次检索阶段,系统或许会因为关键词的匹配,而呈现出科幻电影的历史回溯、科幻小说的精彩介绍乃至最新电影的新闻速递等纷繁内容。但到了重排阶段,模型则像一位精通筛选的艺术大师,它会细致剖析每一项结果,将那些与用户查询意图最为契合、最为新鲜的科幻电影列表、影评或推荐置于前台,而将那些关于科幻电影历史的沉思或稍显偏离主题的内容悄然移至幕后。如此,重排模型不仅显著提升了检索结果的相关性与精准度,更为用户带来了一场量身定制的信息盛宴。
NO.11 提示词
大型语言模型的解码机制,其精髓在于依据给定的输入内容,智能预测接下来的词汇。这一特性意味着,我们如何构思提示语或提问,将微妙地调整模型预测下一个词汇的概率天平。这启示我们:通过变换提示语的表述,我们能巧妙地调控模型对不同类型问题的接纳度与回应风格。例如,巧妙地调整提示语,让大型语言模型(LLM)清晰认知其任务角色,无疑是大有裨益的。 为了降低模型输出主观臆断与虚幻内容的几率,在RAG系统的提示语中明确指示回答应严格基于搜索结果,避免掺杂任何额外信息,是至关重要的。例如,可以这样设定提示:“你是一位智慧型客服代表。你的使命是提供精确无误的信息,全力协助提问者排忧解难。请保持亲切友好,但避免冗长繁琐。基于提供的上下文,忽略既有知识,精准回应查询。”当然,根据具体情境,也可适度允许模型回答中融入些许主观色彩或其知识理解。 此外,采用少量样本示例法,将期望的问答模板融入提示语中,引导LLM有效利用检索到的知识,是提升生成内容品质的又一妙招。这种方法不仅能令模型回答更为精准,还能显著增强其在特定场景下的实用性,让LLM的回答更加贴合实际需求。
NO.12 大语言模型
终于我们来到最后一步——LLM生成回答。LLM是生成响应的核心组件。与嵌入模型类似,可以根据自己的需求选择LLM,例如开放模型与专有模型、推理成本、上下文长度等。此外,可以使用一些LLM开发框架来搭建RAG系统,比如,LlamaIndex或LangChain。这两个框架都拥有比较好用的debugging工具,可以让我们定义回调函数,查看使用了哪些上下文,检查检索结果来自哪个文档等等。
结语
在本文中,我们一起深入探索了RAG(Relevance- Generation)系统的各个方面,从初步的文档准备到复杂的多代理检索策略,希望得到了对RAG一个全面且深入的认识。这个旅程虽然充满挑战,但同样展现了RAG系统在处理大规模信息检索和理解任务时的巨大潜力。通过细致地优化查询问题,灵活运用多级索引和路由技术,以及实施先进的检索策略,我们能够显著提高系统的效率和准确性,从而更好地满足用户的需求。RAG系统的未来发展令人充满期待,随着技术的不断进步,我们有理由相信它将在各行各业中发挥越来越重要的作用。
那么,如何系统的去学习大模型LLM?
作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!