【Milvus&向量搜索】在非中文搜索场景下的探索

620 阅读10分钟

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

halo大家好,我是广州小井。之前跟大家一起探讨了向量搜索在关键词、长文本等场景的搜索效果,发现了向量搜索能缓解语义模糊情况下的搜索不准确问题。那么,本文我们接着探索其在非中文搜索场景的下表现吧,let's go!

前文回顾

前几篇文章中,我分别介绍了向量搜索的特性和向量搜索在关键词、长文本场景下的搜索表现,相信大家都能很直观地 get 到 向量搜索在中文语义多样性的情况下的搜索优势。基于之前的中文模型和Milvus实现的文档搜索,确实在关键词、语句搜索层面带来了一定的提升,并且其具备一定的语义理解能力。但它是不是真的这么好呢?又有什么缺点和不足呢?我们将在本文接着探讨。

不知道大家发现了没有,前面几篇文章中,我用来做 demo 的案例都有一个共性——中文。不管是做关键词实测时,还是语句实测时,我所用的搜索词、文档数据全部都是中文,而在此基础上,向量搜索的结果比ES的搜索结果更加丰富,同义词的搜索也变成了可能。但是,在真实的业务场景中,公司文档肯定不可能只有中文的(毕竟有很多程序员用户),文档要承载着接口文档、api描述、各种专有名词(如iOS)的内容

所以,问题来了,在不更换当前词嵌入模型的基础上,Milvus 和 向量搜索在非中文场景下的搜索表现如何呢?我们一起来探讨一下!

ES 的非中文搜索

其实 ES 的非中文搜索场景跟中文搜索时候的情况是类似的,无非就是拆词、匹配、计算得分总和,最终排名后返回。所以,只要是文档中存在怎么样的数据(不管中文、非中文),只要跟用户的输入能匹配上的话,都是可以被搜索命中的。

话不多说,我们直接开始通过实际案例来体验一下 ES 中的非中文搜索效果。首先还是先往索引中添加数据,这里我添加了三条非中文的数据:huawei、huya、vivo,效果如下图所示:

image.png

这里还是采用默认的 ES 的配置,没有任何的自定义、专有名词词典设置、没有使用分词器。

现在我们的文档数据中出现了非中文的内容,接下来我将通过几种不同的方式来搜索,跟大家一起探讨一下 ES 在对于非中文数据搜索时候的表现。分几种情况来看:

  1. 完全匹配

    这里将跟之前我们在中文内容搜索的时候一致,通过 match 关键字来搜索内容。首先是通过一模一样的内容搜索,相信这样的结果大家不会有意外:

    image.png

    那如果用户只输入了一半的内容来搜索呢?比如此时用户输入的是hua,我们看看这样的搜索效果:

    image.png

    啊?好像事情并不如想象中顺利...不过问题不大,我们只需要使用支持模糊搜索的 DSL 即可,也就是 wildcard 关键字。我们接着往下看...

  2. 模糊搜索

    上述 match 进行搜索的时候,我们不能通过输入 hua 搜索到我们期望的内容,但其实这种拼音、字母等模糊搜索对于日常搜索场景来说非常常见。那接下来我们试着使用 wildcard 关键字来进行搜索试试效果。

    image.png

    如上图所示,当我们通过 ES 的 wildcard 关键字搜索时,可以通过 hua 搜索到目标文档。同理,当我通过关键字 hu 搜索的时候,应该能搜索到两篇文档,一篇为 huawei、一篇为 huya。我们接着看看效果:

    image.png

    结果如你所愿,可以正确搜索出我期望的结果。

小结:根据上述的案例,我们不难发现,ES 在非中文的数据搜索中,依然保持着一定的实力,允许我们比较简单地实现模糊搜索效果。也就是说,我们可以通过结合 matchwildcard 等不同搜索关键字的特性,去组合我们的搜索 DSL,便可达到文档搜索场景的基本业务需求。

向量的非中文搜索

注意,本小结有一个前提就是不更换之前所使用的 emb 模型。

不知道你是否跟笔者一样,初次应用向量搜索时,完全没有考虑过其在非中文场景的搜索表现,从而直接将整个搜索底层替换成向量搜索。(因为其在中文搜索场景的表现确实优秀~)那么,这里我将通过一些案例,还有自身的实战经验来告诉你,向量搜索中的不足之处。

在进入这一小节之前,我们先回顾一下向量搜索、ES关键词搜索之间的不同点。向量搜索在关键词、长文本中的搜索表现,其在语义模糊场景下的搜索是很好提升了 ES 所不具备的语义分析的能力的,因此它在自然语言(如中文、句子)中的搜索有很好的表现。而 ES 则更专注于关键词一一匹配的领域,所以它在语义、同义词近义词方面的搜索能力相对欠缺。

我为什么要先简单回顾 ES 和 向量搜索 的不同点呢?因为我觉得只要你稍微意识到他们之间的不同点,你或许就能突然悟出向量搜索在非中文场景下的不足。

