본문 바로가기
AI 개발/AI 에이전트 (AI Agents)

자연어로 SQL을 생성하는 AI 비서 만들기: PostgreSQL + OpenAI API 활용

by 데이터 AI 벌집 2025. 4. 30.
반응형

내부 데이터를 다루다 보면, 자주 반복되는 SQL 쿼리를 작성하는 일이 번거롭다. 간단한 질의조차도 스키마를 열어보며 작성해야 하는 경우가 많다. 이를 줄이기 위해, 자연어 질문을 SQL로 변환하는 AI 기반 SQL 비서를 Flask 앱 형태로 직접 구현했다.

자연어로 SQL을 생성하는 AI 비서 만들기: PostgreSQL + OpenAI API 활용


목표

자연어 입력 → SQL 변환 → 결과 반환

  • 별도의 로그인/챗봇 없음
  • 단일 입력창과 결과 출력창
  • PostgreSQL 연결
  • OpenAI GPT-4 API 활용

1. OpenAI API 설정

pip install openai flask psycopg2-binary python-dotenv

 

.env 파일:

OPENAI_API_KEY=sk-...

 

2. PostgreSQL + GPT-4 연동 플라스크 앱

from flask import Flask, request, jsonify
import openai
import psycopg2
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

app = Flask(__name__)

# PostgreSQL 연결
conn = psycopg2.connect(
    dbname="mydb", user="myuser", password="mypassword", host="localhost", port="5432"
)

@app.route("/ask", methods=["POST"])
def ask_sql():
    question = request.json.get("question")

    prompt = f"""
You are a PostgreSQL expert.
Use the following schema:
Table: employees
Columns: id, name, department, salary, date_joined

Translate the following natural language question into SQL:
Question: {question}
SQL:
    """

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0
    )
    sql = response["choices"][0]["message"]["content"].strip()

    # 기본적인 보안 필터링
    if any(x in sql.upper() for x in ["DROP", "DELETE", "UPDATE"]):
        return jsonify({"error": "Unsafe SQL detected", "sql": sql}), 400

    # SQL 실행
    try:
        with conn.cursor() as cur:
            cur.execute(sql)
            result = cur.fetchall()
            columns = [desc[0] for desc in cur.description]
            rows = [dict(zip(columns, row)) for row in result]
        return jsonify({"sql": sql, "result": rows})
    except Exception as e:
        return jsonify({"error": str(e), "sql": sql}), 500

 

3. 프롬프트 엔지니어링이 핵심

처음에는 질문만 넘기면 충분할 줄 알았지만, 정확도를 높이기 위해 반드시 스키마 정보를 프롬프트에 포함시켜야 한다. 예:

You are a PostgreSQL expert.
Use the following schema:
Table: employees
Columns: id, name, department, salary, date_joined

Translate the following question into SQL:

4. 추가 개선 사항

  • DROP/DELETE 필터링
  • 실패한 쿼리 로그 저장
  • 다중 테이블 대응 예정
  • 질문과 SQL 로그 기능 추가 예정

마무리

이 방식은 복잡한 AI 모델 구축 없이도, 강력한 자연어 → SQL 인터페이스를 실현할 수 있다. 중요한 건 모델 성능이 아니라 입력(프롬프트)의 정교함이라는 점이다.

반응형