AlloyDB AI クエリエンジンを使用してインテリジェントな SQL クエリを実行する

このページでは、AlloyDB AI クエリエンジンで提供される AI を活用した SQL 演算子を使用してクエリを実行する方法について説明します。ai.if(フィルタ用)、ai.rankai.generate 演算子を使用して、自然言語と SQL クエリを組み合わせることができます。

このページの手順は、AlloyDB と生成 AI のコンセプトに詳しい方向けのものです。

AlloyDB AI は ai スキーマを予約して作成します。

始める前に

SQL 演算子で自然言語を使用する前に、次のことを行ってください。

Vertex AI と統合して拡張機能をインストールする

  1. Vertex AI と統合します
  2. google_ml_integration の最新バージョンがインストールされていることを確認します。
    1. インストールされているバージョンを確認するには、次のコマンドを実行します。

              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.3
              (1 row)
            
    2. 拡張機能がインストールされていない場合、またはインストールされているバージョンが 1.4.3 より前の場合は、次のコマンドを実行して拡張機能をアップデートします。

              CREATE EXTENSION IF NOT EXISTS google_ml_integration;
              ALTER EXTENSION google_ml_integration UPDATE;
            

      上記のコマンドを実行したときに問題が発生した場合、または上記のコマンドを実行しても拡張機能がバージョン 1.4.3 にアップデートされない場合は、AlloyDB サポートにお問い合わせください。

    3. バージョンが最新であることを確認したら、upgrade_to_preview_version プロシージャを実行してプレビュー機能をインストールします。

              CALL google_ml.upgrade_to_preview_version();
              SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
              extversion
              ------------
              1.4.4
              (1 row)
            

リージョンでサポートされている Gemini モデルを使用する

gemini-2.0-flash がサポートされていないリージョンに AlloyDB for PostgreSQL クラスタがある場合は、model_id parameter を使用して、そのリージョンで利用可能な他の Gemini モデルのいずれかを使用できます。

または、Gemini モデル エンドポイントを登録し、AI 演算子でそのモデル ID を指定することもできます。詳細については、モデル エンドポイント管理を使用してリモート AI モデルを登録して呼び出すをご覧ください。

次の例は、別の Gemini エンドポイントを登録する方法を示しています。この例では、この 2 番目の Gemini エンドポイントは gemini-2.0-flash のグローバル エンドポイントです。この登録済みモデルを AI 演算子で使用するには、追加の引数として model_id =>gemini-2.0-flash-global` を渡します。

CALL
  google_ml.create_model(
    model_id => 'gemini-2.0-flash-global',
    model_type => 'llm',
    model_provider => 'google',
    model_qualified_name => 'gemini-2.0-flash',
    model_request_url =>  'https://aiplatform.googleapis.com/v1/projects/<project_id>/locations/global/publishers/google/models/gemini-2.0-flash:generateContent',
    model_auth_type => 'alloydb_service_agent_iam'
);

クエリでフィルタを使用する

AlloyDB AI には、ai.if 演算子や ai.rank 演算子など、データベース クエリ内で自然言語処理と LLM を直接使用できる AI を活用した SQL 関数がいくつか用意されています。

フィルタ

自然言語で指定された条件が満たされているかどうかを評価するには、ai.if/google_ml.if 演算子を使用します。この関数はブール値 true または false を返します。出力が明確に検出されなかった場合は false を返します。

- Function signature
FUNCTION ai.if(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS bool

次の例は、ai.if 演算子をフィルタとして使用して、人口が 10 万人を超える都市にあり、500 件を超える好意的なレビューがあるレストランを見つける方法を示しています。この例では restaurant_reviews を使用しています。このテーブルには、レビューや都市の位置情報などのデータが含まれています。ai.if 演算子を使用することによって、レビューの感情を把握したり、データベースから取得した場所とその場所の人口に関する Gemini の一般的な知識を組み合わせたりることができます。

SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
  AI.IF(r.location_city || ' has a population OF more than 100,000 AND the following is a positive review; Review: ' || r.review)
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;

次は、リージョンでサポートされている Gemini モデルを使用するで登録したモデルを使用した同じ例です。

SELECT r.name, r.location_city
FROM restaurant_reviews r
WHERE
  AI.IF(r.location_city || ' has a population of more than 100,000 AND the following is a positive review; Review: ' || r.review, model_id => 'gemini-2.0-flash-global')
GROUP BY r.name, r.location_city
HAVING COUNT(*) > 500;

if 演算子を使用するクエリで結合を実行する

結合オペレーションを実行するには、結合で ai.if/google_ml.if 演算子を使用します。次のサンプルクエリは、レストランのメニューの各メニュー アイテムに言及しているレビューの数を検索します。

    SELECT item_name, COUNT(*)
    FROM menu_items JOIN user_reviews
      ON ai.if(
        prompt => 'Does the following user review talk about the menu item mentioned ? review: ' || user_reviews.review_text || ' menu item: ' || item_name)
    GROUP BY item_name;

テキスト生成、要約

ai.generate 関数は、提供されたデータとユーザーのプロンプトを組み合わせてテキストを生成します。

-- Function Signature
FUNCTION ai.generate(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS TEXT

たとえば、次のクエリを使用して、各ユーザー レビューの簡潔な要約を生成できます。

SELECT
  ai.generate(
    prompt => 'Summarize the review in 20 words or less. Review: ' || review) AS review_summary
FROM user_reviews

クエリ結果をスコアリングする

カスタムの自然言語による指示を使用してクエリ結果を並べ替える必要がある場合は、ai.rank 演算子を使用します。この関数を使用すると、ランキング基準を説明するプロンプトを指定し、各アイテムのスコアを返すことができます。

-- Function signature
FUNCTION ai.rank(prompt TEXT, model_id VARCHAR(100) DEFAULT NULL) RETURNS real

たとえば、次のクエリは、LLM のスコアを使用して、最も好意的なレストランのレビューの上位 20 件を取得します。

SELECT review AS top20
FROM user_reviews
ORDER BY ai.rank(
  'Score the following review according to these rules:
  (1) Score OF 8 to 10 IF the review says the food IS excellent.
  (2) 4 to 7 IF the review says the food is ok.
  (3) 1 to 3 IF the review says the food is not good. Here is the review:' || review) DESC
LIMIT 20;

次のステップ