SQLDatabaseChain vs LLM (1)

문건희·2025년 3월 10일

DB

목록 보기
1/2

📌 MySQL과 연동한 SQLDatabaseChain 사용법

MySQL 데이터베이스와 LangChain의 SQLDatabaseChain 을 연동하여 자연어로 SQL 쿼리를 실행하는 방법을 단계별로 설명합니다.


1. MySQL 연결 설정

① 필요한 라이브러리 설치

우선, 필요한 Python 라이브러리를 설치해야 합니다.

pip install langchain openai sqlalchemy pymysql
  • langchain : LangChain 프레임워크
  • openai : OpenAI API (LLM 사용)
  • sqlalchemy : 데이터베이스 ORM
  • pymysql : MySQL과 연결을 위한 드라이버

2. MySQL 데이터베이스 연결

① MySQL 데이터베이스 설정

MySQL을 실행하고 사용할 데이터베이스를 생성해야 합니다.

🔹 MySQL 데이터베이스 생성 (예시)

CREATE DATABASE mydatabase;
USE mydatabase;

CREATE TABLE sales_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255),
    sales INT,
    sale_date DATE
);

INSERT INTO sales_data (product_name, sales, sale_date) VALUES
('아이폰 15', 10000, '2025-02-01'),
('갤럭시 S24', 8000, '2025-02-02'),
('맥북 프로', 5000, '2025-02-03');

이렇게 하면 sales_data 테이블이 생성되고 샘플 데이터가 입력됩니다.


3. Python 코드로 MySQL 연동

① MySQL 데이터베이스 연결

이제 Python 코드에서 MySQL과 연결해 봅니다.

from langchain.chains import SQLDatabaseChain
from langchain.llms import OpenAI
from langchain.sql_database import SQLDatabase
from sqlalchemy import create_engine
import os

# OpenAI API 키 설정
os.environ["OPENAI_API_KEY"] = "your-api-key"

# MySQL 데이터베이스 연결
MYSQL_USER = "your_user"
MYSQL_PASSWORD = "your_password"
MYSQL_HOST = "localhost"  # 원격일 경우 서버 IP 입력
MYSQL_PORT = "3306"
MYSQL_DB = "mydatabase"

# MySQL 연결 엔진 생성
engine = create_engine(f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DB}")

# SQLDatabase 객체 생성
db = SQLDatabase(engine)

# LLM 모델 초기화
llm = OpenAI(temperature=0)  # 일관된 결과를 위해 temperature=0 설정

# SQLDatabaseChain 생성
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

# 자연어로 질의 실행
question = "지난 달 가장 많이 판매된 제품은?"
result = db_chain.run(question)

print("🔹 결과:", result)

4. 실행 결과 예시

① 생성된 SQL 쿼리

코드를 실행하면, LangChain이 아래와 같은 SQL을 자동으로 생성할 것입니다.

SELECT product_name, SUM(sales) 
FROM sales_data 
WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY product_name 
ORDER BY SUM(sales) DESC 
LIMIT 1;

② 결과 출력

> Entering new SQLDatabaseChain chain...
SQL Query:
SELECT product_name, SUM(sales) 
FROM sales_data 
WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY product_name 
ORDER BY SUM(sales) DESC 
LIMIT 1;
> Finished chain.
🔹 결과: 지난 달 가장 많이 판매된 제품은 '아이폰 15'이며, 총 10,000개 판매되었습니다.

5. SQLDatabaseChain과 프롬프트 기반 SQL 변환의 차이점

1️⃣ SQLDatabaseChain

📌 특징:

  • LangChain이 직접 데이터베이스와 연결하여 SQL을 실행하고 결과를 반환함.
  • 자연어 입력을 SQL 쿼리로 변환하고, 이를 데이터베이스에서 실행 후 결과를 반환함.

장점:
1. 자동화 → SQL을 생성하고 실행까지 자동으로 진행됨.

  • 예: "지난 달 가장 많이 판매된 제품은?" → 자동으로 SQL 실행 후 결과 반환
  1. 에러 방지 → 데이터베이스 스키마를 참조하여 쿼리 오류를 줄일 수 있음.
    • 예: 컬럼명이 틀려도 LLM이 자동으로 수정 가능
  2. 디버깅 가능verbose=True를 설정하면 실행된 SQL을 확인할 수 있음.
    • 예: 어떤 SQL이 실행되었는지 로그 확인 가능

단점:
1. 초기 설정 필요SQLAlchemy 엔진과 데이터베이스 연결 설정이 필요함.

  • 예: create_engine()을 사용하여 DB 연결해야 함
  1. 보안 이슈 → 직접 SQL을 실행하기 때문에 DB 권한 및 쿼리 검증이 필요함.
    • 예: SQL 인젝션 방지를 위한 추가 보안 설정 필요
  2. 복잡한 질의 어려움 → 너무 복잡한 SQL은 LLM이 잘못 해석할 가능성이 있음.
    • 예: 여러 개의 JOIN을 포함한 쿼리는 오작동할 수 있음

2️⃣ 프롬프트 기반 SQL 변환

📌 특징:

  • LLM이 SQL 쿼리만 생성하고, 실행은 별도로 수행해야 함.
  • 단순히 자연어를 SQL로 변환하는 용도로 활용할 수 있음.

장점:
1. 설정이 간단함 → 데이터베이스 연결 없이 SQL 쿼리만 생성 가능.

  • 예: "지난 달 매출 상위 5개 제품을 SQL로 변환해줘" 요청 시 SQL 반환
  1. 유연한 활용 → SQL 실행 여부를 직접 결정할 수 있어 보안 측면에서 유리함.
    • 예: 생성된 SQL을 검토한 후 실행 가능
  2. 다양한 DB에 적용 가능 → 특정 DBMS(MySQL, PostgreSQL 등)에 종속되지 않음.
    • 예: DB 엔진이 달라도 동일한 SQL 생성 가능

단점:
1. 수동 실행 필요 → 생성된 SQL을 직접 실행해야 하는 번거로움이 있음.

  • 예: 사용자가 복사해서 DB에 붙여넣고 실행해야 함
  1. 데이터베이스 정보 부족 → 테이블 구조를 모르면 부정확한 SQL이 생성될 가능성이 있음.
    • 예: 테이블 스키마를 모르고 쿼리 생성하면 오류 발생 가능
  2. 쿼리 검증 어려움 → LLM이 생성한 SQL을 사람이 직접 검토해야 함.
    • 예: WHERE 조건이 잘못될 가능성 있음

6. 언제 사용하면 좋을까?

사용 목적SQLDatabaseChain프롬프트 기반 SQL 변환
SQL 자동 실행이 필요한 경우✅ 추천❌ 비추천
데이터베이스 연결 없이 SQL만 생성❌ 비추천✅ 추천
빠른 설정이 필요한 경우❌ 비추천✅ 추천
보안이 중요한 경우❌ 신중한 설정 필요✅ 추천 (수동 검토 가능)
대형 프로젝트에서 데이터 분석✅ 추천❌ 비추천

0개의 댓글