Snowflake AI & ML StudioでLLMサービスを試してみた
はじめに
データ事業本部ビッグデータチームのkasamaです。
今回はSnowflake AI & ML Studioで簡単に動かせるLLMサービスを試していきたいと思います。
前提
SnowflakeのSnowflake AI & ML Studioでは、Cortex Playground
、Cortex Search Service
、Cortex Analyst
という3つのLLMサービスを簡単に試せます。
今回準備するデータは以前のブログで使用したsampleデータを活用します。
Cortex Playground
Cortex Playgroundは、モデル出力の比較やデータへの問い合わせができます。後で応答結果をみてもわかりますが、裏側ではLLM関数の1つであるCOMPLETE
関数を実行しています。
Cortex LLM Playground を使用するには、Snowflake Cortex LLM 関数を呼び出す権限を含む CORTEX_USER データベースロールが必要です。詳細については、以下をご確認ください。
まず、Snowsightにログインし、「AI & ML」→「Studio」→「Cortex Playground」を開きます。開いたら、試しに以下のpromptを実行してみます。
snowflakeについて教えて
「View Code」で確認するとCOMPLETE関数を実行していることがわかります。
右上の「Compare」というボタンからmodelを選択し、それぞれのmodelに対し同じ質問をして出力を比較することができます。
ちなみにmodelの選定については以下の記載が参考になりました。
次にtravel_reviews
tableへの問い合わせを試したいと思います。
プロンプトボックスの「+ Connect your data」ボタンをクリックします。
「Connect your Data Source」では、ドロップダウンからデータベースtravel_intelligence
、スキーマdata
、テーブルtravel_reviews
を選択します。
「Select a column with data to process」では、テキストデータカラムを選択します。今回はレビューの本文が含まれているreview_text
を選択します。
「Select a filter column」では、フィルターするための特定カラムを選択します。特定の目的地でフィルタリングするためにdestination
を選択します。
「Select DESTINATION」で沖縄を選択し、以下のシステムプロンプトを入力します。
以下のホテルレビューから、以下の情報を抽出してください:
1. 主なポジティブポイント(3つ)
2. 主なネガティブポイント(あれば2つまで)
3. このホテルの最も印象的な特徴
4. 改善すべき点(あれば)
箇条書きで簡潔にまとめてください。
こちらも先ほどと同様にCOMPLETE関数が実行されていました。
Create a Cortex Search Service
次にCortex Search Serviceを作成していきます。
Cortex Searchは、Snowflakeデータに対して低遅延で高品質な検索を可能にするサービスです。埋め込みやインフラメンテナンスを心配することなく、数分でハイブリッド(ベクトルとキーワード)検索エンジンを構築できます。主に検索拡張生成(RAG)とエンタープライズ検索の2つのユースケースに適しており、大規模言語モデルを活用したアプリケーションのための検索体験を提供します。
「AI & ML」→「Studio」→「Create a Cortex Search Service」を開きます。
今回はtravel_reviews
をsearch対象のtableとして選択します。
「Select a search column」では、検索対象となるテキストカラムであるREVIEW_TEXTを選択します。
以下のカラムを属性(Attribute)として選択します。
- CUSTOMER_NAME
- DESTINATION
- HOTEL_NAME
- RATING
- TRIP_TYPE
Attribute Columnsは、検索結果をフィルタリングするための条件として使用できるカラムです。ユーザーが検索クエリを入力すると、このテキスト列の内容に対して検索が行われます。例えば以下のフィルターです。
- 「沖縄のホテルのレビューだけを見たい」→ DESTINATION で「沖縄」をフィルター
- 「評価が4.5以上のレビューだけを見たい」→ RATING で「4.5以上」をフィルター
- 「家族旅行のレビューだけを見たい」→ TRIP_TYPE で「家族旅行」をフィルター
「Select columns to include in the service」では、全てのカラムを選択します。これらのカラムはすべて検索結果に含まれ、検索時にアクセスできるようになります。検索カラムと属性カラムは自動的に含まれますが、他のカラムも検索結果に表示したい場合は選択する必要があります。
「Configure your Search Service」では、Target Lag
の単位をhoursからminuteに変更します。この設定は元データが変更された場合に検索インデックスが更新される頻度を指定します。それ以外はデフォルトのまま設定完了となります。
試しにSQLワークシートでSQLを実行したところ、問題なく検索してデータを抽出できました。
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'TRAVEL_INTELLIGENCE.DATA.travel_review_search',
'{
"query": "温泉が素晴らしいホテル",
"columns": ["review_text", "hotel_name", "destination", "rating"],
"limit": 5
}'
)
)['results'] AS results;
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'TRAVEL_INTELLIGENCE.DATA.travel_review_search',
'{
"query": "露天風呂からの景色が美しい",
"columns": ["review_text", "hotel_name", "destination", "rating"],
"filter": {"@eq": {"destination": "北海道"}},
"limit": 3
}'
)
)['results'] AS results;
Cortex Analyst
最後にCortex Analystを試したいと思います。Cortex Analystは、自然言語で質問するだけでSnowflake内のデータから回答を得られる、LLMを活用したサービスです。ユーザーが自然言語で質問すると、Cortex Analystはそのテキストとsemantic modelをもとにSQLクエリを自動生成し、Snowflake内のデータを検索して回答を提供します。
semantic modelは、ビジネスユーザーの言葉とデータベーススキーマの間のギャップを埋めるための仕組みです。ビジネスユーザーは業務用語で質問しますが、データベースでは技術的な略語で保存されていることが多く、この乖離がCortex Analystの精度を下げる原因となっています。
- semantic modelの役割
- ビジネス用語とデータベースの紐付け: 「収益」が「純収益」を意味し、「先月」が「前の暦月」を意味するなどの定義を提供
- コンテキストの追加: データに関する追加の意味情報を提供し、質問の意図を正確に理解
- 高精度な回答の実現: 適切なマッピングにより、Cortex Analystが正確な回答を提供可能に
- semantic modelの構成要素
- 論理テーブル: 物理的なデータベーステーブルまたはビューを表現
- ファクト: 売上、コスト、数量などの数値データ
- ディメンション: 製品、顧客、場所などのカテゴリデータ
- 時間ディメンション: 日付、月、年などの時間関連データ
- フィルター: 特定のデータサブセットに結果を制限する条件
- メトリクス: ビジネスパフォーマンスを測定する指標(SUM()やAVG()などの集計関数を使用)
- リレーションシップ: 共有キーを通じて論理テーブル間を接続
semantic modelはyaml形式で定義され、読みやすくかつ技術的な概念を明確に定義できるバランスを取っています。Snowsightのsemantic model generatorを使用して簡単に作成することができます。
「AI & ML」→「Studio」→「Cortex Analyst」を開きます。StageとSemantic Viewsを選択できます。semantic modelの定義となるyamlをStageに持つか、Snowflake Managedな場所にViewとして持つかの違いだと思います。Semantic Viewsについては、最新機能なので、ドキュメントを確認できませんでした。今回は試す意味もありSemantic Viewsを選択し、「+Create new」を選択します。
「Location to store」では、travel_intelligence.data
を選択し、Name
はtravel_booking_analytics
、Description
は以下を入力します。
このセマンティックモデルは旅行予約データを分析するためのものです。予約状況、旅行タイプ別の売上、旅行代理店のパフォーマンス、キャンセル率などの分析に使用できます。旅行日、予約金額、旅行タイプなどの情報を含み、ビジネスユーザーが自然言語で旅行予約データに関する質問ができるようにします。
「Select tables」では、travel_intelligence.data.booking_metrics
を選択します。
「Select columns」では全てのカラムを選択します。
これでsemantic modelを自動で作成してくれました。「Edit yaml」を選択するとyamlファイルが参照できます。
試しに以下の質問してみました。回答のSQLを見る限りは正確に回答できていそうだと思いました。
旅行タイプ別の平均予約金額を教えて
キャンセル率が最も高い旅行代理店はどこですか?
旅行タイプごとの予約数を教えてください
保存後に、Schemaに紐づくSemantic Views
を確認すると作成したSemantic View
を確認することができます。
最後に
回答の精度や細かい動作までは確認できていませんが一通りの機能は確認できたので、参考になれば幸いです。