×
Community Blog Alibaba Cloud の Qwen で SQL クエリを生成する

Alibaba Cloud の Qwen で SQL クエリを生成する

このチュートリアルでは、Alibaba Cloud の Qwen モデルを使用して、自然言語から SQL クエリを生成する方法を説明します。

Gartner の生成 AI ランドスケープ:Quick Wins と Likely Wins

Gartner の “Quick Wins” フレームワーク

1
_出典:Gartner (2023)_

Gartner によると、“Quick Wins” は以下のようなユースケースです。

  • 中程度から高いビジネス価値を提供
  • 低いデプロイコスト、複雑さ、およびリスクが必要
  • 既存のツールとリソースで迅速に実装可能

これらのプロジェクトは、インフラストラクチャの大規模なオーバーホールを必要とせずに、生成 AI から ROI (Return On Investment) の早期達成を求める組織にとって理想的です。

“Quick Win” としての Text-to-SQL

Alibaba Cloud のソリューションは、Quick Win の例です。理由は以下のとおりです。

  1. 低い実装コスト:既存のデータベース (PostgreSQL など) と API (Qwen-Max) を使用します。
  2. 短期間で価値を実現:月単位ではなく時間単位でデプロイできます。
  3. 規模の影響:反復的な SQL タスクを自動化して、人件費とエラーを削減します。
  4. 最小限のリスク:現在のワークフローとシームレスに統合。破壊的な変更は必要ありません。

Gartner による 2024 年の生成 AI ユースケースの比較

2
_出典:Gartner, Inc. (2024)_

Gartner の分析では、コード生成 (text-to-SQL を含む) は、“Likely Wins” 象限、つまり高い実現可能性、高い価値、低いリスクに分類されます。 要点:

  • 高い実現可能性:Qwen-Max などのツールは、自然言語から SQL を確実に生成します。
  • 高いビジネス価値:繰り返しタスクを自動化し、エラーを減らし、データインサイトを高速化します。
  • 低リスク:複雑な AI アプリケーションと比較して、混乱が最小限に抑えられます。

Text-to-SQL が “Likely Wins” である理由

1. コスト効率

  • 手作業による労力の削減:開発者とアナリストは戦略的作業に集中できます。
  • 低いエラー率:AI で生成された SQL では、構文やロジックのエラーが最小限に抑えられます。

2. スケーラビリティ

  • レポートの自動化:ダッシュボードまたは監査に対して何千ものクエリを生成します。
  • 既存システムとの統合:PostgreSQL などのデータベースで動作します。

3. 短期間で価値を実現

  • すばやくセットアップ:Qwen-Max などの API を使用して時間単位でデプロイできます。
  • 最小限のトレーニング:ユーザーに必要とされるのは、基本的な自然言語スキルのみです。

結論:Text-to-SQL は戦略的な低リスク投資

組織が text-to-SQL ソリューションを採用することで、Gartner の推奨事項に合わせて、低リスクで影響の大きい AI への取り組みを優先できます。 自動化だけではなく、最小限の先行投資で生産性を高め、データ主導の意思決定を加速することができます。

より深い洞察については、Gartner のレポートをご覧ください。

この構造では、ビジネスの連携リスク軽減実用的な ROI が強調されています。経営幹部や意思決定者に最適です。

テクニカルディープダイブ:Text-to-SQL チャットボットの構築

SQL クエリ:すべての開発者が直面する問題

3

SQL クエリの作成には時間がかかり、エラーが発生しやすく、コストもかかります。 顧客データを分析する場合でも、レポートを生成する場合でも、自然言語による質問を SQL に変換するには、データベースを深く理解する必要があります。 AI を使用してこのプロセスを自動化し、コストを節約できるとしたらどうでしょうか。

この記事では、最先端の大規模言語モデル (LLM) である Alibaba Cloud Qwen3 (この例では Qwen-Max を使用) を活用した text-to-SQL チャットボット を構築します。 このチャットボットは、PostgreSQL データベースに接続し、人間によるクエリを SQL に変換し、結果を返します。SQL を 1 行も手動で書く必要はありません。

Alibaba Cloud の費用対効果の高い API 料金Qwen-Max の高い精度により、開発時間_と_クラウド費用の両方を削減できます。

ステップ 1:Alibaba Cloud Model Studio の使用を開始する

1.1 Model Studio にアクセスする

Alibaba Cloud にアクセスし、サインアップします。 ログイン後、Model Studio コンソール (リンク) に移動します。

1.2 API キーを生成する

[API Key Management] ページ (リンク) に移動し、新しい API キーを作成します。 API キーは安全に保管してください。Qwen-Max へのアクセストークンです。

