Google Cloud Japan
🐼

自然言語でクエリもできる AlloyDB AI の機能の紹介

に公開

このブログは Google Cloud Japan Advent Calendar 2025 19日目の記事です。

はじめに

Google Cloudでは様々なデータベースのマネージド・サービスを提供しています。 AlloyDB はその中のサービスの1つで 100% の PostgreSQL 互換のデータベースです。AlloyDB のデータベースとしての性能、可用性、アーキテクチャ等の特徴については「AlloyDB for PostgreSQL: 2 年間のイノベーションと業界でのリーダーシップ」をご覧ください。実は、AlloyDB はデータベースの基本的な機能を高いレベルで提供しているだけではなく、AI まわりの機能強化も積極的に行われています。このブログでは主にそれらの機能の概要を紹介して、その中からいくつか個人的におすすめなものを詳しく紹介します。ぜひ、これをきっかけに AlloyDB が生成 AI アプリや AI エージェント構築に適したデータベースであることを知ってもらえればと思います。また、新規の構築だけでなく既存で AlloyDB をお使いの方はこれらの機能を使うことで簡単に AI エージェントからデータを活用することができます。

AlloyDB AI の機能概要

では早速ですが、AlloyDB の AI まわりの機能 (以下 AlloyDB AI ) について紹介します。下記に主な機能と特徴をまとめました。

  1. pgvector 互換の高速なベクトル検索

  • Google 検索技術の応用: Google 検索と同じアルゴリズムを用いた「ScaNN インデックス」を採用しています。AlloyDB の ScaNN インデックスの詳細は「AlloyDB の ScaNN ベクトル インデックスのご紹介」を参考にしてください。
  • 圧倒的なパフォーマンス: 標準的な PostgreSQL の HNSW インデックスと比較して、インデックス作成速度が最大 10 倍、ベクトル検索速度が最大 4 倍、フィルタ付き検索速度が最大 10倍 高速です。
  • 運用機能の充実: 高速にインデックスを作成する並列インデックス構築、自動メンテナンス、インデックスのチューニングに役立つベクトルインデックスの指標の提供
  1. SQL データとベクトルデータにわたる高パフォーマンス クエリ

  • ハイブリッド検索:  単一のクエリエンジンでベクトル検索、従来のフィルタリング、結合等を効率的に結合・処理できるので、1つの SQL 文でこれらを組み合わせたハイブリッド検索ができます。また、GIN インデックスを使ったテキスト検索も組み合わせることもできます。
  • シンプルな構成: 別途ベクトルデータベースを用意する必要がないため、データ移動によるレイテンシが発生せず、システム構成も簡素化できます。
  • 適応型フィルタリング: フィルタ、結合、ベクトルインデックスを組み合わせる際、最適なパフォーマンスが出るようフィルタリングの方法を自動的に調整します。
  1. アプリの自然言語インターフェース

  • 自然言語での対話: ユーザーやエージェントからの自然言語で AlloyDB にクエリができ、コンテキストやスキーマ情報を理解したうえで正確な回答を返します。
  • 柔軟性とセキュリティ: 自然言語特有の曖昧さや柔軟性に対応しつつ、不正データへのアクセスを防止し、悪意のあるプロンプト、広範囲の SQL クエリなどのセキュリティ リスクを低減します。。
  • 精度の向上: スキーマの登録、コンテキスト、クエリのテンプレート等を追加することで、自然言語の質問を適切に解釈し精度を高めることができます。
  1. あらゆるプラットフォームでモデルにアクセス

  • 基盤モデルとの連携: Vertex AI 上の Gemini モデルや、その他の基盤モデルにアクセスできます。
  • SQL による管理: 「モデル エンドポイント管理」を使用し、任意のプラットフォームのモデルエンドポイントを登録して SQL 関数から呼び出せます。
  • RAG(検索拡張生成)の容易な実現: 複雑なコードを書くことなく、データベースのリアルタイムデータをコンテキストとして使用し、アプリケーションの回答精度を向上させることができます。
  1. SQL クエリ内での自然言語の使用

  • AlloyDB AI クエリエンジン: SQL クエリ内で自然言語を使用して、フィルタ条件やランキング基準を表現できます。
  • セマンティック分析: 生成 AI モデルの持つ知識や意味の理解を SQL に組み込むことで、データベース内の文字列等のデータから背景や意味を汲み取って検索することができます。
  • 一貫した処理: 1つのクエリ内で、ベクトルエンベディングの生成、類似検索の実行、AI モデルの呼び出しまでを行うことができます。

