🍲

Vertex AI の自然言語モデルを Cloud Spanner のテキストデータに適用してみる

2023/11/30に公開

こんにちは、クラウドエース データMLディビジョン所属の松山です。
データMLディビジョンでは、Google Cloud が提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。
新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。

1. リリース概要

今回ご紹介するリリースは、2023 年 10 月 9 日付に発表されたCloud Spanner のリリースについてです。
本リリースによって、Vertex AI の自然言語モデル(「textembedding-gecko モデル」と「text-bison モデル」)を Cloud Spanner に保存されているテキストデータに対して適用できるようになりました。
適用の際、Spanner Vertex AI インテグレーションを有効化する必要があります。

1-1. Cloud Spannerとは?

Cloud Spanner とは、フルマネージドのリレーショナルデータベースサービスです。 最大99.999%の可用性、柔軟なスケーリング、強力な整合性・一貫性を持ち、大規模データのトランザクション処理を高速で実現できます。

1-2. VertexAIとは?

Vertex AI とは、フルマネージドの機械学習プラットフォームです。機械学習モデルの構築からデプロイまでを包括的に実施できます。

  • textembedding-geckoモデル とは?
    テキストを高次元ベクトルに変換するモデルです。変換したベクトルを使って、テキスト分類セマンティック検索などを行なうことができます。

  • text-bisonモデル とは?
    様々な自然言語タスク(要約分類感情分析質問回答エンティティの抽出など)を実施できるモデルです。

1-3. Spanner Vertex AI インテグレーションのメリット

Spanner Vertex AI インテグレーションを使用した場合、Cloud Spanner のデータアクセスと Vertex AI のモデルアクセスが別々に実行される場合と比較して、以下 3 つのメリットがあります。

  1. パフォーマンス向上
  • レイテンシの改善
    Spanner Vertex AI インテグレーションが Vertex AI と直接通信するため、Cloud Spanner のクライアントを実行しているコンピューティング ノードと Vertex AI 間の追加のラウンド トリップがなくなります。

  • スループットと並列性の向上
    Cloud Spanner の高度な分散クエリ処理インフラストラクチャを使って、Vertex AI モデルを実行できます。

  1. ユーザーエクスペリエンスの向上
    データ変換や Vertex AI モデルを使った予測を、1 つの SQL インターフェースを使用して簡単に実現できます。

  2. コスト削減
    Cloud Spanner のコンピューティング容量を使用して、ML コンピューティングと SQL クエリ実行の結果をマージするため、追加のコンピューティング(Compute Engine や Google Kubernetes Engine など)をプロビジョニングする必要がありません。

2. 【検証 A】textembedding-gecko モデルを試してみる

2-1. 概要

検証 A の概要は、以下の 3 点にまとめることができます。

  • 「textembedding-gecko モデル」を Cloud Spanner に登録する。
  • Cloud Spanner に以下のテキストデータを保存する。
id text
1 リンゴ
2 Apple
3 日本語の「リンゴ」は、英語では「Apple」です。
  • Cloud Spanner に保存したテキストデータに対して「textembedding-gecko モデル」を適用する。テキストデータを高次元ベクトルに変換できることを確認する。

2-2. 手順

  1. Cloud Spanner インスタンスの作成 or 既存インスタンスの選択
    Google Cloud Console から Cloud Spanner のページを開き、検証用のインスタンスを作成する。または既存インスタンスを選択する。
    altテキスト

  2. データベースの作成 or 既存データベースの選択
    検証用のデータベースを作成する。または既存データベースを選択する。
    altテキスト

  3. Spanner Vertex AI インテグレーションの有効化
    作成したデータベースのページにある「有効にする」ボタンを押す。
    altテキスト

  4. DDL ステートメントの記述
    以下の DDL ステートメントを記述し、「送信」ボタンを押す。

