Pub/SubのAI推論SMTを使ってみた

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では、Pub/Sub から直接 Vertex AI 上の AI モデルによる推論を取得することができる AI 推論 SMT 機能について解説します。

前提知識

Pub/Sub とは

Pub/Sub は Google Cloud におけるフルマネージドなメッセージングサービスです。

メッセージングサービスは、システム間に配置することでメッセージを非同期に中継することができます。これにより、システムの拡張性や保守性を向上することができます。

Pub/Sub を始めとしたメッセージングサービスの詳細やユースケースについては、以下の記事をご一読ください。

blog.g-gen.co.jp

Single Message Transforms(SMTs)

Single Message Transforms(以下、SMTs)は Pub/Sub を使用したストリーミング処理のパイプラインにおいて単純なデータ変換を実現する機能です。

この機能では、Pub/Sub のトピックとサブスクリプションのそれぞれに対して単純なデータ変換処理を実装します。これにより、データの形式の変換やマスキング、フィルタリングなどの処理を、メッセージの配信前に行うことができます。

SMTs の詳細については、以下の記事をご一読ください。

blog.g-gen.co.jp

AI 推論 SMT の機能

基本事項

当記事で紹介する AI 推論 SMT(AI Inference Single Method Transform)は、SMTs の機能の1つであり、Vertex AI にある AI モデル(Gemini など)に Pub/Sub のメッセージを渡し、推論を取得してメッセージに追加することができる機能です。

通常の SMTs 同様に、AI 推論 SMT はトピックとサブスクリプションのどちらでも設定することができます。

トピックに設定した場合、推論結果がメッセージに追加されたあと、トピックに紐づくすべてのサブスクリプションにメッセージが配信されます。

トピックに対して AI 推論 SMT を設定した場合

サブスクリプションに設定した場合は、そのサブスクリプションでのみ推論を取得するような動作となります。Pub/Sub のユースケースに合わせて設定するとよいでしょう。

サブスクリプションに対して AI 推論 SMT を設定した場合

AI 推論 SMT の利点

AI 推論 SMT を使用してモデル推論とデータ変換を行う場合、以下のようなメリットがあります。

  • メッセージに対してリアルタイムで AI モデルによる推論結果を追加することができる(データ エンリッチメント)
  • モデルから推論を取得するための処理をアプリケーション側に実装する必要がなくなる
  • サブスクリプションに設定した場合、Pub/Sub はモデル エンドポイントの過負荷を回避し推論のスループットを最大化するため、リクエストレートを最適化する(フロー制御)
    単項 pull では最適化されない点に注意

  • 参考 : AI 推論 SMT - メッセージ フロー

使用できるモデル

Model Garden で提供されているモデル

AI 推論 SMT では、トピックまたはサブスクリプションを作成する際にモデルの推論用のエンドポイントを指定します。

Vertex AI Model Garden で提供されているモデルを使用する場合、以下のような形式でエンドポイントを指定します。

- ai
- aiInference:
    endpoint: "projects/<プロジェクトID>/locations/<モデルを利用するリージョン>/publishers/<モデルのパブリッシャー>/models/<モデル名>"

使用できるモデルの一覧については、以下のドキュメントで最新の情報を確認してください。

Vertex AI Endpoints にデプロイしたモデル

ユーザーが Vertex AI Endpoints を使用して Google Cloud 上にデプロイしたモデル(セルフデプロイ モデル)を推論に使用することもできます。

セルフデプロイ モデルを使用する場合は、モデルのエンドポイントの指定の仕方が異なります。

- aiInference:
    endpoint: "projects/<プロジェクトID>/locations/<エンドポイントのリージョン>/endpoints/<エンドポイント>"

モデルの入力・出力

入力するメッセージの形式

AI 推論 SMT による推論を行うためには、Pub/Sub に入力されるメッセージが特定の形式になっている必要があります。

例えば gemini-2.5-flash のような Gemini 基盤モデルを使用する場合、Chat Completions APIを使用して Gemini が呼び出されるため、以下のように Pub/Sub トピックに送信するメッセージの形式を API の仕様に合わせます。

