백엔드 · AI 서비스 개발자
[email protected] · Github
엔티티 해석 성능이 임베딩 단독 방식보다 낮던 원인을 평가로 찾아 F1 0.57 → 0.90으로 개선
문제 흐름
flowchart LR
M[호칭 mention] --> S1[1. 후보 검색]
S1 --> S2{2. 규칙 필터}
S2 -.->|① 관계 태그 · 위계 충돌이면<br/>정답 후보까지 배제| X1[미검출 · 오병합]
S2 --> S3[3. LLM 판정]
S3 --> S4{4. 확신도<br/>0.5·LLM + 0.3·임베딩 + 0.2·규칙}
S4 -.->|② 규칙 미측정도 0으로 합산<br/>확신도 상한 0.80| X2[되묻기 59.8%]
문제 원인
- 배경: 대화 속 "팀장", "김팀장", "부장님"이 같은 사람인지 판단하고, 확신이 부족하면 자동으로 합치지 않고 사용자에게 되묻는 4단계 엔티티 해석 구조
- 용어: mention은 대화 속 호칭 하나하나, 오병합은 다른 사람을 한 사람으로 합친 경우, 미검출은 같은 사람을 묶지 못한 경우, 되묻기는 판단을 미루고 사용자에게 묻는 비율. F1은 기존 인물로 합친 판정의 정밀도(합친 것 중 정답 비율)와 재현율(합쳐야 할 것 중 실제로 합친 비율)의 조화평균
- 파일럿 평가에서 제안 방식과 베이스라인 4종을 같은 조건으로 실행: 자동 병합 기준 0.8에서 오병합 1/132, 미검출 1/132, 되묻기 79건(59.8%)
- 임베딩 단독 방식은 오병합 0, 미검출 1, 되묻기 23.5%로 모든 축에서 제안 방식과 같거나 나았음 → 사전에 정한 통과 기준(게이트) 미달
- 실패 케이스를 단계별로 추적: 힌트가 없는 mention은 규칙 점수가 측정되지 않았는데도 0점으로 합산돼 확신도가 최대 0.80에 묶였음. 이 상한이 자동 병합 기준(0.8)과 같아 사실상 자동 병합이 불가능했고, 2단계 규칙 필터가 정답 후보를 미리 제외한 경우도 있었음
해결 과정
- 통과 기준은 결과를 본 뒤 바꾸지 않고 원인만 수정
- 확신도 재정규화: 규칙 점수가 측정되지 않은 경우 0으로 더하지 않고 분모에서 빼서 (0.5×LLM + 0.3×임베딩) / 0.8로 계산
- 규칙 필터 감점: 관계 태그나 위계가 충돌하면 후보를 제외하지 않고 감점만 하고, 호칭 사전과 모순될 때만 제외. 감점된 후보가 자동 병합 구간에 들어오면 되묻기로 낮춤
- 재실행은 같은 40건으로 1회만 진행
테스트
- 환경: 로컬 Docker PostgreSQL 16 + pgvector, OpenAI gpt-4o-mini-2024-07-18과 text-embedding-3-small 실제 호출
- 조건: 시나리오 40건, mention 141개(채점 대상 132개) × 5개 방식 × 임계치 10단계 = 7,050행, 실행당 약 $0.027