文章作者:
黎阳,焦点科技软件开发工程师
李成龙,Zilliz 数据工程师
Milvus (https://milvus.io/) 向量搜索引擎开源半年以来,全球已经有数百家企业或组织用户。焦点科技是一家以 B2B 外贸交易为主营业务的科技公司,也是 Milvus 的用户。| 应用场景
焦点科技旗下多条产品线的商品搜索服务均由搜索平台支撑。但在信息爆炸的背景下,越来越多的信息以非文本的形式出现,传统基于分词与规则匹配的搜索服务已经满足不了对大量非文本数据的搜索场景。为了拓展业务覆盖场景,提高流量,焦点科技开展了扩展向量搜索服务平台的项目。
在 B2B 电商网站中国制造网中,有效过滤掉重复的“广告式”询价、推销等垃圾询盘对提升询盘质量有很大帮助,垃圾询盘的过滤精度直接影响用户的口碑。而提升询盘质量就等于改善了用户体验,无论买家还是卖家都能获取更真实有效的交易信息,完成更多交易。
传统的垃圾询盘过滤很难通过文本匹配规则产生很好的效果,很长一段时间垃圾询盘过滤都需要靠人工完成,效率低下且耗费人力资源。焦点科技通过 Milvus 建立的向量搜索业务,对已知的垃圾询盘向量进行了底库的建立,每当有可疑询盘产生时就进入向量匹配阶段,根据结果和业务规定的临界值等规则进行判断,智能且自动化地完成垃圾询盘的过滤。
| 关键技术
MinHash
在过去通过人工过滤垃圾询盘的时代中,焦点科技累积下了一定数量的已知的垃圾询盘模板。由于功能需求是寻找与既往询盘以及询盘模板在语句和结构上相似的询盘邮件,不存在语义匹配的需求,因此考虑使用文本字符串相似度计算方法。两个集合的相似度可以使用 Jaccard 相似度进行计算,即两个集合的交并比,但在海量数据的情况下计算两两之间的交并比对计算资源要求很高。考虑到既往询盘量为千万级,对计算实时性要求较高,因此选择使用 MinHash 算法将询盘文本转换为哈希编码来进行最近邻检索。MinHash 算法的主要思想为:(1)一个文本从字符串的角度可以近似看做由字(词)或字(词)的 2-gram 构成的集合。(2)用相同的随机方式从两个集合中抽取一个元素,两个元素相等的概率等同于 Jaccard 相似度。随机的哈希函数对两个集合中的所有元素进行哈希运算,取两个集合的最小哈希值判断是否相等,重复该操作多次即可近似评估最小哈希值相等的概率,这种方式就是随机抽取的一种实现。
(3)多种哈希函数所计算得到的最小哈希值构成的向量序列即为该集合的MinHash,可作为该集合的哈希编码。计算两个哈希编码之间的欧式距离作为源文本字符串的相似度。
MinHash 本质上是对文本对应的字(词)集合进行了降维,目标是降低 Jaccard 相似度计算的复杂度,并尽可能保持计算精度。
在本例中对询盘文本使用 jieba 工具(https://github.com/fxsjy/jieba)加载业务词表的方式进行分词,ngram 为 1 的方式构建文本对应词集合,采用 200 种不同的哈希编码构建长度为 200 的 MinHash 向量,在目前的业务场景中表现出了较好的近邻检索能力。
Milvus
Milvus 是一款开源的特征向量相似度搜索引擎,具有使用方便、实用可靠、易于扩展、稳定高效和搜索迅速等特点。Milvus 可以对接包括图片识别,视频处理,声音识别,自然语言处理等深度学习模型,为向量化后的非结构数据提供搜索分析服务。
Milvus 的数据处理流程通常有以下几个步骤:
通过深度学习模型或者其他算法将非结构化数据转化为特征向量;
将特征向量导入 Milvus 库进行存储并建立索引;
在 Milvus 中进行搜索,返回检索向量的相似结果。
在垃圾询盘过滤的场景中,通过 MinHash 算法将已知的垃圾询盘数据向量化并导入 Milvus 库,Milvus 对向量进行存储并建立索引,再通过 Milvus 进行搜索即可返回相似向量的结果。另外,提供 Java SDK 和 Docker 部署方式的 Milvus 对开发十分友好,不仅搜索效率高,部署也十分简单。
| 系统实现
作为一个统一的服务接口平台,焦点科技在开发的时候尽量回避了向量搜索对业务的定制,将 Milvus 实例抽象成搜索服务节点,嵌入原有的搜索平台中,当有向量搜索业务场景需求时,则向这些节点建立业务。
在系统构建层面,焦点科技将 Milvus 实例与文本搜索实例放在了同一层级,通过一个业务控制器分别进行向量搜索结果的召回、文本信息回查等流程,上层通过路由分发器进行负载均衡与读写分离的处理。
整个业务流程中大致可以分为三个流程:
(1)向量化流程
在查询客户端中,将待判断的询盘利用 MinHash 算法转化为特征向量。
(2)向量查询流程
查询向量首先进入 Milvus 服务集群,通过在指定的节点上进行临近匹配,召回前 TopK 个向量与向量 ID;
(3)信息回查流程:
业务控制器控制 Milvus 的结果向量 ID 进入文本搜索服务集群中进行相关信息的收集(向量 ID 即相关信息的主键,通过自定义向量 ID 实现)。通过相关信息的分析,从发送地址、身份、是否标记为垃圾询盘模板等多个维度进行分析,如果出现以下两种情况,则可以确定该询盘为垃圾询盘:
如果查询向量匹配到的结果向量多来自同一地址的不同身份或未认证身份;
结果向量中多为已标记垃圾询盘的模板。
当然,此逻辑可被定制,根据不同业务的需求可以增加更多判断逻辑。
未来 Milvus 版本中会加入富文本和高级搜索,那么相关信息可以通过在 document 中带入,不需要回调文本搜索服务来获取,期待早日上线。
| 结语
对于程序员来说,头疼的手撕向量搜索问题迎来了救世主,经过多版本的迭代 Milvus 增加了越来越多的新功能,大大简化了对业务需求实现的难度。Milvus 正在以肉眼可见的速度茁壮成长,在开源的世界开辟自己的地盘,未来可期。
希望 Milvus 在非结构化数据处理的道路上走得更远,为企业带去更多的价值。同时也希望更多志同道合的伙伴加入 Milvus 开源社区,一起参与、见证 Milvus 的成长。
| 欢迎加入 Milvus 社区github.com/milvus-io/milvus | 源码milvus.io | 官网milvusio.slack.com | Slack 社区zhihu.com/org/zilliz-11/columns | 知乎zilliz.blog.csdn.net | CSDN 博客space.bilibili.com/478166626 | Bilibili