벤치마크 테스트
벤치마크 테스트
섹션 제목: “벤치마크 테스트”LLM 검색 기능의 성능을 객관적으로 비교하기 위한 벤치마크 테스트 방법론입니다.
테스트 대상
섹션 제목: “테스트 대상”| Provider | Mode | 설명 |
|---|---|---|
ollama_basic | Ollama (로컬) | Qwen3:8b 모델, 로컬 실행 |
openai_basic | OpenAI | GPT-4o, 기본 프롬프트 |
openai_rag | OpenAI + RAG | GPT-4o + 서비스 메타데이터 컨텍스트 |
openai_rag_extended | OpenAI + RAG (확장) | GPT-4o + ES 샘플 데이터 포함 |
평가 지표
섹션 제목: “평가 지표”-
응답 시간 (Response Time)
- 평균 응답 시간 (ms)
- P95 응답 시간
- 최대/최소 응답 시간
-
품질 (Quality)
- 키워드 수 (요청한 개수 충족 여부)
- 키워드 관련성 (수동 평가)
- 한국어 품질
-
비용 (Cost)
- 토큰 사용량 (input/output)
- 추정 비용 (USD)
- 쿼리당 평균 비용
-
안정성 (Stability)
- 성공률 (%)
- 에러 유형 분석
- 타임아웃 발생 빈도
테스트 쿼리셋
섹션 제목: “테스트 쿼리셋”쿼리 구성
섹션 제목: “쿼리 구성”총 42개 쿼리, 7개 카테고리:
| 카테고리 | 쿼리 수 | 난이도 분포 |
|---|---|---|
| 인구_통계 | 6 | Easy 2, Medium 4 |
| 경제_산업 | 6 | Easy 2, Medium 4 |
| 환경_기후 | 6 | Easy 2, Medium 3, Hard 1 |
| 교통_도시 | 6 | Easy 2, Medium 3, Hard 1 |
| 복지_문화 | 6 | Easy 1, Medium 5 |
| 역사_사진 | 6 | Easy 1, Medium 4, Hard 1 |
| 특수_케이스 | 6 | Various |
쿼리 예시
섹션 제목: “쿼리 예시”{ "인구_통계": [ "서울 인구 변화", "강남구 인구수", "서울 출산율 추이" ], "특수_케이스": [ "최근 5년간 서울 청년 실업률 변화", // 복잡한 시간 범위 "강남 vs 강북 소득 격차", // 비교형 "AI" // 짧은 쿼리 ]}파일 위치
섹션 제목: “파일 위치”services/llm-search/tests/test_queries.json테스트 실행
섹션 제목: “테스트 실행”사전 준비
섹션 제목: “사전 준비”- 서비스 실행
cd services/llm-searchsource .venv/bin/activateuvicorn app.main:app --host 0.0.0.0 --port 8000- Ollama 실행 (선택적)
ollama serveollama run qwen3:8b- OpenAI API 키 확인
cat .env | grep OPENAI_API_KEY테스트 명령어
섹션 제목: “테스트 명령어”cd services/llm-search
# 빠른 테스트 (3개 쿼리)python tests/benchmark.py quick
# 전체 테스트 (42개 쿼리)python tests/benchmark.py full
# Provider 비교 테스트python tests/benchmark.py compareAPI 직접 호출
섹션 제목: “API 직접 호출”# 단일 쿼리 벤치마크curl -X POST "http://localhost:8000/api/benchmark/single" \ -H "Content-Type: application/json" \ -d '{ "query": "서울 인구", "providers": ["ollama", "openai"], "include_rag": true }'
# 배치 벤치마크curl -X POST "http://localhost:8000/api/benchmark/batch" \ -H "Content-Type: application/json" \ -d '{ "queries": ["서울 인구", "경제 현황", "대기오염"], "providers": ["openai"], "include_rag": true, "delay_between_queries": 0.5 }'결과 분석
섹션 제목: “결과 분석”결과 파일 위치
섹션 제목: “결과 파일 위치”services/llm-search/tests/results/├── benchmark_YYYYMMDD_HHMMSS.json # 전체 결과├── quick_test.json # 빠른 테스트 결과└── comparison_test.json # 비교 테스트 결과결과 구조
섹션 제목: “결과 구조”{ "total_queries": 42, "timestamp": "2026-01-26T12:00:00.000000", "results": [...], "aggregate_summary": { "total_tests": 168, "successful_tests": 165, "failed_tests": 3, "by_provider": { "ollama_basic": { "success_count": 40, "fail_count": 2, "avg_response_time_ms": 2450.5, "total_cost_usd": 0.0, "avg_keywords": 4.8 }, "openai_basic": { "success_count": 42, "fail_count": 0, "avg_response_time_ms": 850.2, "total_cost_usd": 0.0147, "avg_keywords": 5.0 }, "openai_rag": {...}, "openai_rag_extended": {...} }, "fastest_provider": "openai_basic" }}분석 스크립트
섹션 제목: “분석 스크립트”import json
with open("tests/results/benchmark_*.json") as f: data = json.load(f)
summary = data["aggregate_summary"]["by_provider"]
# 속도 비교print("=== 속도 비교 ===")for provider, stats in sorted(summary.items(), key=lambda x: x[1]["avg_response_time_ms"]): print(f"{provider}: {stats['avg_response_time_ms']:.0f}ms")
# 비용 비교print("\n=== 비용 비교 ===")for provider, stats in summary.items(): print(f"{provider}: ${stats['total_cost_usd']:.4f}")
# 성공률 비교print("\n=== 성공률 비교 ===")for provider, stats in summary.items(): rate = stats["success_count"] / (stats["success_count"] + stats["fail_count"]) * 100 print(f"{provider}: {rate:.1f}%")평가 기준
섹션 제목: “평가 기준”정량 평가
섹션 제목: “정량 평가”| 지표 | 우수 | 보통 | 미흡 |
|---|---|---|---|
| 응답 시간 | < 1초 | 1-3초 | > 3초 |
| 성공률 | > 98% | 95-98% | < 95% |
| 쿼리당 비용 | < $0.001 | $0.001-0.005 | > $0.005 |
| 키워드 충족률 | 100% | 80-100% | < 80% |
정성 평가
섹션 제목: “정성 평가”-
키워드 관련성
- 검색어와 직접 관련된 키워드 비율
- 서울/통계 도메인 적합성
-
다양성
- 동의어, 유사어, 관련 개념 포함 여부
- 중복 키워드 없음
-
한국어 품질
- 자연스러운 한국어 표현
- 오탈자 없음
가중치 점수
섹션 제목: “가중치 점수”종합 점수 = (속도 * 0.3) + (품질 * 0.4) + (비용 * 0.2) + (안정성 * 0.1)예상 결과
섹션 제목: “예상 결과”| Provider | 예상 응답 시간 |
|---|---|
| Ollama (로컬) | 2-4초 |
| OpenAI Basic | 0.5-1.5초 |
| OpenAI RAG | 0.8-2초 |
| OpenAI RAG Extended | 1-3초 (ES 쿼리 포함) |
| Provider | 쿼리당 예상 비용 |
|---|---|
| Ollama | $0 (로컬) |
| OpenAI Basic | ~$0.0003-0.0005 |
| OpenAI RAG | ~$0.0005-0.001 |
| OpenAI RAG Extended | ~$0.001-0.002 |
품질 (예상)
섹션 제목: “품질 (예상)”| Provider | 강점 | 약점 |
|---|---|---|
| Ollama | 비용 무료, 프라이버시 | 속도, 품질 일관성 |
| OpenAI Basic | 속도, 품질 | 비용 |
| OpenAI RAG | 도메인 특화, 정확성 | 비용, 속도 |
| OpenAI RAG Extended | 실데이터 기반, 최고 정확성 | 비용, ES 의존성 |
주의사항
섹션 제목: “주의사항”-
Rate Limiting
- OpenAI: 분당 요청 제한 있음
- 배치 테스트 시 delay 설정 필요
-
비용 관리
- 전체 테스트 시 예상 비용: ~$0.05-0.10
- 반복 테스트 시 비용 누적 주의
-
환경 일관성
- 동일 네트워크 환경에서 테스트
- 서버 부하 상태 확인
-
Ollama 가용성
- 로컬 Ollama 미실행 시 해당 테스트 실패
- 모델 다운로드 필요 (~4GB)
다음 단계
섹션 제목: “다음 단계”- 벤치마크 테스트 실행
- 결과 수집 및 분석
- 비교테스트 결과 문서 작성 (07_비교테스트_결과.md)
- 최적 설정 도출 및 권장사항 정리