Snowflakeで学ぶAI実践 モーニングワークショップ参加レポート ~生成AIを活用したチャットボットを作ろう~

# はじめに
2025年4月某日、東京ミッドタウン八重洲の上層階にあるSnowflakeのオフィスで開催された、「AI実践 モーニングワークショップ」に参加したので、実際にやったこと、所感をまとめていきます:snowflake:

# Snowflakeって？
「知ってるよ」という方は次セクションまで飛ばしちゃってください。

Snowflakeはワークショップ参加時点（2025年4月）で日本800社、世界で10,000社以上に導入されているクラウドサービスです。
Snowflakeは自社サービスを「AIデータクラウド」と称しています。
DWHの機能を核としつつ、アナリティクス、AI、データエンジニアリング、アプリケーションとコラボレーションといった機能をシングルプラットフォームで提供します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/0808adec-53b6-4b58-b8c9-2a9f73538e53.png)

弊社のエンジニアの中にも、「SnowflakeはDWHだとおもっていた」と話していた人もいました。
しかし、Snowflakeの機能は従来のDWHを超えたものとなっています！

## Snowflakeの機能
### なぜSnowflakeでAI活用？
各企業がAIドリブンによるビジネス価値の創出を目指しています。
しかし、生成AI単体を利用していてもビジネス価値とはなりません。
自社が持っているデータとAIを掛け合わせることで、はじめて価値が生み出されます。

ただ、皆さん同じような課題に直面します。

* 思ったようなクオリティに達しない
* セキュリティ、ガバナンスの管理
* コストがかかる、実装が複雑
 
Snowflakeは「簡単」、「効率的」、「信頼性」の三要素でこれらの課題を解決します！

### Snowflakeの生成AI 「Cortex AI」
Snowflakeでは独自開発のAIのモデルはもちろん、他社の商用/オープンソースのAIのモデルも選択できます。
2025年2月にはMicrosoftとのパートナーシップの拡大も発表し、OpenAIのモデルにもネイティブで対応するようになります。

Cortex AIの強みは場面場面で簡単に最適なAIのモデルを使い分けられるところです。
また、現時点で優れているAIのモデルであっても、将来もそうとは限りません。
Cortex AIを使えば、常に最先端のAIのモデルを選択できます。

Cortex AIはSnowflake内で使えるAIサービスの総称であり、いくつかの機能を内包しています。
* Cortex Search → RAGを使う
* Cortex Analyst → SQLを生成して分析を行う
* Cortex Agent → Cortex SearchとCortex Analystを柔軟に使い分ける
* Snowflake AI /ML Studio → GUIでAI開発
などなど

本来、いくつかのツールを使い分けなければいけないAI開発も、すべてSnowflakeの中で、一画面で実現できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/1ec141f3-70e7-4209-9854-bbd84b8ff31c.png)

# ハンズオン
GUI操作と、Snowflakeのエンジニアの方が作成したコードをコピペするだけで、簡単に生成AIを活用したチャットボットを作成できます。
ハンズオンで使うコードは以下からクローンできます。

https://github.com/tsubasa-tech-gh/AIMorningWorkshop

## シナリオ
本ワークショップのハンズオンでは、架空のスーパーマーケットチェーン「SNOWRETAIL」のデータを元に生成AIを用いたお問い合わせ対応チャットボットを作成しました。

## Snowflakeを無料でセットアップ
https://signup.snowflake.com/

まずは上記ページから400ドル相当の使用分が無料で含まれている、30日間のSnowflake無料トライアルを始めましょう。

上記ページで必要事項を記入します。
クラウドプロバイダーは「AWS」、地域は「US East (Ohio)」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/553d4a88-328e-41ee-8d79-a69db845f505.png)

:::note warn
**クラウドプロパイダー・地域選択**
クラウドプロパイダー・地域ごとに、利用できる機能に差があります。
後述のハンズオンを実践するには「AWS」、「US West (Oregon)」を選択してください。
:::

記入したメールアドレス宛にログインリンクが送られます。
メールの指示に従ってログインしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/dcb6e316-a903-47dd-bab6-fbab42c9b1e9.png)

アンケートの回答も求められますが、回答は任意です。スキップしてもかまいません。

