SQL-ассистент для вашей DB
Передайте модели схему, позвольте ей написать SQL, выполните его в изолированной DB и объясните результаты.
«SQL-ассистент для вашей DB» — бесплатный урок AI Agents на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Цель проекта
Создайте агента, который превращает вопросы на естественном языке в SQL, выполняет их в изолированной базе данных и объясняет результаты.
Классический агент для «разговоров с моей базой данных».
Архитектура
- Пользователь: "Сколько активных пользователей в этом месяце?"
- Агент вызывает 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())
Передайте схему в системном промпте
Для уменьшения задержки загрузите схему один раз при запуске и поместите её в системный промпт — это сэкономит повторные обращения к инструментам:
schema = ''
for t in list_tables():
cols = describe_table(t)
schema += f'{t}: {cols}\n'
system = system + f'\nSchema:\n{schema}'Пользователь базы данных только для чтения
Даже при наличии проверок кода создайте также пользователя базы данных только для чтения с разрешениями лишь на аналитическую схему. Это дополнительный уровень защиты.
Маскирование PII
Некоторые столбцы (электронная почта, телефон) никогда не должны раскрывать данные. Маскируйте их в результатах перед возвратом:
PII_COLS = {'email', 'phone'}
for row in rows:
for i, col in enumerate(cols):
if col in PII_COLS:
row[i] = '[REDACTED]'Оценка стоимости запроса
Используйте EXPLAIN для оценки стоимости запроса; отклоняйте запросы со стоимостью выше порога (это предотвращает случайное полное сканирование огромных таблиц).
Пример диалога
Пользователь: "Пять лучших клиентов по расходам за прошлый месяц"
Агент:
- list_tables → [users, orders, ...]
- describe_table(orders) → [id, user_id, total, created_at]
- run_sql("SELECT user_id, SUM(total) ...")
- Возвращает: "Alice ($1240), Bob ($910), ..."
Графики в выходных данных
Для более удобного интерфейса добавьте инструмент render_chart, который принимает столбцы и строки и возвращает URL изображения графика. Агент сможет вызвать его после запроса.
Корректно обрабатывайте ошибки
Ошибки SQL встречаются часто. Возвращайте сообщение об ошибке Postgres без изменений: модель отлично исправляет собственный неверный SQL, если видит ошибку.
Проверяйте каждый запрос
Журналируйте пользователя, вопрос на естественном языке, созданный SQL и количество результатов. Аудит обязателен для агентов, работающих с базами данных.
Зачем ограничиваться SELECT?
Зачем жёстко ограничивать агента выполнением только операторов SELECT?
Повторим
Агенты SQL сразу приносят пользу. Создавайте их осторожно: пользователь только для чтения, тайм-аут оператора, ограничение числа строк, список разрешённых типов запросов и журнал аудита.
Часто задаваемые вопросы
Урок «SQL-ассистент для вашей DB» бесплатный?
Да — полный текст урока «SQL-ассистент для вашей DB» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «SQL-ассистент для вашей DB»?
Передайте модели схему, позвольте ей написать SQL, выполните его в изолированной DB и объясните результаты. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «SQL-ассистент для вашей DB»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Бот вопросов и ответов по вашим документам
- Агент для объяснения кода
- Агент-исследователь для веб-поиска
- SQL-ассистент для вашей DB