DB 기반 RAG에서 사용자 질의를 SQL 문으로 변환하는 방법에 대해 설명합니다.
이 방법은 LLM을 활용하여, 사용자의 자연어 질의를 SQL 쿼리로 변환하는 방식입니다.
DB Schema 정보 저장
schema_description 같은 텍스트를 생성하여 LLM이 참조하도록 구성.프롬프트 엔지니어링
You are an expert SQL assistant. Given the following database schema:
Tables:
- employees (id, name, age, department)
- departments (id, name)
Convert the following natural language question into an SQL query:
"List all employees who work in the Sales department."
SQL:
LLM을 활용하여 SQL 생성
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = ChatOpenAI(model_name="gpt-4")
prompt_template = PromptTemplate(
input_variables=["question", "schema"],
template="""
You are an expert SQL assistant. Given the following database schema:
{schema}
Convert the following natural language question into an SQL query:
"{question}"
SQL:
"""
)
sql_chain = LLMChain(llm=llm, prompt=prompt_template)
schema_description = "Tables: employees (id, name, age, department), departments (id, name)"
user_question = "List all employees who work in the Sales department."
sql_query = sql_chain.run(question=user_question, schema=schema_description)
print(sql_query)
SQL 실행 및 결과 반환
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute(sql_query)
result = cursor.fetchall()
print(result)
LangChain에는 SQL 질의 변환을 자동화하는 SQLDatabaseChain이 내장되어 있습니다.
DB 연결 설정
from langchain.sql_database import SQLDatabase
from langchain.chat_models import ChatOpenAI
from langchain.chains import SQLDatabaseChain
db = SQLDatabase.from_uri("sqlite:///example.db")
llm = ChatOpenAI(model_name="gpt-4")
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
사용자의 자연어 질의를 SQL로 변환하고 실행
question = "Show all employees who work in the Sales department."
result = db_chain.run(question)
print(result)
이 방법은 LLM을 사용하지 않고, 기존 NLP 모델과 SQL 템플릿을 조합하여 변환하는 방식입니다.
사용자의 자연어 질의를 SQL 키워드 분석
"Sales 부서의 모든 직원 정보를 보여줘"라는 질문에서 주요 키워드를 추출하여 SQL 변환.Rule-Based Approach 활용
import re
def generate_sql(question):
if "Sales" in question:
return "SELECT * FROM employees WHERE department = 'Sales';"
return "SELECT * FROM employees;"
question = "Sales 부서의 모든 직원 정보를 보여줘"
sql_query = generate_sql(question)
print(sql_query)
SQL Parser 활용 (Text-to-SQL 모델 적용 가능)
sqlparse, T5-SQL 모델, Spider Dataset 기반 Text-to-SQL 모델 활용 가능.| 방법 | 장점 | 단점 |
|---|---|---|
| LLM 기반 SQL 생성 | 유연하게 자연어를 SQL로 변환 가능 | LLM 호출 비용 발생, 프롬프트 최적화 필요 |
| LangChain SQLDatabaseChain | 손쉽게 SQL 변환 및 실행 가능 | 특정 DB에 따라 최적화 필요 |
| Rule-based SQL Template | 빠르고 비용 절감 가능 | 복잡한 질의 변환이 어려움 |
| Text-to-SQL 모델 활용 | LLM 없이도 SQL 변환 가능 | 모델 학습이 필요, 정확도 문제 |
LangChain SQLDatabaseChain 활용필요한 코드나 추가 구현이 필요하면 알려주세요!