はじめに

2026年2月のアップデートで、Cloud SQL for MySQL と Vertex AI の統合、および Model Endpoint Management が正式に一般提供(GA)されました。
https://docs.cloud.google.com/sql/docs/release-notes#February_10_2026

Cloud SQL for MySQL のモデルエンドポイント管理と、Cloud SQL for MySQL と Vertex AI の統合が一般提供(GA)されました。
Cloud SQL for MySQL インスタンスを Vertex AI と統合することで、Cloud SQL インスタンスから直接、Vertex AI でホストされているモデルからオンライン予測を呼び出し、ベクトル埋め込みを生成できるようになります。
モデルエンドポイント管理を使用すると、独自の API キーを使用して、OpenAI などのサードパーティ プロバイダのモデルとデータベースを統合することで、生成型 AI アプリケーションを構築できます。モデルエンドポイント管理を使用すると、MySQL インスタンスのモデルエンドポイントを登録および管理できるため、より幅広い ML モデルとのシームレスなやり取りが可能になります。

このアップデートによって、SQLクエリで直接Vertex AI 等のAIに問い合わせて、その結果をSQL実行結果として出力できる様になる様です。
これまで、データベース内のデータをAIで分析するには、一度アプリケーション側でデータをSELECTし、アプリのコードからOpenAIやVertex AIのAPIを叩き、結果をまたUPDATEで書き戻す…という処理が必要でした。
今回のアップデートにより、SQLクエリを実行するだけで、データベースから直接AIモデル(GeminiやGPT-4oなど)を呼び出せる様になります。

Cloud SQL は、MySQL、PostgreSQL、SQL Server の3つを選択できますが、Vertex AI との統合は、MySQL、PostgreSQL で設定可能で、SQL Server にはまだ対応されていない様です。

上記アップデートを試してみたいと思います。

やること

Cloud SQL for MySQL 上にある「商品レビューテーブル」のテキストデータに対して、感情分析(ポジティブ/ネガティブ判定)をSQLクエリでさせてみます。

  • Vertex AI (Gemini 2.5 Flash) を呼び出す
  • OpenAI (GPT-4o mini) を呼び出す(Model Endpoint Management利用)

Cloud SQLインスタンス作成と設定

インスタンス起動

・データベースのバージョン:MySQL 8.4
・マシンの構成:N2(2vCPU, 16GB)(Vertex AI の統合に構成の制限はないので任意の構成で大丈夫です)
・Vertex AI のインテグレーションを有効にする:ON (デフォルトOFF)(この設定をONにすることで、Vertex AI の統合が有効になります)

Cloud SQLのサービスアカウントに権限追加

Cloud SQLのサービスアカウントに、Vertex AI サービス エージェントとSecret Manager のシークレット アクセサーのロールを追加しました。

  • Vertex AI の呼び出しに、「aiplatform.endpoints.predict」の権限が必要なため、「aiplatform.endpoints.predict」を含むVertex AI サービス エージェントを追加
  • APIキーをSecret Managerに保存し、CloudSQLから、Secret Managerへアクセスするための権限として、Secret Manager のシークレット アクセサーを追加

テストデータ登録

クエリは、Cloud SQL Studio から実行しました。準備が少なくて良いです。

ユーザー作成

Google Cloud コンソール上で、作成したCloud SQL インスタンスを選択し、ユーザーメニューからユーザーを作成します。
rootユーザーは、Cloud SQL Studioからの接続に使用できないユーザーのため、ユーザーを追加する必要があります。

データベース作成

CREATE DATABASE `test-ml-integration` charset utf8mb4 COLLATE utf8mb4_unicode_ci;

テーブル作成 「商品レビューテーブル」

CREATE TABLE `test-ml-integration`.product_reviews (
    review_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255),
    review_text TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

レコード作成 「商品レビューテーブルテストデータ」

INSERT INTO `test-ml-integration`.product_reviews (product_name, review_text) VALUES 
('ワイヤレスイヤホンX', '音質は最高ですが、バッテリーの持ちが悪くて残念です。'),
('スマートウォッチY', 'デザインがかっこよくて、機能も使いやすい!毎日愛用しています。'),
('ゲーミングマウスZ', 'クリック感が軽すぎて誤操作が増えました。自分には合いませんでした。');

SQLクエリから Vertex AI 呼び出し

使用できるモデル確認

デフォルトで使用できるモデルは、mysql.cloudsql_ml_modelsテーブルで確認できます。
サードパーティーのモデルや任意のバージョンのVertex AI もこのテーブルで管理されます。

SELECT id, request_url, provider, model_type, qualified_name, auth_type FROM `mysql`.`cloudsql_ml_models`;

Cloud SQL Studio での実行結果をjson形式でエクスポートしました。

