Milvus 在 Tokopedia 的应用 | 让语义搜索更加智能

2021-06-25 11:26:26 浏览数 (1)

✏️ 作者介绍:Rahul Yadav,Tokopedia 工程师

Tokopedia 是印度尼西亚最大的电商平台,目前拥有逾 9000 万月活跃用户和 860 万家商户,覆盖印尼 98% 的行政区。我们深知,帮助用户迅速并精准地找到想要的商品才是产品语料库的价值所在。正因如此,我们致力于提高用户搜索结果的相关性,并引入了相似度搜索。在 Tokopedia 移动应用端的搜索结果页面上点击 ”...” 按钮,即可选择搜索与当前搜索结果类似的产品。

关键词检索

Tokopedia 使用 ElasticSearch 来搜索产品并对搜索结果排序。对于每个搜索请求,ElasticSearch 返回相关搜索结果并根据关键词对搜索结果进行排序。ElasticSearch 将每个单词存储为其组成字母的 ASCII[1](或 UTF)编码序列,并构建倒排索引[2]以快速检索出包含用户查询关键词的内容,然后使用评分算法找到最佳匹配。这些评分算法鲜少关注这些词的具体含义,而更多基于它们在文档中出现的频率以及它们之间的距离等。尽管 ASCII 编码包含的信息也足以让我们人类理解其原本语义,但仍缺乏一套完善的算法能让计算机也能根据 ASCII 编码理解和比较单词的实际含义。

向量表征

在众多解决方案中,语义向量表征能告诉我们单词是由哪些字母组成的,还能从某种程度上揭露该单词的含义。例如,我们可以对其他经常与该单词一起使用的词进行编码(即潜在上下文,此处默认相似的上下文代表相似的语义),并通过数学计算来比较单词之间的相似度。我们甚至可以试图基于语义对整个句子编码,以得出特征向量。

向量数据库

在获得目标特征向量后,我们需要从大量的向量数据中检索出与目标向量相似的向量。因此,我们试用了 GitHub 上几个为人熟知的向量搜索引擎和向量数据库,包括 FAISS、Vearch 和 Milvus。

以往的经验告诉我们,FAISS 更像是一个底层库,无法满足我们对于系统便捷性的要求。另外从负载测试结果来看,Milvus 的表现也最令我们满意。随着进一步了解,我们最终决定采用 Milvus,主要基于以下两大优势:

  • Milvus 上手容易、使用方便。只需要拉取 Docker 镜像,并根据自己的使用场景修改参数,便可以直接应用于生产环境。
  • Milvus 支持更多索引类型,且提供详细的技术文档。

总而言之,Milvus 对用户非常友好,技术文档资源完备。使用过程中遇到的大部分问题都可以在 Milvus 文档中心找到相应的解决方案;即便没有找到合适的解决方案,也可以在 Milvus 社区提问,获取技术支持。

Milvus 集群服务

选定 Milvus 为特征向量数据库后,我们决定将其用于 Tokopedia 广告服务场景中低填充率与高填充率关键词的匹配。我们在开发环境中配置了一个单机版 Milvus 节点提供服务,该节点在数天内都保持了良好的运行状态,明显改善了点击率和转化率。但是,倘若单机版节点在生产环境中宕机,将导致整个搜索服务崩溃。因此,我们需要部署一个高可用的搜索服务。

Mishards 是一款专为 Milvus 开发的集群分片中间件,允许用户搭建内存和算力均可扩容的分布式 Milvus 实例。通过 Mishards 和 Milvus Helm,用户可以轻松部署自己的 Milvus 集群。下图展示了 Mishards 的工作原理:

Mishards 负责将上游请求拆分,并路由到内部各细分子服务,最后将子服务结果汇总,返回给上游。Mishards 的整体架构如下图所示:

更多关于 Mishards 的内容可参阅官方文档[3]

我们针对 keyword-to-keyword 服务在 Google Cloud Platform (GCP) 部署了一个 Milvus 写节点、两个 Milvus 读节点以及一个 Mishards 实例,至发稿时始终保持性能稳定。

向量索引如何加速相似性搜索

要想实现百万、十亿甚至万亿级别向量数据的高效检索,索引构建[4]不可或缺。

向量数据库将输入对象与数据库中其他存储对象进行比较,以找到与输入最相似的对象。索引在这个过程中十分重要,它可以高效地组织数据结构,显著加速对大规模数据集的查询性能。对一个大规模向量数据集构建索引后,查询请求将被路由到最有可能包含与该输入相似的向量的集群或数据子集。这加快了数据查询速度,但同时也牺牲了一定程度的准确性。

我们可以将整个数据库比作一本字典,所有单词按字母顺序排列。当查询一个单词时,我们可以通过索引快速跳至仅与查询单词首字母相同的章节,更快速地找到输入单词的定义。

未来展望

就像这幅漫画所描绘的,没有十全十美的解决方案,只有不断提升优化向量模型的性能。

另外,从技术角度来看,我们希望可以同时运行多种学习模型,比较它们在图像搜索、视频搜索等方面的实验结果。如有兴趣,欢迎关注 Tokopedia Tech[5]获得更多信息。

解决搜索相关性等问题是 Tokopedia 日常工作的一部分。继 keyword-to-keyword 服务的成功实践后,我们立即运行了 keyword-to-product、keyword-to-category 等类似的搜索,探索更丰富的应用场景。

引用链接:

[1] ASCII:https://zh.wikipedia.org/wiki/ASCII

[2] 倒排索引:https://zh.wikipedia.org/wiki/倒排索引

[3] 官方文档:https://milvus.io/cn/docs/v1.1.0/overview.md

[4] 索引构建:https://milvus.io/cn/docs/v0.10.5/index.md#CPU

[5] Tokopedia Tech:https://medium.com/tokopedia-engineering

参考

Mishards Docs:Mishards: Cluster Sharding Middleware

Mishards:https://github.com/milvus-io/milvus/tree/master/shards

Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus

本文翻译自:https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821

Github @Milvus-io|CSDN @Zilliz Planet|Bilibili @Zilliz-Planet

Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。

Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 目前是 LF AI & Data 基金会的孵化阶段项目,能够管理大量非结构化数据集。我们的技术在新药发现、计算机视觉、推荐引擎、聊天机器人等方面具有广泛的应用。

0 人点赞