Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cortex_Searchを活用したメタデータ検索Chatbot開発.pdf
Search
Ayumu Yamaguchi
March 11, 2025
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cortex_Searchを活用したメタデータ検索Chatbot開発.pdf
Ayumu Yamaguchi
March 11, 2025
More Decks by Ayumu Yamaguchi
See All by Ayumu Yamaguchi
【Streamlit x Snowflake】データ基盤からアプリ開発・AI活用まで、すべてをSnowflake内で実現
ayumu_yamaguchi
1
180
Streamlitで実現できるようになったこと、実現してくれたこと
ayumu_yamaguchi
2
740
Streamlitの入門書を執筆した話
ayumu_yamaguchi
1
240
Streamlitで開発した自作データカタログの導入
ayumu_yamaguchi
4
1.1k
Streamlitのデータカタログが社内にもたらした変化
ayumu_yamaguchi
1
1.8k
StreamlitとTerraformでデータカタログを作った話
ayumu_yamaguchi
1
3k
Streamlitを使ってデータカタログを作ってみた
ayumu_yamaguchi
1
660
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
570
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Ruling the World: When Life Gets Gamed
codingconduct
0
250
Building Adaptive Systems
keathley
44
3k
Scaling GitHub
holman
464
140k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Statistics for Hackers
jakevdp
799
230k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
GraphQLとの向き合い方2022年版
quramy
50
15k
Leo the Paperboy
mayatellez
7
1.8k
Transcript
SnowVillage Data Heroes Talk ~ SnowflakeのAI/LLMについて語ろう! 2025.03.10 山口歩夢 Cortex Searchを活用したメタデータ検索
Chatbot開発
自己紹介
自己紹介 【経歴】 営業職 :4年程 データエンジニア:3年程 【発信】 著書 :Streamlit入門 Pythonで学ぶデータ可視化 &アプリ開発入門 ブログ
:https://qiita.com/Ayumu-y X(旧Twitter) :https://x.com/Yamaguchi_aaaaa Snowflake Squad:https://www.snowflake.com/en/snowflake-squad/ 【趣味】 音楽 筋トレ 山口歩夢 ※本日の発表はあくまでも個人の見解です
Cortex Searchを活用した Chatbotを作成するまでの経緯
経緯 Cortex Searchを活用した Chatbotを作成するまでの経緯 • SnowflakeのCOMMENT機能内のメタデータを曖昧検索したい ◦ COMMENTのメタデータはデータカタログから閲覧 ▪ データカタログのソースコードは公開されている
(https://github.com/genda-tech/sample-data-catalog) • LLM関数を活用してRAGを実装しようとしたが精度が上がらなかった
• メタデータをEMBED_TEXT関数でベクトル化して DBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細を
contextとしてpromptに埋め込む • COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
• メタデータをEMBED_TEXT関数でベクトル化してDBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細を contextとしてpromptに埋め込む
• COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
• メタデータをEMBED_TEXT関数でベクトル化して DBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細を
contextとしてpromptに埋め込む • COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
• メタデータをEMBED_TEXT関数でベクトル化して DBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細を
contextとしてpromptに埋め込む • COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
• メタデータをEMBED_TEXT関数でベクトル化して DBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細をcontextとしてpromptに埋め込む
• COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
• メタデータをEMBED_TEXT関数でベクトル化して DBに挿入 • ユーザーの質問をEMBED_TEXT関数でベクトル化 • ユーザーの質問のとメタデータの類似度が高いメタデータを VECTOR_COSINE_SIMILARITY関数で抽出 • 抽出したメタデータ詳細を
contextとしてpromptに埋め込む • COMPLETE関数でpromptを実行 Cortex Searchを活用しない RAG Cortex Searchを活用した Chatbotを作成するまでの経緯
高い精度を出せなかった Cortex Searchを活用した Chatbotを作成するまでの経緯
Cortex Searchを活用した Chatbotを作成するまでの経緯 https://www.snowflake.com/ja/blog/cortex-search-ai-hybrid-search/ Cortex Searchによる ハイブリッド検索で 12%精度が向上
Cortex Searchを活用した Chatbotを作成するまでの経緯 Cortex SearchでRAGxChatbot実装してみよう!
Cortex SearchでRAGを実装
Cortex SearchでRAGを実装 • Snowflake上のデータに対して、曖昧検索を可能にする • ハイブリッド検索を簡単に実現可能 ◦ 以下を自動で行ってくれる ▪ ベクトル化
▪ ハイブリッド検索:ベクトル検索 + キーワード検索 ▪ リランキング:結果セットの中で関連性の高い文書を上位に表示 Cortex Searchとは
• 自然言語でユーザーが質問 • ハイブリッド検索で抽出した contextをpromptに埋込 • COMPLETE関数でpromptを実行 Cortex SearchでRAGを実装 Cortex
Searchを活用した RAG
Cortex SearchでRAGを実装 • 自然言語でユーザーが質問 • ハイブリッド検索で抽出した contextをpromptに埋込 • COMPLETE関数でpromptを実行 Cortex
Searchを活用した RAG
Cortex SearchでRAGを実装 • 自然言語でユーザーが質問 • ハイブリッド検索で抽出したcontextをpromptに埋込 • COMPLETE関数でpromptを実行 Cortex Searchを活用した
RAG
Cortex SearchでRAGを実装 • 自然言語でユーザーが質問 • ハイブリッド検索で抽出した contextをpromptに埋込 • COMPLETE関数でpromptを実行 Cortex
Searchを活用した RAG
Chatbot開発
Chatbot開発 実装手順 1. ベクトルデータベース・テーブルの CREATE 2. メタデータを入れる 3. Cortex SearchのCREATE
4. StreamlitでChatbot作成
実装手順 1. ベクトルデータベース・テーブルの CREATE 2. メタデータを入れる 3. Cortex SearchのCREATE 4.
StreamlitでChatbot作成 Chatbot開発
手順1.ベクトルデータベース・テーブルの CREATE CREATE DATABASE CORTEX_SEARCH_DB; CREATE OR REPLACE TABLE CORTEX_SEARCH_DB.PUBLIC.TABLE_METADATA
( table_name STRING COMMENT 'Snowflakeテーブルの名前 ', table_usage VARCHAR COMMENT 'データベース、スキーマ、テーブルに関する詳細な説明や使用例。 ' ); • ベクトルデータベースとして使用する DB・テーブルを作成 ◦ テーブル名とメタデータを入れるカラムを作成 Chatbot開発
• COMMENT内のメタデータをCREATEしたテーブルに挿入 ◦ Chatbot開発にフォーカスするため、今回はサンプルを INSERT INSERT INTO CORTEX_SEARCH_DB.PUBLIC.TABLE_METADATA (table_name, table_usage)
VALUES -- Customer Data Mart ('customer_transaction', 'customer_transactionテーブルは顧客の取引に関する詳細な記録を保持しています。主なカラムには、 transaction_id(取引のユニーク識別子)、 customer_id(特定の顧客に関連付けられた取引識別子)、 purchase_date(取引の日付)、 purchase_amount(取引金額)、 product_category(購入した商品のカテゴリ)、 sales_region(販売が行われた地域)が含まれます。このテーブルは、顧客の購買行動の分析、顧客のセグメンテーション、売上の予 測、マーケティングキャンペーンの効果測定に適しています。 '), ('customer_profile', 'customer_profile テーブルは基本的な顧客情報を保持しています。主なカラムには、 customer_id(顧客のユニーク識別子)、 name(顧客のフルネーム)、 age(顧客の年齢)、 gender(顧客の性別)、 address(顧客の住所)、 signup_date(顧客が登録した日付)が含まれます。このテーブルは、顧客のセグメンテーション、人口動態パターンの分析、ターゲット戦略、顧客維持の努力に適しています。 '), -- Sales Data Mart ('sales_revenue_summary', 'sales_revenue_summaryテーブルは全てのプロダクトの売上データを集計したサマリーを保持しています。主なカラムには、 sales_id(売上記録のユニーク識別子)、 total_revenue(取引から生成された総売上)、 sales_date(取引の日付)、 product_id(販売された商品の識別子)、 sales_channel(取引が行われたチャネル、例:オンライン、店舗)が含まれます。このテーブルは、全体的な売上パフォーマンスの分析、トレンド検出、異なる商品、チャネル、期 間における売上予測に適しています。 '), ('regional_sales_performance', 'regional_sales_performance テーブルは地域ごとの売上パフォーマンスを提供します。主なカラムには、 region_id(地域ごとのユニーク識別子)、 revenue(地域の総売上)、 transaction_count(取引数)、 average_transaction_value(地域ごとの平均取引額)が含まれます。このテーブルは、地域別の売上パフォーマンス分析、市場浸透の評価、高パフォーマンス地域の特定に適しています。 '), ('xphone_pro_sales', 'xphone_pro_salesテーブルは「XPhone Pro」の売上データを保持しています。主なカラムには、 sales_id(売上記録のユニーク識別子)、 customer_id(購入した顧客の識別子)、 sales_date(取引の日付)、 sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、 sales_channel(販売チャネル、例:公式オンラインストア、家電量販店)が含まれます。このテーブルは、「 XPhone Pro」の販売パフォーマンスの分析、需要予測、マーケ ティング施策の効果測定に適しています。 '), ('ultrabook_x_sales', 'ultrabook_x_salesテーブルは「UltraBook X」の売上データを保持しています。主なカラムには、 sales_id(売上記録のユニーク識別子)、 customer_id(購入した顧客の識別子)、 sales_date(取引の日付)、 sales_quantity (販売数量)、 unit_price(単価)、total_sales(合計売上額)、 sales_channel(販売チャネル、例: ECサイト、直営店)が含まれます。このテーブルは、「 UltraBook X」の売上動向分析、ターゲット市場の特定、価格戦略の最適化に適しています。 '), ('soundwave_air_sales', 'soundwave_air_salesテーブルはワイヤレスイヤホン「 SoundWave Air」の売上データを保持しています。主なカラムには、 sales_id(売上記録のユニーク識別子)、 customer_id(購入した顧客の識別子)、 sales_date (取引の日付)、 sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、 sales_channel(販売チャネル、例: ECサイト、家電量販店)が含まれます。このテーブルは、「 SoundWave Air」の販売トレンドの把握、季節ごとの売上 分析、プロモーション効果の評価に適しています。 '), ('smartwatch_neo_sales', 'smartwatch_neo_salesテーブルはスマートウォッチ「 SmartWatch Neo」の売上データを保持しています。主なカラムには、 sales_id(売上記録のユニーク識別子)、 customer_id(購入した顧客の識別子)、 sales_date(取引の日付)、 sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、 sales_channel(販売チャネル、例:公式サイト、フィットネス専門店)が含まれます。このテーブルは、「 SmartWatch Neo」の販売動向の分 析、健康志向の顧客層の特定、フィットネス関連マーケティングの最適化に適しています。 ') ; 手順2.メタデータを入れる ※サンプル Chatbot開発
smartwatch_neo_sales smartwatch_neo_salesテーブルはスマートウォッチ「 SmartWatch Neo」の売 上データを保持しています。 主なカラムには、sales_id(売上記録のユニーク識別子)、 customer_id(購入し た顧客の識別子)、 sales_date(取引の日付)、sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、sales_channel(販売チャネル、
例:公式サイト、フィットネス専門店)が含まれます。 このテーブルは、「SmartWatch Neo」の販売動向の分析、健康志向の顧客層 の特定、フィットネス関連マーケティングの最適化に適しています。 (例) 手順2.メタデータを入れる メタデータには、詳細な情報を INSERTした • プロダクトの具体的な名称や具体的な用途 • テーブルの詳細 • テーブルの中のカラムの情報 Chatbot開発
smartwatch_neo_sales smartwatch_neo_salesテーブルはスマートウォッチ「 SmartWatch Neo」の売 上データを保持しています。 主なカラムには、sales_id(売上記録のユニーク識別子)、 customer_id(購入し た顧客の識別子)、 sales_date(取引の日付)、sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、sales_channel(販売チャネル、
例:公式サイト、フィットネス専門店)が含まれます。 このテーブルは、「SmartWatch Neo」の販売動向の分析、健康志向の顧客層 の特定、フィットネス関連マーケティングの最適化に適しています。 (例) 手順2.メタデータを入れる メタデータには、詳細な情報を INSERTした • プロダクトの具体的な名称や具体的な用途 • テーブルの詳細 • テーブルの中のカラムの情報 Chatbot開発
smartwatch_neo_sales smartwatch_neo_salesテーブルはスマートウォッチ「 SmartWatch Neo」の売 上データを保持しています。 主なカラムには、sales_id(売上記録のユニーク識別子)、 customer_id(購入し た顧客の識別子)、 sales_date(取引の日付)、sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、sales_channel(販売チャネル、
例:公式サイト、フィットネス専門店)が含まれます。 このテーブルは、「SmartWatch Neo」の販売動向の分析、健康志向の顧客層 の特定、フィットネス関連マーケティングの最適化に適しています。 (例) 手順2.メタデータを入れる メタデータには、詳細な情報を INSERTした • プロダクトの具体的な名称や具体的な用途 • テーブルの詳細 • テーブルの中のカラムの情報 Chatbot開発
(例) 手順2.メタデータを入れる メタデータには、詳細な情報を INSERTした • プロダクトの具体的な名称や具体的な用途 • テーブルの詳細 • テーブルの中のカラムの情報
smartwatch_neo_sales smartwatch_neo_salesテーブルはスマートウォッチ「 SmartWatch Neo」の売 上データを保持しています。 主なカラムには、sales_id(売上記録のユニーク識別子)、 customer_id(購入し た顧客の識別子)、 sales_date(取引の日付)、sales_quantity(販売数量)、 unit_price(単価)、total_sales(合計売上額)、sales_channel(販売チャネル、 例:公式サイト、フィットネス専門店)が含まれます。 このテーブルは、「SmartWatch Neo」の販売動向の分析、健康志向の顧客層 の特定、フィットネス関連マーケティングの最適化に適しています。 Chatbot開発
手順2.メタデータを入れる 今回はチャンキングを行わない • Snowflakeの公式ドキュメントによるとトークン数 512以下になるようにチャンキングすることを推奨 • 今回入れるメタデータは 250前後と小さめである (COUNT_TOKENS関数で測定) •
メタデータのトークン数が大きくなり、精度が低いと感じたら検討する。 Chatbot開発
手順3.Cortex SearchのCREATE • 用意したテーブルに CORTEX SEARCHを設定 ◦ ONに検索対象のカラム ◦ WAREHOUSEに、Refreshに使用する仮想ウェアハウス
◦ TARGET_LAGに、ベーステーブルが更新されてから Cortex Searchに反映されるまでの時間 CREATE CORTEX SEARCH SERVICE CORTEX_SEARCH_DB.PUBLIC.METADATA_SEARCH_SERVICE ON table_usage WAREHOUSE = COMPUTE_WH TARGET_LAG = '1 day' AS ( SELECT * FROM CORTEX_SEARCH_DB.PUBLIC.TABLE_METADATA ); Chatbot開発
• Streamlitのコードは公式ドキュメントで公開されている ◦ こちらのコードをほぼ流用すれば大丈夫 ◦ https://docs.snowflake.com/ja/user-guide/snowflake-cortex/cortex-search/tutorials/cortex-search-tutorial-2-chat#step-6-create-a-streamlit-app 手順4.StreamlitでChatbotを作成 ※チュートリアルが複数用意されている Chatbot開発
完成! メタデータについて問い合わせができる Chatbotの完成 Chatbot開発
実装結果・まとめ
• LLM関数だけで実装した時よりも精度が上がった ◦ 抽象的な質問に正確に答えてくれる ◦ クエリも書いてくれるようになった • データをSnowflake外に出さずにChatbotを実装できる ◦ セキュリティ的にも安心
◦ 外部のLLMサービスに繋ぐ手間が不要 • 検索対象のメタデータ整備が非常に重要 • Streamlitを使ったChatbotの導入は非常に簡単 ◦ Streamlitを使ったChatbotのサンプルコードが多く公開されている ◦ サンプルコードが無くても、 Streamlitならアプリを簡単に作れる 実装結果・まとめ 実装結果 今後の展望 • チャンキングに挑戦したい ◦ 大きなトークンのデータをチャンキングして精度を上げてみたい • ファインチューニングを試したい ◦ トークンが大きくなってきたら商品名などは RAGではなくて、ファインチューニングを使うべき ?
ありがとうございました!
• 固定長チャンク化(Character Splitting) ◦ 最も簡単な方法。チャンクのトークンのサイズを決めてチャンキングする • 再帰的文字チャンク化( Recursive Character Splitting)
◦ 改行や句読点を考慮して適切なサイズにチャンキングする • ドキュメントベースのチャンク化( Document-Based Chunking) ◦ 文章の構造(Markdownなど)を把握してチャンキングする • 意味的チャンク化(Semantic Chunking) ◦ 文脈の意味を理解しながらチャンキングする • エージェント型チャンク化( Agenting Chunking) ◦ LLMを活用して文脈を理解しながら最適なサイズでチャンキングする 2.メタデータを入れる 実装 色々なチャンキング方法が存在。 試行錯誤しながら精度が上がる方法を探す必要がある。