1.3 Python 環境を設定する

仮想環境を作成し、依存関係をインストールします。

# 仮想環境の作成
python3 -m venv venv
source venv/bin/activate

# 必要なパッケージのインストール
pip install openai python-dotenv psycopg2-binary tabulate

以下の内容を requirements.txt に保存します。

openai
python-dotenv
psycopg2-binary
tabulate

1.4 Qwen-Max API をテストする

用意されたサンプルコードを使用して簡単なテストを実行し、API キーが機能することを確認します。

import os
from openai import OpenAI

try:
    client = OpenAI(
        # 環境変数が設定されていない場合は、次の行を API キーに置き換えます:api_key="sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
    )

    completion = client.chat.completions.create(
        model="qwen-plus",  # モデルリスト:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
        messages=[
            {'role': 'system', 'content': 'You are a helpful assistant.'},
            {'role': 'user', 'content': 'Who are you?'}
            ]
    )
    print(completion.choices[0].message.content)
except Exception as e:
    print(f"Error message: {e}")
    print("For more information, see: https://www.alibabacloud.com/help/en/model-studio/developer-reference/error-code")

ステップ 2:自動化のための PostgreSQL の設定

2.1 PostgreSQL で ApsaraDB for RDS インスタンスを作成します。

ApsaraDB for PostgreSQL を使用して、マネージド PostgreSQL インスタンスを設定します。 詳細については、こちらのドキュメントをご参照ください。

もう 1 つの方法は、このステップバイステップガイドに従って、Alibaba Cloud で PostgreSQL 17 データベースをプロビジョニングし、psql を使用してローカルマシンに接続することです。

ステップ 1:ApsaraDB RDS コンソールにアクセスする

4

  1. Alibaba Cloud コンソールにログインします。
  2. [ApsaraDB RDS] > [Quick Start] に移動します (図を参照)。

ステップ 2:データベースを設定する

上図に示すインターフェースを使用して、PostgreSQL 17 インスタンスを設定します。

設定 操作
リージョン リージョンを選択します (例:シンガポール)。
データベースエンジン [PostgreSQL] を選択し、ドロップダウンから [バージョン17] を選択します。
SLR 権限 セキュリティを強化するため、“Authorized” がチェックされていることを確認します。
エディション 冗長性を確保するため、[高可用性エディション] を選択します。
プロダクトタイプ ほとんどのユースケースでは、[Standard] を選択します。
ストレージタイプ 高性能 I/O 用の [高性能クラウドディスク] を選択します。
ネットワークタイプ 安全な分離のために [VPC] を選択します。
ホワイトリストに追加 [はい] を選択肢、ローカル IP または VPC からの接続を許可します。

ステップ 3:最終確認と起動

  1. 設定を確認し、[作成] をクリックします。
  2. インスタンスの状態が “実行中” になるまで待ちます (通常 5 ~ 10 分)。

ステップ 4:接続の詳細を取得する

インスタンスがアクティブになったことを確認し、

  1. ApsaraDB RDS コンソールの [概要] タブに移動します。
  2. [エンドポイント][ポート][ユーザー名]、および [パスワード] を確認します。

ステップ 5:psql でローカルに接続する

ローカルマシンに psql をインストールし (インストールされていない場合)、以下の方法で接続します。

psql -h <エンドポイント> -U <ユーザー名> -d <データベース名> -p <ポート>

それぞれのプレースホルダーをお客様の設定に合わせて置き換えます (例:デフォルトのデータベースを -d postgres に設定)。

作成できました!

詳細な設定については、Alibaba Cloud の公式ドキュメントをご参照ください。

2.2 PostgreSQL ツールをインストールする

macOS / Linux で、以下を実行します。

brew install postgresql  # macOS
sudo apt install postgresql-client  # Ubuntu

2.3 DVD レンタルサンプルデータベースを復元する

DVD レンタルサンプルデータベース をダウンロードして復元します。

# データベースを復元
pg_restore -U your_user -h your_host -p your_port -d dvdrental dump_file.tar

2.4 psql または pgAdmin でテストを実行する

サンプルクエリを実行して、すべてが正常に機能することを確認します。

SELECT * FROM film LIMIT 5;

ステップ 3:Text-to-SQL チャットボットをビルドする

3.1 コードの概要

以下は、Qwen-Max を使用して自然言語クエリを SQL に変換し、PostgreSQL で実行するスクリプトです。

import os
import psycopg2
from openai import OpenAI
from dotenv import load_dotenv
from tabulate import tabulate

