📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

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

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

注記:

ベクター検索機能はベータ版です。予告なく変更される可能性があります。バグを見つけた場合は、GitHubで問題報告を行ってください。

注記:

ベクトル検索機能は、TiDB Self-Managed、 TiDB Cloudスターター TiDB Cloudエッセンシャル利用できますTiDB Cloud専用 Self-Managed およびTiDB Cloud Dedicated の場合、TiDB バージョンは v8.4.0 以降である必要があります(v8.5.0 以降を推奨)。

前提条件

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

  • Python 3.8以上個インストールされました。
  • ギット個インストールされました。
  • TiDB クラスター。

TiDB クラスターがない場合は、次のように作成できます。

サンプルアプリを実行する

以下の手順に従って、TiDB Vector Search を Django ORM と統合する方法を簡単に学習できます。

ステップ1. リポジトリのクローンを作成する

tidb-vector-pythonリポジトリをローカル マシンにクローンします。

git clone https://github.com/pingcap/tidb-vector-python.git

ステップ2. 仮想環境を作成する

プロジェクト用の仮想環境を作成します。

cd tidb-vector-python/examples/orm-django-quickstart python3 -m venv .venv source .venv/bin/activate

ステップ3. 必要な依存関係をインストールする

デモ プロジェクトに必要な依存関係をインストールします。

pip install -r requirements.txt

あるいは、プロジェクトに次のパッケージをインストールすることもできます。

pip install Django django-tidb mysqlclient numpy python-dotenv

mysqlclient のインストールで問題が発生した場合は、mysqlclient の公式ドキュメントを参照してください。

django-tidbとは何か

django-tidb Django 用の TiDB 方言であり、Django ORM を拡張して TiDB 固有の機能 (たとえば、Vector Search) をサポートし、TiDB と Django 間の互換性の問題を解決します。

django-tidbインストールするには、お使いのDjangoのバージョンに合ったバージョンを選択してください。例えば、 django==4.2.*使用している場合はdjango-tidb==4.2.*インストールしてください。マイナーバージョンは同じである必要はありません。最新のマイナーバージョンを使用することをお勧めします。

詳細についてはdjango-tidbリポジトリを参照してください。

ステップ4.環境変数を設定する

選択した TiDB デプロイメント オプションに応じて環境変数を構成します。

    TiDB Cloud Starter クラスターの場合、次の手順に従ってクラスター接続文字列を取得し、環境変数を構成します。

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

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

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

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

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

      • 接続先がGeneralに設定されています

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

      ヒント:

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

    4. 接続ダイアログから接続パラメータをコピーします。

      ヒント:

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

    5. Python プロジェクトのルート ディレクトリに.envファイルを作成し、接続パラメータを対応する環境変数に貼り付けます。

      • TIDB_HOST : TiDB クラスターのホスト。
      • TIDB_PORT : TiDB クラスターのポート。
      • 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_HOST127.0.0.1なります。初期のTIDB_PASSWORD空なので、クラスターを初めて起動する場合はこのフィールドを省略できます。

    各パラメータの説明は次のとおりです。

    • TIDB_HOST : TiDB クラスターのホスト。
    • TIDB_PORT : TiDB クラスターのポート。
    • TIDB_USERNAME : TiDB クラスターに接続するためのユーザー名。
    • TIDB_PASSWORD : TiDB クラスターに接続するためのパスワード。
    • TIDB_DATABASE : 接続するデータベースの名前。

    ステップ5.デモを実行する

    データベース スキーマを移行します。

    python manage.py migrate

    Django 開発サーバーを実行します。

    python manage.py runserver

    ブラウザを開いてhttp://127.0.0.1:8000アクセスし、デモアプリケーションをお試しください。利用可能なAPIパスは以下のとおりです。

    APIパス説明
    POST: /insert_documents埋め込みのあるドキュメントを挿入します。
    GET: /get_nearest_neighbors_documents3 つの最も近い近傍ドキュメントを取得します。
    GET: /get_documents_within_distance一定の距離内にある書類を取得します。

    サンプルコードスニペット

    次のサンプル コード スニペットを参照して、独自のアプリケーション開発を完了することができます。

    TiDBクラスタに接続する

    ファイルsample_project/settings.pyに次の構成を追加します。

    dotenv.load_dotenv() DATABASES = { "default": { # https://github.com/pingcap/django-tidb "ENGINE": "django_tidb", "HOST": os.environ.get("TIDB_HOST", "127.0.0.1"), "PORT": int(os.environ.get("TIDB_PORT", 4000)), "USER": os.environ.get("TIDB_USERNAME", "root"), "PASSWORD": os.environ.get("TIDB_PASSWORD", ""), "NAME": os.environ.get("TIDB_DATABASE", "test"), "OPTIONS": { "charset": "utf8mb4", }, } } TIDB_CA_PATH = os.environ.get("TIDB_CA_PATH", "") if TIDB_CA_PATH: DATABASES["default"]["OPTIONS"]["ssl_mode"] = "VERIFY_IDENTITY" DATABASES["default"]["OPTIONS"]["ssl"] = { "ca": TIDB_CA_PATH, }

    プロジェクトのルート ディレクトリに.envファイルを作成し、 TIDB_DATABASE TIDB_USERNAME TIDB_HOST TIDB_PASSWORDおよびTIDB_CA_PATH TIDB_PORTクラスターの実際の値で設定できます。

    ベクターテーブルを作成する

    ベクトル列を定義する

    tidb-django 、ベクトル埋め込みをテーブルに格納するためのVectorField提供します。

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

    class Document(models.Model): content = models.TextField() embedding = VectorField(dimensions=3)

    埋め込み付きドキュメントを保存する

    Document.objects.create(content="dog", embedding=[1, 2, 1]) Document.objects.create(content="fish", embedding=[1, 2, 4]) Document.objects.create(content="tree", embedding=[1, 0, 0])

    最も近い文書を検索する

    TiDB Vector は次の距離関数をサポートしています。

    • L1Distance
    • L2Distance
    • CosineDistance
    • NegativeInnerProduct

    コサイン距離関数に基づいて、クエリベクトル[1, 2, 3]に意味的に最も近い上位 3 つのドキュメントを検索します。

    results = Document.objects.annotate( distance=CosineDistance('embedding', [1, 2, 3]) ).order_by('distance')[:3]

    特定の距離内の文書を検索する

    クエリベクトル[1, 2, 3]からのコサイン距離が 0.2 未満であるドキュメントを検索します。

    results = Document.objects.annotate( distance=CosineDistance('embedding', [1, 2, 3]) ).filter(distance__lt=0.2).order_by('distance')[:3]

    参照

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