会員限定
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」という技術について、実装方法とセキュリティ対策を詳しく解説したいと思います。
Text-to-SQLとは
Text-to-SQLは、ユーザーが自然言語で書いた質問(例えば「2023年の売上が100万円以上の顧客を教えて」)をAIが解析して、自動的にSQL文に変換する技術です。これによってデータベースへのアクセスを非エンジニアにも開放でき、ビジネスインテリジェンスを広く活用できるようになります。
結論から言うと、OpenAIのGPT-4やAnthropicのClaudeといった大規模言語モデル(LLM)の進化が、これを実現させました。従来の正規表現やルールベースの手法では対応しきれなかった複雑な自然言語処理が、今ようやく可能になったという実感があります。
実装方法:基本的なアプローチ
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()

# 使用例
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インジェクションや不正なクエリの実行を防ぐために、複数の対策を講じる必要があります。甘く見ると、本当に危険なことになってしまいます。