## snowsightを日本語化
前述のメールから、SnowflakeのWeb UI「snowsight」にログインします。
初期状態では言語設定が英語になっています。
日本語の方が読みやすいという方は、左下の自身のアイコン > My profileをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/53edaa78-d289-4d87-9b7b-acaa23e9afb1.png)

:::note info
**ダークモード**
My profileの2つ下、Appearanceからダークモードの設定もできます。
:::

Languageのプルダウンから日本語を選択し、Saveボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/c7f12d53-3923-481d-ae6c-0587a0271b5e.png)

## 各種オブジェクトの作成
ハンズオンで使う各種オブジェクトを、下記パラーメーターシートに沿って作成していきます。

```text:handson_parameter.txt
# コピペ用各種パラメーター

## DBオブジェクト関連

データベース名： snowretail_db

スキーマ名: snowretail_schema

テーブル名: 
  - snow_retail_documents
  - snow_retail_documents_chunked

ウェアハウス名: compute_wh

Cortex SearchのService名: snow_retail_search_service
```
https://github.com/tsubasa-tech-gh/AIMorningWorkshop/blob/main/handson_parameter.txt

### データベースを作成
左側タブ　データ > データベース を選択し、右上「＋データベース」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/0cefd621-ef79-4d20-9b40-5df1f42ca699.png)

「snowretail_db」という名前で新しいデータベースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/72b327cd-52c2-4182-879c-2e8fb7cf897b.png)

:::note warn
**大文字と小文字の区別**
Snowflakeではオブジェクトの識別子を引用符で囲まない場合、大文字として保存および解決されます。
例1：`snowretail_db`は`SNOWRETAIL_DB`として保存および解決
例2：`"snowretail_db"`は`snowretail_db`として保存および解決

詳しくは以下を参照
https://docs.snowflake.com/ja/sql-reference/identifiers-syntax
:::

### スキーマを作成
先ほど作成した「snowretail_db」というデータベースをクリックすると、データベースの詳細が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/3a19dc20-ff52-4f96-b2e3-3abb0560866f.png)

右上「＋スキーマ」ボタンをクリック。
パラメーターシートに記載の通り、「snowretail_schema」という名前で新しいスキーマを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/ec5e3141-5564-4e77-9877-4bd0e883cdb0.png)

### テーブルを作成
先ほど作成した「snowretail_schema」というスキーマをクリックすると、スキーマの詳細が表示されます。
右上のボタンを 作成 > テーブル > ファイルから の順でクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/5383ea4f-f229-4e7f-959d-e9f3aab78cf3.png)

以下のファイルを保存後選択し、「snow_retail_documents」という名前で「次へ」をクリック。

https://github.com/tsubasa-tech-gh/AIMorningWorkshop/blob/main/snow_retail_documents.csv

![スクリーンショット 2025-05-12 154954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/d68c1d0e-ddd1-488b-9084-c0e451f1c3c0.png)

遷移先画面で、規定値のまま「ロード」をクリックして新しいテーブルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/619a0694-2149-4bff-9344-e67f80a2f1ac.png)

同様の手順で、以下のファイルから「snow_retail_documents_chunked」という名前で新しいテーブルを作成します。

https://github.com/tsubasa-tech-gh/AIMorningWorkshop/blob/main/snow_retail_documents_chunked.csv

### Cortex Searchのサービスを作成
左側タブ AIとML > Studio を選択し、Cortex検索「▶試す」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/fcd1f0b1-a22b-481e-b39e-cfe2183bd0fa.png)

遷移先の画面で右上「作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/351b99d4-a148-4fd7-a72a-bac9c8eaa85a.png)

ロールとウェアハウスは規定値のモノを使用。
データベースとスキーマは先ほど作成した「snowretail_db.snowretail_schema」を選択。
名前は「snow_retail_search_service」とし、「次へ：Select data」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/f08c1415-9d64-43ca-9700-47556d623933.png)

インデックスを作成するデータは「snow_retail_documents_chunked」を選択し、「次へ：Select search column」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/38e5aaa9-c650-4017-bfbf-ea4300d54c4d.png)

検索列は「chunked_content」を選択し、「次へ：Select attributes」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/247d77fe-f994-44df-9e5b-c25569b25847.png)

属性列は「title」、「document_type」、「department」を選択し、「次へ：列を選択」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/7a043731-afdd-4fbc-a051-e8e4e4be46bb.png)

