DB 기반 RAG에서 SQL 변환 방법

문건희·2025년 3월 10일

RAG

목록 보기
12/12

DB 기반 RAG에서 사용자 질의를 SQL 문으로 변환하는 방법에 대해 설명합니다.


1. LLM을 사용하여 내부적으로 프롬프트 작성 후 SQL 변환

이 방법은 LLM을 활용하여, 사용자의 자연어 질의를 SQL 쿼리로 변환하는 방식입니다.

동작 방식

  1. DB Schema 정보 저장

    • 테이블 정보, 컬럼 정보, 관계, 데이터 타입 등을 미리 저장해둠.
    • 예를 들어, schema_description 같은 텍스트를 생성하여 LLM이 참조하도록 구성.
  2. 프롬프트 엔지니어링

    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:
  3. 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)
  4. SQL 실행 및 결과 반환

    import sqlite3
    
    conn = sqlite3.connect("example.db")
    cursor = conn.cursor()
    
    cursor.execute(sql_query)
    result = cursor.fetchall()
    
    print(result)

2. LangChain의 SQLDatabaseChain 활용

LangChain에는 SQL 질의 변환을 자동화하는 SQLDatabaseChain이 내장되어 있습니다.

동작 방식

  1. 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)
  2. 사용자의 자연어 질의를 SQL로 변환하고 실행

    question = "Show all employees who work in the Sales department."
    result = db_chain.run(question)
    print(result)

3. 또 다른 방법 - SQL Parser + Template 기반 SQL 생성

이 방법은 LLM을 사용하지 않고, 기존 NLP 모델과 SQL 템플릿을 조합하여 변환하는 방식입니다.

동작 방식

  1. 사용자의 자연어 질의를 SQL 키워드 분석

    • "Sales 부서의 모든 직원 정보를 보여줘"라는 질문에서 주요 키워드를 추출하여 SQL 변환.
  2. 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)
  3. 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 활용
  • 최적화된 변환이 필요하면 LLM 프롬프트 기반 SQL 생성
  • 비용 절감 & 간단한 SQL 변환이면 Rule-based 방법

필요한 코드나 추가 구현이 필요하면 알려주세요!

0개의 댓글