LlamaIndex와 SQLite를 이용한 데이터베이스 검색 최적화
SQLite는 가볍고 강력한 데이터베이스로 소규모 애플리케이션에서 자주 사용됩니다. 여기에 LlamaIndex를 통합하면 자연어 질의 처리와 검색 성능을 대폭 향상시킬 수 있습니다. 이 글에서는 SQLite 데이터베이스와 LlamaIndex를 활용해 데이터 검색을 최적화하는 방법을 소개합니다.
1. 프로젝트 개요
목표
- SQLite 데이터베이스의 데이터를 LlamaIndex로 인덱싱합니다.
- 자연어 기반 검색을 지원하여 데이터베이스의 활용도를 높입니다.
주요 기능
- SQLite 데이터 읽기 및 인덱싱
- LlamaIndex를 활용한 자연어 검색
- 빠르고 정확한 질의 응답
2. 개발 환경 준비
2.1 필수 라이브러리 설치
다음 명령어를 실행해 필요한 라이브러리를 설치합니다:
pip install llama-index openai sqlite3
참고: OpenAI API 사용을 위해 API 키가 필요합니다.
2.2 기본 설정
Python 3.8 이상의 버전을 사용하는 것을 권장하며, 가상 환경(venv, Conda)을 활용하면 프로젝트 의존성을 관리하기 편리합니다.
3. SQLite 데이터와 LlamaIndex 통합
3.1 SQLite 데이터베이스 준비
SQLite 데이터베이스를 생성하고 샘플 데이터를 추가합니다. 예를 들어, employees.db
라는 데이터베이스에 직원 정보를 저장합니다.
create_db.py:
import sqlite3
def create_database():
conn = sqlite3.connect("employees.db")
cursor = conn.cursor()
# 테이블 생성
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
role TEXT
)
''')
# 샘플 데이터 삽입
cursor.executemany('''
INSERT INTO employees (name, department, role)
VALUES (?, ?, ?)
''', [
("Alice", "Engineering", "Software Engineer"),
("Bob", "HR", "HR Manager"),
("Charlie", "Engineering", "DevOps Engineer"),
("Diana", "Finance", "Accountant")
])
conn.commit()
conn.close()
create_database()
3.2 데이터 읽기 및 LlamaIndex로 인덱싱
SQLite 데이터베이스의 데이터를 읽어와 LlamaIndex에 인덱싱합니다.
index_and_search.py:
import os
import sqlite3
from llama_index import GPTSimpleVectorIndex, Document
# OpenAI API 키 설정
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
# 1. SQLite 데이터 읽기
def fetch_data_from_db(db_path):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 데이터 가져오기
cursor.execute("SELECT name, department, role FROM employees")
rows = cursor.fetchall()
conn.close()
# Document 객체 생성
documents = [Document(f"Name: {row[0]}\nDepartment: {row[1]}\nRole: {row[2]}") for row in rows]
return documents
# 2. 데이터 인덱싱
print("데이터베이스 데이터를 인덱싱합니다...")
file_path = "employees.db"
documents = fetch_data_from_db(file_path)
index = GPTSimpleVectorIndex.from_documents(documents)
print("인덱싱 완료!")
# 3. 질의 처리
while True:
query = input("질문을 입력하세요 (종료하려면 'exit' 입력): ")
if query.lower() == "exit":
print("프로그램을 종료합니다.")
break
response = index.query(query)
print(f"답변: {response}")
3.3 코드 설명
- SQLite 데이터 읽기:
fetch_data_from_db
함수는 SQLite 데이터베이스에서 데이터를 가져와Document
객체로 변환합니다. - 데이터 인덱싱:
GPTSimpleVectorIndex.from_documents
를 사용해 데이터를 인덱싱합니다. - 질문 응답 루프: 사용자가 입력한 질문에 대해 자연어 처리를 통해 답변을 제공합니다.
4. 실행 결과
데이터베이스 예시
employees.db:
| ID | Name | Department | Role |
| ---- | -------- | ----------- | ----------------- |
| 1 | Alice | Engineering | Software Engineer |
| 2 | Bob | HR | HR Manager |
| 3 | Charlie | Engineering | DevOps Engineer |
| 4 | Diana | Finance | Accountant |
실행 예시
질문을 입력하세요 (종료하려면 'exit' 입력): Engineering 부서의 직원은 누구인가요?
답변: Engineering 부서에는 Alice (Software Engineer), Charlie (DevOps Engineer)가 있습니다.
질문을 입력하세요 (종료하려면 'exit' 입력): exit
프로그램을 종료합니다.
5. 확장 가능성
5.1 데이터 소스 확장
- JSON, CSV, API 데이터 등 다양한 데이터 소스를 추가로 인덱싱할 수 있습니다.
- 데이터베이스 테이블을 확장해 더 많은 정보를 저장하고 검색할 수 있습니다.
5.2 고급 검색 기능
- 키워드 필터링과 같은 고급 검색 기능을 추가할 수 있습니다.
- 사용자 입력의 의도를 분석하여 더 정확한 응답을 제공할 수 있습니다.
5.3 웹 애플리케이션 통합
- Flask 또는 FastAPI와 결합하여 RESTful API를 제공할 수 있습니다.
- 사용자 인터페이스를 추가해 실시간 검색 애플리케이션을 구현할 수 있습니다.
참고 자료
'LlamaIndex' 카테고리의 다른 글
LlamaIndex를 이용한 Python 실시간 데이터 처리 (0) | 2025.01.22 |
---|---|
LlamaIndex를 사용한 JSON 데이터 인덱싱 (0) | 2025.01.22 |
LlamaIndex로 개인 비서 만들기 (0) | 2025.01.22 |
LlamaIndex로 PDF 문서 검색 (0) | 2025.01.22 |
LlamaIndex를 활용한 텍스트 파일 데이터 검색 (0) | 2025.01.22 |