CREATE MODEL ${MODEL_NAME}
INPUT(content STRING(MAX))
OUTPUT(
  embeddings
    STRUCT<
      statistics STRUCT<truncated BOOL, token_count FLOAT64>,
      values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/${PROJECT}/locations/${LOCATION}/publishers/google/models/textembedding-gecko'
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${PROJECT}: Vertex AIエンドポイントをホストするプロジェクトID
  • ${LOCATION}: Vertex AIエンドポイントの場所

altテキスト

  1. モデルの登録を確認
    altテキスト

  2. テーブルスキーマの登録
    画面右上の鉛筆マークをクリックする。
    altテキスト

以下のスキーマを記述し、「送信」ボタンを押す。

CREATE TABLE ${TABLE_NAME} (
  id INT64 NOT NULL,
  text STRING(255)
) PRIMARY KEY (id);
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

  1. テーブルスキーマの登録を確認
    altテキスト

  2. Spanner Studio を開く
    画面左のナビゲーションペインから「Spanner Studio」を開く。
    altテキスト

  3. テキストデータの登録
    以下のクエリを実行し、テキストデータをテーブルに追加する。

INSERT INTO ${TABLE_NAME} (id, text)
VALUES (1, 'リンゴ'), (2, 'Apple'), (3, '日本語の「リンゴ」は、英語では「Apple」です。');
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

  1. モデルの適用
    以下のクエリを実行する。
SELECT id, embeddings.values
FROM ML.PREDICT(
  MODEL ${MODEL_NAME},
  (SELECT id, text as content FROM ${TABLE_NAME})
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${TABLE_NAME}: テーブルの名前(任意)

Text列のテキストデータをベクトル化できていることが分かります。
altテキスト

id text
1 -0.0026604468002915382,0.02634146623313427,-0.003313597524538636,0.003234213450923562,0.018140884116292,-0.051342710852622986,0.032363928854465485,・・・
2 -0.002589644631370902,-0.030254140496253967,-0.005284039303660393,0.033260196447372437,-0.003124704584479332,-0.07534682005643845,0.04191019386053085,・・・
3 -0.0027795331552624702,0.0013411781983450055,0.004375485237687826,0.03498736396431923,0.022517427802085876,-0.07539568096399307,0.04857306927442551,・・・

3. 【検証 B】text-bisonモデルを試してみる

3-1. 概要

検証 B の概要は、以下の 3 点にまとめることができます。

  • 「text-bison モデル」をCloud Spannerに登録する。
  • Cloud Spanner に以下のテキストデータを保存する。
id text
1 おはようございます。いいお天気ですね。
2 早起きのコツを端的に3つ教えてください。
3 日記を作成してください。
  • Cloud Spanner に保存したテキストデータに対して「text-bison モデル」を適用する。id=1 のテキストに対しては会話、id=2 のテキストに対しては質問回答、id=3 のテキストに対しては文章作成が実施できることを確認する。

3-2. 手順

手順 1~3 は検証 A と同一です。

  1. Cloud Spanner インスタンスの作成 or 既存インスタンスの選択
    Google Cloud ConsoleからSpannerのページを開き、検証用のインスタンスを作成する。または既存インスタンスを選択する。
    altテキスト

  2. データベースの作成 or 既存データベースの選択
    検証用のデータベースを作成する。または既存データベースを選択する。
    altテキスト

  3. Spanner Vertex AI インテグレーションの有効化
    作成したデータベースのページにある「有効にする」ボタンを押す。
    altテキスト

  4. DDL ステートメントの記述
    以下の DDL ステートメントを記述し、「送信」ボタンを押す。

CREATE MODEL ${MODEL_NAME}
INPUT(prompt STRING(MAX))
OUTPUT(
  content STRING(MAX),
  citationMetadata STRUCT<
    citations ARRAY<STRUCT<
    startIndex INT64,
    endIndex INT64,
    url STRING(MAX),
    title STRING(MAX),
    license STRING(MAX),
    publicationDate STRING(MAX)
   >>
  >,
  safetyAttributes STRUCT<
    scores ARRAY<FLOAT64>,
    categories ARRAY<STRING(MAX)>,
    blocked BOOL
  >
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/${PROJECT}/locations/${LOCATION}/publishers/google/models/text-bison'
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${PROJECT}:Vertex AIエンドポイントをホストするプロジェクトID
  • ${LOCATION}:Vertex AIエンドポイントの場所

altテキスト

  1. モデルの登録を確認
    altテキスト

  2. テーブルスキーマの登録
    画面右上の鉛筆マークをクリックする。
    altテキスト

以下のスキーマを記述し、「送信」ボタンを押す。

CREATE TABLE ${TABLE_NAME} (
  id INT64 NOT NULL,
  text STRING(255)
) PRIMARY KEY (id);
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

  1. テーブルスキーマの登録を確認
    altテキスト

  2. Spanner Studio を開く
    画面左のナビゲーションペインから「Spanner Studio」を開く。
    altテキスト

  3. テキストデータの登録
    以下のクエリを実行し、テキストデータをテーブルに追加する。

INSERT INTO ${TABLE_NAME} (id, text)
VALUES (1, 'おはようございます。いいお天気ですね。'), (2, '早起きのコツを端的に3つ教えてください。'), (3, '日記を作成してください。');
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

  1. モデルの適用
    以下のクエリを実行する。
SELECT prompt, content
FROM ML.PREDICT(
  MODEL ${MODEL_NAME},
  (SELECT text as prompt FROM ${TABLE_NAME} WHERE id=1), STRUCT(250 AS maxOutputTokens)
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

以下のように会話できていることが分かります。

prompt content
おはようございます。いいお天気ですね。 おはようございます。いいお天気ですね。今日は20度くらいまで気温が上がるそうです。日差しが強いですから、日焼け止めを塗って、水分を十分に摂るようにしてください。
SELECT prompt, content
FROM ML.PREDICT(
  MODEL ${MODEL_NAME},
  (SELECT text as prompt FROM ${TABLE_NAME} WHERE id=2), STRUCT(250 AS maxOutputTokens)
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

以下のように質問に回答できていることが分かります。

prompt content
早起きのコツを端的に3つ教えてください。 1. 十分な睡眠をとる。 これは、早起きするための最も重要なコツです。十分な睡眠をとっていないと、朝起きるのが難しく、一日中疲れを感じてしまいます。ほとんどの大人は、一晩に7~8時間の睡眠を必要としています。2. 就寝前にリラックスする。 就寝前の数時間は、リラックスしてストレスを解消するのに費やしましょう。これは、読書、入浴、落ち着いた音楽を聴くなど、好きなことをして過ごすことを意味します。就寝前にテレビを見たり、電子機器を使ったりするのは避けましょう。これらの機器から発せられる青い光は、睡眠を妨げる可能性があります。3. 目覚まし時計を手の届かないところに置く。 これは、スヌーズボタンを押して二度寝するのを防ぐのに役立ちます。目覚まし時計が手の届かないところに置いてあれば、起き上がって止める必要があります。これは、一日を始めるのに役立ちます。
SELECT prompt, content
FROM ML.PREDICT(
  MODEL ${MODEL_NAME},
  (SELECT text as prompt FROM ${TABLE_NAME} WHERE id=3), STRUCT(250 AS maxOutputTokens)
);
  • ${MODEL_NAME}: モデルの名前(任意)
  • ${TABLE_NAME}: テーブルの名前(任意)

altテキスト

以下のように文章を作成できていることが分かります。

prompt content
日記を作成してください。 2023年3月8日 火曜日 今日は、朝起きてからずっと、日記を書くことを考えていました。日記を書くのは久しぶりです。最後に日記を書いたのは、いつだったか思い出せません。でも、日記を書くことは、私にとって大切なことだと思っています。日記を書くことで、自分の考えや感情を整理することができます。また、日記を読み返すことで、自分の成長を振り返ることができます。今日は、最近あった出来事について書きたいと思います。先週、私は新しい仕事に就きました。新しい仕事は、とてもやりがいのある仕事です。でも、同時に、とてもプレッシャーのかかる仕事でもあります。私は、この新しい仕事で成功したいと思っています。でも、同時に、失敗するのではないかと不安に思っています。私は、この新しい仕事で成功するために、毎日努力しています。毎日、新しいことを学び、新しいことに挑戦しています。また、毎日、自分の仕事に責任を持とうとしています。・・・

まとめ

本ページでは、Vertex AI の自然言語モデル(「textembedding-gecko モデル」と「text-bison モデル」)を Cloud Spanner のテキストデータに適用する検証を行ないました。
今後、Cloud Spanner と Vertex AI の統合が進むにつれて、適用できるモデルが更に増えていくことが期待できます。今後の発展を楽しみに見守りましょう。

Discussion