Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cortex_Searchを活用したメタデータ検索Chatbot開発.pdf

Ayumu Yamaguchi
March 11, 2025
37

 Cortex_Searchを活用したメタデータ検索Chatbot開発.pdf

Ayumu Yamaguchi

March 11, 2025
Tweet

Transcript

  1. 自己紹介 【経歴】 営業職     :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/ 【趣味】 音楽 筋トレ 山口歩夢 ※本日の発表はあくまでも個人の見解です
  2. Cortex SearchでRAGを実装 • Snowflake上のデータに対して、曖昧検索を可能にする • ハイブリッド検索を簡単に実現可能 ◦ 以下を自動で行ってくれる ▪ ベクトル化

    ▪ ハイブリッド検索:ベクトル検索 + キーワード検索 ▪ リランキング:結果セットの中で関連性の高い文書を上位に表示 Cortex Searchとは
  3. 手順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開発
  4. • 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開発
  5. 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開発
  6. 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開発
  7. 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開発
  8. (例) 手順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開発
  9. 手順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開発
  10. • LLM関数だけで実装した時よりも精度が上がった ◦ 抽象的な質問に正確に答えてくれる ◦ クエリも書いてくれるようになった • データをSnowflake外に出さずにChatbotを実装できる ◦ セキュリティ的にも安心

    ◦ 外部のLLMサービスに繋ぐ手間が不要 • 検索対象のメタデータ整備が非常に重要 • Streamlitを使ったChatbotの導入は非常に簡単 ◦ Streamlitを使ったChatbotのサンプルコードが多く公開されている ◦ サンプルコードが無くても、 Streamlitならアプリを簡単に作れる 実装結果・まとめ 実装結果 今後の展望 • チャンキングに挑戦したい ◦ 大きなトークンのデータをチャンキングして精度を上げてみたい • ファインチューニングを試したい ◦ トークンが大きくなってきたら商品名などは RAGではなくて、ファインチューニングを使うべき ?
  11. • 固定長チャンク化(Character Splitting) ◦ 最も簡単な方法。チャンクのトークンのサイズを決めてチャンキングする • 再帰的文字チャンク化( Recursive Character Splitting)

    ◦ 改行や句読点を考慮して適切なサイズにチャンキングする • ドキュメントベースのチャンク化( Document-Based Chunking) ◦ 文章の構造(Markdownなど)を把握してチャンキングする • 意味的チャンク化(Semantic Chunking) ◦ 文脈の意味を理解しながらチャンキングする • エージェント型チャンク化( Agenting Chunking) ◦ LLMを活用して文脈を理解しながら最適なサイズでチャンキングする 2.メタデータを入れる 実装 色々なチャンキング方法が存在。 試行錯誤しながら精度が上がる方法を探す必要がある。