TiDBベクトル検索をSQLAlchemyと統合する
このチュートリアルでは、 SQLAlchemyを使用して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をSQLAlchemyと統合する方法をすぐに習得できます。
ステップ1. リポジトリをクローンする
tidb-vector-pythonリポジトリをローカルマシンにクローンします。
git clone https://github.com/pingcap/tidb-vector-python.git
ステップ2. 仮想環境を作成する
プロジェクト用の仮想環境を作成する:
cd tidb-vector-python/examples/orm-sqlalchemy-quickstart
python3 -m venv .venv
source .venv/bin/activate
ステップ3. 必要な依存関係をインストールします
デモプロジェクトに必要な依存関係をインストールします。
pip install -r requirements.txt
または、プロジェクトに以下のパッケージをインストールすることもできます。
pip install pymysql python-dotenv sqlalchemy tidb-vector
ステップ4.環境変数を設定する
選択したTiDBのデプロイオプションに応じて、環境変数を設定してください。
TiDB Cloud StarterまたはEssentialインスタンスの場合、接続文字列を取得し、環境変数を設定するには、以下の手順に従ってください。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログの設定がご使用の環境と一致していることを確認してください。
接続タイプは
Publicに設定されています。ブランチは
mainに設定されています。「接続」は
SQLAlchemyに設定されています。お使いの環境に合ったオペレーティングシステムを選択してください。
ヒント:
プログラムがWindows Subsystem for Linux(WSL)上で実行されている場合は、対応するLinuxディストリビューションに切り替えてください。
PyMySQLタブをクリックして、接続文字列をコピーしてください。
ヒント:
まだパスワードを設定していない場合は、 「パスワードを生成」をクリックしてランダムなパスワードを生成してください。
Python プロジェクトのルートディレクトリに
.envファイルを作成し、接続文字列を貼り付けます。以下はmacOSの例です。
TIDB_DATABASE_URL="mysql+pymysql://<prefix>.root:<password>@gateway01.<region>.prod.aws.tidbcloud.com:4000/test?ssl_ca=/etc/ssl/cert.pem&ssl_verify_cert=true&ssl_verify_identity=true"
TiDBセルフマネージドクラスタの場合、Pythonプロジェクトのルートディレクトリに.envファイルを作成します。次の内容を.envファイルにコピーし、TiDBクラスタの接続パラメータに応じて環境変数の値を変更します。
TIDB_DATABASE_URL="mysql+pymysql://<USER>:<PASSWORD>@<HOST>:<PORT>/<DATABASE>"
# For example: TIDB_DATABASE_URL="mysql+pymysql://root@127.0.0.1:4000/test"
TiDBをローカルマシンで実行している場合、 <HOST>はデフォルトで127.0.0.1になります。初期の<PASSWORD>は空なので、クラスターを初めて起動する場合は、このフィールドを省略できます。
各パラメータの説明は以下のとおりです。
<USER>: TiDBに接続するためのユーザー名。<PASSWORD>: TiDBに接続するためのパスワード。<HOST>: TiDBクラスタのホスト。<PORT>: TiDB クラスタのポート。<DATABASE>: 接続するデータベースの名前。
ステップ5.デモを実行する
python sqlalchemy-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 sqlalchemy import Column, Integer, create_engine, Text
from sqlalchemy.orm import declarative_base, Session
from tidb_vector.sqlalchemy import VectorType
dotenv.load_dotenv()
tidb_connection_string = os.environ['TIDB_DATABASE_URL']
engine = create_engine(tidb_connection_string)
ベクトル列を定義する
embeddingという名前の列を持つテーブルを作成し、その列に3次元ベクトルを格納します。
Base = declarative_base()
class Document(Base):
__tablename__ = 'sqlalchemy_demo_documents'
id = Column(Integer, primary_key=True)
content = Column(Text)
embedding = Column(VectorType(3))
埋め込みを含むドキュメントを保存する
with Session(engine) as session:
session.add(Document(content="dog", embedding=[1, 2, 1]))
session.add(Document(content="fish", embedding=[1, 2, 4]))
session.add(Document(content="tree", embedding=[1, 0, 0]))
session.commit()
近隣住民の文書を検索
コサイン距離関数に基づいて、クエリベクトル[1, 2, 3]に意味的に最も近い上位 3 つのドキュメントを検索します。
with Session(engine) as session:
distance = Document.embedding.cosine_distance([1, 2, 3]).label('distance')
results = session.query(
Document, distance
).order_by(distance).limit(3).all()
一定距離内の文書を検索
クエリベクトル[1, 2, 3]からのコサイン距離が 0.2 未満の文書を検索します。
with Session(engine) as session:
distance = Document.embedding.cosine_distance([1, 2, 3]).label('distance')
results = session.query(
Document, distance
).filter(distance < 0.2).order_by(distance).limit(3).all()