自然言語クエリから SQL ステートメントを生成するプロセス
Claude AI、ChatGPT、Geminiのような生成AIが、DBのスキーマ情報だけを使って自然言語クエリーやSQLステートメントを生成できるのは、非常に興味深く驚くべきことだ。 これにより、ユーザーには次のような利点がある:
1. ユーザビリティの向上
2. 開発のスピードアップ
3. ビジネス洞察の発見
このように、生成AIのDBスキーマに基づく自然言語クエリやSQL文生成機能は、企業のデータ活用を革新する大きな可能性を秘めている。 この技術が開発、マーケティング、営業、企画など様々な分野で活用されれば、作業効率や意思決定のスピードが大幅に向上する。 今後、多くの企業がこの素晴らしいAI機能を競争的に導入し、ユースケースを生み出していくことが期待される。
クロードによるDBスキーマ情報の利用例
サンプルのDBスキーマは、anthropic site で公開されているTypical DB schema (Customers, Products, Orders, Orders_Items, Reviews)を使用しています。

DBスキーマのウェブサイトからテキスト全体をコピーし、Googleドキュメントに貼り付ける。 そして、Googleドキュメントに保存された内容をPDFファイルとしてエクスポートします。 その後、このPDFファイルをクロード(またはChatGPT)にアップロードし、コマンドを与えます: "10個の自然言語クエリとそれに対応するSQLステートメントを含むテーブルを作成する" 簡単でしょう?

