[LLM+RAG] 데이터 구축을 위한 데이터 저장 방법

JAsmine_log·2025년 7월 29일

📂 생성 파일예시

storage_example/
├── retrieval_cache.db                                    (16 KB) - SQLite DB
├── retrieval_pubhealth_20250729_154221_c478c992.json    (1.6 KB) - JSON
├── retrieval_pubhealth_20250729_154221_c478c992.pkl     (1.2 KB) - Pickle  
└── retrieval_pubhealth_20250729_154221_c478c992.csv     (1.4 KB) - CSV

🔹 1. JSON 형태 (가장 직관적)

{
  "query": "What are the side effects of COVID-19 vaccines?",
  "query_id": "test_001", 
  "dataset": "pubhealth",
  "model_name": "e5-large-v2",
  "top_k": 3,
  "timestamp": "2025-07-29T15:42:21.148782",
  "retrieved_documents": [
    {
      "id": "doc_001",
      "content": "COVID-19 vaccines may cause mild side effects...",
      "score": 0.95,
      "meta": {
        "source": "CDC Guidelines",
        "claim_id": "vaccine_safety_001",
        "url": "https://cdc.gov/covid19/vaccines/safety.html",
        "is_selected": true
      }
    }
  ],
  "metrics": {
    "hit@1": 1.0,
    "hit@3": 1.0, 
    "mrr": 1.0,
    "ndcg@10": 0.95
  }
}

🔹 2. CSV 형태 (분석 최적화)

query,query_id,dataset,model_name,rank,document_id,content,score,meta,timestamp,metric_hit@1,metric_mrr,...
"What are the side effects of COVID-19 vaccines?",test_001,pubhealth,e5-large-v2,1,doc_001,"COVID-19 vaccines may cause...",0.95,"{""source"": ""CDC Guidelines"",...}",2025-07-29T15:42:21.148782,1.0,1.0,...

CSV 특징:

  • 각 문서별로 1행씩 저장 (3개 문서 = 3행)
  • 모든 메트릭이 각 행에 포함 (분석 편의)
  • Excel/Pandas에서 바로 열기 가능

🔹 3. SQLite Database (쿼리 최적화)

CREATE TABLE retrieval_results (
    id INTEGER PRIMARY KEY,
    query_hash TEXT UNIQUE,          -- 캐싱용 해시
    query_text TEXT,                 -- 실제 쿼리
    query_id TEXT,                   -- 쿼리 ID
    dataset TEXT,                    -- 데이터셋 이름
    model_name TEXT,                 -- 모델 이름
    top_k INTEGER,                   -- 검색 문서 수
    timestamp DATETIME,              -- 실행 시간
    results_json TEXT,               -- 전체 문서 결과 (JSON)
    metrics_json TEXT                -- 메트릭 결과 (JSON)
);

🔹 4. Pickle 형태 (Python 전용)

pickle_data = {
    'query': "What are the side effects of COVID-19 vaccines?",
    'retrieved_documents': [...],     # Python 리스트/딕셔너리 그대로
    'metrics': {...},                 # Python 딕셔너리 그대로
    'timestamp': datetime.datetime,   # Python datetime 객체
    # ... 기타 모든 필드
}

🎯 각 형태별 장단점

형태용도장점단점언제 사용?
JSON📖 디버깅, 공유사람이 읽기 쉬움, 언어 무관파일 크기 큼디버깅, 결과 확인
CSV📊 데이터 분석Excel/Pandas 호환, 분석 용이구조 제한통계 분석, 시각화
SQLite🔍 빠른 검색인덱싱, 쿼리, 캐싱SQL 지식 필요대량 데이터, 성능
Pickle🐍 Python 개발빠른 로딩, 객체 완전 보존Python 전용개발, 프로토타입

🚀 실제 사용 시나리오

📊 데이터 분석가 시나리오

# CSV로 분석
import pandas as pd
df = pd.read_csv('retrieval_results.csv')

# 모델별 성능 비교
model_performance = df.groupby('model_name')['metric_hit@1'].mean()

# 점수 분포 확인  
high_score_docs = df[df['score'] > 0.9]

# 시각화
import matplotlib.pyplot as plt
df['score'].hist()
plt.title('Document Score Distribution')

🔍 연구자 시나리오

# SQLite로 빠른 검색
import sqlite3
conn = sqlite3.connect('retrieval_cache.db')

# 특정 조건 검색
cursor = conn.execute('''
    SELECT query_text, metrics_json 
    FROM retrieval_results 
    WHERE dataset = 'pubhealth' 
    AND model_name = 'e5-large'
    AND json_extract(metrics_json, '$.hit@1') > 0.8
    ORDER BY timestamp DESC
''')

results = cursor.fetchall()

🐍 개발자 시나리오

# Pickle로 빠른 프로토타입
import pickle

with open('retrieval_result.pkl', 'rb') as f:
    data = pickle.load(f)
    
# 원본 Python 객체 그대로 사용
documents = data['retrieved_documents']
for doc in documents:
    print(f"Score: {doc['score']}, Content: {doc['content'][:50]}...")

💡 최종 정리

검색 결과는 이렇게 저장됩니다:

  1. 🔄 자동 저장: 검색할 때마다 4가지 형태로 자동 저장
  2. 📊 구조화: 쿼리, 문서, 메트릭, 메타데이터 모두 포함
  3. 🎯 용도별 최적화: 분석용(CSV), 개발용(Pickle), 검색용(SQLite), 공유용(JSON)
  4. ⚡ 캐싱: 같은 쿼리 재실행시 캐시에서 빠르게 로딩
  5. 📈 분석 지원: 메트릭과 함께 저장되어 바로 분석 가능

이제 RAG 실험의 모든 결과를 체계적으로 저장하고 관리할 수 있음

profile
Everyday Research & Development

0개의 댓글