0Pricing
AI Agents · レッスン

DB向けSQLアシスタント

モデルにスキーマを渡してSQLを書かせ、サンドボックス化したDBで実行し、結果を説明させます。

「DB向けSQLアシスタント」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

プロジェクトの目標

自然言語の質問をSQLに変換し、サンドボックス化されたDBに対して実行し、結果を説明するエージェントを構築します。

いわば「自分のデータベースと会話する」ための基本的なエージェントです。

アーキテクチャ

  1. ユーザー:「今月のアクティブユーザー数は?」
  2. エージェントがlist_tablesとdescribe_tableを呼び出してスキーマを確認する
  3. エージェントが生成したクエリをrun_sqlで実行する
  4. エージェントが結果を自然言語で説明する

Step 1: Schema Tools

import psycopg

conn = psycopg.connect(DATABASE_URL)

def list_tables():
    with conn.cursor() as cur:
        cur.execute("SELECT table_name FROM information_schema.tables WHERE table_schema='public'")
        return [r[0] for r in cur.fetchall()]

def describe_table(name):
    with conn.cursor() as cur:
        cur.execute('''
            SELECT column_name, data_type FROM information_schema.columns
            WHERE table_name = %s
        ''', (name,))
        return cur.fetchall()

ステップ2:安全なrun_sqlツール

エージェントが実行できる操作を制限する必要があります。読み取り専用、クエリタイムアウト、行数制限を設定します:

import re

def run_sql(query: str, limit: int = 100):
    q = query.strip().rstrip(';').lower()
    if not q.startswith('select'):
        return {'error': 'Only SELECT statements are allowed.'}
    if any(bad in q for bad in [' drop ', ' delete ', ' update ', ' insert ', ' alter ', ' truncate ']):
        return {'error': 'Statement contains a disallowed keyword.'}
    with conn.cursor() as cur:
        cur.execute(f'SET statement_timeout = 5000')   # 5 seconds
        cur.execute(f'SELECT * FROM ({query}) sub LIMIT {limit}')
        cols = [c.name for c in cur.description]
        rows = cur.fetchall()
        return {'columns': cols, 'rows': rows}

Tool Definitions

tools = [
    {'type': 'function', 'function': {'name': 'list_tables', 'description': 'List tables in the database', 'parameters': {'type': 'object', 'properties': {}}}},
    {'type': 'function', 'function': {'name': 'describe_table', 'description': 'Get columns of a table', 'parameters': {'type': 'object', 'properties': {'name': {'type': 'string'}}, 'required': ['name']}}},
    {'type': 'function', 'function': {'name': 'run_sql', 'description': 'Execute a SELECT query (read-only, max 100 rows, 5s timeout)', 'parameters': {'type': 'object', 'properties': {'query': {'type': 'string'}}, 'required': ['query']}}}
]
import json
print(json.dumps(tools, indent=2))

System Prompt

system = '''
You are a SQL analyst assistant for a Postgres database.
First use list_tables and describe_table to learn the schema.
Then write a single SELECT query to answer the user.
Never modify data.
After receiving results, explain them in plain language.
'''
print(system.strip())

システムプロンプトにスキーマを渡す

レイテンシを改善するため、起動時にスキーマを1回取得してシステムプロンプトに含めます。これにより、ツールとの往復を減らせます:

schema = ''
for t in list_tables():
    cols = describe_table(t)
    schema += f'{t}: {cols}\n'
system = system + f'\nSchema:\n{schema}'

読み取り専用のデータベースユーザー

コードによるチェックに加えて、分析用スキーマだけに権限を持つ読み取り専用DBユーザーも作成します。多層防御を実現するためです。

PIIのマスキング

メールアドレスや電話番号など、一切漏えいさせてはいけない列があります。結果を返す前にマスキングします:

PII_COLS = {'email', 'phone'}
for row in rows:
    for i, col in enumerate(cols):
        if col in PII_COLS:
            row[i] = '[REDACTED]'

クエリコストの見積もり

EXPLAINを使ってクエリコストを見積もり、しきい値を超えるコストのクエリを拒否します(巨大なテーブルに対する意図しない全表スキャンを防ぎます)。

会話の例

ユーザー:「先月の支出額が多い顧客上位5人」

エージェント:

  1. list_tables -> [users, orders, ...]
  2. describe_table(orders) -> [id, user_id, total, created_at]
  3. run_sql("SELECT user_id, SUM(total) ...")
  4. 結果:「Alice($1240)、Bob($910)、...」

出力チャート

より豊かなUXを実現するには、列と行を受け取り、チャート画像のURLを返すrender_chartツールを追加します。エージェントはクエリの後にこれを呼び出せます。

適切に失敗させる

SQLエラーはよく発生します。Postgresのエラーメッセージをそのまま返します。モデルはエラーを見せると、壊れたSQLを自力で修正するのが得意です。

すべてのクエリを監査する

ユーザー、自然言語の質問、生成されたSQL、結果の件数をログに記録します。DBアクセスを行うエージェントでは、監査は必須です。

SELECTだけに制限する理由

エージェントがSELECT文だけを実行するようハードコードするのはなぜでしょうか?

まとめ

SQLエージェントはすぐに役立ちます。ただし、読み取り専用ユーザー、ステートメントタイムアウト、行数制限、クエリ種別の許可リスト、監査ログを用意して慎重に構築してください。

よくある質問

「DB向けSQLアシスタント」レッスンは無料ですか?

はい。「DB向けSQLアシスタント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「DB向けSQLアシスタント」で何を学びますか?

モデルにスキーマを渡してSQLを書かせ、サンドボックス化したDBで実行し、結果を説明させます。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「DB向けSQLアシスタント」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ドキュメントを対象にしたQ&Aボット
  2. コード説明エージェント
  3. Webブラウジング調査エージェント
  4. DB向けSQLアシスタント
← AI Agentsに戻る