(**このERD図は、クロードに"アップロードされたDBスキーマに対応するERDを描くPythonコードを生成してくれ "と依頼し、クロードが生成したPythonコードをコピーし、ChatGPTで実行することで作成されました。 **)
これにより、クロードはスキーマ情報に基づいて以下のことができる:
1. 自然言語クエリの理解
2. SQL文の生成
3. データ型を考慮する
4. 検証と改良
自然言語クエリとそれに対応するSQL文の例を20個紹介します:
Claude Prompt: 「20の自然言語とそれに対応するSQL文を表にしてください。
クロードの答え
自然言語クエリ | SQLステートメント |
平均注文金額が100ドル以上の顧客のメールアドレスを取得する | SELECT email<br>FROM Customers<br>WHERE customer_id IN (<br> SELECT customer_id<br> FROM Orders<br> GROUP BY customer_id<br> HAVING AVG(total_amount) >= 100<br>); |
在庫が最も少ない上位3つの商品カテゴリーを表示する | SELECT category<br>FROM Products<br>GROUP BY category<br>ORDER BY SUM(stock_quantity) ASC<br>LIMIT 3; |
従業員給与の部署別最高・最低給与額を教えてください。 | SELECT department,<br> MAX(salary) AS max_salary,<br> MIN(salary) AS min_salary<br>FROM Employees<br>GROUP BY department; |
前年同月比で最も売上が伸びた月は? | WITH monthly_sales AS (<br> SELECT DATE_FORMAT(order_date, '%Y-%m') AS month,<br> SUM(total_amount) AS sales<br> FROM Orders<br> GROUP BY DATE_FORMAT(order_date, '%Y-%m')<br>)<br>SELECT month, sales,<br> LAG(sales) OVER (ORDER BY month) AS prev_sales,<br> sales / LAG(sales) OVER (ORDER BY month) - 1 AS growth<br>FROM monthly_sales<br>ORDER BY growth DESC<br>LIMIT 1; |
新規顧客の割合が高い都市トップ5は? | SELECT city, <br> COUNT(CASE WHEN YEAR(NOW()) = YEAR(first_order_date) THEN customer_id END) / COUNT(*) AS new_customer_ratio<br>FROM (<br> SELECT c.city, c.customer_id, MIN(o.order_date) AS first_order_date<br> FROM Customers c<br> JOIN Orders o ON c.customer_id = o.customer_id<br> GROUP BY c.city, c.customer_id<br>) AS t<br>GROUP BY city<br>ORDER BY new_customer_ratio DESC<br>LIMIT 5; |
注文の多い日ランキング | SELECT DAYNAME(order_date) AS day_of_week, COUNT(*) AS order_count<br>FROM Orders<br>GROUP BY DAYNAME(order_date)<br>ORDER BY order_count DESC; |
3月の未入荷は? | SELECT SUM(total_amount) AS undelivered_total<br>FROM Orders<br>WHERE status != 'Delivered'<br> AND YEAR(order_date) = YEAR(CURDATE())<br> AND MONTH(order_date) = 3; |
カテゴリー別に在庫の少ない商品(在庫10個未満)のリストを表示する | SELECT p.product_name, p.category, p.stock_quantity <br>FROM Products p<br>WHERE p.stock_quantity < 10<br>ORDER BY p.category, p.stock_quantity; |
会員登録後、何も注文していない休眠顧客の数は? | SELECT COUNT(*) AS dormant_customers<br>FROM Customers c<br>LEFT JOIN Orders o ON c.customer_id = o.customer_id<br>WHERE o.order_id IS NULL; |
商品ごとの平均レビュースコアとレビュー数を表示する | SELECT p.product_name, <br> AVG(r.rating) AS avg_rating,<br> COUNT(r.review_id) AS review_count<br>FROM Products p<br>LEFT JOIN Reviews r ON p.product_id = r.product_id<br>GROUP BY p.product_id, p.product_name; |
2022年に注文した顧客の名前、Eメール、注文日、注文総額を表示 | SELECT c.first_name, c.last_name, c.email, o.order_date, o.total_amount<br>FROM Customers c<br>JOIN Orders o ON c.customer_id = o.customer_id<br>WHERE o.order_date BETWEEN '2022-01-01' AND '2022-12-31'; |
売れ筋商品トップ5の商品名、カテゴリー、販売数量を入手 | SELECT p.product_name, p.category, SUM(oi.quantity) AS total_quantity<br>FROM Products p<br>JOIN Order_Items oi ON p.product_id = oi.product_id<br>GROUP BY p.product_id<br>ORDER BY total_quantity DESC<br>LIMIT 5; |
平均評価4以上の商品の商品名、平均評価、レビュー数を取得します。 | SELECT p.product_name, AVG(r.rating) AS avg_rating, COUNT(r.review_id) AS review_count<br>FROM Products p<br>JOIN Reviews r ON p.product_id = r.product_id<br>GROUP BY p.product_id<br>HAVING AVG(r.rating) >= 4; |
注文ステータスが「出荷済み」の注文について、注文番号、顧客名、注文日、注文総額を取得する。 | SELECT o.order_id, c.first_name, c.last_name, o.order_date, o.total_amount<br>FROM Orders o<br>JOIN Customers c ON o.customer_id = c.customer_id<br>WHERE o.status = 'Shipped'; |
2023年上半期(1月~6月)と下半期(7月~12月)の売上合計を取得する。 | SELECT<br> SUM(CASE WHEN order_date BETWEEN '2023-01-01' AND '2023-06-30' THEN total_amount ELSE 0 END) AS first_half_revenue,<br> SUM(CASE WHEN order_date BETWEEN '2023-07-01' AND '2023-12-31' THEN total_amount ELSE 0 END) AS second_half_revenue<br>FROM Orders<br>WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; |
エレクトロニクス」カテゴリーの商品の平均価格を取得する | SELECT AVG(price) AS avg_price<br>FROM Products<br>WHERE category = 'Electronics'; |
2023年第1四半期(1月~3月)の注文で購入された商品の商品名、数量、販売総額を取得する | SELECT p.product_name, SUM(oi.quantity) AS total_quantity, SUM(oi.quantity * oi.price) AS total_sales<br>FROM Products p<br>JOIN Order_Items oi ON p.product_id = oi.product_id<br>JOIN Orders o ON oi.order_id = o.order_id<br>WHERE o.order_date BETWEEN '2023-01-01' AND '2023-03-31'<br>GROUP BY p.product_id; |
顧客一人当たりの注文総額が1000ドル以上の顧客のID、名前、注文総額を取得する | SELECT c.customer_id, c.first_name, c.last_name, SUM(o.total_amount) AS total_order_amount<br>FROM Customers c<br>JOIN Orders o ON c.customer_id = o.customer_id<br>GROUP BY c.customer_id<br>HAVING SUM(o.total_amount) >= 1000; |
2023年に注文した「ニューヨーク」の顧客の名前、Eメール、注文日を取得する | SELECT c.first_name, c.last_name, c.email, o.order_date<br>FROM Customers c<br>JOIN Orders o ON c.customer_id = o.customer_id<br>WHERE c.city = 'New York' AND o.order_date BETWEEN '2023-01-01' AND '2023-12-31'; |
在庫が10個未満の商品の名前、カテゴリー、価格、在庫数を取得する | SELECT product_name, category, price, stock_quantity<br>FROM Products<br>WHERE stock_quantity < 10; |
結論
Claudeのような生成AIモデルが自然言語クエリの意図を理解し、DBスキーマ情報を基に対応するSQL文を自動生成できるようになれば、企業は開発リソースを大幅に節約しつつ、データ活用を強化することができます。
非開発者も複雑なクエリを直接書くことなく、まるで同僚に尋ねるように自然言語でデータの検索や分析を行えるようになります。これによりデータの民主化が加速し、組織のより多くのメンバーがデータドリブンな意思決定を行えるようになるでしょう。
このプロセスは、RAG(Retrieval-Augmented Generation)の一部となる可能性があります。RAGは、膨大な外部知識を活用することで言語モデルの生成能力を向上させる手法です。外部のデータベースやドキュメントなどからクエリに必要な情報を見つけ出し、言語モデルに提供することで、より正確で豊かな回答を生成できるのです。
DBスキーマとデータを知識ソースとして活用すれば、ユーザークエリに基づいて実際のDBからデータを検索し、それに応じてSQL文と回答を生成するRAGシステムを実装することが可能になります。これは、単にSQL文を生成するだけでなく、実際のDBデータと連携したより強力な質問応答システムへと進化していく可能性を示唆しています。
今後、AI技術が進歩し、様々な外部知識と結びつくことで、ユーザーの複雑な要件を満たす包括的なデータ分析・質問応答ソリューションが登場することが期待されます。企業は、RAGのような最先端のAI技術を積極的に取り入れ、データ活用の競争力をさらに高めていく必要があるでしょう。
---------------------------------
"Claude 3 AIの活用:文章作成よ びビジネス業務" https://bit.ly/3wAY3mX
コメント
コメントを投稿