同样是上述 ES 中使用的数据,我把 huawei、huya、vivo 这三条数据,以同样的方式 emb 后插入到 Milvus 数据库中。其中 vivo 的 emb 结果如下:

image.png

现在,我已经把三条数据都插入到了 Milvus 数据库的集合中了:

image.png

紧接着马上开始激动人心的测试环节,首先跟 ES 一样,是完全匹配的方式搜索 huawei。结果不会有意外:

image.png

因为是完全同一个点,所以搜出来的结果距离值为 1 也是符合我们预期的。紧接着我们将搜索词折断后再搜索看看效果。这次我们输入关键词 hua 来试试搜索效果。首先看看 hua 的 emb 结果:

image.png

马上看看通过 Milvus 进行向量搜索的结果:

image.png

结果不得不让我有点意外。通过关键词 hua 搜索出来的结果,huya 的排名居然比 huawei 的还高出了不少。其实如果只从字母相似度的角度来分析,huya 和 huawei 对于关键词 hua 的确是 huya 更加匹配,因为4个字母命中了3个。但即便如此,huawei在命中了半数字母的同时,还是每个字符之间没有间隔的,是紧密的、连续的。

不管怎么样,huawei 对于搜索词 hua 的向量化搜索结果才 0.478 的距离计算结果,我是比较吃惊的。按照我目前所服务的用户来说,上述的搜索结果是严重不符合预期的。这里相较于前文中 ES 的表现,向量搜索明显处于下风了...

不过我们不能仅凭一个案例就来否定向量搜索的能力,于是我们接着测多几个案例,把 ES 中也用到的 hu 也作为关键词拿去搜索,看看效果:

image.png

结果更抽象的事情发生了... hu 的 emb 结果,虽然比较好的搜索出了其中一个我们预期要出现的内容 huya,但是 huawei 已经掉到第 5 了。而且,我这个测试集合里总共只有 14 条数据,可想当真实生产场景中,动辄几十万、上百万条的数据会怎么样。而且还有一点比较意外的就是,排名第二的结果。搜索结果”高兴“,似乎与我们期望的搜索结果毫不相干...

总结:通过简单的搜索案例,我们可以发现,向量搜索在非中文的搜索场景中存在不足。当然,这一个结论是基于我目前所使用的模型的结果,不能涵盖所有情况。我之所以要点出这个点,一方面是让大家注意到向量搜索的不足,一方面是让大家有所防备,在寻找模型的时候可以更加有针对性的寻找一个符合自己业务场景的模型。

实战经验总结

我是完完全全将向量搜索落地到实际的文档搜索业务中的,所以实战这一块还是比较有感悟的。首先回顾我使用向量搜索来落地文档搜索的原因:语义模糊搜索能力提升。一开始想在这方面提升,所以开启了一些调研,最终决定使用向量搜索的出发点有两点:

  1. 技术探究。近期AI技术的兴起,我也很期待我能如何利用AI工具的能力,从而解决业务问题
  2. 语义模糊、句子等方式的搜索能力。比起单纯的近义词、同义词等,由于模型的能力,向量搜索具备一定的语义理解能力,可以找到语意层面相近的内容。

当然,使用了向量搜索之后,从我收集的埋点数据来看,其在中文内容的表现还是可圈可点的。以下是我收集的一段时间内的数据(简单的搜索点击率统计):

非中文(次)点击率中文(次)点击率
48255.81%69065.51%

上述数据的统计方式是,一段时间内用户的总搜索次数和当次搜索后产生的点击行为。其中,非中文的点击率远低于中文的点击率,低了差不多 10% ,并且非中文场景的搜索次数也不低,跟中文内容的搜索次数也达到四六开的情况。

对于我目前的业务场景来说,这个结果肯定是不及格的。前面的文章我有提到过,内部文档有很多跟 API 文档相关的偏技术型的文档,所以用户直接通过一些接口、代码方法名来直接搜索的情况还是很多的,我不追求90%的搜索点击率,但起码非中文内容的搜索也要达到跟中文内容搜索一样的效果才行~

基于这一点还有本文所用来测试的案例,向量搜索在非中文搜索场景存在短板,文档搜索优化的革命尚未成功,还得接着卷。不过到这里,Milvus搜索的优势和不足我们大概清楚了,接下来,我们只需要“各取所需”,一定可以在文档搜索领域获得一个不错的优化效果。

写在最后

不管是 ES 还是 Milvus,都有其各自的优势,我们可以综合利用他们各自的优势,以达到优势互补的目的来落地文档搜索的业务。当然,为了解决目前非中文内容搜索点击率偏低的问题,我需要再次对文档搜索做升级改造,请大家接着关注本系列文章,下一篇我将给大家带来 ES+Milvus 并用的混合搜索方案介绍,我们下一期再见!