サービスに含む列はすべて選択し、「次へ：Configure indexing」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/dc121cd5-6af3-4184-9c7b-38c15348c54f.png)

最後に、検索サービスを構成です。
ターゲットラグを1 daysに設定。
埋め込みモデルは「snowflake-arctic-embed-l-v2.0」を選択します。
「検索サービスの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/aee46fbb-442b-4297-90d5-806dc194d1d2.png)

:::note warn
**ターゲットラグ**
ターゲットラグとは、サービスがソースデータの更新を確認する頻度のことです。
頻度が高いとコストがかかってしまいます。
:::

:::note warn
**埋め込みモデル**
v1.5も選択できますが、こちらは英語のみの対応となっています。
日本語を扱いたい場合は必ずv2.0を選択しましょう。
:::

## Streamlitアプリの作成
### Streamlitとは
Streamlitとは、手軽にデータ分析を行うWebアプリが作成できる、オープンソースのPythonフレームワークです。
Snowflakeがこれを買収し、「Streamlit in Snowflake」として、SnowflakeのWeb UI内でアプリ開発ができる機能を提供しています。

### Streamlitアプリの作成
左側タブ プロジェクト > Streamlitを選択し、右上「＋Streamlitアプリ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/6ae691d3-5a70-4167-9231-41dab9a4ceef.png)

アプリタイトルは任意です。ここでは、「チャットボットアプリ」とでもしておきましょうか。
アプリの場所は、「snowretail_db」、「snowretail_schema」です。
ウェアハウスは規定値のままでOKです。
「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/38878cc2-82c2-4c0a-a813-9a795c716af2.png)

### コーディング
初期状態では、サンプルコードと、その実行結果が表示されています。
サンプルコードは削除して、以下のコードをコピペしてください。

https://github.com/tsubasa-tech-gh/AIMorningWorkshop/blob/main/sis_snowretail_rag_mvp.py

### Anacondaパッケージをインストール
Streamlit in Snowflakeでは、Anacondaを用いたPythonの各種ライブラリのインストールが手軽にできます。
今回は「snowflake-ml-python」と、「snowflake.core」をインストールします。
バージョンは共に選択できる中で最新のもので結構です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/6de0f3ee-f530-4194-9c8f-c19b2ba36317.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/c25cc55a-56e5-4894-95e1-86b298d7d6ad.png)

### 実行
右上「▶実行」をクリック。
チャットボットアプリが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/a500366e-6c3e-43e2-aa4c-336e8a18f4d8.png)

## チャットボットアプリを試してみる
アプリ内画面左上の「>」をクリックすると、「社内問い合わせチャットボット」を選択できます。
ここでは、前述までの手順で取り込んだsnowretailのドメイン情報を元に、チャットの回答が生成されます。
では、実際にsnowretailの社内規則について聞いてみましょう。（下画像参照）
![社内規則について聞いてみよう](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/65dca8f2-cc0a-4e37-9424-b722b3b9eee6.png)
> snowretailの社内規則について教えて

という問いに対して、
> スノーリテールの主な社内規則について、提供された文書から以下の重要なポイントをご説明します...

といったように、ドメイン情報を元にした適切な回答がされていることが確認できました！

インプットしたドメイン情報はまだまだありますので、ここまでワークショップをなぞった方は別の質問も試してみてください！

:::note info
**画面構成の変更**
左下の3つのボタンから、サイドバー、エディタ、プレビューを開閉できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4081698/87399365-e0d2-4c8a-852d-2df0e7131ef5.png)
:::

# 所感
SnowflakeはDWHとしてのデータを蓄積する機能はもちろん、蓄積したデータからAIを用いてビジネス価値の創出を行うための機能が備わっていることがよく分かります。
これらの機能は追加のライセンス等なしに、ログインが完了したその瞬間から使えるようになっているのが魅力的ですね！
また、たったこれだけの手順でチャットボットが完成してしまうほど簡単です。

私も今回のコードを改造して、自社のデータでもチャットボットを作成してみたいと思います:v:

# We Are Hiring!
BIPROGYグループでは一緒に働く仲間を募集しています。ご興味ある方は下記をご参照ください。

https://www.biprogy.com/recruit/recruiting/