見出し画像

ベクトルデータベース Pinecone を試す

ベクトルデータベース「Pinecone」を試したので、使い方をまとめました。

1. Pinecone

「Pinecone」は、シンプルなAPIを提供するフルマネージドなベクトルデータベースです。高性能なベクトル検索アプリケーションを簡単に構築することができます。

「Pinecone」の特徴は、次のとおりです。

・高速 : 数十億のデータがあっても、クエリは高速。
・フレッシュ : データの追加・編集・削除時に、インデックスを動的更新。
・フィルタリング : ベクトル検索とメタデータフィルタを組み合わせて、より関連性の高いデータをすばやく取得。
・フルマネージド : 開始、使用、スケーリングが簡単でスムーズで安全。

2. 利用料金

「Pinecone」の利用料金は、次のとおりです。
無料プランで試用できますが、非アクティブ状態が7日間続くと削除されます。

3. キーコンセプト

「Pinecone」のキーコンセプトは、次のとおりです。

◎ ベクトル検索
「ベクトル検索」は、MLで生成したデータ表現 (ベクトル埋め込み) をインデックス化して、類似要素を高速に検索します。

◎ ベクトル埋め込み
「ベクトル埋め込み」は、オブジェクトを表す浮動小数配列です。オブジェクトの意味的類似性をキャプチャした情報になります。

◎ ベクトルデータベース
「ベクトルデータベース」は、効率的な管理と検索のために、ベクトル埋め込みをインデックス化して保存するデータベースです。

4. ユースケース

「Pinecone」のユースケースは、次のとおりです。

◎ セマンティックテキスト検索
「Transformer」でテキストをベクトル埋め込みに変換し、「Pinecone」でベクトル埋め込みをインデックス化および検索します。

◎ 質問応答
一連の質問の埋め込みベクトルをインデックス化し、新しい質問に対して最も類似した結果を取得します。

◎ 画像類似検索
画像データをベクトル埋め込みに変換し、「Pinecone」でベクトル埋め込みをインデックス化および検索します。

◎ 商品レコメンデーション
ユーザーを表すベクトルに基づき、EC向けの商品レコメンデーションを生成します。

5. APIキーの取得

「Pinecone」のAPIキーの取得手順は、次のとおりです。

(1) 「Pinecone」のサイトを開き、「Sign Up Free」ボタンからログイン。
コンソールが表示されます。

(2) 「API Keys」を選択し、APIキーを取得。

6. Colabでの実行

Google ColabでのPineconeの実行手順は、次のとおりです。

(1) パッケージのインストール。

# パッケージのインストール
!pip install pinecone-client

(2) Pineconeの初期化。
<Pinecone_APIキー>には自分のPineconeのAPIキーを指定します。

import pinecone

# Pineconeの初期化
pinecone.init(
    api_key="<Pinecone_APIキー>",
    environment="us-west1-gcp"
)

(3) インデックスの作成。
8次元ベクトルのユークリッド距離メトリックを使用して近似最近傍検索を実行する「quickstart」という名前のインデックスを作成します。

# インデックスの生成
pinecone.create_index(
    "quickstart", 
    dimension=8, 
    metric="euclidean", 
    pod_type="p1"
)

metricは、次のとおりです。

・euclidean (ユークリッド距離) : ベクトル間の物理的距離を測定する必要がある場合に使用。画像や音声などの類似性測定に有効。
・cosine (コサイン類似度) : ベクトルの向きによる類似性を測定する必要がある場合に使用。文書や単語などの類似性測定に有用。
・dotproduct (ドット積) : ベクトルの向きと大きさによる類似性を測定する必要がある場合に使用。

pod_typeは、次のとおりです。

・s1 : 低コストで低スループットな、低コストタイプ。
・p1 : 適度な検索レイテンシーでスループットな、バランスタイプ。
・p2 : 低検索レイテンシーで高スループットな、高パフォーマンスタイプ。

(4) インデックスのリストを取得。

# インデックスのリストを取得取得
pinecone.list_indexes()
['quickstart']

(5) インデックスに接続。
インデックスにクエリするには接続する必要があります。

# インデックスに接続
index = pinecone.Index("quickstart")

(6) データの挿入。

# データの挿入
index.upsert([
    ("A", [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]),
    ("B", [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]),
    ("C", [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]),
    ("D", [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]),
    ("E", [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
])
{'upserted_count': 5}

(6) インデックスの統計の取得。

# インデックスの統計の取得
index.describe_index_stats()
{'dimension': 8,
 'index_fullness': 0.0,
 'namespaces': {'': {'vector_count': 5}},
 'total_vector_count': 5}

(7) 類似のベクトルの取得。
Cが同じで、DとBが次に類似するものになります。

# 類似のベクトルの取得
index.query(
  vector=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3],
  top_k=3,
  include_values=True
)
{'matches': [{'id': 'C',
              'score': 0.0,
              'sparseValues': {},
              'values': [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]},
             {'id': 'D',
              'score': 0.0799999237,
              'sparseValues': {},
              'values': [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]},
             {'id': 'B',
              'score': 0.0800000429,
              'sparseValues': {},
              'values': [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]}],
 'namespace': ''}

(8) インデックスの削除。
元の何もない状態に戻します。

# インデックスの削除
pinecone.delete_index("quickstart")

7. 制限事項

現在の「Pinecone」の制限事項は、次のとおりです。

◎ upsert
ベクトルの最大次元数は 20,000 です。
upsertリクエストの最大サイズは 2MB です。
upsertの推奨制限は、リクエストごとに 100ベクトル です。

upsert直後のクエリでは、ベクトルが表示されない場合があります。describe_index_stats()で合計を調べることにより、ベクトルがインデックス付けされたかどうかを確認できます。データベースは結果整合性があります。

◎ クエリ
返される結果数 top_k の最大値は 10,000 です。
include_metadata=True または include_data=True のクエリの top_k の最大値は 1,000 です。

◎ フェッチと削除
フェッチと削除のリクエストごとの最大ベクトル数は 1,000 です。

◎ 名前空間
インデックスごとの名前空間の数に制限はありません。

◎ Podのストレージ容量
s1 podは、768次元 の 5Mベクトル です。
p1/p2 podは、768次元 の 1Mベクトル です。

◎ メタデータ
ベクターあたりのメタデータの最大サイズは 10 KB です。

Null メタデータ値はサポートされていません。null 値を保持するようにキーを設定する代わりに、そのキーをメタデータペイロードから削除してください。大きなインデックス内の全てのベクトルの一意の値など、カーディナリティの高いメタデータは、予想よりも多くのメモリを消費し、podがいっぱいになる原因となります。



この記事が気に入ったらサポートをしてみませんか?