DB向けSQLアシスタント
モデルにスキーマを渡してSQLを書かせ、サンドボックス化したDBで実行し、結果を説明させます。
「DB向けSQLアシスタント」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
プロジェクトの目標
自然言語の質問をSQLに変換し、サンドボックス化されたDBに対して実行し、結果を説明するエージェントを構築します。
いわば「自分のデータベースと会話する」ための基本的なエージェントです。
アーキテクチャ
- ユーザー:「今月のアクティブユーザー数は?」
- エージェントがlist_tablesとdescribe_tableを呼び出してスキーマを確認する
- エージェントが生成したクエリをrun_sqlで実行する
- エージェントが結果を自然言語で説明する
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人」
エージェント:
- list_tables -> [users, orders, ...]
- describe_table(orders) -> [id, user_id, total, created_at]
- run_sql("SELECT user_id, SUM(total) ...")
- 結果:「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ドキュメントを対象にしたQ&Aボット
- コード説明エージェント
- Webブラウジング調査エージェント
- DB向けSQLアシスタント