Skip to content

fix(ai): 평가위원이 남의 축 기준값을 보고 채점하던 문제 - #272

Merged
i3months merged 1 commit into
devfrom
fix/ai-per-axis-score-anchor
Sep 29, 2026
Merged

i3months merged 1 commit into
devfrom
fix/ai-per-axis-score-anchor

Conversation

@i3months

Copy link
Copy Markdown
Member

면접 품질 백로그의 L9(앵커 축별 분리). 아직 유효했다.

문제

패널 평가위원 N명에게 score_basis 를 shared 로 넘기고 있었다. 그 블록에는 네 축의
기준값이 전부 들어 있다:

- technical_accuracy ≈ 80 (correctness=RAG 사실일치 기반)
- logic_score ≈ 20
- communication_score ≈ 100
- overall_score ≈ 67

프롬프트는 이렇게 지시한다:

'점수 기준값(score_basis)'에 해당 축 기준값이 있으면 그 값에서 ±15점 이내로 산정한다.

"해당 축"을 위원이 스스로 찾아야 한다. 그런데 기준값 라벨과 위원의 축 이름이 다르다:

위원의 축 이름 기준값 라벨
직무 역량·깊이 technical_accuracy
논리·인과관계 명확성 logic_score
명료성·구조화·전달력 communication_score

직군 위원은 #268 에서 "기술"→"직무 역량"으로 바꾼 뒤 더 멀어졌다.

그리고 overall_score 가 보인다 — 어느 위원도 써서는 안 될 앵커다. 남의 축 숫자도
앵커링으로 새어 들어간다. 논리 위원이 technical 80 을 보면 자기 점수를 그쪽으로 당긴다.

고친 방법

위원마다 자기 축 기준값만 주입한다. 라벨도 위원의 축 이름과 같은 말로 쓴다:

- 직무 역량 기준값 ≈ 80 (per-answer correctness(자료 근거 사실성) 평균)
- 이 값에서 ±15점 이내로 산정하세요. 다른 축의 기준값은 주어지지 않습니다.

주의한 것 셋:

  • 직군 위원은 여러 명이라 key 가 tech:{직군} 이다. axis_of 가 이걸 technical 로
    접는다 — 하나라도 빠지면 그 위원만 조용히 옛 동작으로 떨어진다.
  • 평가 0건이면 기존 공용 문자열로 폴백한다. 앵커가 통째로 사라지면 점수가
    캘리브레이션 없이 흔들린다 — 고치려다 더 나쁘게 만들면 안 된다.
  • 단일 생성기(LlmFeedbackGenerator)는 네 축을 한 번에 내므로 전체 기준값이 필요하다.
    선택 인자로 두고 소비자가 지원 여부를 보고 넘긴다.

숫자 계산은 _score_baselines 한 곳으로 모았다 — 전체 문자열과 축별 값이 달라지면 안 된다.

테스트

테스트 왜
tech:BACKEND·tech:SALES·technical 이 모두 technical 로 접힌다 빠지면 그 위원만 조용히 옛 동작
각 축이 자기 숫자만 본다 (80 / 20 / 100 — 섞이면 바로 드러남)
overall 이 어느 위원에게도 안 보인다 가장 위험한 앵커
남의 축 라벨도 안 보인다
평가 0건이면 공용 기준값으로 폴백한다 과교정 방지

가드 둘 다 회귀를 잡는지 확인했다 — 축별 주입을 지우면, tech: 매핑을 지우면 각각 실패한다.

AI 449건 통과.

남은 L9 (이번에 안 함)

technical_accuracy 를 correctness 하나로만 산정하는 부분. correctness 는 RAG 기반이라
참고 문서를 안 고르면 통째로 null 이 되고, 그러면 직무 역량 축이 "근거 없음"이 된다.
specificity 를 섞는 게 맞아 보이지만 기준값 정의가 바뀌면 과거 점수와 비교가 깨진다 —
백로그가 중리스크로 분류한 이유다. 별도로 다루는 게 맞다.

면접 품질 백로그의 L9(앵커 축별 분리). 아직 유효했다.

패널 평가위원 N명에게 score_basis 를 shared 로 넘기고 있었다. 그 블록에는 네
축(technical/logic/communication/**overall**)의 기준값이 전부 들어 있다.

프롬프트는 이렇게 지시한다:

  "'점수 기준값(score_basis)'에 해당 축 기준값이 있으면 그 값에서 ±15점 이내로 산정"

그런데 기준값 라벨(logic_score)과 위원의 축 이름(논리·인과관계 명확성)이
**다르다**. 위원이 스스로 짝을 찾아야 한다. 직군 위원은 #268 이후 축 이름이
"직무 역량·깊이"인데 라벨은 technical_accuracy 라 더 멀다.

그리고 overall_score 가 보인다 — **어느 위원도 써서는 안 될 앵커**다. 남의 축
숫자도 앵커링으로 새어 들어간다. 논리 위원이 technical 80 을 보면 자기 점수를
그쪽으로 당긴다.

## 고친 방법

build_axis_score_basis 가 축별 기준값을 만들고, 패널이 위원마다 자기 것만
주입한다. 라벨도 위원의 축 이름과 같은 말로 쓴다(직무 역량/논리/전달력).

  직무 역량 기준값 ≈ 80 (per-answer correctness 평균)
  이 값에서 ±15점 이내로 산정하세요. 다른 축의 기준값은 주어지지 않습니다.

주의한 것 셋:

- 직군 위원은 여러 명이라 key 가 tech:{직군} 이다. axis_of 가 이걸 technical 로
  접는다 — 하나라도 빠지면 그 위원만 조용히 옛 동작으로 떨어진다.
- 축별 기준값이 없으면(per-answer 평가 0건) 기존 공용 문자열로 **폴백**한다.
  앵커가 통째로 사라지면 점수가 캘리브레이션 없이 흔들린다.
- 단일 생성기는 네 축을 한 번에 내므로 전체 기준값이 필요하다. 선택 인자로 두고
  소비자가 지원 여부를 보고 넘긴다.

숫자 계산은 _score_baselines 한 곳으로 모았다 — 전체 문자열과 축별 값이
달라지면 안 된다.

## 테스트

  tech:BACKEND · tech:SALES · technical 이 모두 technical 로 접힌다
  각 축이 자기 숫자만 본다 (80 / 20 / 100 으로 서로 달라 섞이면 드러남)
  **overall 이 어느 위원에게도 안 보인다**
  **남의 축 라벨도 안 보인다**
  평가 0건이면 공용 기준값으로 폴백한다

가드 둘 다 회귀를 잡는지 확인했다 — 축별 주입을 지우면, tech: 매핑을 지우면
각각 실패한다.

AI 449건 통과.
@i3months
i3months merged commit d04bf9f into dev Sep 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant