テキストを分類する

ai.classify 関数は、テキスト入力を定義した一連のクラスまたはラベルに分類する組み込みの AlloyDB AI ツールです。この機能をデータベースに直接埋め込むことで、AlloyDB for PostgreSQL では、複雑な抽出、変換、読み込み(ETL)パイプラインや外部サービス統合を構築することなく、非構造化データを処理できます。

テキスト分類関数には次の利点があります。

  • リアルタイム分類: SQL を使用して、Gemini の世界知識をエンタープライズ データに適用します。
  • スケーラビリティ: AI 関数のスマートバッチ処理(AI 関数アクセラレーションとも呼ばれます)をサポートしています。これは、AlloyDB AI の自動クエリ実行最適化機能です。クエリ実行中に、個々の行単位のスカラー AI 関数呼び出しをバックグラウンドでバッチモデル リクエストに透過的にグループ化します。また、配列ベースとカーソルベースの処理をサポートし、数千行を効率的に処理します。
  • シンプルさ: モデルの呼び出しとデータの準備を自動的に管理する高レベルの抽象化を提供します。

AlloyDB AI のテキスト分類関数は、次のようなさまざまなユースケースをサポートしています。

  • トピック分類: 事前定義されたトピック(スポーツ、テクノロジー、金融など)をドキュメントや記事に割り当てます。
  • スパム検出: 受信メール、コメント、メッセージをスパムとして識別します。
  • インテント認識: フライトの予約、天気の確認、食べ物の注文など、クエリの背後にあるユーザーの目標を特定します。

始める前に

ai.classify 関数を使用する前に、次の要件を満たしていることを確認してください。

  • PostgreSQL のバージョン: ai.classify 関数は、PostgreSQL バージョン 18 以降でサポートされています。AlloyDB クラスタで PostgreSQL 18 以降が実行されていることを確認します。詳細については、サポートされているデータベースのバージョンをご覧ください。
  • 拡張機能のバージョン: google_ml_integration 拡張機能の最新バージョン(バージョン 1.6.1 以降)がインストールされ、プレビュー機能が有効になっていることを確認します。

拡張機能を有効にする

google_ml_integration 拡張機能の最新バージョン(バージョン 1.6.1 以降)がインストールされ、プレビュー機能が有効になっていることを確認します。

AlloyDB で google_ml_integration.enable_ai_query_engine フラグと google_ml_integration.enable_preview_ai_functions フラグを有効にするには、SET コマンドを使用します。これらのフラグは、AI クエリエンジンと ai.classify などのプレビュー AI 関数へのアクセスを制御します。

  1. google_ml_integration 拡張機能のバージョンが 1.6.1 以降であることを確認します。バージョンを確認するには、次のコマンドを実行します。

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    
  2. 現在のセッションまたはデータベース全体でフラグを有効にします。現在のセッションでフラグを有効にするには、次のコマンドを実行します。

    SET google_ml_integration.enable_ai_query_engine = 'on';
    SET google_ml_integration.enable_preview_ai_functions = 'on';
    

    この変更により、データベースの再起動は必要ありません。これらのフラグのデフォルト値は off です。

サンプル テーブルを作成する

このドキュメントの classify 関数の例に沿って、テーブルを作成し、次のサンプル商品レビューを入力します。

CREATE TABLE IF NOT EXISTS product_reviews (
    id INT PRIMARY KEY,
    review TEXT
);

INSERT INTO product_reviews (id, review) VALUES
(1, 'Fantastic, would buy again!'),
(2, 'Broken on arrival.'),
(3, 'Mediocre, not worth the price.');

1 つの文字列を分類する

単一のテキスト入力を分類するには、ai.classify のスカラー バージョンを使用します。API の詳細なドキュメントについては、ai.classify リファレンスをご覧ください。

SELECT ai.classify(
  input => 'TEXT_CONTENT',
  categories => ARRAY['CATEGORY1', 'CATEGORY2', 'CATEGORY3'],
  examples => 'EXAMPLES', -- Optional
  output_mode => 'OUTPUT_MODE', -- Optional. Can be 'single' or 'multi'.
  model_id => 'MODEL_ID' -- Optional. The default value is gemini-3.5-flash-lite.
);

テキストを相互に排他的なカテゴリに分類する

次の例は、1 つのテキストを複数の相互に排他的なカテゴリのいずれかに分類する基本的なユースケースを示しています。

SELECT ai.classify(
  input => 'This is a sales report for Q1.',
  categories => ARRAY['Report', 'Invoice', 'Memo']
);

出力例を次に示します。

Report

マルチラベル トピックを分類する

次の例では、output_mode を 'multi' に設定し、カテゴリの説明を指定することで、ニュースの見出しを複数のトピックに分類しています。

SELECT ai.classify(
  input => 'The government announced new regulations on AI development, citing both economic opportunities and potential security risks.',
  categories => ARRAY[
    ARRAY['politics', 'Questions about politics'],
    ARRAY['technology', 'Questions about technology'],
    ARRAY['security', 'Questions about security']
  ],
  output_mode => 'multi'
);

出力例を次に示します。

politics,technology,security

説明付きのカテゴリを使用する

次の例は、わかりやすくするためにラベルと説明を含む 2D 配列形式を使用してカテゴリを指定する、推奨される方法を示しています。

SELECT ai.classify(
  input => 'The patient reported mild fever and headache.',
  categories => ARRAY[
    ARRAY['urgent', 'Requires immediate medical attention'],
    ARRAY['non-urgent', 'Routine check-up or minor symptoms'],
    ARRAY['query', 'A question about services or appointments']
  ]
);

