0Pricing
AI Agents · 강의

DB용 SQL 어시스턴트

모델에 스키마를 제공하고 SQL을 작성하게 한 뒤 샌드박스 DB에서 실행하고 결과를 설명하게 해보세요.

DB용 SQL 어시스턴트은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

프로젝트 목표

자연어 질문을 SQL로 변환하고, 샌드박스 처리된 데이터베이스에서 실행한 뒤 결과를 설명하는 에이전트를 구축합니다.

말 그대로 "내 데이터베이스와 대화하는" 에이전트의 기본형입니다.

아키텍처

  1. 사용자: "이번 달에 활성 사용자는 몇 명인가요?"
  2. 에이전트가 list_tables와 describe_table을 호출하여 스키마를 파악
  3. 에이전트가 생성된 query와 함께 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단계: SAFE run_sql 도구

에이전트가 수행할 수 있는 작업을 제한해야 합니다. 읽기 전용, query 시간 제한, 행 수 제한을 적용합니다:

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]'

query 비용 추정

EXPLAIN을 사용하여 query 비용을 추정하고, 비용이 임계값을 초과하는 query를 거부합니다. 이렇게 하면 매우 큰 테이블을 실수로 전체 스캔하는 일을 방지할 수 있습니다.

대화 예시

사용자: "지난달 지출액 기준 상위 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), ..."

차트 출력

더 풍부한 사용자 경험을 제공하려면 열과 행을 받아 차트 이미지 URL을 반환하는 render_chart 도구를 추가합니다. query가 끝난 뒤 에이전트가 이 도구를 호출할 수 있습니다.

우아하게 실패 처리하기

SQL 오류는 흔히 발생합니다. Postgres 오류 메시지를 있는 그대로 반환하십시오. 오류를 보여 주면 모델은 잘못된 SQL을 스스로 수정하는 데 매우 뛰어납니다.

모든 query 감사하기

사용자, 자연어 질문, 생성된 SQL, 결과 개수를 로그로 기록합니다. 데이터베이스 접근 에이전트에서는 감사 기록이 반드시 필요합니다.

SELECT로 제한하는 이유

에이전트가 SELECT 문만 실행하도록 하드 코딩하는 이유는 무엇일까요?

정리

SQL 에이전트는 즉시 유용하게 사용할 수 있습니다. 읽기 전용 사용자, 문 실행 시간 제한, 행 수 제한, query 유형 허용 목록, 감사 로그를 적용하여 신중하게 구축하십시오.

자주 묻는 질문

“DB용 SQL 어시스턴트” 강의는 무료인가요?

네 — “DB용 SQL 어시스턴트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

“DB용 SQL 어시스턴트”에서 뭘 배우나요?

모델에 스키마를 제공하고 SQL을 작성하게 한 뒤 샌드박스 DB에서 실행하고 결과를 설명하게 해보세요. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Agents을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“DB용 SQL 어시스턴트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 문서 기반 질의응답 봇
  2. 코드 설명 에이전트
  3. 웹 탐색 연구 에이전트
  4. DB용 SQL 어시스턴트
← AI Agents(으)로 돌아가기