使用 Elasticsearch 向量搜索功能
目标
在本教程中,您将部署 Databases for Elasticsearch 的实例,并使用该实例来存储图像的 向量表示,然后您可以搜索这些图像以找到与新的不可见的图像的相似之处。
这些向量表示 (称为嵌入) 是使用机器学习算法创建的。 机器学习 是人工智能 (AI) 和计算机科学的一个分支,专注于使用数据和算法来模仿人类学习的方式,逐渐提高其准确性。 通过使用统计方法,训练算法以进行分类或预测,并发现数据挖掘项目中的关键洞察。
这些学习算法被称为“模型”。 在本教程中,我们将使用这样一个模型,OpenAI'sCLIP。 CLIP (对比语言-图像预训练) 是一个在各种 (图像,文本) 对上训练的神经网络。
传统上,在图像之间找到相似之处,对人的眼睛比较直白的东西,计算机一直很难做到。 Machine Learning 已变换此搜索字段。
请参阅此 Elasticsearch 机器学习系列中的其他教程:
Databases for Elasticsearch 是付费服务,因此遵循本教程将产生费用。
提高生产力
要开始供应过程,请安装一些必备的生产力工具:
- 您需要具有 IBM Cloud 帐户。
- Terraform-用于编码和供应基础结构。
- Python
您还需要提供用于执行相似性搜索的语料库的图像数据集。 例如,您可能具有汽车图像或鸟类图像的数据集。 您通常需要数以千计的这些图像。 由于图片的版权限制,我们不能在这里提供一个。
在本教程中,您不会将图像本身上载到数据库。 将在本地计算向量表示,并且将仅上载这些向量表示。 在现实场景中,您可能将图像存储在某个位置 (例如,Object Storage 存储区),并且对图像位置的引用将与向量表示一起存储以进行检索。
获取 API 密钥
创建 IBM Cloud API 密钥,使 Terraform 能够在您的帐户中供应基础结构。 您最多可以创建 20 个 API 密钥。
出于安全原因,API 密钥仅在创建时才可复制或下载。 如果 API 密钥丢失,必须创建新的 API 密钥。
克隆项目
从 GitHub 存储库克隆项目。
git clone https://github.com/IBM/elasticsearch-ml-vector-search-tutorial.git
安装 Elasticsearch 集群
-
浏览至克隆项目的 Terraform 文件夹。
cd elasticsearch-ml-vector-search-tutorial/terraform
-
在机器上,使用以下字段创建名为
terraform.tfvars
的文档:ibmcloud_api_key = "<your_api_key_from_step_1>" region = "<your_region>" elastic_password = "<make-up-a-password>"
terraform.tfvars
文档包含您可能希望保密的变量,因此会将其从公共 Github 存储库中排除。 -
使用以下命令安装基础架构
terraform init terraform apply --auto-approve
-
最后,将数据库访问 URL 导出到终端环境。 后续步骤将需要此参数。
terraform output --json export ES_URL="<the url value obtained from the output>"
安装依赖项
您需要安装一些 Python 依赖项:
pip3 install elasticsearch
pip3 install Pillow
pip3 install imgbeddings
pip3 install requests
生成图像的向量嵌入
在项目文件夹结构的根目录中创建名为 images
的文件夹。 在其中,创建一个或多个具有不同图像的文件夹。 例如,如果您有汽车数据集,那么可能要为不同类型的汽车创建文件夹,例如 fordescort
和 fordcortina
。 这不是严格必要的 (所有图像都可能位于名为 cars
的文件夹中),但组织文件夹可能会使以后更容易识别搜索匹配项。
您已准备好运行 create.py
脚本。 在项目类型的根目录中:
python3 create.py
此脚本在 Databases for Elasticsearch 数据库中创建名为 images
的 Elasticsearch 索引。
然后,它会在 images
文件夹中循环,并且对于每个图像,它会使用 此开放式源代码 Python 包(使用开放式源代码 OpenAI 中的 CLIP 模型)
创建一组 嵌入。 使用这些嵌入和少量元数据 (文件路径和文件标识),脚本会创建一个文档,然后将该文档上载到 Elasticsearch 索引。
根据数据集的大小,此过程可能需要多个小时才能完成。
搜索数据集
现在您可以测试新数据集了。 为此,您需要查找不属于原始数据集的另一个汽车图像 (如果您正在使用汽车)。 将此映像 (例如,myimage.jpg
) 保存到项目的根目录。
运行 search.py
脚本,传入映像名称:
python3 search.py myimage.jpg
该脚本使用与之前相同的算法为提供的图像生成一组嵌入。 它尝试在数据集上执行 已知最近邻元素 搜索,以查找数据集中与搜索中提供的图像最接近的匹配项。 它返回最接近匹配项的详细信息。
{"took": 4947, "timed_out": false, "_shards": {"total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits": {"total": {"value": 1, "relation": "eq"}, "max_score": 0.97320974, "hits": [{"_index": "images", "_id": "5c910de5357cb9a3f1b43e6618b141afa6666bfca8676269d5e10a14e1688819", "_score": 0.97320974, "fields": {"file_path": ["./images/Bald_Eagle/26897.jpg"], "desc": ["Bald_Eagle"]}}]}}
您可以使用其他映像重复此过程。
图像相似性,而不是鸟类相似性
您构建的是图像相似性搜索,而不是鸟 (或汽车) 相似性搜索。 向量搜索算法正在分析整个图像并查找匹配项。 坐在树枝上的莺的图像可能比在飞行中的莺的图像更类似于坐在树枝上的树麻雀的图像。 然而,它是一个强大的工具,可以使 (直到最近) 对象之间的关系变得困难 (如果不是不可能的话)。
拆除基础架构
Databases for Elasticsearch 会产生费用。 完成本教程后,可以通过转至项目的 terraform
目录并使用以下命令来除去所有基础结构:
terraform destroy
后续步骤
如果您已准备好进一步探索,那么还可以使用 Databases for Elasticsearch 来不仅存储向量嵌入,还生成向量嵌入。 这是本系列中 下一个教程 的主题。