NEWS

新闻

了解openKylin最新资讯,关注社区和产品动态。

NEWS

Learn about the latest news.

【小白课程】基于向量检索技术的UKUI智能语义搜索

2024-04-19 09:32:22
全局搜索是UKUI桌面环境核心功能之一,具备本地文件、文本内容、应用、设置项、便签、图片等聚合搜索功能,可以为用户提供快速准确的搜索体验。本期主要介绍UKUI SIG组如何利用向量检索技术实现更加精准、智能的语义模糊搜索,提升用户体验。



一、背景



1.1什么是向量检索?

在深度学习中,向量用于对非结构化数据进行特征表述,通过使用AI模型对图片,文本,视频和语音等非结构化数据进行特征向量提取操作,然后通过对这些特征向量的计算和检索,即可实现对非结构化数据进行分析和检索。

向量的其中一个特性就是可以通过一些距离计算如欧式距离等,来判断向量之间的相似度,即其所代表的元素的相似度。通过对相似度的计算,便可以实现基本的搜索功能。

向量检索的应用场景非常丰富,如推荐系统、图片识别、自然语言处理等。

openKylin(开放麒麟)


1.2为什么要做向量检索?

UKUI中全局搜索应用(ukui-search)目前的文本内容搜索和图片搜索功能基于传统的中文关键词提取实现(图片通过OCR提取文本),数据库为基于倒排索引的Xapian数据库,搜索基于对“关键词”的搜索实现。从根本上讲,搜索还是基于关键词匹配实现,即使我们在一定程度上支持了“模糊搜索”,即可以在用户输入多个关键词时,做部分关键词的匹配即可召回,但根本上我们并没有解决用户输入的内容和其搜索内容之间的“模糊”关联关系,比如,假设用户有很多个描述“天气”的文件,包括包含对天气描述的文本文件和天气相关的照片,但每个文件中只包含对天气的描述,如“阴转小雨”,但并不包含“天气“这两个字,那么我们现在的搜索功能将不能搜到任何一个文件;另外一个例子是,如果用户输入的关键词刚好和我们在做关键词提取时提取的不一致,那么即使用户输入的内容和文件中的很类似,也无法搜索到对应的文件。

而向量搜索是基于“语义”的,我们将每个文件中的内容,通过特性模型转换成描述他们“语义”的特征向量保存在索引数据库中,当用户搜索时,我们将用户输入的内容生成向量,然后和数据库中的向量通过距离计算,返回相似度较高的Topk向量,即可实现基于语义的模糊搜索,让用户得到的结果更加“人性化”。


二、我们要做什么?



2.1 确定合适的模型

用什么样的模型取决于我们的功能需求和使用场景,比如要实现文本内容搜索,就要使用文本转向量的模型,要实现图片搜索,即需要图片向量的模型,同时,我们还需要注意模型对语言的支持,大部分模型都只支持单一语言。

同时,需要根据具体应用场景,我们还对模型的性能有一定的要求,比如在不支持gpu加速的硬件上,如何保证索引的性能和资源占用不至于太高,同时,模型的大小也决定了我们软件包的打包大小。

如果开源模型难以满足我们的需求,或者我们需要针对用户场景对模型进行定制,那么我们就需要训练自己的模型,但训练模型需要耗费大量的人力物力,就目前来讲我们没有足够的资源。

如果开源模型能满足我们的需求,但索引过程中消耗的资源过多,我们可能需要考虑对模型进行一些压缩处理,如模型蒸馏等。

2.2 构建数据库

向量搜索其实不一定依赖向量数据库,传统的关系型数据库也可以实现基本的搜索功能,但向量数据库有一些传统数据库无法实现的特性,例如,当平面索引搜索时性能不够时,可以通过分区索引等手段,在保证精度不损失太多的情况下对搜索性能进行优化。

当向量维数很多,且数量也很多时,为了让索引数据库不占用过多磁盘空间,我们还需要考虑对向量数据进行压缩或降维。

同时,考虑到我们的应用场景,数据库还需要支持单条或批量的更新操作。

2.3 文件索引与搜索

搞定了模型和数据库,接下来要做的就是构建一个基于向量搜索的文件索引服务,基于ukui-search的文件索引机制,我们可以很方便的实现文件扫描,文件监听,目录增删,数据库管理等操作,有了这个基础,我们需要实现文件索引数据服务的构建功能,并且在UKUI上部署。

在索引数据服务的基础上,我们要实现搜索功能,重点分为两步,第一步是将用户输入的内容转换成向量,第二步是基于向量数据库的搜索接口进行搜索。基于双塔模型,我们可以在一些用户特征数据的分析加入搜索中,比如根据收集的用户习惯做一些搜索结果推荐等。


三、社区目前的尝试


社区已经开始尝试使用开源模型进行向量检索技术在UKUI中的应用。针对文本内容搜索,社区选用了BERT等自然语言处理模型,这些模型可以将文本转换为高维向量。对于图片搜索,社区尝试使用了clip模型来提取图片特征。

在数据库方面,社区测试了一些针对向量检索的数据库,如Faiss和Milvus等。这些数据库提供了丰富的向量检索功能,同时支持向量的压缩和降维。在初步测试中,我们发现这些数据库在性能和精度方面都表现良好。

为了实现文件索引与搜索功能,社区将在ukui-search的基础上进行扩展,将文件内容转换为向量并存储在向量数据库中。同时,社区对搜索接口进行了调整,以支持基于向量相似度的搜索。社区还尝试使用双塔模型结合用户特征数据对搜索结果进行推荐和优化。

目前,社区已经完成了部分功能的原型开发和测试。在实际使用中,基于向量检索的搜索功能相较于传统关键词匹配搜索,确实可以实现更加精准的模糊搜索,提高了用户体验。

