【Milvus&向量搜索】落地文档搜索业务的探索

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

halo大家好,我是广州小井。本文我们继续回到文档搜索业务,跟大家一起探讨向量搜索、Milvus数据库在文档搜索这块业务领域的落地可能性。这里,我们将了解到 Mivlus 的基本使用,将有助于你对其落地当前搜索业务可行性有一个基本的判断。

前文回顾

回顾之前的那篇文章,我给大家通过举例的方式讲解了向量搜索的基本原理,这里再跟大家重温一下,以便更好的开启本篇文章的内容讲解。

首先,如下图所示:

其中,我们通过 NLP 将自然语言(文本)数据转化成结构化数据------n维向量,这样的过程简单理解为文本向量化。当我们将所有的文档数据都转化成向量后,我们便可以利用向量这个点对我们的目标数据进行搜索了。

怎么理解利用向量来搜索这句话呢?我们接着通过图例来加强理解:

上图是一个二维平面,假设我们的目标数据 b 的坐标为 [1.1, 1.1],它是由"开心"经过 embedding 后得到的向量值。而 a 的坐标为 [1.05, 1.05],它是"高兴"经过 embedding 后得到得向量值,当我们把 a 的向量值丢到 Milvus 数据库时,它就能通过计算"向量相似度"从而找到目标数据 b

其原理相信大家都能想到,不就是坐标点之间的位置计算嘛?当我们把搜索数据都向量化处理后,再需要搜索内容的时候,只需要寻找这个距离这个向量最近 的点,便是目标数据

Milvus 基础准备

之前对向量搜索的讲解一直都是比较虚幻的,毕竟我只是通过图例的方式来大概说明它的基本原理,至于它是怎么在实际中使用的并没有提及。于是从这一小节开始,我们就来认识一下真实的 Milvus。

这里,我打算通过 Milvus 提供的一个开源的可视化 Web 工具------Attu来作为实战演示,感兴趣的佬们可以点进超链里面看看。当然,有需要的就自己捣鼓一下如何私有化部署在本地玩玩吧,这里我就不延申了。

接着,我会在 Attu 上做 Milvus 实现向量搜索功能的前期准备,包括集合创建,一些基础配置的讲解。不过我依然不会拓展开,就以最简配置来讲,主要的是跟大家一起探讨其搜索的效果,精细化的配置大家实战中自己再深入研究即可。

1. 创建集合

当我们点击创建集合后,会看到这个弹窗:

这里我们仅需要关注我圈起来的两个值就行(其他的配置项大家自行了解吧):

  • Name:集合名称
  • Dimension:向量维度

关于维度值怎么定?这个我个人认为就看需求吧,也并不是越高越好。比如说三维空间比平面多了个维度,所以其数据比二维更具体,理论上搜索质量更可靠,但其相比二维空间,在计算距离远近的基础上算力又增加了...所以这个东西取决于实际需求就好。

当然,拿不准这个维度值的可以自己拿真实的数据来测试测试效果,然后自己决定。而我这边因为用的模型是转成 1024 维的,所以这里我就直接配置 1024 维了。

最后扯多一句,向量维度那里的配置其实就像是我们数据库新增字段一样,有对应的字段名、值类型等等。当我们点击弹窗那里的"+"号时,便可以添加更多的字段,但是向量类型 的字段(也就是要设置维度的字段)有且仅有一个。

2. 向量索引

当我们创建完集合后,便可点进去集合的详情里面查看对应的 schema,如下图所示:

这里会显示我们刚才创建的所有字段信息,然后大家会看到我圈起来的地方,这里便是给向量字段添加索引的。点击进去后会有一个配置弹窗,我们简单来了解一下要怎么配置。

这里的索引类型度量标准是我们需要重点关注的,因为他们会影响距离的计算方式和二者之间的兼容性。不过在 Attu 这里,它已经通过交互的方式解决了兼容的问题(前端的作用凸显有木有!!),当选择不同的 Index Type 的时候,会联动到度量标准那边的表单变化。

简单地介绍一下我选择的 Index Type ------ FLAT,只要查询的数据规模小,无脑用就行了,数据量大了再根据需求考虑其他类型。这里贴出 知识库检索匹配的服务化实践 这个文章,里面有比较详细地介绍每个 Type 地使用场景,大家可以去看看。或者大家直接看官网文档也是一个不错的选择~

另外关于 Metric Type 度量标准的值,那个计算公式、法则啥的大家还是自己了解吧(反正我是没细看了),反正也看不懂~不过在 Milvus 中文文档 中找到有可以看懂(讲的是人话)的介绍:

那既然我们现在所要处理的就是自然语言领域方面的,所以无脑 IP(内积) 就好了,管他呢~

3. load 进内存

如上图所示,Milvus 的所有搜索操作都需要 load 到内存里面去,所以当我们把集合、字段等都配置好了后,就要把集合 load 到内存里面去,这一步很重要!

好了,到这一步,基本的准备工作算是搞完了,接下来我们就往里面搞点数据,试试 Milvus 搜索的效果吧!

Mivlus 小试牛刀

这一小节,我们就开始写入一些数据并开始做一个简单的搜索测试吧。

ps:这里我不会展开词嵌入(emb)的过程,因为我暂时也是调别人接口做的词嵌入(后文把 embedding 、词嵌入统称为"词嵌入")。等后续有空了,我会自己去部署一个模型来做 emb,那时候我再另写一篇文章来分享吧。(当然大家站内随便搜一下,都有很多现成的模型部署教学文章~)

