应用语义相似度优化标签过滤品质 RAG开发新技术
本文旨在引见如何应用语义相似度改良标签过滤以优化RAG运行开发品质。
要了解本文中的内容,你须要把握Jaccard相似性和向量搜查等预备常识。本文算法的成功已在GitHub()上颁布,并且是齐全开源的。
简介
多年来,咱们曾经发现了如何从诸如数字、原始文本、图像和标签等不同类型的形式数据中检索消息。
随着运行程序定制用户接口的日益遍及,标签搜查系统已成为一种繁难、准确的消息过滤方式。理论,经常使用标签搜查的一些代表性场景包括检索社交媒体帖子、文章、游戏、电影,甚至简历等畛域。
但是,传统的标签搜查缺乏灵敏性。假设咱们要过滤齐全蕴含给定标签的样本,或者会产生以下状况,特意是关于仅蕴含几千个样本的数据库,或者没有任何(或只要少数)与咱们的查问婚配的样本。
缺乏无关消息时两种搜查打算的搜查结果差异(作者自己提供图片)
经过上方的内容,我将引见几种新的搜查算法。就我所知,目前我还没有在网络上找到与此相反的算法。
传统标签搜查是如何上班的?
传统系统驳回一种称为Jaccard相似度的算法(理论经过Minhash算法口头),该算法能够计算两组元素之间的相似度(在咱们的例子中,这些元素是标签)。如前所述,这样的搜查基本不灵敏(无论汇合中蕴含或是不蕴含查问的标签)。
一个繁难的AND位操作示例(虽然这里给出的并非是Jaccard相似性,但是能够展现过滤方法的大抵概念)(作者自己提供图片)
咱们能做得更好吗?
假设咱们不只是从婚配的标签中过滤样本,而是思考样本中一切其余不相反但与咱们选用的标签相似的标签,那么状况会怎样样呢?咱们可以使算法愈加灵敏,将结果裁减到非完美婚配,但依然是良好的婚配。咱们的思绪是:间接将语义相似性运行于标签,而不是文本。
语义标签搜查算法
正如文章扫尾提到的那样,这种新方法试图将语义搜查的配置与标签过滤系统相结合。为了构建这个算法,咱们只要要做一件事:
在本文示例名目中,我将经常使用的参考数据是Steam游戏库的开源汇合(可从Kaggle下载:,遵照MIT容许证)——大概有00个样本,这是用于测试咱们算法的不错的样本。正如咱们从显示的数据帧中看到的,每个游戏都对应几个已调配的标签,咱们的数据库中共有多个惟一的标签。
示例源文件中提供的Steam数据帧截图(作者自己提供图片)
如今,咱们曾经预备好了初始数据,就可以继续接上去的上班了。
咱们的算法将经过以下步骤启动论述:
在本文中,我将只剖析这种新方法面前的数学原理(无关代码的深化解释和上班演示,请参阅本文示例工程源码:。无关如何经常使用simtag的说明,请参阅源码工程根目录下的README.md文件)。
1.提取标签相关
首先想到的疑问是,咱们如何找到标签之间的相关。请留意,目前曾经存在几种算法可用于取得相反的结果:
咱们可以用来提取标签相关的最繁难的方法称为共现矩阵(co-occurrence matrix),这是我将在本文中经常使用的格局(出于其有效性和繁难性)。
最先进的都是基于嵌入神经网络(如过去经常使用的Word2Vec;如今理论经常使用转换器,如LLM),可以提取样本之间的语义相关。创立一个神经网络来提取标签相关(以智能编码器的方式)是或者的,而且在面对某些状况时理论也是理智的打算。
由于标签是经常使用人类言语定义的,所以可以经常使用现有的预训练模型来计算曾经存在的相似性。这或者会更快,而且缩小了费事。但是,每个数据集都有其独个性。无余的一点是,经常使用预先训练的模型将疏忽客户行为。
例如,咱们稍后将看到2D与Fantasy有着亲密的相关:但是,经常使用预先训练的模型永远不会发现这样的婚配对。
算法的选用或者取决于许多起因,特意是当咱们必定处置庞大的数据池或有可裁减性疑问时(假设咱们领有太多的标签,那么咱们须要经常使用机器学习来处置这个疑问)。
a.经常使用Michelangiolo相似性构建共现矩阵
如前所述,我将经常使用共现矩阵作为提取这些相关的手腕。我的目的是找到每对标签之间的相关。为此,我将经常使用IoU(联结上的交加)对一切样本集(S)运行以下计数:
计算一对标签之间相似度的公式(作者自己提供图片)
该算法与Jaccard相似度十分相似。虽然这种算法针对样本启动操作(而我引见的那种算法针对元素启动操作),但是由于(据我所知)这个特定的运行程序尚未被编程成功过;因此,咱们可以将其命名为Michelangiolo相似性。(公平地说,这个算法的经常使用以前在StackOverflow疑问中曾经提到过,但从未被编程成功过)。
Jaccard相似性和Michelangiolo相似性的差异(作者自己提供图片)
关于00个样本,提取相似性矩阵大概须要一个小时,结果如下:
样本列表S中一切惟一标签的共现矩阵(作者自己提供图片)
接上去,让咱们手动审核前10个样本中一些比拟经常出现的标签,看看结果能否无心义:
从共现矩阵中提取的样本相关(作者自己提供图片)
结果看起来很有宿愿!咱们从繁难的分类数据(只能转换为0和1)开局,但咱们提取了标签之间的语义相关(甚至没有经常使用神经网络)。
b.经常使用预训练的神经网络
雷同,咱们可以经常使用预训练的编码器()提取样本之间的现有相关。但是,这种处置打算疏忽了只能从咱们的数据中提取的相关,只关注人类言语的现有语义相关。留意,这种算法或者不是一个十分适宜基于批发数据的上班处置打算。
另一方面,经过经常使用神经网络,咱们不再须要构建相关矩阵。因此,当关注可裁减性时,这是一种比拟适当的处置打算。例如,假设咱们必定剖析少量的推特数据,咱们会获取53.300个标签。依据这个数量的标签计算共现矩阵将获取大小为2500000000的稠密矩阵(这是一个十分不实际践的壮举)。相反,经过经常使用输入向量长度为384的规范编码器,获取的矩阵的总大小将为19200200。
经常使用预训练编码器对一组标签启动编码的快照数据
2.对查问和样本启动编码
咱们的目的是构建一个能够支持语义标签搜查的搜查引擎:依据咱们不时在构建的格局,惟一能够支持这种打算的技术是经常使用向量搜查。因此,咱们须要找到一个适宜的编码算法,将样本和查问转换为向量。
在大少数编码算法中,咱们都会经常使用相反的算法对查问和样本启动编码。但是,每个样本都蕴含多个标签,而每个标签都由一组不同的相关示意;因此,咱们须要在单个向量中捕捉这些相关。
协变量编码(作者自己提供图片)
此外,咱们须要处置上述可裁减性疑问,咱们将经过经常使用PCA模块来成功(当咱们经常使用共现矩阵时,咱们可以跳过PCA,由于不须要紧缩咱们的向量)。
当标签的数质变得太大时,咱们须要丢弃计算共现矩阵的或者性,由于它以平方速率缩放。因此,咱们可以经常使用预训练的神经网络提取每个现有标签的向量(PCA模块的第一步)。例如,all-MiniLM-L6-v2模型将每个标签转换为长度为384的向量。
而后,咱们可以转置取得的矩阵,并对其启动紧缩:咱们最后将经常使用1和0对可用标签索引对查问/样本启动编码,从而获取与初始矩阵(53300)长度相反的初始向量。此时,咱们可以经常使用预先计算的PCA实例在大小为384的维度中紧缩相反的稠密向量。
编码样本
就咱们的样本而言,该环节在PCA紧缩(激活时)后立刻完结。
编码查问:协变量编码
咱们的查问须要以不同的方式编码:咱们须要思考与每个现有标签相关的相关。这个环节是经过首先将紧缩向量与紧缩矩阵(一切现有相关的总和)相加来口头的。如今,咱们曾经取得了一个矩阵(384x384),咱们须要对其启动平均计算,从而取得咱们的查问向量。
由于咱们将经常使用欧几里德搜查,它将首先优先搜查得分最高的特色(现实状况下,咱们经常使用数字1激活的特色),但它也会思考额外的无所谓得分状况。
加权搜查
由于咱们将向量平均在一同,所以咱们甚至可以对此计算运行权重,向量将遭到与查问标签不同的影响。
3.经常使用向量检索口头语义标签搜查
你或者会问这样的疑问:为什么咱们要教训这个复杂的编码环节,而不只仅是将这对标签输入到函数f(query, sample)中并取得一个分值?
假设你相熟基于向量的搜查引擎,你曾经知道答案了。经过成对口头计算,在只要00个样本的状况下,所需的计算才干是渺小的(单个查问或者须要长达10秒):这不是一种可裁减的做法。但是,假设咱们选用对00个样本启意向量检索,搜查将在0.1秒内成功:这是一种高度可裁减的做法,在咱们的运行状况下这是十分完美的方法。
4.验证
为了使算法有效,须要对其启动验证。目前,咱们缺乏适当的数学验证(乍一看,对M的相似性得分启动平均曾经显示出十分有宿愿的结果,但须要进一步的钻研来取得有证据支持的主观目的)。
但是,当经常使用比拟示例并可视化比拟时,现有结果的长处是十分直观的。以下是两种搜查方法的最接近顶部的搜查结果比拟(你看到的是调配给此游戏的标签)。
传统标签搜查与语义标签搜查的比拟
咱们可以看到传统搜查或者会(在没有额外规定的状况下,样本会依据一切标签的可用性启动过滤,而不是排序)前往具备更多标签的样本,但其中许多标签或者并不相关。
语义标签搜查依据一切标签的相关性对一切样本启动排序。繁难来说,它敞开了蕴含不相关标签的样本的资历。
这个新系统的真正长处在于,当传统搜查无法前往足够的样本时,咱们可以经常使用语义标签搜查来选用恣意数量的样本。
两次搜查结果稀缺前的差异(作者自己提供图片)
在上方的例子中,经常使用传统的标签过滤不会从Steam库中前往任何游戏。但是,经过经常使用语义标签过滤,虽然咱们依然会获取不完美的结果,但会获取与咱们的查问最婚配的结果。你看到的是与咱们的搜查婚配的前5个游戏的标签。
论断
在此之前,假设不驳回复杂的方法,如聚类、深度学习或多个K近邻算法(KNN)搜查,就无法能在思考标签语义相关的状况下对标签启动过滤。
本文中给出的算法提供的灵敏性应准许与传统的手动标志方法分别,后者迫经常使用户在一组预约义的标签之间启动选用,并开拓了经常使用视觉言语模型的LLM自在地将标签调配给文本或图像的或者性,而不局限于预先存在的结构,从而为可裁减和改良的搜查方法开拓了新的选用打算。
最后,我怀着最美妙的祝愿选择向全环球开明这个算法,我也十分宿愿它能获取充沛的应用。
译者引见
朱先忠,社区编辑,专家博客、讲师,潍坊一所高校计算机老师,自在编程界老兵一枚。
原文题目: Introducing Semantic Tag Filtering: Enhancing Retrieval with Tag Similarity ,作者:Michelangiolo Mazzeschi