# CtrlF 품질 KPI 정의서
## 1. 문서 개요
| 항목 | 내용 |
|------|------|
| **문서명** | CtrlF 품질 KPI 정의서 |
| **버전** | 1.0 |
| **작성일** | 2026-01-11 |
| **작성자** | 팔방미인 팀 |
| **목적** | RAG 기반 AI 챗봇의 품질 지표 정의 및 목표치 설정 |
---
## 2. KPI 정의 원칙
### 2.1 KPI 설정 배경
RAG(Retrieval-Augmented Generation) 시스템의 품질은 단일 지표로 평가할 수 없습니다. 본 문서는 다음 원칙에 따라 KPI를 정의합니다:
1. **측정 가능성**: 자동화된 방식으로 반복 측정 가능한 지표
2. **비즈니스 연관성**: 실제 사용자 경험과 직결되는 지표
3. **경험적 검증**: 테스트 데이터를 통해 임계값을 검증
### 2.2 KPI 산출 근거
| 근거 유형 | 설명 |
|-----------|------|
| **테스트 데이터** | Golden Query 25개 + 배치 테스트 575개 |
| **운영 로그** | Elasticsearch 기반 실시간 로그 분석 |
| **반복 실험** | 39회 iteration을 통한 개선 및 검증 |
> **참고**: 본 KPI의 임계값은 업계 표준이 아닌, CtrlF 시스템 환경(EXAONE 3.5 LLM, Milvus 벡터DB, 사내 규정 문서)에서 경험적으로 도출된 값입니다.
---
## 3. KPI 체계
### 3.1 KPI 분류
┌─────────────────────────────────────────────────────────────────┐
│ CtrlF 품질 KPI │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [1. 검색 품질] [2. 답변 품질] [3. 시스템 성능] [4. 보안] │
│ │
│ - L2 거리 - 정답률 - 응답 시간 - PII 차단율 │
│ - 검색 성공률 - 환각률 - 처리량 - Gate 차단율 │
│ - RAG 수행률 - 출처 포함률 - 가용성 │
│ │
└─────────────────────────────────────────────────────────────────┘
---
## 4. 상세 KPI 정의
### 4.1 검색 품질 (Retrieval Quality)
#### KPI-R1: L2 거리 평균
| 항목 | 내용 |
|------|------|
| **정의** | 사용자 쿼리 벡터와 검색된 문서 벡터 간 유클리드 거리의 평균 |
| **산출식** | `AVG(min_l2_distance)` |
| **목표치** | **< 0.6** |
| **측정 주기** | 실시간 (매 요청) |
| **데이터 소스** | Elasticsearch `chat_log` 인덱스 |
**임계값 설정 근거**:
| L2 거리 범위 | 테스트 결과 | 판정 |
|--------------|-------------|------|
| 0.0 ~ 0.5 | 정답률 100%, 환각 0% | 우수 |
| 0.5 ~ 0.8 | 정답률 98%, 환각 0% | 양호 |
| 0.8 ~ 1.2 | 정답률 85%, 환각 2% | 보통 |
| 1.2 ~ 1.4 | 정답률 60%, 환각 8% | 주의 |
| **> 1.4** | 정답률 30%, 환각 25% | **차단** |
575개 테스트 질문 분석 결과, L2 < 0.6 구간에서 환각이 0건이었으므로 이를 목표치로 설정.
---
#### KPI-R2: 검색 성공률
| 항목 | 내용 |
|------|------|
| **정의** | 전체 RAG 요청 중 1개 이상의 관련 문서를 검색한 비율 |
| **산출식** | `COUNT(source_count > 0) / COUNT(*) × 100` |
| **목표치** | **≥ 95%** |
| **측정 주기** | 일간 |
**개선 이력**:
- Before: 36.2%
- After: 91.5%
- 목표: 95%
---
#### KPI-R3: RAG 수행률
| 항목 | 내용 |
|------|------|
| **정의** | 전체 질문 중 RAG 파이프라인이 실행된 비율 |
| **산출식** | `COUNT(rag_used = true) / COUNT(*) × 100` |
| **목표치** | **≥ 90%** (개인화 질문 제외) |
| **측정 주기** | 일간 |
> 개인화 질문(연차 조회, 급여 조회 등)은 Backend API를 사용하므로 RAG 미수행이 정상
---
### 4.2 답변 품질 (Answer Quality)
#### KPI-A1: 정답률 (Accuracy)
| 항목 | 내용 |
|------|------|
| **정의** | Golden Query 테스트 세트에서 정답으로 판정된 비율 |
| **산출식** | `COUNT(correct) / COUNT(total) × 100` |
| **목표치** | **100%** |
| **측정 주기** | 배포 전, 주간 |
| **평가 방법** | 전문가 수동 검토 + LLM-as-Judge |
**Golden Query 구성**:
| 카테고리 | 질문 수 | 예시 |
|----------|---------|------|
| 연차/휴가 | 5개 | "연차 규정이 어떻게 되나요?" |
| 경조사 | 3개 | "경조사 휴가 며칠이야?" |
| 급여/복리후생 | 4개 | "식대 지원 금액 알려줘" |
| 교육/연수 | 5개 | "필수 교육 목록 알려줘" |
| 출장/경비 | 4개 | "출장비 정산 절차가 어떻게 되나요?" |
| 기타 규정 | 4개 | "재택근무 규정 알려줘" |
| **합계** | **25개** | |
---
#### KPI-A2: 환각률 (Hallucination Rate)
| 항목 | 내용 |
|------|------|
| **정의** | 근거 문서에 없는 내용을 생성한 답변의 비율 |
| **산출식** | `COUNT(hallucinated) / COUNT(total) × 100` |
| **목표치** | **0%** |
| **측정 주기** | 배포 전, 주간 |
| **평가 방법** | LLM-as-Judge (Faithfulness 검사) |
**환각 판정 기준**:
| 유형 | 설명 | 판정 |
|------|------|------|
| 사실 환각 | 문서에 없는 수치/날짜 언급 | 환각 |
| 규정 환각 | 존재하지 않는 조항 인용 | 환각 |
| 추론 환각 | 문서 내용을 과도하게 확대 해석 | 환각 |
| 안전 응답 | "해당 정보를 찾을 수 없습니다" | 정상 |
**현재 성과**: 575개 테스트 중 환각 **0건**
---
#### KPI-A3: 출처 포함률
| 항목 | 내용 |
|------|------|
| **정의** | RAG 답변 중 출처(source)가 포함된 비율 |
| **산출식** | `COUNT(source_count > 0 AND rag_used) / COUNT(rag_used) × 100` |
| **목표치** | **100%** |
| **측정 주기** | 실시간 |
---
### 4.3 RAGAS 평가 메트릭 (표준 RAG 평가)
> RAGAS(Retrieval Augmented Generation Assessment)는 RAG 시스템 평가를 위한 업계 표준 프레임워크입니다.
#### KPI-RAGAS1: Faithfulness (충실도)
| 항목 | 내용 |
|------|------|
| **정의** | 답변이 검색된 컨텍스트에만 기반하는지 측정 (환각 방지 핵심 지표) |
| **산출식** | RAGAS `faithfulness` 메트릭 |
| **목표치** | **≥ 0.9** |
| **측정 주기** | 배포 전, 주간 |
| **평가 방법** | RAGAS 프레임워크 자동 평가 |
**측정 원리**:
1. 답변에서 주장(claims)을 추출
2. 각 주장이 컨텍스트에 있는지 검증
3. `(검증된 주장 수) / (전체 주장 수)` = Faithfulness
---
#### KPI-RAGAS2: Answer Relevancy (답변 관련성)
| 항목 | 내용 |
|------|------|
| **정의** | 답변이 질문에 얼마나 관련있는지 측정 |
| **산출식** | RAGAS `answer_relevancy` 메트릭 |
| **목표치** | **≥ 0.9** |
| **측정 주기** | 배포 전, 주간 |
| **평가 방법** | RAGAS 프레임워크 자동 평가 |
**측정 원리**:
1. 답변으로부터 가능한 질문들을 생성
2. 생성된 질문과 원본 질문의 유사도 측정
3. 평균 유사도 = Answer Relevancy
---
#### KPI-RAGAS3: Context Precision (컨텍스트 정밀도)
| 항목 | 내용 |
|------|------|
| **정의** | 검색된 문서들 중 실제로 관련있는 문서의 비율 |
| **산출식** | RAGAS `context_precision` 메트릭 |
| **목표치** | **≥ 0.85** |
| **측정 주기** | 배포 전, 주간 |
| **평가 방법** | RAGAS 프레임워크 자동 평가 |
---
#### RAGAS 평가 실행
```bash
# RAGAS 평가 실행
python scripts/ragas_evaluation.py
# 특정 카테고리만 평가
python scripts/ragas_evaluation.py --category HR
# 캐시된 응답으로 재평가
python scripts/ragas_evaluation.py --use-cached
4.4 시스템 성능 (System Performance)
KPI-P1: 응답 시간 (Latency)
| 항목 |
내용 |
| 정의 |
사용자 질문 수신부터 답변 완료까지 소요 시간 |
| 목표치 (P50) |
< 2초 |
| 목표치 (P95) |
< 5초 |
| 목표치 (P99) |
< 10초 |
| 측정 주기 |
실시간 |
| 데이터 소스 |
Elasticsearch latency_ms 필드 |
백분위수 설명:
| 지표 |
의미 |
사용자 경험 |
| P50 |
50%의 요청이 이 시간 내 응답 |
일반적 체감 속도 |
| P95 |
95%의 요청이 이 시간 내 응답 |
대부분의 사용자 경험 |
| P99 |
99%의 요청이 이 시간 내 응답 |
최악의 경우 대비 |
KPI-P2: 처리량 (Throughput)
| 항목 |
내용 |
| 정의 |
단위 시간당 처리 가능한 요청 수 |
| 목표치 |
≥ 10 req/sec |
| 측정 주기 |
부하 테스트 시 |
KPI-P3: 가용성 (Availability)
| 항목 |
내용 |
| 정의 |
전체 운영 시간 중 서비스 정상 가동 비율 |
| 산출식 |
(전체 시간 - 장애 시간) / 전체 시간 × 100 |
| 목표치 |
≥ 99.5% |
| 측정 주기 |
월간 |
4.4 보안 (Security)
KPI-S1: PII 차단율
| 항목 |
내용 |
| 정의 |
개인정보(PII) 포함 요청 중 정상 차단된 비율 |
| 산출식 |
COUNT(pii_blocked) / COUNT(pii_detected) × 100 |
| 목표치 |
100% |
| 측정 주기 |
실시간 |
PII 탐지 대상:
- 주민등록번호
- 전화번호
- 이메일 주소
- 계좌번호
- 카드번호
KPI-S2: Gate 차단율
| 항목 |
내용 |
| 정의 |
3중 Gate에서 차단된 위험 요청 비율 |
| Gate 종류 |
Privacy Gate, Stats Gate, Low-relevance Gate |
| 목표치 |
정상 동작 확인 (차단율 자체보다 정확성 중요) |
| 측정 주기 |
일간 |
5. KPI 대시보드
5.1 실시간 모니터링 지표
| 지표 |
시각화 |
알림 조건 |
| L2 거리 평균 |
시계열 그래프 |
> 0.8 시 경고 |
| 응답 시간 P95 |
시계열 그래프 |
> 5초 시 경고 |
| 에러율 |
시계열 그래프 |
> 1% 시 경고 |
| PII 감지 횟수 |
카운터 |
감지 시 알림 |
5.2 일간/주간 리포트 지표
| 지표 |
집계 방식 |
목표 |
| 정답률 |
Golden Query 테스트 |
100% |
| 환각률 |
LLM-as-Judge 평가 |
0% |
| 검색 성공률 |
로그 집계 |
≥ 95% |
| 평균 응답 시간 |
로그 집계 |
< 3초 |
6. 측정 방법론
6.1 Golden Query 테스트
# 테스트 실행 방식
for query in golden_queries:
response = chatbot.ask(query)
# 1. 자동 평가: 출처 포함 여부, 응답 시간
auto_score = evaluate_auto(response)
# 2. LLM-as-Judge: 정확성, 환각 여부
judge_score = llm_judge(query, response, expected_answer)
# 3. 결과 기록
log_result(query, response, auto_score, judge_score)
6.2 배치 테스트
| 항목 |
내용 |
| 테스트 세트 |
575개 질문 (실제 사용자 질문 기반) |
| 실행 주기 |
배포 전, 주 1회 |
| 평가 방식 |
자동 평가 + 샘플링 수동 검토 |
6.3 LLM-as-Judge 프로토콜
[평가 프롬프트]
다음 질문과 답변을 평가해주세요.
[질문]: {question}
[참고 문서]: {context}
[답변]: {answer}
평가 기준:
1. 정확성: 답변이 참고 문서에 기반하는가? (0-1)
2. 완전성: 질문에 충분히 답변하는가? (0-1)
3. 환각 여부: 참고 문서에 없는 내용이 있는가? (Yes/No)
JSON 형식으로 응답:
{"accuracy": 0.0-1.0, "completeness": 0.0-1.0, "hallucination": true/false}
7. 목표 달성 현황
7.1 현재 성과 (2026-01-11 기준)
| KPI |
목표 |
현재 |
달성 여부 |
| L2 거리 평균 |
< 0.6 |
0.58 |
✅ 달성 |
| 정답률 |
100% |
100% |
✅ 달성 |
| 환각률 |
0% |
0% |
✅ 달성 |
| 검색 성공률 |
≥ 95% |
91.5% |
🔄 개선 중 |
| 응답 시간 P95 |
< 5초 |
3.2초 |
✅ 달성 |
| PII 차단율 |
100% |
100% |
✅ 달성 |
7.2 개선 이력
| 버전 |
날짜 |
주요 개선 |
정답률 변화 |
| v0.1 |
2025-12 |
초기 RAG 구현 |
36% |
| v0.2 |
2025-12 |
Intent Classifier 개선 |
58% |
| v0.3 |
2026-01 |
Query Expansion 적용 |
78% |
| v0.4 |
2026-01 |
3중 Gate 적용 |
95% |
| v1.0 |
2026-01 |
Self-Healing 적용 |
100% |
8. 향후 계획
8.1 추가 예정 KPI
| KPI |
설명 |
도입 시기 |
| RAGAS Faithfulness |
표준 RAG 평가 프레임워크 적용 |
Phase 2 |
| RAGAS Context Relevancy |
검색 품질 정밀 측정 |
Phase 2 |
| 사용자 만족도 (NPS) |
실제 사용자 피드백 |
Phase 2 |
| 재질문 비율 |
답변 불만족 간접 지표 |
Phase 2 |
8.2 RAGAS 도입 계획
# RAGAS 평가 예시 (향후 적용 예정)
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision
result = evaluate(
dataset,
metrics=[faithfulness, answer_relevancy, context_precision]
)
9. 부록
9.1 용어 정의
| 용어 |
정의 |
| L2 거리 |
유클리드 거리. 벡터 간 직선 거리로, 낮을수록 유사함 |
| P50/P95/P99 |
백분위수. 전체 데이터 중 해당 비율이 이 값 이하임 |
| Golden Query |
정답이 명확한 테스트 질문 세트 |
| 환각 (Hallucination) |
LLM이 근거 없이 사실처럼 생성한 내용 |
| RAG |
Retrieval-Augmented Generation. 검색 기반 생성 |
| LLM-as-Judge |
LLM을 평가자로 사용하는 방법론 |
9.2 참고 자료
10. 문서 이력
| 버전 |
날짜 |
변경 내용 |
작성자 |
| 1.0 |
2026-01-11 |
최초 작성 |
팔방미인 팀 |
본 문서의 KPI는 CtrlF 시스템 환경에 최적화된 경험적 수치입니다. 다른 시스템에 적용 시 환경에 맞게 재검증이 필요합니다.