今回は、この中から「アプリの自然言語インターフェース」と「SQL クエリ内での自然言語の使用」を紹介します。(本機能は2015年12月19日時点はプレビューであり、GA前のサービスである点に注意をしてください。)

アプリの自然言語インターフェース

この機能を使って自然言語で AlloyDB にクエリを実行すると、それに対応した SQL を生成、またはその SQL を実行して回答を返してくれます。いわゆる NL2SQL (自然言語から SQL のへの変換)の機能です。これによってビジネスユーザや SQL を書けない非技術系のユーザがデータを活用できるようになるだけでなく、SQL を得意とする人も複雑なクエリを作成する時間を削減して業務の効率を改善することができます。もちろん、生成 AI アプリや AI エージェントからも自然言語でアクセスすることもできます。(エージェントから MCP でアクセスする場合は、データベース用の MCP サーバーを簡単に構築できる MCP Toolbox for Databases で alloydb-ai-nl tool を使います。)一般的には NL2SQL はデータベース外部で行われることも多いですが、AlloyDB 内で SQL を生成することで構成をシンプル化できるだけでなく、スキーマやコンテキストを深く理解した正確な SQL の生成、ベクトル検索などを含めた SQL の生成など様々なメリットがあります。
では、ここから使い方を見ていきましょう。大まかな流れは下の図のような手順になります。

今回は、使い方のイメージを掴んでもらうためにこちらのドキュメントのサンプルの一部の手順のみを紹介しています。実際に試したい場合は、ドキュメントに沿って実行してください。サンプルは英語ですが、日本語にも対応しています。

構成と登録

alloydb_ai_nl 拡張機能を有効にしてインストールします。

  1. 拡張機能の有効化: インスタンスレベルで alloydb_ai_nl.enabled データベースブラグを有効化します。
  2. 拡張機能をインストールしてアップグレードします。
CREATE EXTENSION alloydb_ai_nl cascade;
ALTER EXTENSION alloydb_ai_nl UPDATE;

自然言語の構成を作成します。 この自然言語の構成の中にスキーマのコンテキストやクエリのテンプレートなど、正確なSQLを生成するための様々な情報が含まれています。(実際には alloydb_ai_nl スキーマ内にあるテーブルに情報が格納されています。)

-- 自然言語の構成を作成
SELECT alloydb_ai_nl.g_create_configuration( 'nla_demo_cfg' );

-- テーブルを登録する
SELECT alloydb_ai_nl.g_manage_configuration(
    operation => 'register_table_view',
    configuration_id_in => 'nla_demo_cfg',
    table_views_in=>'{nla_demo.customers, nla_demo.addresses, nla_demo.brands, nla_demo.products, nla_demo.categories, nla_demo.orders, nla_demo.order_items}'
);

コンテキストを強化

正確なSQLを生成するためにテーブル、ビュー、列に関するコンテキストを指定する必要があります。手動で追加していくこともできますが、自動コンテキスト生成機能を使うとテーブルと列から自動で生成し、alloydb_ai_nl.generated_schema_context_view に追加します。

SELECT alloydb_ai_nl.generate_schema_context(
  'nla_demo_cfg',
  TRUE
);

生成されたコンテキストの例

実際にはスキーマコンテキストだけではなく、クエリテンプレートや、値インデックスと呼ばれる特定の値がどの列にリンクしているかなど様々なコンテキストを追加することができます。これらの詳細はドキュメントのサンプルを参照してください。

関数を呼んでSQLを生成

コンテキストの強化が終わったら、実際に関数を呼んで SQL を生成してみます。作成した自然構成 nla_demo_cfg を指定することで強化したコンテキストを使って SQL を生成してくれます。

SELECT
    alloydb_ai_nl.get_sql(
        'nla_demo_cfg',
        'Find the customers who purchased Tote Bag.'
    ) ->> 'sql';

この例ではトートバッグを購入した顧客を検索するように自然言語で指示しています。

結果のSQLがこちらになります。

SQL を生成するのではなく、生成した SQL そのまま実行したい場合は、alloydb_ai_nl.execute_nl_query 関数を使います。


SELECT
    alloydb_ai_nl.execute_nl_query(
        'nla_demo_cfg',
        'Find the customers who purchased Tote Bag.'
    );

この関数の実行結果はこちらになります。

