头图

✏️ 编者按

 一般来说,企业寻找行业客户时,需要先人工搜索企业信息,判断是否符合商务需求,然后开展下一步的商务联系。这套流程繁琐费时,也容易遗漏客户。那么,有没有一套智能销售系统可以「主动获客」

「励销云」平台可以为企业提供覆盖「获客-筛客-管客-数字化仓储-客服运营」的一体化 SaaS 服务。 本文作者是上海微问家信息技术有限公司大数据研究院的算法工程师杨沅霖、张文峰,他们的研究方向包括自然语言处理、计算机视觉等机器学习领域以及算法工程化。

让我们一起来揭秘这套个性化推荐背后的技术原理吧!

技术背景

一般的推荐策略完全基于数据库关键词的检索,检索结果只能做到包含重要关键字,但是无法建立企业和企业之间的关联。为了更好地理解文本语义,「励销云」需要使用一套算法模型,将描述性的信息转化为语义向量,从而更好地利用语义信息并进行推荐召回。

现在,我们已经进入万物皆可 Embedding 的时代,图片、文本、视频、语音等非结构化数据可以通过 Embedding 技术提取为特征向量,通过对特征向量的计算和相似度检索可以实现智能问答、智能推荐等场景。我们需要一个向量数据库实现高性能的相似度检索,实现对目标企业召回对应的相似企业。我们希望完成「数据库+应用」实现产品的落地,真正服务于客户。

企业客户智能推荐

技术思路

企业数据包括位置、类型、标签等基本信息,以及对应的描述性信息。对于位置、类型等可以被结构化的信息,「励销云」利用数据离散化、One-Hot 编码等各种方式进行处理;而对于文本等描述信息,则利用 Word2Vector、GloVe、Sentence-BERT 等进行处理,实现描述信息转为向量的过程。在这个过程中,我们先文本进行分词,再使用腾讯的预训练词向量[1]拼接,然后取平均,生成对应的向量,再拼接之前结构化数据的向量,生成最终的企业向量。在产生对应的企业向量后,即可以使用相似搜索,找到目标企业的相似企业,实现召回的功能。

技术选型

Faiss[2]:向量化检索开山鼻祖的应用,Faiss 库是由 Facebook 开发的适用于稠密向量匹配的开源库。 

Vearch[3]:Vearch 是一个分布式向量搜索系统,可用来存储、计算海量的特征向量,基于 Facebook AI 研究院开源的 Faiss 实现。 

Milvus[4]:Milvus 向量数据库提供完整的向量数据更新,索引与查询框架。Milvus 向量数据库利用 GPU(Nvidia)进行索引加速与查询加速,能大幅提高单机性能。除了提供针对向量的近实时搜索能力外,Milvus 向量数据库可以对标量数据进行过滤。 

Faiss 不能开箱即用,在生产环境中使用涉及更多的开发、维护成本;Milvus 向量数据库和 Vearch 向量搜索系统是两款开箱即用的应用。Milvus 数据库在实现基本的相似计算功能的基础上,加强服务整体易用性、稳定性[5],部署更简单。经过一系列测试和对比分析,最终我们选择了 Milvus 作为我们的向量数据库。

项目实现

1. 基于 Kubernetes 搭建分布式 Milvus[6]

首先,要为 Milvus 数据库、MySQL 数据库配置数据存储(PersistentVolume)。为了方便快速地实现项目搭建,以 type 的类型为 local 作为示例:

apiVersion: v1 
kind: PersistentVolume 
metadata: 
 name: … 
 labels: 
 type: local 
spec: 
 capacity: 
 storage: 500Gi 
 accessModes: 
 - ReadWriteMany 
 hostPath: 
 path: "…"

然后,从 GitHub 仓库 (https://github.com/milvus-io/...) 上拉取项目。

进入 milvus-helm/charts/milvus 目录,利用 Helm 安装。在我们的项目中,我们将 readonly.replicas 设为 6,readonly.cache.cacheSize 设为 50G (缓存配置和 PV 配置无关)。可根据机器配置和项目需求调大 cacheSize、readonly 等参数,从而加速搜索。

接着,将服务对外暴露,可以在测试集群上简单使用如下命令完成简单的对外暴露。

kubectl --namespace default port-forward --address 0.0.0.0 $POD_NAME 19530 19121 &

2. 相关表的创建:

创建时,可以参考官方文档[7]设置 INDEX\_FILE\_SIZE 大小以优化搜索速度。可根据业务需求,在表内实现各种分区。

3. 插入数据:

在构造数据时,在此将企业的 ID 映射为 64 位的 int 作为向量的 ID,方便后续搜索时使用。

4. 创建索引:

我们选择了 IndexType.IVF_SQ8 索引[8] ,因为该索引搜索速度快,占用内存少。

5. 加载数据:

调用 load_collection 的 API 将数据和索引加载到内存中。

6. 基于 Flask 快速完成 RESTFUL 接口开发,配合 Gunicorn [9]实现服务的并发,完成服务上线。 

项目效果

Milvus 数据库中有多个集合,最大的集合下有 3000w+ 企业向量,在 topK=512、nprobe=256 的情况下,最大集合单向量搜索耗时为 100ms 左右。随着搜索的向量越多,耗时呈线性增长。但在 topK 为 100W 的极端情况下,Milvus 数据库依然在秒级内完成了相似企业的搜索。

在项目初期,我们也重试过直接在 Faiss 上进行二次开发,但是由于数据量的逐渐增加与所需功能的增加,开发所需时间和质量无法得到保证。在转向使用 Milvus 数据库后,我们在一个月内完成了初期相关理论验证与开发上线工作,测试情况良好。并且在这过程中,当我们遇到问题,社区和官方的技术支持会在 24 小时内协助解决,非常感谢!

参考文献

1. https://ai.tencent.com/ailab/...

2. https://github.com/facebookre...

3. https://github.com/vearch/vearch

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

5. https://zhuanlan.zhihu.com/p/...

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

7. https://milvus.io/cn/docs/v1....

8. https://milvus.io/cn/docs/v1....

9. https://gunicorn.org/


Zilliz
154 声望829 粉丝

Vector database for Enterprise-grade AI