[
  {
    "id": "gemini-2.5-flash",
    "request_url": "publishers/google/models/gemini-2.5-flash:generateContent",
    "provider": "GOOGLE",
    "model_type": "GENERIC",
    "qualified_name": "gemini-2.5-flash",
    "auth_type": "AUTH_TYPE_CLOUDSQL_SERVICE_AGENT_IAM"
  },
  {
    "id": "gemini-embedding-001",
    "request_url": "publishers/google/models/gemini-embedding-001",
    "provider": "GOOGLE",
    "model_type": "TEXT_EMBEDDING",
    "qualified_name": "gemini-embedding-001",
    "auth_type": "AUTH_TYPE_CLOUDSQL_SERVICE_AGENT_IAM"
  }
]

gemini-2.5-flash がデフォルトで使用できる様です。

SQLクエリ実行

mysql.cloudsql_ml_modelsテーブルで確認したモデルgemini-2.5-flashを指定しています。
contents.parts.textで、プロンプト指示しています。

SELECT
    review_id
    , product_name
    , review_text
    , JSON_UNQUOTE( 
        JSON_EXTRACT( 
            mysql.ml_predict_row( 
                'gemini-2.5-flash'
                , CONCAT( 
                    '{ "contents": [{ "role": "user", "parts":[{"text":"次のテキストの感情を「ポジティブ」「ネガティブ」「中立」のいずれかで答えてください:  \n'
                    , review_text
                    , ' "}]}]}'
                )
            ) 
            , '$.candidates[0].content.parts[0].text'
        )
    ) AS sentiment_analysis 
from
    `test-ml-integration`.product_reviews;

実行結果は、

[
  {
    "review_id": "1",
    "product_name": "ワイヤレスイヤホンX",
    "review_text": "音質は最高ですが、バッテリーの持ちが悪くて残念です。",
    "sentiment_analysis": "ネガティブ"
  },
  {
    "review_id": "2",
    "product_name": "スマートウォッチY",
    "review_text": "デザインがかっこよくて、機能も使いやすい!毎日愛用しています。",
    "sentiment_analysis": "ポジティブ"
  },
  {
    "review_id": "3",
    "product_name": "ゲーミングマウスZ",
    "review_text": "クリック感が軽すぎて誤操作が増えました。自分には合いませんでした。",
    "sentiment_analysis": "ネガティブ"
  }
]

sentiment_analysis に、Vertex AI による感情分析の結果が出力されました!
Vertex AI からのjson形式のレスポンスから、text部分のみ抽出するのをSQLクエリで記述するのは面倒さを感じました。
実用するには、text部分抽出のファンクション化が必要ですね。

SQLクエリから OpenAI 呼び出し

SQLクエリからOpenAIを呼び出すために、APIキーの登録、モデルの登録をしていきます。
OpenAIの他に使用できるモデル プロバイダについては、
使用できるモデル プロバイダは、2026/02/15時点下記が使える様です。

モデル プロバイダ 関数での設定…
Vertex AI(Gemini を含む) google
Anthropic anthropic
Hugging Face hugging_face
OpenAI open_ai
Vertex AI、Anthropic、Hugging Face、OpenAI の外部で
ホストされているその他のモデル
custom

OpenAI のAPIキーを Secret Manager のシークレット に追加

予め発行しておいた OpenAI のAPIキーを、
Google Cloud コンソールからSecret Manager のシークレットを追加し、リソース名をコピーしておきます。
Secret Manager のシークレットのリソース名は下記の様になります。
projects/{プロジェクトID}/secrets/{シークレット名}/versions/{バージョン}

Cloud SQL に、Secret Manager のシークレットのリソースパス登録

第1引数は任意で一意の名称を付けてください。モデル登録時に指定します。

CALL mysql.ml_create_sm_secret_registration(
    'ml-integration-openai_key',
    'projects/XXXXX/secrets/YYYYY/versions/1' -- コピーしたリソース名
);

登録したシークレットはmysql.cloudsql_ml_secretsテーブルから確認できます。

SELECT * FROM `mysql`.`cloudsql_ml_secrets`;

実行結果

[
  {
    "id": "ml-integration-openai_key",
    "secret_path": "projects/XXXXX/secrets/YYYYY/versions/1"
  }
]

モデル登録

第1引数:任意で一意な名称(SQLクエリで指定します)
第2引数:APIコール時のエンドポイント
第3引数:モデル プロバイダ名称(名称は決まっています)
第4引数:テキスト エンベディング モデル エンドポイントの場合は text_embedding、他のすべてのモデル エンドポイントの場合は generic
第5引数:OpenAI モデル エンドポイントの場合は必須。他のモデル エンドポイントの場合は NULL にできる
第6引数:Vertex AI モデルの場合は auth_type_cloudsql_service_agent_iam、他のプロバイダの場合は auth_type_secret_manager に設定
第7引数:先ほど登録したmysql.cloudsql_ml_secretsテーブルのid値

CALL mysql.ml_create_model_registration( 
    'gpt-4o-mini'
    , 'https://api.openai.com/v1/chat/completions'
    , 'open_ai'
    , 'GENERIC'
    , 'gpt-4o-mini'
    , 'auth_type_secret_manager'
    , 'ml-integration-openai_key'
    , NULL
    , NULL
    , NULL
);

登録結果を確認します。