{
  "model":"google/gemini-2.5-flash",
  "messages":[
    {
      "role": "user",
      "content": "Explain how AI works in a few words"
    }
  ]
}

推論後のメッセージの形式

AI 推論 SMT によって取得したモデルのレスポンスは、以下のように元のメッセージに追加されます。

{
  "original_message": "<元のメッセージ>",
  "model_output": "<推論によって取得したモデルのレスポンス>"
}

制限事項

AI 推論 SMT には以下のような制限事項があります。

  • トピックまたはサブスクリプションに設定できる AI 推論 SMT の数は1つまで
  • Vertex AI Endpoints のプライベート エンドポイントはサポートされていない(公開エンドポイントのみ使用可)
  • グローバル エンドポイントは、Gemini 基盤モデルでのみサポートされる。その他のモデルではリージョン エンドポイントのみ使用可能
  • Pub/Sub 側では入力されたメッセージのデータ形式などの検証は行われない。トピックにメッセージを送信する前に検証する必要がある
  • 1つのメッセージごとに1つの推論リクエストのみが可能であり、バッチ推論は不可
  • 指定したモデルによる推論は60秒以内に完了する必要がある

推論が60秒を超過するとタイムアウトとなり、Pub/Sub に設定したメッセージ保持期間と再試行回数の上限まで再試行が行われ、その後デッドレタートピックにメッセージが転送されます。

その他、制限事項に関する最新情報は以下のドキュメントをご一読ください。

設定手順

手順の概要

当記事で紹介する手順は、サブスクリプションに対して AI 推論 SMT によるメッセージ変換を設定し、そのサブスクリプションのコンシューマーに対してのみ推論結果を含めたメッセージを配信できるようにするためのものです。

サービスアカウントの作成・権限付与

AI 推論 SMT を使用する場合、Cloud Pub/Sub サービスエージェント(service-<プロジェクト番号>@gcp-sa-pubsub.iam.gserviceaccount.com)に対して Vertex AI サービス エージェントroles/aiplatform.serviceAgent)ロールを付与するか、カスタムサービスアカウントに対して Vertex AI ユーザーroles/aiplatform.user)ロールを付与します。

当記事ではカスタムサービスアカウントを使用します。

# サブスクリプション用のサービスアカウントを作成
$ gcloud iam service-accounts create pubsub-ai-inference-smt \
    --display-name="Pub/Sub AI Inference SMT"
  
# Vertex AI ユーザー ロールの付与
$ gcloud projects add-iam-policy-binding <プロジェクトID> \
    --member="serviceAccount:pubsub-ai-inference-smt@<プロジェクトID>.iam.gserviceaccount.com" \
    --role="roles/aiplatform.user"

定義ファイルの作成

ai-smt.yaml という名前で AI 推論 SMT の定義ファイルを作成します。これをトピックもしくはサブスクリプションの作成時に指定することで、AI 推論 SMT を使用することができます。

- aiInference:
    endpoint: "projects/<プロジェクトID>/locations/asia-northeast1/publishers/google/models/gemini-2.5-flash"
    unstructuredInference: {
        parameters: {
            "temperature": 0.5,
            "max_tokens": 1000
        }
    }
    serviceAccountEmail: "pubsub-ai-inference-smt@<プロジェクトID>.iam.gserviceaccount.com"

endpoint にはモデルのエンドポイントを指定します。unstructuredInference.parameters には、モデルに推論リクエストを送信する際のパラメータや最大トークン数などを指定できます。

serviceAccountEmail には、先ほど作成したサービスアカウントを指定します。

トピックの作成

Pub/Sub のトピックを作成します。

# トピックの作成
$ gcloud pubsub topics create ai-smt-topic

トピックに AI 推論 SMT を設定する場合、ここで --message-transforms-file オプションを使用します。

AI 推論 SMT を使用するサブスクリプションの作成

トピックに紐付けるサブスクリプションを作成します。

当記事ではサブスクリプション側に AI 推論 SMT によるメッセージ変換処理を設定するため、--message-transforms-file で先ほど作成した定義ファイルを指定します。

