# 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 참고 자료

자료 설명
RAGAS Documentation RAG 평가 프레임워크
MTEB Leaderboard 임베딩 모델 벤치마크
LLM-as-Judge Paper LLM 평가 방법론 논문

10. 문서 이력

버전 날짜 변경 내용 작성자
1.0 2026-01-11 최초 작성 팔방미인 팀

본 문서의 KPI는 CtrlF 시스템 환경에 최적화된 경험적 수치입니다. 다른 시스템에 적용 시 환경에 맞게 재검증이 필요합니다.