SELECT id, request_url, provider, model_type, qualified_name, auth_type FROM `mysql`.`cloudsql_ml_models`;
[
  {
    "id": "gemini-2.5-flash",
    "request_url": "publishers/google/models/gemini-2.5-flash:generateContent",
    "provider": "GOOGLE",
    "model_type": "GENERIC",
    "qualified_name": "gemini-2.5-flash",
    "auth_type": "AUTH_TYPE_CLOUDSQL_SERVICE_AGENT_IAM"
  },
  {
    "id": "gemini-embedding-001",
    "request_url": "publishers/google/models/gemini-embedding-001",
    "provider": "GOOGLE",
    "model_type": "TEXT_EMBEDDING",
    "qualified_name": "gemini-embedding-001",
    "auth_type": "AUTH_TYPE_CLOUDSQL_SERVICE_AGENT_IAM"
  },
  {
    "id": "gpt-4o-mini",
    "request_url": "https://api.openai.com/v1/chat/completions",
    "provider": "OPEN_AI",
    "model_type": "GENERIC",
    "qualified_name": "gpt-4o-mini",
    "auth_type": "AUTH_TYPE_SECRET_MANAGER"
  }
]

gpt-4o-miniが追加されたことが確認できます。

SQLクエリ実行

ml_predict_rowの第1引数でモデル登録したモデル名称を指定しています。
プロンプト指示している messages.contentの形式はOpenAI 向けのため、Vertex AI とは形式が違います。

SELECT
    review_id
    , product_name
    , review_text
    , JSON_UNQUOTE( 
        JSON_EXTRACT( 
            mysql.ml_predict_row( 
                'gpt-4o-mini'
                , JSON_OBJECT( 
                    'model'
                    , 'gpt-4o-mini'
                    , 'messages'
                    , JSON_ARRAY( 
                        JSON_OBJECT( 
                            'role'
                            , 'user'
                            , 'content'
                            , CONCAT( 
                                '次のテキストの感情を「ポジティブ」「ネガティブ」「中立」のいずれかで答えてください: \n'
                                , review_text
                            )
                        )
                    )
                )
            ) 
            , '$.choices[0].message.content'
        )
    ) AS sentiment_analysis 
FROM
    `test-ml-integration`.product_reviews;

実行結果

[
  {
    "review_id": "1",
    "product_name": "ワイヤレスイヤホンX",
    "review_text": "音質は最高ですが、バッテリーの持ちが悪くて残念です。",
    "sentiment_analysis": "このテキストの感情は「ネガティブ」です。音質についてはポジティブな表現がありますが、バッテリーの持ちが悪い点が残念と述べられているため、全体的に否定的な印象を与えています。"
  },
  {
    "review_id": "2",
    "product_name": "スマートウォッチY",
    "review_text": "デザインがかっこよくて、機能も使いやすい!毎日愛用しています。",
    "sentiment_analysis": "ポジティブ"
  },
  {
    "review_id": "3",
    "product_name": "ゲーミングマウスZ",
    "review_text": "クリック感が軽すぎて誤操作が増えました。自分には合いませんでした。",
    "sentiment_analysis": "ネガティブ"
  }
]

Vertex AI同様、sentiment_analysis に、感情分析の結果が出力されました!
先頭の結果は、「ポジティブ」「ネガティブ」「中立」のいずれかで答えてくださいと指示したのに、文書が入っています。
gpt-4o-miniなのでこんなものでしょう。

まとめ

Cloud SQL for MySQL の新機能を使って、Vertex AI と OpenAI 両方のモデルを SQLクエリ から呼び出してみました。

  • アプリケーションコードが不要になる
    SQLクエリからAIに問い合わせて結果を取得できるため、アプリのコードが不要になります。
    ただ、使う場面を想定した場合、元々ストアドプロシージャやファンクションを積極的に使っていれば、AI連携も視野に入りそうですが、
    元々アプリコードがある場合は、SDK等ライブラリを使用できますが、SQLクエリの場合はSDKに任せられる処理も独自に、SQLだけで実装することになると思われるので、SQLクエリからAIに問い合わせを使うことは無いかと思いました。
    使用する場合は、システムに組み込む場合は、AIからエラー返った場合のエラーハンドリングも必要なので、プロシージャが必須になると思われます。
  • SQLでのJSON操作の知識が必要
    mysql.ml_predict_row はあくまで「APIのレスポンス(JSON)をそのまま返す関数」なので、
    実用化にあたっては以下の MySQL JSON関数の習得が必須となります。
    アプリコードでのJSON操作と比べると、SQLでのJSON操作は直感的でない様に感じますし、可読性もアプリコードの方が良いと感じました。
  • APIキーは Secret Manager に保存して管理
    しっかり、Secret Managerと連携される様になっていました。

今回SQLクエリの実行は、Cloud SQL Studioから行いましたが、AIプロバイダからのエラーのデバッグに難がありました。
エラーの内容の文字列が途中で切れてるし、アプリコードならデバッガで詳細で確認できるのですが、SQLクエリの場合は、表示されたSQLエラーを見て確認する必要があるため時間がかかりました。