25분
KG Q&A 시스템 평가: 측정 가능한 품질 지표
KG 기반 Q&A
KG Q&A 시스템 평가: 측정 가능한 품질 지표
온톨로지 & Knowledge Graph > KG 기반 Q&A
학습 목표
Retrieval과 Generation을 분리해서 평가한다 Precision, Recall, Hit Rate, MRR 등 지표를 이해한다 Golden Test Set을 구축하여 회귀 테스트를 자동화한다
"우리 KG Q&A가 좋아진 건가 나빠진 건가?"
LLM 프롬프트만 살짝 바꿔도 답변이 달라진다. 측정 없는 개선은 운에 맡기는 것.
평가의 두 축
KG Q&A 시스템 = Retrieval + Generation
┌─────────────────┐
질문 ────────→│ Retrieval │ → 관련 노드/경로 추출
│ (Cypher 실행) │
└─────────────────┘
↓
┌─────────────────┐
│ Generation │ → 자연어 답변
│ (LLM 호출) │
└─────────────────┘
↓
답변
두 단계를 분리 평가해야 문제를 정확히 진단 가능
Retrieval 평가 지표
| 지표 | 정의 | 제조 도메인 적용 |
|---|---|---|
| Precision@K | Top-K 결과 중 정답 비율 | "E-201 원인 5개 중 진짜 원인 몇 개?" |
| Recall@K | 전체 정답 중 Top-K에 포함된 비율 | "실제 원인 3개 중 몇 개를 잡았나?" |
| Hit Rate | 정답이 Top-K에 1개라도 있으면 1 | "베어링 마모가 결과에 있나?" |
| MRR | 평균 역순위 (정답 첫 등장 순위의 역수) | "베어링 마모가 1순위에 있나?" |
def precision_at_k(retrieved: list, relevant: set, k: int) -> float:
top_k = retrieved[:k]
if not top_k:
return 0.0
hits = sum(1 for item in top_k if item in relevant)
return hits / len(top_k)
def mrr(retrieved: list, relevant: set) -> float:
for rank, item in enumerate(retrieved, start=1):
if item in relevant:
return 1.0 / rank
return 0.0
Generation 평가 지표
| 지표 | 측정 방법 | 비고 |
|---|---|---|
| Faithfulness | 답변이 KG 사실에 기반하는가? | LLM-as-a-judge |
| Answer Relevance | 질문과 답변이 일치하는가? | 임베딩 유사도 |
| Completeness | 필수 정보 모두 포함했나? | 체크리스트 |
| Tone/Style | 제조 현장 톤에 맞는가? | 사람 평가 |
# LLM-as-a-judge 예시 (간단 버전)
JUDGE_PROMPT = """제조 KG Q&A 시스템의 답변을 평가:
질문: {question}
KG 사실: {kg_facts}
답변: {answer}
다음 항목을 1-5로 점수:
- faithfulness (사실 일치도)
- relevance (질문 관련성)
- completeness (완성도)
JSON: {{"faithfulness": N, "relevance": N, "completeness": N, "reason": "..."}}
"""
Golden Test Set 구축
[
{
"id": "test_001",
"question": "CNC밀링 3호기에서 E-201 알람이 떴습니다. 원인이 뭘까요?",
"relevant_nodes": ["cause_coolant_low", "cause_bearing_wear", "cause_overcutting"],
"expected_top_cause": "cause_coolant_low",
"must_include_keywords": ["냉각수", "베어링", "확률"],
"must_not_include": ["환각", "추측"]
},
{
"id": "test_002",
"question": "베어링 교체할 수 있는 사람 누구야?",
"relevant_nodes": ["worker_kim"],
"must_include_keywords": ["김기술", "스핀들 정비"]
}
]
최소 50개의 골든 테스트를 만들고 CI에 자동 실행. 프롬프트나 모델 변경 시 즉시 회귀 확인 가능.
자동 평가 파이프라인
def run_evaluation(qa_system, test_set):
results = []
for test in test_set:
# 1. Retrieval 평가
retrieved = qa_system.retrieve(test["question"])
p_at_5 = precision_at_k(retrieved, set(test["relevant_nodes"]), 5)
# 2. Generation 평가
answer = qa_system.generate(test["question"], retrieved)
keyword_score = sum(1 for kw in test["must_include_keywords"]
if kw in answer) / len(test["must_include_keywords"])
# 3. LLM Judge
judge_score = llm_as_judge(test["question"], retrieved, answer)
results.append({
"test_id": test["id"],
"precision@5": p_at_5,
"keyword_coverage": keyword_score,
"judge": judge_score,
})
return results
# 회귀 임계값
MIN_PRECISION = 0.7
MIN_KEYWORD_COVERAGE = 0.8
MIN_JUDGE_SCORE = 4.0 # 5점 만점
운영 체크리스트
- 골든 테스트 셋 ≥ 50개 보유
- CI/CD에 자동 평가 통합
- 프로덕션 로그에서 사용자 피드백 수집 (좋아요/싫어요)
- 주간 평가 리포트 (정확도 추이)
- 임계값 미달 시 자동 알림
- LLM 모델 버전 변경 시 회귀 테스트 필수
측정하지 않으면 개선도 없다. 평가 인프라가 제조 KG Q&A의 진짜 차별화 포인트다.
AI로 학습하기 — 꿀팁
🤖KG Q&A 평가 데이터셋 생성AI 학습 팁
AI에게 제조 설비 KG Q&A 시스템을 평가할 수 있는 질문-정답-평가지표 데이터셋을 생성하게 요청하세요.
제조 설비 KG Q&A 시스템 성능을 측정하기 위한 평가 데이터셋을 만들어줘. 질문 10개(단순 조회 4개, 관계 탐색 3개, 집계 3개)와 각각의 정답 Cypher, 기대 출력, 평가 지표(Hit Rate, MRR, Precision@3)를 포함한 JSON 형식으로 출력해줘. 실제 Neo4j 제조 KG에서 바로 사용 가능한 형식으로 줘.
이 팁이 도움이 됐나요?
핵심 포인트
- • Retrieval과 Generation은 분리해서 평가해야 문제 진단이 가능
- • Precision@K, MRR로 Retrieval 품질을 정량화
- • LLM-as-a-judge + 키워드 커버리지로 Generation을 자동 평가
- • Golden Test Set 50+개를 CI에 통합하여 회귀 방지