这里我们直接拿我们的案例来试一试,分别是三个词:"开心"、"高兴"、"快乐"。我会先拿这三个词去做词嵌入的操作,最后会得到一个 1024 维的向量数据。这个向量数据其实就是一个 1024 长度的浮点数据,给其中一个词嵌入的结果大家看看:

这里我是通过 Milvus 提供的 node.js 的一个 sdk 调用去插入的数据,具体的操作就不一步步演示了,大家在官网是可以找到对应的 demo 的。另外用的 sdk 是------milvus-sdk-node 这个,感兴趣的哥们可以点进去 github 看看~

数据插入 Milvus 完成后,我们可以看到现在总共有三条数据:

我们趁热打铁,马上进行搜索试试看效果。首先我们拿"开心"的词嵌入结果去搜一下试试看效果:

如上图所示,当我们用"开心"的词嵌入结果去搜索后,可以发现第一条 召回结果的 distance0。这个很好理解,用同一个坐标去搜索同一个坐标,他们之间的距离肯定是0,因为本质上就是同一个点。

再仔细一点看,其实会发现,"快乐"的 distance 值比起"高兴",更接近 "开心" 的位置,所它排名第二。讲到这里,我相信大家已经茅厕 顿开了,基于向量搜索通过距离的计算方式来搜索结果,确实存在优化语义模糊情况下搜索的可能,特别是这种近义词,短句之类的

那么为了印证以上的这一点,我决定给 Mivlus 再多插入几条数据给大家看看效果。比如说我插入跟开心反着来的数据,如"不开心"、"生气"、"难过"。插入后数据大概是这样:

这时候,我再通过 "开心" 的词嵌入结果去搜一搜,一探究竟!搜索结果如下图所示:

结果有没有在你的意料范围之内?显然,"不开心"、"生气"、"难过"这三个跟"开心"反着干的词语,毫无意外排在了靠后的位置,并且他们距离"开心"点的距离已经比较遥远了,最近的"不"开心都去到了0.56。而跟开心语义比较接近的另外两个词语,依然是跟前文中一样的距离,这次搜索的整体排名结果也比较符合我们预期。

通过上述简单的一个小 demo 的探索,我们大概可以领略到向量搜索在关键词搜索中,确实有缓解语义模糊情况下的搜索质量的效果的 。或者说比起 ES,向量搜索在这一个领域里更有优势(但还是那句话,排除 ES 额外使用自定义词典,配置同义词近义词等操作,我知道 ES 很强大,所以大家不用杠)。

因此,看到这里的你,我想你大概会有一定的底气去尝试向量搜索在文档搜索领域的落地了。而我当时,也是通过这样的一些小测试,小尝试,最终决定落地其到文档搜索业务中去的。

最后还想提一句,向量搜索的过程中,Milvus 只是充当了向量搜索的角色,而将这些非结构性数据 ------自然语言转换为结构性数据的步骤一样重要,也就是本文多次提及的"词嵌入"(emb)。但其实,这一步看似是实现向量搜索中难的一步,其实也没大家想得这么复杂。现在有比较多成熟的开源模型可以拿来部署,而我们最终也只是调用这些模型来帮我们做词嵌入处理而已~anyway,等我有空了亲自部署了一个模型后,会另外写一篇文章来分享。

写在最后

虽然说 Mivlus 算是这几年出的,是一个比较新的产物,但其实据我自己的经历来说,Milvus 和 向量搜索 已经有一定的业务落地情况了,不仅仅是做文档搜索,还有做知识库、图片检索等。就我了解过(待过)的团队,都有其在业务上的落地,只是在网上的实战参考还是比较少。反正我当时刚定下来要用 Milvus 来做文档搜索优化的时候,基本没有找到很详细实战的参考资料(连官网的文档搜索应用 demo 都是一个幌子),这对于前端狗来说真的太难了,好长一段时间都无从下手。所以,我会慢慢把自己的实战内容写成文章来分享,只要有时间就写!!!

关注我,下一篇文章我将会展开在文档实战中的一些细节点。会具体跟大家一起探讨以下几点,比如说:

  1. 对文段、标题等不同类型的数据处理。
  2. 怎么把控词嵌入的文本长度?用一整段、一句话或者一个词呢?
  3. 不同长度的语句做词嵌入后对搜索有什么影响?

参考文献

相关推荐
不悔哥5 分钟前
vue 案例使用
前端·javascript·vue.js
anyup_前端梦工厂35 分钟前
Vuex 入门与实战
前端·javascript·vue.js
你挚爱的强哥1 小时前
【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具
前端·javascript·vue.js
喝旺仔la1 小时前
Element 表格相关操作
javascript·vue.js·elementui
米老鼠的摩托车日记1 小时前
【vue element-ui】关于删除按钮的提示框,可一键复制
前端·javascript·vue.js
forwardMyLife1 小时前
element-plus的菜单组件el-menu
javascript·vue.js·elementui
好多吃的啊2 小时前
背景图鼠标放上去切换图片过渡效果
开发语言·javascript·ecmascript
Passion不晚2 小时前
打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵
javascript·html·css3
pan_junbiao2 小时前
Vue使用代理方式解决跨域问题
前端·javascript·vue.js
子非鱼9213 小时前
【JavaScript】LeetCode:41-45
开发语言·javascript·leetcode·链表·二叉树