自然言語クエリから SQL ステートメントを生成するプロセス:[Claude 3 AIの活用 文章作成よ びビジネス業務]

自然言語クエリから SQL ステートメントを生成するプロセス



 Claude AI、ChatGPT、Geminiのような生成AIが、DBのスキーマ情報だけを使って自然言語クエリーやSQLステートメントを生成できるのは、非常に興味深く驚くべきことだ。 これにより、ユーザーには次のような利点がある:


1. ユーザビリティの向上

  • ユーザーは、SQL構文に精通することなく、自然言語を使ってデータベースに問い合わせることができます。


2. 開発のスピードアップ

  • 開発者はSQL文を1つ1つ記述することなく、自然言語クエリーだけで目的のデータを抽出することができ、開発プロセスがスピードアップします。


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. 自然言語クエリの理解

  • ユーザの自然言語クエリに現れるキーワードと DB スキーマのテーブル/カラム名を一致させる。

  • クエリで使用されている集約関数(SUM、AVG など)と条件(過去 1 年、上位 10 件など)を特定する。


2. SQL文の生成

  • 特定されたテーブル/カラム、集約関数、条件を組み合わせて、正しい構文のSQL文を自動的に生成します。

  • 必要に応じてテーブルJOINやサブクエリを使用する。


3. データ型を考慮する

  • 列のデータ型(INT、VARCHAR、DATEなど)を考慮して適切な操作や比較を行う。

  • 文字列を引用符で囲み、必要に応じて日付にデータベースに適した書式を使用する。


4. 検証と改良

  • 生成されたSQL文が文法的に正しく、実行可能であることを検証する。

  • セキュリティ・リスク(SQLインジェクションなど)となり得る内容を削除する。


自然言語クエリとそれに対応する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



コメント

このブログの人気の投稿

校正、編集、修正にクロードを使う::[Claude 3 AIの活用 文章作成よ びビジネス業務]

自然言語による大規模Gmailログの分析:[Claude 3 AIの活用 文章作成よ びビジネス業務]