0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?