記事一覧に戻る
AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策
会員限定

AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策

AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策橋本裕也です。今回は、自然言語からSQL文を自動生成する「Text-to-SQL」技術について、実装方法とセキュリティ対策

2026年3月27日

AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策

僕は橋本裕也です。今回は、自然言語からSQL文を自動生成する「Text-to-SQL」という技術について、実装方法とセキュリティ対策を詳しく解説したいと思います。

AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策

Text-to-SQLとは

Text-to-SQLは、ユーザーが自然言語で書いた質問(例えば「2023年の売上が100万円以上の顧客を教えて」)をAIが解析して、自動的にSQL文に変換する技術です。これによってデータベースへのアクセスを非エンジニアにも開放でき、ビジネスインテリジェンスを広く活用できるようになります。

結論から言うと、OpenAIのGPT-4やAnthropicのClaudeといった大規模言語モデル(LLM)の進化が、これを実現させました。従来の正規表現やルールベースの手法では対応しきれなかった複雑な自然言語処理が、今ようやく可能になったという実感があります。

AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策

実装方法:基本的なアプローチ

1. LLMを使用したシンプルな実装

最も簡単なアプローチは、OpenAI APIを直接利用する方法です。以下がPythonの実装例になります。

import openai
import os

openai.api_key = os.getenv("OPENAI_API_KEY")

def natural_to_sql(question: str, schema: str) -> str:
    """
    自然言語をSQLに変換する関数
    
    Args:
        question: ユーザーの質問(自然言語)
        schema: データベーススキーマの定義
    
    Returns:
        生成されたSQL文
    """
    prompt = f"""以下のデータベーススキーマを参考に、
ユーザーの質問をSQLに変換してください。

スキーマ:
{schema}

質問: {question}

SQLのみを返してください(説明は不要です)。"""

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "あなたはSQLエキスパートです。"},
            {"role": "user", "content": prompt}
        ],
        temperature=0
    )
    
    return response.choices[0].message.content.strip()


![AIで自然言語からSQLを生成|Text-to-SQLの実装とセキュリティ対策](https://images.unsplash.com/photo-1677442135703-1787eea5ce01?w=800&h=400&fit=crop&auto=format&q=80)

# 使用例
schema = """
CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    sales INT,
    year INT
);
"""

question = "2023年の売上が100万円以上の顧客を教えて"
sql = natural_to_sql(question, schema)
print(sql)

実行すると、こんな感じのSQL文が生成されます。

SELECT name, sales 
FROM customers 
WHERE year = 2023 AND sales >= 1000000;

2. JavaScriptでの実装

Node.js環境での実装も示しておきます。基本的な考え方は同じです。

const OpenAI = require('openai');

const openai = new OpenAI({
    apiKey: process.env.OPENAI_API_KEY
});

async function naturalToSQL(question, schema) {
    const prompt = `以下のデータベーススキーマを参考に、
ユーザーの質問をSQLに変換してください。

スキーマ:
${schema}

質問: ${question}

SQLのみを返してください。`;

    const response = await openai.chat.completions.create({
        model: "gpt-4",
        messages: [
            { role: "system", content: "あなたはSQLエキスパートです。" },
            { role: "user", content: prompt }
        ],
        temperature: 0
    });

    return response.choices[0].message.content.trim();
}

// 使用例
(async () => {
    const schema = `
    CREATE TABLE orders (
        id INT PRIMARY KEY,
        customer_id INT,
        amount DECIMAL(10, 2),
        created_at DATE
    );
    `;

    const question = "今月の注文総額を計算してください";
    const sql = await naturalToSQL(question, schema);
    console.log(sql);
})();

セキュリティ対策

正直に言えば、Text-to-SQLの実装で最も重要なのはセキュリティです。SQLインジェクション不正なクエリの実行を防ぐために、複数の対策を講じる必要があります。甘く見ると、本当に危険なことになってしまいます。

1. SQLインジェクション対策

続きを読むには無料登録が必要です

無料会員登録をするだけで、この記事の全文を読めます

すでにアカウントをお持ちの方は こちらからログイン