最適化された関数を使用してクエリを高速化する

最適化された関数を使用すると、ほとんどのクエリを処理するために、より小さく高速なプロキシモデルを使用し、必要に応じてより大きな LLM にフォールバックできます。 このアプローチにより、運用コストが削減され、クエリの応答性が向上します。 最適化された関数は、行ごとの分類やフィルタリングのタスクに LLM を使用するのを最小限に抑えます。これらのタスクは、プロキシモデルでより適切に処理できます。

ai.if() などの AlloyDB AI 関数は、大規模言語モデル(LLM)へのリモート呼び出しが原因でレイテンシが長くなる可能性があります。最適化された関数は、より小さいローカルでトレーニングされたプロキシモデルを使用してクエリを処理することで、このレイテンシの問題に対処します。これらのモデルは、LLM の出力を信頼できる情報源として使用して、データのサンプルでトレーニングされます。

精度チェックは、LLM を使用して行のサンプルで実行時に行われます。 このチェックを行うために、AlloyDB は LLM を使用してサンプル行のラベルを生成し、プロキシモデルの予測と比較して精度を確認します。精度チェックに失敗すると、クエリは LLM の使用にフォールバックします。

最適化された関数を使用すると、AlloyDB は次の処理を行います。

  1. プロキシモデルをトレーニングする: AlloyDB は、データのサンプルで軽量なプロキシモデルをトレーニングします。これは、ai.if() 関数で PREPARE ステートメントを使用して、最適化されたクエリのモデルをトレーニングするときにバックグラウンドで行われます。
  2. クエリを実行する: EXECUTE ステートメントを使用すると、AlloyDB はトレーニング済みのプロキシモデルを使用してクエリをローカルで処理します。
  3. LLM にフォールバックする: モデルの精度が低い場合、または AlloyDB がモデルを見つけられない場合、AlloyDB は自動的に LLM の使用にフォールバックします。

最適化された関数のフロー図

始める前に

最適化された関数を使用する前に、次の操作を行います。

  • psql または AlloyDB Studio を使用して、postgres ユーザーとして、またはデータが存在するテーブルに アクセスできるユーザーとしてデータベースに接続します。
  • google_ml_integration 拡張機能がインストールされ、バージョン 1.5.8 以降で使用可能であることを確認します。

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    extversion
    ------------
    1.5.8
    (1 row)
    
  • Vertex AI と連携するように AlloyDB を構成します。詳細については、データベースを Vertex AI と統合するをご覧ください。

  • 次のデータベース フラグが有効になっていることを確認します。詳細については、インスタンスのデータベース フラグを構成するをご覧ください。

    • google_ml_integration.enable_model_support
    • google_ml_integration.enable_ai_query_engine
    • google_ml_integration.enable_cost_optimized_ai_functions
  • クエリを実行するテーブルのエンベディングを生成します。詳細については、 「テーブルの自動エンベディングを生成して管理する 」をご覧ください。

  • 次の点を考慮してください。

    • ソースデータ列の型は TEXT または VARCHAR である必要があります。
    • 最適化された AI 関数に入力を提供するエンベディング列の型は、REAL[] または VECTOR である必要があります。
    • 最適化された関数は、Vertex AI 生成モデルが利用可能なリージョンでのみ使用できます。使用可能な リージョンの一覧については、生成 AI のロケーションをご覧ください。

最適化された関数を使用する

最適化された関数を使用するには、ai.if() 関数で PREPARE ステートメントと EXECUTE ステートメントを使用します。最適化された関数の使用例を次に示します。

  1. restaurant_reviews テーブルを作成します。ソースデータを保持する review 列の型は TEXT で、クエリに使用される review_embedding 列の型は VECTOR(768) です。

    CREATE TABLE restaurant_reviews (
        id SERIAL,
        name VARCHAR(64),
        city VARCHAR(64),
        review TEXT,
        review_embedding VECTOR(768)
    );
    
  2. ai.if() 関数で PREPARE ステートメントを使用して、クエリで最適化された関数を使用する必要があることを示します。このステートメントは、バックグラウンドでモデルの非同期トレーニングをトリガーします。

    モデルは、次の条件でのみトレーニングされます。

    • クエリに ai.if() 関数が 1 つだけ存在する場合。
    • ai.if() がサブクエリ内にない場合。
    PREPARE positive_reviews_query AS
    SELECT r.name, r.city
    FROM restaurant_reviews r
    WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
    GROUP BY r.name, r.city
    HAVING COUNT(*) > 500;
    
  3. EXECUTE ステートメントを使用してクエリを実行します。PREPARE ステートメントは現在のセッションに固有であるため、同じ接続で EXECUTE ステートメントを実行する必要があります。

    EXECUTE positive_reviews_query;
    
    conn2=> SELECT r.name, r.city
        FROM restaurant_reviews r
        WHERE ai.if('Is the following a positive review? Review: ' || r.review, r.review_embedding)
        GROUP BY r.name, r.city
        HAVING COUNT(*) > 500;
    

    次のいずれかの条件が満たされた場合、トレーニング済みのプロキシモデルは使用されません。

    • ai.if() で参照されるコンテンツ列またはエンベディング列が変更された場合。両方の列は同じテーブルに属している必要があります。
    • コンテンツ列に指定されたプロンプトが変更された場合。
    • クエリの構造が変更され、query_id が異なる場合。
    • クエリの開始時に、クエリが精度チェックのしきい値を満たしていない場合。

    このような場合、クエリは LLM の使用にフォールバックし、AlloyDB は警告を返します。

  4. 省略可。モデルのトレーニング中にも精度チェックが行われるため、データベース環境全体の精度検証チェックを無効にするには、次のコマンドを実行します。

    ALTER DATABASE DATABASE_NAME SET google_ml_integration.runtime_accuracy_check = off;
    

    DATABASE_NAME はデータベースの名前に置き換えます。

プロキシモデルを再トレーニングする

基盤となるテーブルデータが大幅に変更された場合は、PREPARE ステートメントを再度実行してプロキシモデルを再トレーニングできます。クエリを再準備すると、新しいトレーニング リクエストが開始され、既存のプロキシモデルが置き換えられます。

制限事項

ソース コンテンツ列、エンベディング列、または ai.if() 関数に指定されたプロンプトを変更する場合は、新しい PREPARE ステートメントを発行する必要があります。 AlloyDB は、プロンプトと入力データの固有の組み合わせの動作を近似するように最適化された関数をトレーニングします。

次のステップ