SnowflakeのAI機能を試してみる(COMPLETE, TRANSLATE, SUMMARIZE, SENTIMENT)

先日、下記のSnowflake Cortex AIに関するイベントに参加してきました！
そこで、SnowflakeのAI機能が簡単に利用できるということを今更ながら知ったので、試してみました！

https://techplay.jp/event/950878

Cortex AIではいくつかの関数が準備されており、それを呼び出すだけで簡単に利用できるようになっています。

https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions

今回は気軽に使えそうな以下の４つを試してみました！
- `COMPLETE`
- `TRANSLATE`
- `SUMMARIZE`
- `SENTIMENT`


## COMPLETE
`COMPRETE`はChatGPTとの会話のように、入力したプロンプトに対してLLMからの回答が返ってくる関数です。
第1引数に利用するLLMモデル名、第2引数にプロンプトを入力します。

```sql
select SNOWFLAKE.CORTEX.COMPLETE('llama3.1-8b','DWHのSnowflakeについて簡単に説明して' );
```
↓

出力結果
> Snowflakeは、クラウドベースのデータウェアハウス（DWH）です。主にデータ分析に使用されます。
Snowflakeの特徴は以下のとおりです。
>
>*   **クラウドベース**: Snowflakeはクラウド上で動作するため、スケーラビリティが高く、管理が容易です。
>*   **マルチモデル**: Snowflakeはマルチモデルなので、SQL、JSON、AVRO、PARQUETなどのデータ形式をサポートしています。
>*   **データ分割**: Snowflakeはデータ分割をサポートしており、データを小さなパーティションに分割して管理できます。
>*   **データキャッシュ**: Snowflakeはデータキャッシュをサポートしており、頻繁に参照されるデータをキャッシュして読み取りの高速化を実現します。
>*   **セキュリティ**: Snowflakeは高度なセキュリティ機能を備えており、データの保護と管理を容易にします。
>
>Snowflakeは、データ分析、ビジネスインテリジェンス、データサイエンスなどの分野で広く使用されています。

<br>

`COMPLETE`にはテーブルから取得した結果を直接渡すことも可能です。

https://docs.snowflake.com/en/sql-reference/functions/complete-snowflake-cortex#responses-from-table-column

ChatGPTに作ってもらった渋谷の人気施設30個の一時テーブルをもとに、施設のカテゴリを判定してもらってみます。
```sql
SELECT 
    spot_name,
    SNOWFLAKE.CORTEX.COMPLETE(
        'llama3.1-70b',
        CONCAT('各施設について、「生活サービス」「宿泊」「ショッピング」「レジャー」「交通施設」「飲食」「観光」のいずれかのカテゴリーに分類してください。カテゴリー名のみを出力してください: <spot>', spot_name, '</spot>')
    ) AS category
FROM popular_spots_shibuya
;
```

こちらが出力結果です！
何となく良さそうな感じがします。（すごー）
※ ChatGPTが作ってくれた施設一覧なので、渋谷外の施設や、そもそも施設や場所でないものも紛れ込んでいますがそこは🙈

| SPOT_NAME                          | CATEGORY    |
|-----------------------------------|-------------|
| スクランブル交差点                | 交通施設    |
| ハチ公像                          | 観光        |
| SHIBUYA SKY                       | 観光        |
| 渋谷パルコ                        | ショッピング |
| 渋谷ヒカリエ                      | ショッピング |
| MIYASHITA PARK                    | レジャー    |
| 東急プラザ渋谷                    | ショッピング |
| MAGNET by SHIBUYA109              | ショッピング |
| Spotify O-EAST                    | レジャー    |
| Bunkamura                         | ショッピング |
| 国立代々木競技場                  | レジャー    |
| NHKスタジオパーク                 | 観光        |
| 代々木公園                        | レジャー    |
| 明治神宮                          | 観光        |
| キャットストリート                | ショッピング |
| スペイン坂                        | 観光        |
| タワーレコード渋谷店              | ショッピング |
| HMV&BOOKS SHIBUYA                 | ショッピング |
| SHIBUYA TSUTAYA                   | ショッピング |
| ヴィレッジヴァンガード 渋谷本店 | ショッピング |
| Disney HARVEST MARKET By CAFE COMPANY | ショッピング |
| ゴンチャ 渋谷道玄坂店             | 飲食        |
| 猿カフェ                          | レジャー    |
| THE THEATRE TABLE                 | 飲食        |
| BIOTOP                            | レジャー    |
| niko and ... TOKYO                | 飲食        |
| SHIBUYA CAST.                     | ショッピング |
| 青の洞窟 SHIBUYA                  | 観光        |
| シブヤノオト                      | レジャー    |
| RAYARD MIYASHITA PARK             | ショッピング |


## TRANSLATE
`TRANSLATE`は関数名のとおり、翻訳してくれる関数です！

```sql
select SNOWFLAKE.CORTEX.translate('`TRANSLATE`は関数名のとおり、翻訳してくれる関数です！','ja', 'en' );
```
↓
出力結果はいかのとおりです！結構いい感じだと思います。
>`TRANSLATE` is a function that translates, as the name of the function!

