IBM Cloud Docs
Elasticsearch ベクトル検索機能の使用

Elasticsearch ベクトル検索機能の使用

目標

このチュートリアルでは、 Databases for Elasticsearch のインスタンスをデプロイし、それを使用してイメージの ベクトル表記 を保管します。これを検索して、新しい未表示のイメージとの類似性を見つけることができます。

これらのベクトル表現は、組み込みと呼ばれ、機械学習アルゴリズムを使用して作成されます。 機械学習 は、人工知能 (AI) とコンピューター・サイエンスの分野で、人間が学習する方法を模倣するためのデータとアルゴリズムの使用に重点を置き、その正確度を徐々に向上させています。 統計手法を使用することで、分類や予測を行い、データ・マイニング・プロジェクトの重要な洞察を明らかにするためにアルゴリズムがトレーニングされます。

これらの学習アルゴリズムは「モデル」として知られています。 このチュートリアルでは、そのようなモデルの1つを使用します。OpenAI'sクリップ。 CLIP (Contrastive Language-Image Pre Training) は、さまざまな (イメージ、テキスト) ペアでトレーニングされたニューラル・ネットワークです。

伝統的には、人間の目に比較的分かりやすいイメージ間の類似性を見つけることは、コンピューターにとって難しいことでした。 Machine Learning は、この検索フィールドを変換しました。

この Elasticsearch 機械学習シリーズの他のチュートリアルを参照してください。

Databases for Elasticsearch は有料サービスであるため、このチュートリアルに従うと料金が発生します。

生産性の向上

プロビジョニング・プロセスを開始するには、以下のように、いくつかの必須生産性向上ツールをインストールします。

また、類似性検索を実行するためのコーパスを提供するイメージのデータ・セットも必要です。 例えば、車の画像または鳥の画像のデータ・セットがあるとします。 通常、これらのイメージは数千個必要です。 イメージの著作権が制限されているため、ここでは提供できません。

このチュートリアルでは、イメージ自体をデータベースにアップロードしません。 ベクトル表現はローカルで計算され、それらのみがアップロードされます。 実際のシナリオでは、イメージは ( Object Storage バケットのような) どこかに保管され、イメージ・ロケーションへの参照は、取得のためにベクトル表現と一緒に保管される可能性があります。

API キーの取得

Terraform がインフラストラクチャーをアカウントにプロビジョンできるようにする IBM Cloud API キー を作成します。 最大 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 という名前のフォルダーを作成します。 その中に、異なるイメージを持つ 1 つ以上のフォルダーを作成します。 例えば、車のデータ・セットがある場合、 fordescortfordcortina など、さまざまなタイプの車用のフォルダーを作成することができます。 これは厳密には必要ではありませんが (すべてのイメージが cars という名前のフォルダーに入る可能性があります)、フォルダーを編成することにより、後で検索の一致を識別しやすくなる場合があります。

これで、 create.py スクリプトを実行する準備ができました。 プロジェクト・タイプのルートで、以下のようにします。

python3 create.py

このスクリプトは、 Databases for Elasticsearch データベース内に images という Elasticsearch 索引を作成します。

次に、 images フォルダー内を循環し、検出されたイメージごとに、オープン・ソース OpenAI からの CLIP モデルを使用する 埋め込み のセットを このオープン・ソース Python パッケージを使用して作成します。 これらの埋め込みと少量のメタデータ (ファイル・パスとファイル ID) を使用して、スクリプトは文書を作成し、それを 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 を使用して、ベクトル埋め込みを保管するだけでなく、それらを生成することもできます。 これが、このシリーズの 次のチュートリアル のテーマです。