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
{
"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
}
}
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 특징:
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)
);
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]}...")
검색 결과는 이렇게 저장됩니다:
이제 RAG 실험의 모든 결과를 체계적으로 저장하고 관리할 수 있음