25

KG Q&A 시스템 평가: 측정 가능한 품질 지표

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@KTop-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에 통합하여 회귀 방지