基于双塔模型的AI搜索工业实现

介绍

这篇文章只是介绍CLIP模型的工业实现,能力有限没法深入到具体的算法。目前了解到视觉中国的搜索就是用的这个模型实现的,可以去体验下效果。实现步骤相对简单,记录下来是因为这是最近接触到比较有趣的一个业务场景,同时也感叹下科技爆炸带来的惊叹。

前置知识

  • 双塔模型
    双塔模型如下图,指的是把图片和文字进行编码生成一个512维度的向量,然后比对图文向量得到相关的搜索图片。

  • 向量距离
    向量距离就是说的不同向量的相似度常见的距离算法有。
    1. 余弦相似度
    2. 欧几里得距离
    3. 曼哈顿距离

流程介绍

  1. 团队里面大多技术栈是 PHP + GO 加上环境安装需要解决一些依赖问题。所以把服务端进行了封装我放在了GitHub上 传送门
  2. 图上的ES-PUSH是之前写的一个es推送的小脚本,也是我的第一个Go程序mysql2elasticsearch没有向量类型开了副本提交了一版。
  3. PHP用gRPC的时候会很不顺畅不知道是我的问题还是普片现象,不过我也把grpc_php_plugin打包进了docker环境,如果有缘人遇到了类似的问题可以试试我的思路。

可以看这个dockerfile编译grpc_php_plugin 或者直接用编译好的镜像

1
registry.cn-shanghai.aliyuncs.com/ibaotu/php7.2

在这个环境里没法直接用protoc生成代码,(因为php docker的官方镜像太老了很多依赖包都出了问题)。 我是在PHP8里面调用编译好的grpc_php_plugin生成的。

  1. 再贴一下es的DSL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
PUT /index_name
{
"mappings": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "text"
},
"vector": {
"type": "dense_vector",
"dims": 512
},
"picurl": {
"type": "keyword"
},
"c1": {
"type": "keyword"
}
}
}
}

POST index_name/_search
{
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "cosineSimilarity(params.queryVector, 'vector') + 1.0",
"params": {
"queryVector": [
...
]
}
}
}
}

}

结尾

本来感觉有很多可以记录下来的,但是回头梳理了下大多耗时都是因为PHP的低版本造成的gRPC使用上的问题解决就行记录下环境编译的过程没什么意义 :-(

最后看下搜索了100w素材后的搜索结果

关键词:夏天

关键词: 沙滩上的美女

关键词: 吃饭的小孩

产考文献

https://modelscope.cn/models/damo/multi-modal_clip-vit-base-patch16_zh/summary

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~