TiDBベクトル検索をpeeweeと統合する
このチュートリアルではピーウィーを使用してTiDB ベクトル検索と対話し、エンベディングを保存し、ベクトル検索クエリを実行する方法を説明します。
注記:
- ベクター検索機能はベータ版です。予告なく変更される場合があります。バグを発見した場合は、GitHubで問題を報告してください。
- ベクトル検索機能は、 TiDBセルフマネージドTiDB Cloud Starter 、 TiDB Cloud Essential 、およびTiDB Cloud Dedicatedで利用できます。TiDB Self-ManagedおよびTiDB Cloud Dedicatedの場合、TiDBのバージョンはv8.4.0以降である必要があります(v8.5.0以降を推奨)。
前提条件
このチュートリアルを完了するには、以下が必要です。
- Python 3.8以降インストールされています。
- Gitがインストールされました。
- TiDBクラスタ。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
サンプルアプリを実行します
以下の手順に従うことで、TiDB Vector Searchをpeeweeに統合する方法をすぐに習得できます。
ステップ1. リポジトリをクローンする
tidb-vector-pythonリポジトリをローカルマシンにクローンしてください。
git clone https://github.com/pingcap/tidb-vector-python.git
ステップ2. 仮想環境を作成する
プロジェクト用の仮想環境を作成する:
cd tidb-vector-python/examples/orm-peewee-quickstart
python3 -m venv .venv
source .venv/bin/activate
ステップ3. 必要な依存関係をインストールします
デモプロジェクトに必要な依存関係をインストールします。
pip install -r requirements.txt
または、プロジェクトに以下のパッケージをインストールすることもできます。
pip install peewee pymysql python-dotenv tidb-vector
ステップ4.環境変数を設定する
選択したTiDBのデプロイオプションに応じて、環境変数を設定してください。
TiDB Cloud StarterまたはEssentialインスタンスの場合、接続文字列を取得し、環境変数を設定するには、以下の手順に従ってください。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用のオペレーティング環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。「接続」は
Generalに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
ヒント:
プログラムがWindows Subsystem for Linux(WSL)上で実行されている場合は、対応するLinuxディストリビューションに切り替えてください。
接続ダイアログから接続パラメータをコピーしてください。
ヒント:
まだパスワードを設定していない場合は、 「パスワードを生成」をクリックしてランダムなパスワードを生成してください。
Python プロジェクトのルートディレクトリに
.envファイルを作成し、接続パラメータを対応する環境変数に貼り付けます。TIDB_HOST: TiDB Cloud StarterまたはEssentialインスタンスのホスト。TIDB_PORT: TiDB Cloud StarterまたはEssentialインスタンスのポート。TIDB_USERNAME: TiDBに接続するためのユーザー名。TIDB_PASSWORD: TiDBに接続するためのパスワード。TIDB_DATABASE: 接続するデータベース名。TIDB_CA_PATH: ルート証明書ファイルへのパス。
以下はmacOSの例です。
TIDB_HOST=gateway01.****.prod.aws.tidbcloud.com TIDB_PORT=4000 TIDB_USERNAME=********.root TIDB_PASSWORD=******** TIDB_DATABASE=test TIDB_CA_PATH=/etc/ssl/cert.pem
TiDBセルフマネージドクラスタの場合、Pythonプロジェクトのルートディレクトリに.envファイルを作成します。次の内容を.envファイルにコピーし、TiDBクラスタの接続パラメータに応じて環境変数の値を変更します。
TIDB_HOST=127.0.0.1
TIDB_PORT=4000
TIDB_USERNAME=root
TIDB_PASSWORD=
TIDB_DATABASE=test
TiDBをローカルマシンで実行している場合、 TIDB_HOSTはデフォルトで127.0.0.1になります。初期のTIDB_PASSWORDは空なので、クラスターを初めて起動する場合は、このフィールドを省略できます。
各パラメータの説明は以下のとおりです。
TIDB_HOST: TiDB セルフマネージド クラスタのホスト。TIDB_PORT: TiDB セルフマネージド クラスタのポート。TIDB_USERNAME: TiDB セルフマネージド クラスタに接続するためのユーザー名。TIDB_PASSWORD: TiDB セルフマネージド クラスタに接続するためのパスワード。TIDB_DATABASE: 接続するデータベースの名前。
ステップ5.デモを実行する
python peewee-quickstart.py
出力例:
Get 3-nearest neighbor documents:
- distance: 0.00853986601633272
document: fish
- distance: 0.12712843905603044
document: dog
- distance: 0.7327387580875756
document: tree
Get documents within a certain distance:
- distance: 0.00853986601633272
document: fish
- distance: 0.12712843905603044
document: dog
サンプルコードスニペット
アプリケーション開発にあたっては、以下のサンプルコードスニペットを参考にしてください。
ベクターテーブルを作成する
TiDBに接続する
import os
import dotenv
from peewee import Model, MySQLDatabase, SQL, TextField
from tidb_vector.peewee import VectorField
dotenv.load_dotenv()
# Using `pymysql` as the driver.
connect_kwargs = {
'ssl_verify_cert': True,
'ssl_verify_identity': True,
}
# Using `mysqlclient` as the driver.
# connect_kwargs = {
# 'ssl_mode': 'VERIFY_IDENTITY',
# 'ssl': {
# # Root certificate default path
# # https://docs.pingcap.com/tidbcloud/secure-connections-to-serverless-clusters/#root-certificate-default-path
# 'ca': os.environ.get('TIDB_CA_PATH', '/path/to/ca.pem'),
# },
# }
db = MySQLDatabase(
database=os.environ.get('TIDB_DATABASE', 'test'),
user=os.environ.get('TIDB_USERNAME', 'root'),
password=os.environ.get('TIDB_PASSWORD', ''),
host=os.environ.get('TIDB_HOST', 'localhost'),
port=int(os.environ.get('TIDB_PORT', '4000')),
**connect_kwargs,
)
ベクトル列を定義する
peewee_demo_documentsという名前の列を持つテーブルを作成し、その列に3次元ベクトルを格納します。
class Document(Model):
class Meta:
database = db
table_name = 'peewee_demo_documents'
content = TextField()
embedding = VectorField(3)
埋め込みを含むドキュメントを保存する
Document.create(content='dog', embedding=[1, 2, 1])
Document.create(content='fish', embedding=[1, 2, 4])
Document.create(content='tree', embedding=[1, 0, 0])
近隣住民の文書を検索
コサイン距離関数に基づいて、クエリベクトル[1, 2, 3]に意味的に最も近い上位 3 つのドキュメントを検索します。
distance = Document.embedding.cosine_distance([1, 2, 3]).alias('distance')
results = Document.select(Document, distance).order_by(distance).limit(3)
一定距離内の文書を検索
クエリベクトル[1, 2, 3]からのコサイン距離が 0.2 未満の文書を検索します。
distance_expression = Document.embedding.cosine_distance([1, 2, 3])
distance = distance_expression.alias('distance')
results = Document.select(Document, distance).where(distance_expression < 0.2).order_by(distance).limit(3)