# AI 推論 SMT を使用するサブスクリプションの作成
$ gcloud pubsub subscriptions create ai-smt-topic-sub \
  --ack-deadline=600 \
  --topic ai-smt-topic \
  --message-transforms-file ai-smt.yaml

動作確認

メッセージのパブリッシュ

作成したトピックに対してメッセージをパブリッシュしてみます。

AI 推論 SMT で Gemini モデルを指定しているため、--message には、Chat Completions API の仕様に合わせた形式でメッセージを設定します。

# プロンプトを含むメッセージのパブリッシュ
$ gcloud pubsub topics publish ai-smt-topic --message=$'{
  "model":"google/gemini-2.5-flash","messages":[{
    "role": "user",
    "content": "Vertex AI について簡単に説明して"
    }]
  }'

メッセージの受信

サブスクリプションに配信されたメッセージを確認します。

# メッセージを受信し、データを復号したあと JSON に変換
$ gcloud pubsub subscriptions pull ai-smt-topic-sub \
    --auto-ack \
    --format="value(message.data.decode(base64))" | jq .

受信したメッセージには、元のメッセージである "original_message" に加え、サブスクリプション側の AI 推論 SMT によって "model_output" が含まれていることがわかります。

以下は受信したメッセージの例です。

{
  "model_output": {
    "choices": [
      {
        "finish_reason": "stop",
        "index": 0,
        "logprobs": null,
        "message": {
          "content": "Vertex AI は、Google Cloud が提供する、**機械学習(ML)開発のための統合プラットフォーム**です。\n\n簡単に言うと、MLモデルを開発する際に必要な「データの準備」「モデルの構築」「トレーニング」「デプロイ(公開)」「監視・管理」といった**あらゆる工程を、一つの場所で効率的に行えるようにするための「ワンストップショップ」**のようなものです。\n\n**主なポイント:**\n\n1.  **統合された環境:** これまでバラバラだったML開発のツールやサービスを一つにまとめ、開発プロセスをシンプルにします。\n2.  **効率化と高速化:** データサイエンティストやMLエンジニアが、インフラの管理に時間を取られることなく、モデルの開発や改善に集中できるよう設計されています。\n3.  **幅広い対応:** カスタムモデルの構築はもちろん、画像認識や自然言語処理などの特定のタスクに対応した事前学習済みモデルの利用や、AutoML(自動機械学習)機能も提供します。\n4.  **スケーラビリティ:** Googleの強力なインフラ上で動作するため、大規模なデータや複雑なモデルのトレーニングも柔軟に対応できます。\n\n例えるなら、ML開発に必要なあらゆる道具が揃った「高機能な作業台」のようなものです。これにより、企業はより迅速にMLをビジネスに導入し、価値を生み出すことができるようになります。",
          "role": "assistant"
        }
      }
    ],
    "created": 1775550770,
    "id": "MsHUaYLcFaKTp_QP1_SwiAw",
    "model": "google/gemini-2.5-flash",
    "object": "chat.completion",
    "system_fingerprint": "",
    "usage": {
      "completion_tokens": 263,
      "completion_tokens_details": {
        "reasoning_tokens": 1066
      },
      "extra_properties": {
        "google": {
          "traffic_type": "ON_DEMAND"
        }
      },
      "prompt_tokens": 6,
      "total_tokens": 1335
    }
  },
  "original_message": {
    "messages": [
      {
        "content": "Vertex AI について簡単に説明して",
        "role": "user"
      }
    ],
    "model": "google/gemini-2.5-flash"
  }
}

佐々木 駿太 (記事一覧)

クラウドソリューション部 クラウドエンジニアリング1課
北海道在住

大学院まで社会心理学を専攻し、AI に興味を持ち IT 業界へ。2022年6月に G-gen にジョイン。Google Cloud Partner Top Engineer に選出(2024 / 2025 Fellow / 2026)。好きな Google Cloud プロダクトは Cloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。最近は法律の勉強にも目覚め、2級知的財産管理技能士を取得。