TiDB ベクトル検索を SQLAlchemy と統合する

このチュートリアルでは、 SQLアルケミー使用してTiDB ベクトル検索と対話し、埋め込みを保存し、ベクトル検索クエリを実行する方法について説明します。

注記:

ベクトル検索機能は、TiDB セルフマネージド クラスターとTiDB Cloudサーバーレスクラスターでのみ使用できます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

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 Serverless
  • TiDB Self-Managed

TiDB Cloud Serverless クラスターの場合、クラスター接続文字列を取得し、環境変数を構成するには、次の手順を実行します。

  1. クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。

  2. 右上隅の「接続」をクリックします。接続ダイアログが表示されます。

  3. 接続ダイアログの構成が環境と一致していることを確認します。

    • 接続タイプはPublicに設定されています。

    • ブランチはmainに設定されています。

    • Connect With はSQLAlchemyに設定されています。

    • オペレーティング システムは環境に適合します。

    ヒント:

    プログラムが Windows Subsystem for Linux (WSL) で実行されている場合は、対応する Linux ディストリビューションに切り替えます。

  4. PyMySQLタブをクリックし、接続文字列をコピーします。

    ヒント:

    まだパスワードを設定していない場合は、「パスワードの生成」をクリックしてランダムなパスワードを生成します。

  5. 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)

ベクトル列を定義する

3 次元ベクトルを格納するembeddingという名前の列を持つテーブルを作成します。

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()

参照

このページは役に立ちましたか?