load_dotenv()

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)

def generate_sql_query(natural_language_query):
    system_prompt = """
You are a helpful assistant trained to convert natural language queries into SQL statements.
The database schema includes the following tables:
- film_category (category_id, name)
- film (film_id, title, category_id)
- inventory (inventory_id, film_id, store_id)
- rental (rental_id, inventory_id, customer_id, return_date, rental_date)
- payment (payment_id, customer_id, staff_id, rental_id, amount, payment_date)

Generate a valid SQL query that answers the user's question.
"""

    response = client.chat.completions.create(
        model="qwen-max",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": natural_language_query}
        ],
        temperature=0.2
    )

    sql_query = response.choices[0].message.content.strip()

    # "```sql" と "```" の間の SQL を抽出
    start_marker = "```sql"
    end_marker = "```"
    start_idx = sql_query.find(start_marker)
    end_idx = sql_query.find(end_marker, start_idx + len(start_marker))

    if start_idx != -1 and end_idx != -1:
        sql_query = sql_query[start_idx + len(start_marker):end_idx]
    elif start_idx != -1:
        sql_query = sql_query[start_idx + len(start_marker):]
    elif end_idx != -1:
        sql_query = sql_query[:end_idx]

    sql_query = sql_query.strip()

    # 'select' キーワードにフォールバック
    if not sql_query.lower().startswith("select"):
        select_index = sql_query.lower().find("select")
        if select_index != -1:
            sql_query = sql_query[select_index:]

    return sql_query.strip()

def execute_sql_query(sql_query):
    conn = psycopg2.connect(
        dbname=os.getenv("DB_NAME"),
        user=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        host=os.getenv("DB_HOST"),
        port=os.getenv("DB_PORT")
    )
    cursor = conn.cursor()
    try:
        cursor.execute(sql_query)
        columns = [desc[0] for desc in cursor.description]
        rows = cursor.fetchall()
        return columns, rows
    except Exception as e:
        print(f"Error executing SQL: {e}")
        return [], []
    finally:
        cursor.close()
        conn.close()

def main():
    user_query = "show the sum of amount by each payment id that is greater then 10"
    print("Generating SQL query...")
    sql_query = generate_sql_query(user_query)
    print("Generated SQL:")
    print(sql_query)

    print("\nExecuting SQL query...")
    columns, rows = execute_sql_query(sql_query)

    if columns and rows:
        print("\nQuery Result:")
        print(tabulate(rows, headers=columns, tablefmt="psql"))
    else:
        print("No results returned.")

if __name__ == "__main__":
    main()

3.2 仕組み

  • generate_sql_query():Qwen-Max を使用して自然言語を SQL に変換します。
  • execute_sql_query():PostgreSQL に接続し、生成された SQL を実行します。
  • main():フローを調整します。

5

上図のような結果が得られるはずです。 このコードは、さらに開発および変更を行ってダッシュボードを作成することができ、また ChatBI と統合できます。 QuickBI の ChatBI ほど高度ではありませんが、悪くありません。

3.3 デバッグのヒント

  • Python で実行する前に、psql または pgAdmin で SQL 出力を直接テストします。
  • print(repr(sql_query)) を使用して隠し文字をデバッグします。

このソリューションでコストを節約できる理由

  1. 手作業の削減:開発者やアナリストが SQL クエリを作成する必要はありません。
  2. 低い API コスト:Qwen-Max は、速度の点で他の LLM と比較して魅力的であり、低コストで同様の精度が得られます。
  3. インフラを自動スケーリング:スケーリングは Alibaba Cloud のマネージドサービスで処理され、DevOps のオーバーヘッドが削減されます。

結論:Text-to-SQL の先へ

このチャットボットはほんの始まりに過ぎません。 Alibaba Cloud の Qwen シリーズを使用すると、以下のように拡張できます。

  • ChatBI:会話型ダッシュボードの作成。
  • エージェントシステム:関数の呼び出しによる、複雑なワークフローの自動化。
  • マルチモーダル AI:Qwen-VL で画像 / ビデオ分析を追加。

コストを削減し、生産性を高める準備はできましたか? この text-to-SQL チャットボットから始めて、AI を活用した自動化の可能性を最大限に引き出してみましょう。

次のステップ

  • Alibaba Cloud 環境でコードを試してみてください。
  • Qwen の高度な機能をご覧ください。
  • コメント欄でユースケースを共有しましょう。


この記事は英語から翻訳されました。 元の記事はこちらからご覧いただけます。

0 0 0
Share on

Regional Content Hub

119 posts | 4 followers

You may also like

Comments