LLMでGoogle Cloudのアップデート情報に効率的にキャッチアップする方法

# はじめに

データ領域で仕事をしていると、既存サービスのアップデートや新たな技術／サービスの登場をキャッチアップしていくことは、基礎的な知識／技術を身に着けるのと同様にとても大事なことです。

自分が情報収集するにあたっては、Twitterのつぶやきを見たり、気になる技術記事を読んだり、社内で話題になっていることについて詳しく調べてみたりなどしています。

一方で、そういった考えをもとに、株式会社primeNumberでは[Data Engineering News](https://blog.trocco.io/category/data-engineering-news)というデータエンジニアリング領域を中心としたアップデート情報を発信しており、私も執筆者の1人として携わっています。（メール配信もしているので、よろしければ購読ください！）

今回は、こうしたサービスのアップデート情報をキャッチアップするなかで、Google Cloudで便利なことができることに気が付いたので、ご紹介しようと思います。


# Google Cloudのアップデート情報は、データ化されている

サービスのアップデート情報というと、「リリースノート」と呼ばれるものがあります。例えば、Looker Studioでは[Looker Studio release notes](https://cloud.google.com/looker-studio/docs/release-notes)というページがあり、ここでアップデート情報を確認することができます。

ただ、こういったリリースノートをいちいち身にいくのは面倒ですし、ましてやサービスごとに別々のページを見に行くというのはなかなか骨が折れることです。だんだんめんどくさくなって、とりあえずTwitterで流れてくるのを待ってればいいか、とか思ってしまいますよね。

そんなところ、実はこのアップデート情報が、データ化されているのです。そしてそれはBigQueryのパブリックデータとして公開されています。

BigQueryのパブリックデータとは、BigQueryでデータ利用するにあたり、まずサンプルで扱うためのデータとしてGoogleから公開されているデータセットです。Google Analyticsのサンプルデータである[ga4_obfuscated_sample_ecommerce](https://console.cloud.google.com/bigquery?ws=!1m4!1m3!3m2!1sbigquery-public-data!2sga4_obfuscated_sample_ecommerce)は参考としてよく紹介されるものですかね。

このパブリックデータのなかに、[release_notes](https://console.cloud.google.com/bigquery?ws=!1m5!1m4!4m3!1sbigquery-public-data!2sgoogle_cloud_release_notes!3srelease_notes)というデータがあります。下記のようなデータが入っており、そうこれ欲しかったやつだ・・・となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/e8f5966f-da16-7d4b-a71a-fc3c39702503.png)

このデータを使って、アップデート情報を使いやすく加工してみましょう。


# Google Cloudのアップデート情報を使いやすくする

先ほどのパブリックデータは、アップデート情報がdescriptionに記載されていますが、この記述は英語で書かれているので、そのままではやや読むのが大変です。そこで、この内容を翻訳しつつ、補足情報を加えてもらいましょう。


## SQLでアップデート情報を加工する

今回やりたいことは、SQLを実行するだけで簡単にできます。利用するクエリは以下の通りです。

```sql
with release_notes as (
  select
    product_name,
    published_at as published_date,
    product_version_name,
    release_note_type,
    description,
    '以下の文章を日本語に翻訳してください。補足が必要な場合は追加の説明を入れて分かりやすくまとめてください。文章: ' as prompt_base
  from
    `bigquery-public-data.google_cloud_release_notes.release_notes`
  where
    -- ここに欲しいサービス名を入れておく
    product_name in (
      'BigQuery',
      'Looker Studio'
    )
    and published_at >= date_sub(current_date('Asia/Tokyo'))
  group by
    all
)

select
  product_name,
  published_date,
  product_version_name,
  release_note_type,
  description,
  prompt_base,
  prompt,
  ml_generate_text_llm_result,
  ml_generate_text_rai_result,
  ml_generate_text_status
from
  ml.generate_text(
    model `project_id.dataset_id.llm_model`,
    (
      select
        *,
        prompt_base || replace(regexp_replace(description, '\\[|\\]|\\((https://cloud\\.google\\.com[^\\)]*)\\)|\\((https://console\\.cloud\\.google\\.com[^\\)]*)\\)|\\((https://support\\.google\\.com[^\\)]*)\\)|\\((https://lookerstudio\\.google\\.com[^\\)]*)\\)|\\((https://github\\.com[^\\)]*)\\)', ''),'**', '*') as prompt
      from
        release_notes
    ),
    struct(
      300 as max_output_tokens,
      true as flatten_json_output
    )
  )
```

このクエリを実行すると、下記のようなデータが取得できます。これは便利すぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492462/94715dca-dd2a-3340-d34c-76af43adf3b9.png)


## 処理内容の解説

「翻訳しつつ補足情報が欲しい」というのを思い浮かべると、LLMを使えばなんとかなりそうですね。そこで、BigQuery MLでLLMを利用することで、SQLでLLMを利用して処理します。

BigQueryでLLMを利用するには事前準備が必要になりますが、詳細は[BigQuery で Vertex AI モデルを使って、SQL のみで LLM のテキスト生成を実行する](https://cloud.google.com/blog/ja/products/ai-machine-learning/llm-with-vertex-ai-only-using-sql-queries-in-bigquery)の記事を参考にしてください。

では、クエリの紹介をしていきます。まず、下記のクエリでLLMに投げるためのベースとなるデータを抽出しています。

```sql
with release_notes as (
  select
    product_name,
    published_at as published_date,
    product_version_name,
    release_note_type,
    description,
    '以下の文章を日本語に翻訳してください。補足が必要な場合は追加の説明を入れて分かりやすくまとめてください。文章: ' as prompt_base
  from
    `bigquery-public-data.google_cloud_release_notes.release_notes`
  where
    -- ここに欲しいサービス名を入れておく
    product_name in (
      'BigQuery',
      'Looker Studio'
    )
    and published_at >= date_sub(current_date('Asia/Tokyo'))
  group by
    all
)
```

そして、下記のクエリでプロンプトを生成してLLMに投げ込んで、返ってきた内容をデータとして取得しています。なお、プロンプトで投げるときにはリンクの情報があってもトークンを無駄に消費するだけなので、リンク部分は除外をするように置換しています。

```sql
select
  product_name,
  published_date,
  product_version_name,
  release_note_type,
  description,
  prompt_base,
  prompt,
  ml_generate_text_llm_result,
  ml_generate_text_rai_result,
  ml_generate_text_status
from
  ml.generate_text(
    model `project_id.dataset_id.llm_model`,
    (
      select
        *,
        prompt_base || replace(regexp_replace(description, '\\[|\\]|\\((https://cloud\\.google\\.com[^\\)]*)\\)|\\((https://console\\.cloud\\.google\\.com[^\\)]*)\\)|\\((https://support\\.google\\.com[^\\)]*)\\)|\\((https://lookerstudio\\.google\\.com[^\\)]*)\\)|\\((https://github\\.com[^\\)]*)\\)', ''),'**', '*') as prompt
      from
        release_notes
    ),
    struct(
      300 as max_output_tokens,
      true as flatten_json_output
    )
  )
```

解説は以上です。めちゃくちゃ簡単ですね（笑）


# さいごに

非常に簡単な処理内容ですが、これでGoogle Cloudのアップデート情報をサービス横断でまとめて、日本語に翻訳しつつ補足情報も入った形でデータとして取得することができます。処理としてはシンプルですが、アップデート情報のキャッチアップが格段に楽になりますので、よろしければご活用ください！