<br>

こちらも`COMPLETE`と同様にテーブルの値を渡すことができます。
ChatGPTが作ってくれた文章を翻訳してみましょう。

```sql
select
    text as ja_text,
    SNOWFLAKE.CORTEX.translate(text,'ja', 'en' ) as en_text
from temp_japanese_texts;
```


| JA_TEXT                                           | EN_TEXT                                                    |
|---------------------------------------------------|------------------------------------------------------------|
| 渋谷駅前に新しいカフェがオープンしました。       | A new café has opened in front of Shibuya Station          |
| 渋谷ヒカリエで開催中の展示会が話題です。         | The exhibition in Shibuya Hikariye is the topic of discussion |
| 代々木公園で大規模なフリーマーケットが行われています。 | Large-scale free markets are held in the tree park every day  |
| 明治神宮は観光客で賑わっています。               | Meiji Shrine is packed with tourists                       |
| 渋谷スクランブル交差点は世界的に有名な場所です。 | Shibuya Scramble Intersection is a world famous place      |


## SUMMARIZE
`SUMMARIZE`はテキストを要約するための関数です。

```sql
select snowflake.cortex.summarize(
    '渋谷は、東京で最も活気のあるエリアの一つとして知られています。
    この地域は、ショッピング、エンターテイメント、飲食、ファッションといった
    多様な楽しみ方ができるスポットが豊富に集まっています。特に、渋谷スクランブル
    交差点は世界的に有名であり、多くの観光客が写真を撮るために訪れます。
    渋谷駅周辺には渋谷ヒカリエや渋谷109といった商業複合施設が立ち並び、
    若者や観光客に人気です。また、少し足を伸ばせば代々木公園や明治神宮などの
    自然と歴史に触れることができる場所もあります。渋谷はその多様性とダイナミズムから、
    訪れる人々に常に新しい発見と興奮を与えてくれるエリアです。'
);
```
↓
英語で出力されます。要約はされていないようです。
[ドキュメント](https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions#summarize)に「英語の入力を要約します」とあるように、日本語には対応していません。
日本語を英語にしてから`SUMMARIZE`するのが良さそうですね！

> Shibuya is known as one of the most lively areas in Tokyo. It offers various ways to enjoy shopping, entertainment, dining, and fashion. The famous Shibuya Scramble intersection is a world-renowned spot where many tourists take photos. Shibuya Station area is home to popular commercial complexes like Shibuya Hikarie and Shibuya 109, and is popular among young people and tourists. Nearby are also natural and historical sites like Yoyogi Park and Meiji Shrine. Shibuya's diversity and dynamism continually offers new discoveries and excitement to visitors.




## SENTIMENT
`SENTIMENT`は感情分析ができる関数です。
-1 ~ 1の範囲で数字が返ってきてネガポジ判定が成されます。

```sql
select
    text,
    snowflake.cortex.sentiment(text) as score
from temp_negapoji_texts
;
```
↓

日本語だと正しく分析できていないようです。
こちらもドキュメントに英語のみが対応している書いてあります！

| TEXT                                      | SCORE        |
|-------------------------------------------|--------------|
| 渋谷はいつも楽しい場所です。             | -0.1235845   |
| 渋谷の交通はとても混雑していて疲れます。 | -0.15305562  |
| 渋谷の新しいカフェは美味しいです。       | -0.01358631  |
| 渋谷の騒音が気になります。               | -0.006846354 |
| 渋谷ヒカリエのイベントは素晴らしいです。 | 0.0473288    |


```sql
select
    text,
    snowflake.cortex.sentiment(
        snowflake.cortex.translate(text, 'ja', 'en')
    ) as score
from temp_negapoji_texts
;
```

↓

英語に翻訳してからだと、こんな感じになりました。
「騒音が気になる」がマイナス値になってくれたら完璧だったのに！
ChatGPTによると『 英語の翻訳が「I care about the noise of Shibuya」となっており、「care」という単語がポジティブなニュアンスを持つため、誤ってポジティブなスコアをつけた可能性があります。』とのこと。
| TEXT                                      | EN_TEXT                                                | SCORE        |
|-------------------------------------------|--------------------------------------------------------|--------------|
| 渋谷はいつも楽しい場所です。             | Shibuya is always a fun place to be in                 | 0.454862     |
| 渋谷の交通はとても混雑していて疲れます。 | The traffic in Shibuya is very crowded and tiring      | -0.13499872  |
| 渋谷の新しいカフェは美味しいです。       | The new cafe in Shibuya is good                        | 0.38711646   |
| 渋谷の騒音が気になります。               | I care about the noise of Shibuya                      | 0.4065359    |
| 渋谷ヒカリエのイベントは素晴らしいです。 | The event in Shibuya Hikariye is great!                | 0.5326819    |

<br>

用意されている関数だけでも、いろんな用途がありそうですね！
イベントでは他にもRAGやファインチューニングなども紹介されていたので、今後はそれらも試してみたいなと思います！