LLM Day 22 - Text-to-SQL RAG 시스템 구현

Soyee Sung·2025년 3월 6일
0

LLM

목록 보기
27/34

ETF 데이터를 활용한 Text-to-SQL 및 RAG (Retrieval-Augmented Generation) 시스템 구현 과정을 다룹니다.

✅ 핵심 개념 정리
✅ 코드 설명 (데이터 처리, SQL 실행, LangChain 활용 등)
✅ Text-to-SQL 변환 및 RAG 기법 소개

🔹 1. 프로젝트 개요
ETF(Exchange-Traded Fund)란?
ETF는 주식처럼 거래되는 투자 펀드로, 여러 종목을 묶어서 투자할 수 있도록 만들어진 금융 상품입니다.
이 프로젝트에서는 ETF 관련 데이터를 자연어로 질의하고, SQL을 통해 분석한 후, AI를 활용해 자연어 답변을 생성하는 시스템을 구현합니다.

Text-to-SQL + RAG란?
Text-to-SQL: 자연어 질의를 SQL 쿼리로 변환하여 데이터베이스에서 원하는 정보를 검색하는 기술
RAG (Retrieval-Augmented Generation): 데이터베이스에서 정보를 검색(Retrieval)하고, 이를 기반으로 LLM이 자연어 응답을 생성하는 기법
✅ 즉, 자연어 → SQL 변환 → 데이터 검색 → 자연어 응답의 흐름으로 작동합니다.

🔹 2. 프로젝트 환경 설정
필요한 라이브러리 설치
이 프로젝트는 Python 환경에서 실행되며, 다음과 같은 라이브러리가 필요합니다.

pip install python-dotenv langchain-community sqlite3 pandas

환경 변수 설정
.env 파일을 사용하여 API 키 등을 관리합니다.

from dotenv import load_dotenv
import os

load_dotenv()
print(os.getenv("LANGCHAIN_TRACING_V2"))  # 환경 변수 확인

✅ .env 파일에 OpenAI API 키 등이 저장되어 있어야 합니다.

🔹 3. 데이터베이스(SQL) 연결 및 데이터 조회
이 프로젝트에서는 SQLite 데이터베이스 (etf_database.db)를 사용하여 ETF 데이터를 저장하고 조회합니다.

데이터베이스 연결

from sqlalchemy import create_engine

# SQLite 데이터베이스 연결
engine = create_engine("sqlite:///etf_database.db")

테이블 확인

from sqlalchemy import text

with engine.connect() as connection:
    result = connection.execute(text("SELECT name FROM sqlite_master WHERE type='table';"))
    tables = result.fetchall()

print("📌 현재 데이터베이스에 존재하는 테이블 목록:")
for table in tables:
    print(table[0])

✅ 현재 데이터베이스에 존재하는 테이블을 확인할 수 있습니다.

ETF 데이터 조회 예제

with engine.connect() as connection:
    result = connection.execute(text("SELECT * FROM ETFs LIMIT 5;"))
    rows = result.fetchall()

for row in rows:
    print(row)

✅ ETF 데이터를 직접 조회하여 확인할 수 있습니다.

🔹 4. Text-to-SQL 변환 (자연어 → SQL)
사용자의 자연어 질의를 SQL 쿼리로 변환하는 과정입니다.
이 과정에서 LangChain의 SQLDatabaseChain을 활용합니다.

from langchain_community.utilities import SQLDatabase
from langchain.chains import SQLDatabaseChain
from langchain.chat_models import ChatOpenAI

# 데이터베이스 객체 생성
db = SQLDatabase.from_uri("sqlite:///etf_database.db")

# LLM 설정 (GPT-4 사용)
llm = ChatOpenAI(model="gpt-4", temperature=0)

# Text-to-SQL 체인 생성
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

# 자연어 질문 실행
question = "지난 한 달 동안 가장 많이 상승한 ETF는?"
result = db_chain.run(question)
print(result)

✅ 사용자의 질문을 SQL로 변환하여 실행하고, 결과를 반환합니다.

🔹 5. RAG 기반 자연어 응답 생성
이제 데이터베이스에서 가져온 정보를 기반으로 AI가 자연어 답변을 생성하는 기능을 추가합니다.

from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

# 벡터DB 생성 (FAISS 사용)
vectorstore = FAISS.load_local("faiss_index", OpenAIEmbeddings())

# RAG 기반 QA 체인 생성
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    chain_type="stuff",
    verbose=True,
)

# 질문 실행
question = "지난 3개월 동안 수익률이 가장 높은 ETF는?"
answer = qa_chain.run(question)
print(answer)

✅ RAG 기법을 활용하여 검색 + 생성 모델을 결합한 답변을 생성합니다.

🔹 6. 최종 정리
이 프로젝트에서는 다음과 같은 과정을 거쳐 ETF 데이터를 활용한 Text-to-SQL 및 RAG 기반 Q&A 시스템을 구축했습니다.

✅ 주요 기능
자연어 → SQL 변환하여 데이터 조회 (LangChain 활용)
SQLite 데이터베이스에서 실시간 데이터 검색
LLM(GPT-4)과 RAG를 결합하여 자연어 응답 생성
✅ 활용 가능성
금융 데이터 분석 자동화
데이터베이스 기반 챗봇 개발
AI 기반 투자 어드바이저 서비스 구축

🚀 마무리 및 다음 단계
ETF Text-to-SQL 및 RAG 시스템은 금융 데이터 자동 분석에 강력한 도구가 될 수 있습니다.
추후 개선할 부분:

데이터 업데이트 자동화
사용자 피드백을 반영한 개선 학습
다양한 자연어 질의 처리 최적화

0개의 댓글