dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

BigQuery でテキストのベクトル(エンベディング)を生成

2024-06-30 00:05:32 | BigQuery
BigQuery で ML.GENERATE_TEXT_EMBEDDING() を利用してテキストのベクトル(エンベディング)を生成する方法のメモ。

大まかな手順は以下の通り。
  • 言語モデル用の外部接続を追加
  • 外部接続用のサービスアカウントにロールを設定
  • 言語モデルの作成
  • 生成AIによるテキストからの生成


1. 言語モデル用の外部接続を追加
  • GCP コンソールで「BigQuery」をクリック
  • BigQuery の「エクスプローラ」のメニューで「+追加」をクリック
  • 「外部データソースへの接続」をクリック
  • 以下を設定
    • 接続タイプ: Vertex AI リモートモデル ...
    • 接続ID: 任意のID(ここでは ai_remote_model)
    • ロケーションタイプ: リージョン
    • リージョン: 任意のリージョン(ここではus-central1)
  • 「接続を作成」ボタンをクリック


2. 外部接続用のサービスアカウントにロールを設定
  • BigQuery の当該のプロジェクトに表示される「外部接続」欄に上記で作成した接続ID(us-central1.ai_remote_model)をクリックして接続情報を表示し、サービスアカウントIDをコピー。
  • GCP コンソールで「IAMと管理」をクリック
  • IAM メニューの「アクセス権を付与」をクリック
  • 新しいプリンシパルに上記でコピーしたサービスアカウントIDをペースト
  • 「ロールを選択」で「Vertex AI ユーザー」を選択
  • 「保存」ボタンをクリック

3. 言語モデルの作成
  • BigQuery の当該のプロジェクトのメニューをクリックし、「データセットを作成」をクリック
  • 以下を設定
    • データセットID: 任意(ここでは test_dataset)
    • ロケーションタイプ: リージョン
    • リージョン: 任意(ここでは us-central1)
  • 「データセットを作成」をクリック
  • 以下のクエリを実行して言語モデルを作成
    create or replace model
      {データセット}.{モデル名} # ここでは test_dataset.embedding_model
    remote with connection
      {外部接続ID} # ここでは `us-central1.ai_remote_model`
    options (
      endpoint = 'textembedding-gecko-multilingual@001'
    );


4. テキストからのベクトル生成
以下の SQL でテキストからベクトルを生成することができる。
select
  *
from
  ml.generate_text_embedding(
    model test_dataset.embedding_model,
    (select '私は人間です' as content),
    struct(true as flatten_json_output)
  )
;
実行結果
[{
  "text_embedding": ["0.041282802820205688", "-0.049310304224491119", ...],
  "statistics": "{\"token_count\":3,\"truncated\":false}",
  "ml_embed_text_status": "",
  "content": "私は人間です"
}]
以下のようにテーブルに格納されたテキストのベクトルを生成することもできる。
テーブル定義
create table test_dataset.text_tbl (
  id     string,
  body   string
);

insert into test_dataset.text_tbl (id, body) values ('01', '晴れています。');
insert into test_dataset.text_tbl (id, body) values ('02', '曇りです。');
insert into test_dataset.text_tbl (id, body) values ('03', '雨が降っています。');
SQL
select
  t.id as id
  , t.body as title
  , (
    select
      text_embedding
    from
      ml.generate_text_embedding(
        model test_dataset.embedding_model,
        (select t.body as content),
        struct(true as flatten_json_output)
      )
    ) as s
from
  test_dataset.text_tbl as t
;
実行結果
[{
  "id": "01",
  "body": "晴れています。",
  "s": ["-0.0071903029456734657", "-0.062979131937026978", ...]
}, {
  "id": "02",
  "body": "曇りです。",
  "s": ["-0.020720960572361946", "-0.058550607413053513", ...]
}, {
  "id": "03",
  "body": "雨が降っています。",
  "s": ["-0.013185698539018631", "-0.027199963107705116", ...]
}]
この記事についてブログを書く
« JavaScript で数値を3桁の,区... | トップ | BigQuery で生成AIによるテキ... »

BigQuery」カテゴリの最新記事