IBM Cloud Docs
使用 Elasticsearch 向量搜尋功能

使用 Elasticsearch 向量搜尋功能

目標

在本指導教學中,您部署 Databases for Elasticsearch 的實例,並使用它來儲存映像檔的 向量表示法,然後您可以搜尋這些映像檔,以尋找與新的未看到映像檔的相似性。

這些向量表示法 (稱為內嵌) 是使用機器學習演算法所建立。 機器學習 是人工智慧 (AI) 和電腦科學的分支,著重於使用資料和演算法來模擬人類學習的方式,逐漸提高其精確度。 透過使用統計方法,會訓練演算法進行分類或預測,以及揭露資料採礦專案中的重要見解。

這些學習演算法稱為「模型」。 在本教程中,我們使用一個這樣的模型,OpenAI's夾子。 CLIP (對比語言-影像預先訓練) 是在各種 (影像、文字) 配對上訓練的神經網路。

傳統上,尋找影象之間的相似性,對人類來說相對簡單的東西,對於計算機來說是很難做到的。 Machine Learning 已轉換此搜尋欄位。

請參閱下列 Elasticsearch 機器學習系列中的其他指導教學:

Databases for Elasticsearch 是已付費服務,因此遵循本指導教學將產生費用。

提高生產力

若要開始佈建程序,請安裝一些必須具有生產力的工具:

您還需要提供語料庫以執行相似性搜尋的影像資料集。 例如,您可能具有汽車影像或鳥影像的資料集。 您通常需要數千個這些影像。 由於對影像的版權限制,我們不能在此提供。

在本指導教學中,您不會將映像檔本身上傳至資料庫。 向量表示法將在本端計算,且只會上傳那些向量表示法。 在實際實務範例中,您可能會將映像檔儲存在某處 (例如 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 集群

  1. 導覽至所複製專案的 terraform 資料夾。

    cd elasticsearch-ml-vector-search-tutorial/terraform
    
  2. 在機器上,建立名為 terraform.tfvars 的文件,並包含下列欄位:

     ibmcloud_api_key = "<your_api_key_from_step_1>"
     region = "<your_region>"
     elastic_password = "<make-up-a-password>"
    

    terraform.tfvars 文件包含您可能想要保密的變數,因此會從公用 Github 儲存庫中排除它。

  3. 使用以下命令安裝基礎架構:

    terraform init
    terraform apply --auto-approve
    
  4. 最後,將資料庫存取 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 的資料夾。 在其中,建立一個以上具有不同影像的資料夾。 例如,如果您有汽車資料集,則可能想要建立不同汽車類型的資料夾,例如 fordescortfordcortina。 這並非嚴格必要 (所有影像都可以放在稱為 cars 的資料夾中),但組織資料夾可能會讓稍後更容易識別搜尋相符項。

您已準備好執行 create.py Script。 在專案類型的根目錄中:

python3 create.py

此 Script 會在 Databases for Elasticsearch 資料庫中建立稱為 images 的 Elasticsearch 索引。

然後,它會輪流選取 images 資料夾,並針對每一個映像檔,發現它使用 此開放程式碼 Python 套件來建立一組 內嵌,這會使用開放程式碼 來自 OpenAI 的 CLIP 模型。 使用這些內嵌及少量 meta 資料 (檔案路徑及檔案 ID),Script 會建立文件,然後上傳至 Elasticsearch 索引。

視資料集的大小而定,此程序可能需要數小時才能完成。

搜尋資料集

您現在已準備好測試新資料集。 若要這樣做,您需要尋找不屬於原始資料集的汽車 (如果您正在使用汽車) 的另一個影像。 將此映像檔 (例如,myimage.jpg) 儲存至專案的根目錄。

執行 search.py Script,並傳入映像檔名稱:

python3 search.py myimage.jpg

此 Script 會使用與之前相同的演算法,為所提供的映像檔產生一組內嵌。 它會嘗試在資料集上進行 已知最近鄰接項 搜尋,以尋找資料集中與搜尋中提供的影像最接近的相符項。 它會傳回最相符項的詳細資料。

{"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,不僅儲存向量內嵌,還可以產生它們。 這是本系列 下一個指導教學 的主題。