[Gemini in BigQuery] Natural language chat（自然言語）を使ってBig QueryでSQLを自動生成してもらう（プレビュー版）

## はじめに
こんにちは。
2024年4月に発表された**Gemini for Google Cloud**の中から**Natural language chat**の挙動を検証してみました。
## 事前説明
Google Cloudのコンソールで**Natural language chat**について以下の説明が記載されています。

```Through a natural language chat interface, you can quickly chat with Gemini Code Assist to get answers to your coding questions, or receive guidance on cloud best practices. Chat is available in the Google Cloud Console, and IDEs such as Visual Studio Code and JetBrains IntelliJ, via the Cloud Code IDE extensions.```

つまり、自然言語チャットを通じてコーディングの質問をして回答を得たり、べスプラに誘導して貰えるサービスをサポートしているようです。

なお、2024年5月20日時点では英語のみのサービス提供です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/4ae4b4de-ca6f-c8a3-95bb-3f85f079a30e.png)
## 前提

**Gemini for Google Cloud API**を有効にしてからBig Queryコンソールに移動。
右上のペインから鉛筆マークを押下、「自動生成」にチェックが入っていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/c9e1980c-ddd8-9ad1-50ea-993b478f9056.png)

## 実機検証①
「コーディングをサポート」を押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/23d7da4a-96a7-c677-b0dc-1372101fe3a5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/43ce7757-0168-d9f6-327f-12c837027b7c.png)

手始めに「BigQueryで利用可能なデータセットとテーブルを知るにはどうすればよいですか？（インフォメーションスキーマ参照を誘導するような質問）」を入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/fb5fa16e-5750-17c0-42ce-a11ea1c66061.png)

```diff_sql:こんなクエリが返ってきたらいいな…の期待値例（筆者作成クエリ）
SELECT
    table_schema,
    table_name
FROM 
    `kasuya-1715.INFORMATION_SCHEMA.SCHEMATA` S
LEFT JOIN
    `kasuya_us_location.INFORMATION_SCHEMA.TABLES` T
ON S.catalog_name = T.table_catalog
  WHERE
    S.catalog_name = 'kasuya-1715'
GROUP BY table_schema ,table_name;
```
1秒ほどでクエリが返ってきた。期待値から離れていたのは質問の仕方が悪かったか…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/cd280ff3-6cd9-072f-0855-76e3263e504c.png)

挿入を押下すると動かないクエリだったので、動作するクエリに手で修正した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/00513127-413c-58f1-95eb-58971c498da2.png)

```diff_sql:How to find available Datasets and Tables to me in BigQuery?
SELECT
-   dataset_id,
-   table_id
+   table_schema,
+   table_name
  FROM
-   `INFORMATION_SCHEMA.TABLES`
+   `kasuya_us_location.INFORMATION_SCHEMA.TABLES`
  WHERE
    table_catalog = 'kasuya-1715'
```
（所感）自社のインフォメーションスキーマはもう少し上手い具合に出てくれると
　　　　想定していた。質問スキルを磨きながら今後の発展を期待したい。

## 実機検証②
こちらの方が動きは良かった。
航空会社関連のサンプルデータを想定した適当なデータを自分で作成しBig Queryに投入。

「データセットkasuya_us_locationのデータから、2004年の各週にキャンセルされたフライトの数を求めてください。」と聞いてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/2fef6d12-a52e-e57e-a62c-5ba843e1d0e9.png)
1秒ほどで以下の結果が返ってきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/5911f1ba-4167-3e9c-e6a2-d2c6fc454503.png)

動きそうなSQLステートメントが返ってきた。

```diff_sql:Counting Cancelled Flights by Week in 2004 from Dataset kasuya-1715.kasuya_us_location?
SELECT
    DATE_TRUNC(DATE(CAST(arr_time AS STRING)), WEEK) AS week,
    COUNT(*) AS cancelled_flights
  FROM
    `kasuya-1715.kasuya_us_location.flights`
  WHERE CAST(arr_time AS STRING) LIKE '2004%'
-   AND cancellation_code = '1'
+   AND cancelled = true
  GROUP BY 1
```
Flightsテーブルが持っているのはBOOLEAN型のcancelledカラムで、
存在しないcancellation_codeというカラムが適当にクエリされていたので手修正した。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/3a53dcdb-3122-fb18-f827-2ffa94371713.png)

修正ver.のクエリが動作することを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/b0f884ee-4100-2714-60f7-a1958f5afa72.png)<br>

（所感）今回、特に指定せずとも勝手にカラムは選定してくれたことが便利だった。（期待したコードから大きく外れていなかった。）クエリが意図した分析を行えるものかどうかを判断する力は使う側に必要だと感じ取って貰えたら嬉しい。

## 後述
### 関連機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/0a83fab0-818a-dcce-8d93-4b5b4bdbc369.png)
**Natural language chat**の機能以外にも、**Private Google Access**でAIアシスタントを使えばセキュリティとプライバシーもしっかりと制御できることが説明されていて興味を持った。<br>

### 料金
Gemini for Google Cloudを使うには**Gemini Code Assistサブスクリプション**に登録する。
料金は年間と月額が選択出来る。
年間：USD 19.00 / month（契約した場合の月額料金。長期契約する分 少し割引される）
月額：USD 22.80 / month
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/e32e10b6-44f0-28cf-cdc5-134b50669ba5.png)

月額で登録してお試し→慣れてきたら年間で登録でもよいかなと思い今回は月額を選択。
自然言語機能は全体の一部なので、他の機能使い方についても、また追加で投稿していこうと思う。

## 参考
https://cloud.google.com/gemini/docs/discover/works?hl=ja&_gl=1*1bgc2kp*_ga*MTg3MTUwNDMzMi4xNjk3MjY0ODA2*_ga_WH2QY8WWF5*MTcxNjIwOTY0NC41NC4xLjE3MTYyMDk2NjEuMC4wLjA.&_ga=2.111335684.-1871504332.1697264806