序言
图示:一个简单的智能问答系统。
- 在当前业务系统中,是否感受到越来越多的智能化个性业务诉求,做一个智能化的商品搜索,用于检索商品的相似性;做一个图片搜索,检索相似的图片;做一个语音搜索,检索相似度极高的音频,这种智能化的需求越来越多。
- 可能你听过看过很多机器学习或者深度学习的“名词“,对于一些常规的应用工程师来说,这些距离个人很远,打开各种算法网站,看到各种模型,看的头疼。
- 可能你是一个高学历的深度学习方面工程师,当面对业务复杂的需求时,也会两难,虽然掌握了很多深度学习模型,但在具体工程落地实践时,遇到很多困惑,如何解决海量的向量存储,如何解决海量的检索,如何与应用工程师搭配等。
以上是我们一个个IT领域工程师都会有的困惑,单个人精力有限,有的人擅长工程实践,有的人擅长算法模型,所以得需要找到一个中间衔接点,这个点就是 "Elasticsearch”
Elasticsearch 是如何解决问题的?
dense_vector
2019年4月,Elasticsearch发布了7.0版本,带来了很多新特性,其中增加了新的字段类型dense_vector,向量字段类型为智能搜索提供了最关键的基石,可广泛应用于文本相似度搜索、图片相似度搜索、语音相似度搜索等。
同时借助于Elasticsearch的架构特性,既可以解决海量数据的存储,也可以解决海量数据的检索,非常完美的解决了深度学习工程师的工程问题。
如下案例:设置字段类型为 dense_vector
代码语言:javascript复制PUT xxx-index-01
{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "dot_product"
}
}
}
}
knn-search
2022年2月,Elasticsearch发布了8.0版本,同样带来很多新特性,其中最关注的是knn-search,提供了一种更加高效的索引算法,检索效率同比之前大幅度提升,在此之前只能通过简单粗暴的全表三角函数计算。
如下案例:基于_knn_search 构建向量检索
代码语言:javascript复制#KNN检索:_knn_search,构建向量检索
GET my-index/_knn_search
{
"knn": {
"field": "image_vector",
"query_vector": [0.3, 0.1, 1.2],
"k": 10,
"num_candidates": 100
},
"_source": ["name", "date"]
}
Text-embedding
在深度学习领域,tensorflow深度学习平台是大家经常讨论熟知使用的,有了深度学习平台强力支撑,高学历的深度模型工程师仅仅需要关注算法模型层面,无需关注工程层面,在此之上,也衍生出一些成熟的算法模型,开箱即用,大大降低了项目落地的门槛。
基于Text-embedding单词嵌入模型,可以将文本、图像、音频等各种世间万物转换为特定向量,程序提前将各种数据生成对应向量,存入到Elasticsearch平台中,应用搜索时,也可以即可在Elasticsearch进行检索。
图示:通过embed模型,将文本内容转化为向量
参考文献
- dense-vector 向量字段类型
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/dense-vector.html
- knn-search 近邻搜索
https://www.elastic.co/guide/en/elasticsearch/reference/8.1/knn-search.html
- text-similarity-search-with-vectors-in-elasticsearch 使用向量字段进行文本相似度搜索
https://www.elastic.co/cn/blog/text-similarity-search-with-vectors-in-elasticsearch
- universal-sentence-encoder text-embeding 文本向量模型
https://tfhub.dev/google/universal-sentence-encoder/4