このように AlloyDB の自然言語インターフェースを使うことで、自然言語から SQL を生成、実行をすることができます。 また、パラメータ化されたセキュアなビューを使用するとアクセス制御ができるので悪意のあるプロンプトや広範なデータにアクセスする SQL 等からのセキュリティリスクを低減できます。実際のシステムで利用する際には、是非、ご利用ください。

SQL クエリ内での自然言語の使用

ここでは Alloy DB AI クエリエンジンの AI 関数を紹介します。AI 関数を使うことで自然言語を使って AlloyDB に格納されているデータのフィルタリング、ランキングやデータからテキストを生成することができます。これを使うことで生成AI のモデルをデータに適用し、従来のSQLではできなかった検索や分析ができます。今回、ご紹介するのは、ai.if、ai.generate、ai.rank です。

準備

まずはこれらの関数を利用する前に google_ml_integration 拡張機能の バージョン 1.5.2 以上がインストールされているかを確認します。インストールされてない場合はこちらの手順を実行してください。

AlloyDB AI クエリエンジンの機能を使用するには、google_ml_integration.enable_ai_query_engine フラグを true に設定します。
次の例はデータベースレベルで設定する方法です。

ALTER DATABASE <データベース名> SET google_ml_integration.enable_ai_query_engine = 'on';

以上で準備は完了です。デフォルトでは AlloyDB のあるリージョンの gemini-2.0-flash が使われます。そのリージョンで gemini-2.0-flash が提供されてない、または、Gemini 3.0など別のバージョンのモデルを使いたい場合は、こちらの方法で Gemini モデル エンドポイントを登録してください。

ai.if

関数名からイメージできるかもしれませんが、自然言語で指定された条件が満たされているかどうかを評価する演算子です。まずは、簡単な例をみてみましょう。

SELECT ai.if('東京は日本の首都です。')

ai.if に「東京は日本の首都です」という自然言語を渡すことによって、この内容が本当かどうかをこの関数が評価してくれます。東京は日本の首都なのでもちろん true が返ってきます。これをデータベースに格納されているデータに適用することによって生成 AI モデルの知識や文脈を理解する能力を使ってデータをフィルタリング、結合することができます。

SELECT r.name, r.location_city, r.review
FROM restaurant_reviews r
WHERE
  AI.IF('the following is a positive review; Review: ' || r.review)

この例ではレストランのレビューが入っているテーブルの中からポジティブなレビューを抽出しています。このレビューはポジティブなレビューです。という質問とレビューのテキストを ai.if 関数に渡すことでモデルがその内容がポジティブであれば true、ネガティブであれば false を返すので、where句でこの関数を利用することで自然言語でフィルタリングをしています。

ai.generate

この関数に、ユーザーのプロンプトを渡すことでテキストを生成できます。ai.if のケースと同様に簡単な例を見てみましょう。

SELECT ai.generate('日本の首都はどこですか?')

「日本の首都はどこですか?」というプロンプトを渡すことでその結果がテキストとして生成されます。日本の首都は東京なので、結果も想定どおりです。このプロンプトと データベースに格納されているデータを組み合わせることで、翻訳、感情分析、テキストの要約、テキストの分類、エンティティの抽出など様々なテキスト処理のタスクを実行することができます。

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

この例では、レストランのレビューのテキストを ai.generate 関数にプロンプトと一緒に渡すことで、 20 語以内で要約しています。

ai.rank

この関数を使うと自然言語で指示したルールをもとにクエリ結果をランク付けして並び替えることができます。ランキング基準を説明するプロンプトを指定し、各アイテムのスコアを返すことができます

SELECT review AS top20
FROM restaurant_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;

この例では、レビューで「食事は素晴らしい」と評価していれば 8 〜 10 のスコアをつけ、「食事はOK」だと 4 〜 7、「食事がよくない」で 1 〜 3 をつけるように指示して、レビューと一緒に ai.rank に渡しています。最終的に ORDER BY によって、スコアが高い上位 20 のレビューが表示されます。

まとめ

このブログでは AlloyDB の持つ AI の機能をまとめて紹介しました。ベクトル検索、基盤モデルへのアクセス、自然言語による問い合わせ、AI 関数を使った 自然言語でフィルタリング、テキスト生成、ランキングなど様々な機能があることがご理解いただけたかと思います。これらの機能を利用することで生成 AI アプリ、AI エージェントからシンプルな構成で、簡単にデータを活用することができます。是非、AI レディなデータベースに進化している AlloyDB をご利用ください。

Google Cloud Japan
Google Cloud Japan

Discussion