Slide 1

Slide 1 text

NL2SQLの世界 生活協同組合コープさっぽろ 2025/03/14 小森一成(@icckx) 第41回 JAWS-UG札幌 勉強会

Slide 2

Slide 2 text

小森 一成(@icckx)

Slide 3

Slide 3 text

今日は生成AIのRAGの話です (みなさん、そろそろN回目?)

Slide 4

Slide 4 text

RAG(検索 拡張 生成) 生成AIが知るはずがない情報を、事前に検索して 指示プロンプトに得た検索結果を追加拡張してから、 テキストを生成する N回目だと思うので雑めに説明すると...

Slide 5

Slide 5 text

NL2SQL しってる方?✋ 本題

Slide 6

Slide 6 text

NL2SQL(Natural Language to SQL) 自然言語(ユーザーが普段使う言葉)で書かれた質問や命令を、 データベースから情報を取得するためのSQLクエリに変換する技術 別名:Text-to-SQL / Semantic Parsing

Slide 7

Slide 7 text

RAGの全体像 https://github.com/bRAGAI/bRAG-langchain/

Slide 8

Slide 8 text

今日のはなし https://github.com/bRAGAI/bRAG-langchain/

Slide 9

Slide 9 text

RAG: Vector / NL2SQL の違い Vector NL2SQL / Text-to-SQL / Semantic Parsing わがはいは 猫 わがはいは 犬 猫 類似度 検索 1月の売上は? SQL 生成 自然言語から類似度が高いベクトルを検索 自然言語から最適なSQLを生成

Slide 10

Slide 10 text

RAG: Vector / NL2SQL の違い Vector わがはいは 猫 わがはいは 犬 猫 類似度 検索 自然言語から類似度が高いベクトルを検索 NL2SQL / Text-to-SQL / Semantic Parsing 1月の売上は? SQL 生成 【大きな違い】 SQLでデータ集計(SUM)できる ↓ 生成AIで数字のビックデータを 「柔軟に」扱える!!! SQLだから計算ハルシネーション なし!

Slide 11

Slide 11 text

knowledge base with structured data store Amazon Bedrock Amazon Redshift +

Slide 12

Slide 12 text

knowledge base with structured data store 〜 AWS版のNL2SQLによるRAG構築手段 〜 Users SQL 生成&実行 Amazon Bedrock Amazon Redshift 返答 DB/Table スキーマ定義 SQL 生成時のメタデータ SQL実行履歴 データの扱われ方を理解 Descriptions テーブルまたは列名へ説明拡張 Inclusions/exclusions SQL 生成の対象または除外にしたい テーブル名や列名を明示 Curated queries 事前に想定される質問と期待される SQL の情報をキュレーションされた クエリとして登録 GenerateQuery API : $2/1000 Query , Generative AI model selection not available Optional 参考:https://qiita.com/hayao_k/items/460bf6aa8b0424eb0d82

Slide 13

Slide 13 text

作成してみる。

Slide 14

Slide 14 text

Create User + GRANT → DB同期 CREATE USER "IAMR:KBロール名" WITH PASSWORD DISABLE; GRANT SELECT ON sales TO "IAMR:KBロール名"; GRANT SELECT ON date TO "IAMR:KBロール名"; knowledge base Role A Amazon Redshift sales User Role A date ※ KBロール名ユーザーを作ることでで接続できます

Slide 15

Slide 15 text

実行してみる(マネジメントコンソールから) SELECT "date".month, SUM(public.sales.pricepaid) AS total_sales FROM public.sales JOIN public.date ON public.sales.dateid = public.date.dateid GROUP BY "date".month; 17万件をサマリ

Slide 16

Slide 16 text

SQLはあっているが、Claudeが嘘をつかないかは別の話 あれ、10月より3月の売上のほうが高いよね ...

Slide 17

Slide 17 text

検索失敗も... SELECT SUM(pricepaid) AS total_sales FROM public.sales INNER JOIN public.date ON public.sales.dateid = public.date.dateid WHERE public.date.month = 'Jan'; 1月の合計を教えてと伝えても、すべて大文字にな らず、検索が失敗した。 ※本当は”JAN”で検索してほしかった どうすべきか?

Slide 18

Slide 18 text

検索失敗の原因:値の仕様による検索失敗 SELECT SUM(pricepaid) AS total_sales FROM public.sales INNER JOIN public.date ON public.sales.dateid = public.date.dateid WHERE public.date.month = 'Jan'; DBの値がJANとすべて大文字であり検索が失敗した。 どうすべきか?

Slide 19

Slide 19 text

Optionを追加....しても動かなかった monthとは 3文字で大文字と教えてみた 1月限定で実行すべき SQLを 指定してみた

Slide 20

Slide 20 text

解決方法1:システム的な指示プロンプトにする SELECT SUM(pricepaid) AS total_sales FROM public.sales INNER JOIN public.date ON public.sales.dateid = public.date.dateid WHERE public.date.month = 'JAN'; エンドユーザーがつかわない 内部構造を知っているような自然言語指示 ↓ ”JAN” といった具合に、 ダブルクォーテーションでくくると SQL変換がやりやすいのか意図した動きになった 自然言語指示 指示拡張層 knowledge base できればやりたくない...

Slide 21

Slide 21 text

解決方法2:DB側の定義にコメントをつける COMMENT ON COLUMN public.date.month IS '3-letter uppercase month abbreviation (e.g. JAN, FEB, MAR...)'; ↑ RedShift のTableにコメントを付けて同期した

Slide 22

Slide 22 text

knowledge base with structured data store 〜 AWS版のNL2SQLによるRAG構築手段 〜 Users SQL 生成&実行 Amazon Bedrock Amazon Redshift 返答 DB/Table スキーマ定義 SQL 生成時のメタデータ SQL実行履歴 データの扱われ方を理解 Descriptions テーブルまたは列名へ説明拡張 Inclusions/exclusions SQL 生成の対象または除外にしたい テーブル名や列名を明示 Curated queries 事前に想定される質問と期待される SQL の情報をキュレーションされた クエリとして登録 GenerateQuery API : $2/1000 Query , Generative AI model selection not available Optional 参考:https://qiita.com/hayao_k/items/460bf6aa8b0424eb0d82 解決1 解決2 解決せず... 解決せず...

Slide 23

Slide 23 text

まとめ ● 売上など集計したいビックデータなら NL2SQL ○ 大量データを1度に扱える ○ 数値計算ミスが絶対おきない ● 文字列など、値を条件に分岐する SQLは失敗リスク ○ DB側をきれいな世界に持っていくと成功率向上 ● お手軽にお試し可能 ○ RedShift Serverless $0.00 / month(17万件、数十回の実行) ○ KnowledgeBase $0.03 / month(数十回の実行)

Slide 24

Slide 24 text

NL2SQLの世界 生活協同組合コープさっぽろ 2025/03/14 小森一成(@icckx) 第41回 JAWS-UG札幌 勉強会