共计 2674 个字符,预计需要花费 7 分钟才能阅读完成。
✏️ 编者按
一般来说,企业寻找行业客户时,须要先人工搜寻企业信息,判断是否合乎商务需要,而后发展下一步的商务分割。这套流程繁琐费时,也容易脱漏客户。那么,有没有一套智能销售零碎能够「被动获客」?
「励销云」平台能够为企业提供笼罩「获客 - 筛客 - 管客 - 数字化仓储 - 客服经营」的一体化 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/