ベクトルデータベース 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は、次のとおりです。
pod_typeは、次のとおりです。
(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がいっぱいになる原因となります。
この記事が気に入ったらサポートをしてみませんか?