3.1 文本内容向量搜索

文本内容向量搜索的demo程序使用到了sbert的开源模型和faiss向量数据库。

SBERT(Sentence-BERT)是一种生成句子嵌入表示的深度学习模型,其目的是为不同自然语言处理任务提供高质量的文本表示。SBERT模型通过使用双向编码器生成句子嵌入向量,以捕获句子中的语义和上下文信息,使不同句子之间的相似性得到准确的刻画。

FAISS(Facebook AI Similarity Search)是一种高性能向量数据库,用于处理大规模的向量数据集。FAISS使用一系列的索引结构和近似算法来实现高效的向量搜索。它支持 CPU 和 GPU,并可以在内存中存储和检索高维向量。

目前ukui-search中对于中文文本内容的处理使用到了分词,将一句话分成多个不同的关键词然后存入倒排索引数据库xapian来提供对应的关键词搜索功能。而向量搜索则可以跳过分词的步骤将整句文本内容作为整体通过sbert模型计算出高维向量存入faiss向量数据库,搜索过程中faiss将提供多种索引结构和近似算法来高效输出近似向量相关信息。

3.1.1 相似文本内容搜索

使用pandas加载测试文本集作为本地搜索数据。文本内容已做预处理,将单个句子作为一行保存。

openKylin(开放麒麟)

cell运行对应输出:

openKylin(开放麒麟)

使用sentence_transformers加载开源模型,然后将测试文本内容输入到模型中获取对应向量。

openKylin(开放麒麟)

cell运行对应输出:

openKylin(开放麒麟)

使用faiss向量数据库将已转换为向量的数据存入索引容器。

openKylin(开放麒麟)

cell运行对应输出:

openKylin(开放麒麟)

同样使用sentence_transformers加载开源模型并将要搜索的内容(测试数据集中无相同文本内容)转换为向量,然后使用索引容器搜索近似度前5的数据。

openKylin(开放麒麟)

cell运行对应输出:

openKylin(开放麒麟)

根据搜索结果可以看到向量搜索对于搜索不存在的内容可以输出非常相近的搜索结果。

3.1.2 精确文本内容搜索

向量搜索对于存在的内容同样有精确地搜索结果,例如将搜索内容替换为测试文本中存在的:“哈利突然惊醒了”,再进行向量搜索。

openKylin(开放麒麟)

cell运行对应输出:

openKylin(开放麒麟)

可以看到对于精确文本内容的搜索faiss向量数据库依然能够提供精确的搜索结果。

3.1.3 C++接口技术验证

向量搜索的核心步骤为将文件内容转换为向量的模型和大批量存储向量的向量数据库。目前已实现了使用开源模型中的pytorch模型通过script形式转换为C++可以使用的libtorch类模型,为桌面应用实现C++直接调用提供可能。另外使用到了C++为核心编写的faiss向量数据库,通过修改部分cmake文件将faiss向量数据库链接到了demo工程中,

仿照之前例子中的搜索流程,使用C++编写Transfomer类实现文本通过vocab字典到张量的转换:

openKylin(开放麒麟)

然后加载数据文件并完成向量转换存入数据库:

openKylin(开放麒麟)

最后将搜索内容转换为向量并通过数据库搜索TOP5的内容:

openKylin(开放麒麟)

程序输出内容如下:

openKylin(开放麒麟)


对比不同模型使用python的demo程序输出结果与C++版本程序输出结果:

openKylin(开放麒麟)

openKylin(开放麒麟)

可以看到搜索结果基本一致,相似性计算结果也基本一致。最后一个有很小的差异猜测是C++版本使用的libtorch默认精度为float32,而python版本的pytorch默认精度为float64导致。

3.2 多模态搜索

通过将不同种类的结构化数据通过CLIP模型转换到同一个语义空间中,可以实现诸如文字搜图,以图搜图等功能,大大扩展了桌面搜索的灵活性。语义搜索在单机的部署将领先竞品实现首次发布与应用。

3.3 目前面临的问题

  • 开源模型,自己训练的模型可能更适用;

  • GPU适配,主机配置各不相同;

  • 模型效率问题,向量转换速度慢,需要模型蒸馏、剪枝等技术优化;Intel的CPU可以使用OpenVino加速,英伟达GPU可以使用TensorRT加速;开源ncnn技术,pytorch模型转换为onnx再转换为ncnn模型加载使用;

  • 模型占用存储空间大,集成到项目打包受影响;

  • 待索引内容选择,图片、文档、视频、语音...涉及多模态模型支持;

  • 多模态模型服务化部署,服务框架如triton inference server等。


四、未来计划



  • 继续优化模型和数据库方案,提高搜索效率和准确性;

  • 考虑支持多语言搜索,以满足更广泛的用户需求;

  • 优化搜索结果排序和推荐算法,使搜索结果更加符合用户预期;

  • 针对不同文件类型(如视频和音频),尝试引入相应的特征提取模型,实现全面的多媒体搜索功能;

  • 用户行为预测,将UKUI桌面环境各种用户操作向量化,通过用户输入内容预测用户行为。


五、总结



向量检索技术在UKUI中的应用有望为用户提供更加智能化、人性化的搜索体验。通过不断优化模型、数据库和搜索算法,我们可以为用户提供提供更高效、准确的搜索服务。甚至可以作为整个UKUI桌面环境的统一入口,通过输入信息预测用户行为并提供相应“一条龙”式的脚本化操作。

相关文档:

  • https://github.com/milvus-io/milvus

  • https://jina.ai/news/hype-and-hybrids-multimodal-search-means-more-than-keywords-and-vectors-2/

  • https://github.com/openai/CLIP