出力例を次に示します。

non-urgent

少数ショットの例を提供する

次の例は、入力とその期待される出力の例を提供して、モデルの分類をガイドする方法を示しています。

SELECT ai.classify(
  input => 'Is this item returnable after 90 days?',
  categories => ARRAY[
    ARRAY['policy', 'Questions about return, warranty, or other policies'],
    ARRAY['shipping', 'Questions about order shipment and delivery'],
    ARRAY['payment', 'Questions about payment methods or issues'],
    ARRAY['other', 'Any other type of question']
  ],
  examples => '[
    {"input": "When will my order arrive?", "output": "shipping"},
    {"input": "What is the warranty on this?", "output": "policy"},
    {"input": "My discount code isn''t working.", "output": "payment"}
  ]'
);

出力例を次に示します。

policy

特定のモデル ID を使用する

次の例は、ID を参照して特定のモデル バージョンまたはタイプを使用する方法を示しています。

SELECT ai.classify(
  input => 'This new song is a banger!',
  categories => ARRAY[
    ARRAY['positive', 'Expresses approval or enjoyment'],
    ARRAY['negative', 'Expresses disapproval or dislike']
  ],
  model_id => 'MODEL_ID'
);

出力例を次に示します。

positive

MODEL_ID は、サポートされている事前登録済みモデルの ID または登録したカスタムモデルの ID に置き換えます。サポートされている事前登録済みモデルの一覧については、サポートされている AI モデルをご覧ください。他のモデル エンドポイントの登録手順については、モデル エンドポイント管理を使用してリモート AI モデルを登録して呼び出すをご覧ください。

バッチで分類する

複数の行にわたる大規模なデータセットを分類する場合は、AI 関数のスマート バッチ処理を使用するか、配列ベースの ai.classify を使用して、パフォーマンスを最適化できます。

スマートなバッチ処理

複雑な配列集計クエリを記述せずに、複数の行でスカラー ai.classify を実行するクエリを高速化するには、google_ml_integration.enable_ai_function_acceleration データベース フラグを on に設定して、AI 関数のスマート バッチ処理を有効にします。

SET google_ml_integration.enable_ai_function_acceleration = 'on';

このフラグを有効にすると、AlloyDB はバックグラウンドで個々のスカラー ai.classify 呼び出しをスマート バッチに自動的にグループ化します。

SELECT
  id,
  ai.classify(
    input => review,
    categories => ARRAY['positive', 'neutral', 'negative']
  ) AS sentiment
FROM product_reviews
ORDER BY id;

配列ベースのバッチ処理

大規模なデータセットのバッチ処理を明示的に制御するには、配列ベースの ai.classify を使用して、入力の SQL 配列を渡すことで、複数の入力を一度に処理します。詳細な API ドキュメントについては、ai.classify リファレンスをご覧ください。

SELECT ai.classify(
  inputs => TEXT[],
  categories => TEXT[][],
  examples => TEXT, -- Optional.
  output_mode => VARCHAR, -- Optional. The default value is single.
  batch_size => INT, -- Optional. The default value is 10.
  model_id => VARCHAR(100) -- Optional. The default value is gemini-3.5-flash-lite.
);

次の例では、複数のレビューを一度に分類します。

SELECT unnest(
  ai.classify(
    inputs => ARRAY(SELECT review FROM product_reviews ORDER BY id),
    categories => ARRAY[
      ARRAY['positive', 'Good sentiment'],
      ARRAY['neutral',  'Neither good nor bad sentiment'],
      ARRAY['negative', 'Bad sentiment']
    ],
    batch_size => 5
  )
) AS sentiment;

出力例を次に示します。

 sentiment
-----------
 positive
 negative
 negative

カーソルを使用して分類する

カーソルベースの関数は、すべてのデータを一度にメモリに読み込む必要なく、管理可能なバッチで AI モデルを介してデータをストリーミングできるようにすることで、大規模なデータセットを効率的に処理します。詳細については、ai.classify リファレンスをご覧ください。

カーソルベースの ai.classify の関数シグネチャは次のとおりです。

CREATE OR REPLACE FUNCTION ai.classify(
    input_cursor REFCURSOR,
    categories TEXT[][],
    examples TEXT DEFAULT NULL,
    output_mode VARCHAR DEFAULT NULL,
    batch_size INT DEFAULT NULL,
    model_id VARCHAR(100) DEFAULT NULL)
  RETURNS REFCURSOR

次の例は、カーソルを使用して ai.classify に入力をフィードする方法を示しています。

DO $$
DECLARE
  cur REFCURSOR;
  result_cur REFCURSOR;
  input_val TEXT;
  sentiment TEXT;
BEGIN
  OPEN cur FOR SELECT review FROM product_reviews ORDER BY id;

  result_cur := ai.classify(
    input_cursor => cur,
    categories => ARRAY[
      ARRAY['positive', 'Good sentiment'],
      ARRAY['neutral',  'Neither good nor bad sentiment'],
      ARRAY['negative', 'Bad sentiment']
    ],
    batch_size => 20
  );

  LOOP
    FETCH result_cur INTO input_val, sentiment;
    EXIT WHEN NOT FOUND;
    RAISE NOTICE 'Sentiment: %', sentiment;
  END LOOP;

  CLOSE result_cur;
  CLOSE cur;
END $$;

次のステップ