Skip to content

루브릭이 선언한 오해 46개 중 강제되는 건 라이브러리 9종뿐이다 — 나머지는 프롬프트 문면일 뿐이고, 모델이 놓치면 아무 일도 안 일어난다 #284

Description

@yoonjiseok

@gitIt-sehyeon @hd0rable — #279(eval 재생성)에서 두 분이 독립으로 같은 지적을 하셔서
원인을 팠다. 개별 결함이 아니라 구조적 공백이었다.

발단 — els-0028 이 U4 → U2 로 내려갔다

발화   "지수만 안 빠지면 되는 거 아니에요? 회사가 망하는 건 별개 문제고요."
항목   ELS-ISSUER-CREDIT-RISK          gemini U4  →  gpt-5-mini U2

두 분 다 루브릭 문면으로 대조해서 U4 가 맞다고 읽으셨다. 그 근거가 이것이다.

misconception_conditions:
  - 기초자산만 오르면 안전하다      ← 발화가 거의 그대로다

루브릭은 이 오해를 이미 선언해 놨다. 그런데도 통과했다.

왜 통과했나 — floor 는 이 목록을 안 본다

misconception_conditions   프롬프트에 실린다.  모델이 읽고 판단한다      → 강제력 없음
related_misconceptions     apply_misconception_floor 가 등급을 U4 로 올린다 → 강제력 있음

두 목록이 서로 대조되지 않는다. ELS-ISSUER-CREDIT-RISK 의 related 는
M01-PRINCIPAL-GUARANTEE · M02-DEPOSIT-INSURANCE 인데 둘 다 "기초자산만 오르면 안전하다"
와 무관하고, 애초에 발행사 신용위험에 해당하는 유형이 9종 안에 없다.

실측이다.

[ELS] "지수만 안 빠지면 되는 거 아니에요? 회사가 망하는 건 별개 문제고요."  → 매칭 없음
[ELS] "증권사가 망할 리가 있나요"                                        → 매칭 없음   ← ❗

두 번째가 중요하다. 증권사가 망할 리 없다 는 선언된 조건과 사실상 같은 문장인데도
라이브러리가 못 잡는다. 즉 선언된 조건은 매처의 입력이 전혀 아니다 — 매칭은
misconceptions.yaml 의 patterns 라는 별개의, 더 좁은 어휘로만 돈다.

공백의 크기

루브릭 17개가 선언한 오해 조건   46개
라이브러리 유형                   9종  (M07 은 근거 미확보로 삭제됨)
related 보다 조건이 많은 루브릭   15 / 17

가장 눈에 띄는 것.

VAR-PARTIAL-DEPOSIT-INSURANCE   조건 3개 · related 0개   ← floor 가 영원히 안 걸린다
    · 예금처럼 전액 보호된다
    · 전혀 보호되지 않는다
    · 낸 보험료 전액이 보호 대상이다

첫 조건은 누가 봐도 M02-DEPOSIT-INSURANCE 자리인데 링크가 비어 있다. 이건 단순 누락으로
보인다. (실측: "예금처럼 전액 보호되는 거죠?" → 매칭 없음.)

M08-TYING 을 아무 루브릭도 related 로 안 거는 것은 정상이다 — #205 가 상신
신호를 루브릭 필터 밖에서 만들도록 갈랐다. 이걸 "빠졌다" 고 보고 채우면 #160 이
되돌아간다.

왜 이게 우리가 계속 고쳐 온 것과 같은 모양인가

굳은 원칙 두 개에 정면으로 걸린다.

모델 출력을 그대로 믿지 않는다 — 스팬은 원문에서 계산, 유형ID 는 라이브러리에서만,
mismatch·confidence 는 재계산.

모델이 못 하는 판정은 계산으로 내린다 — 복창 판정이 그 사례다.

여기는 규칙을 선언까지 해 놓고 강제를 모델에게 맡겼다. 그리고 #268 에서 확인한 것과
같은 자리다 — 거기서도 R-05 를 실제로 발동시킨 건 우리 계산(복창 캡)이었지 모델이 아니었다.

실패 방향이 미탐이라는 게 제일 나쁘다. U4 → U2 면 게이트가 R-01 RED 대신 R-04
YELLOW 를 낸다. 라벨링 지침 §2.1 이 U4 를 맨 앞에 둔 이유를 강희진이 #279 리뷰에서
그대로 인용하셨다 — "U2 로 붙이면 게이트가 통과시킨다. 이 시스템에서 제일 비싼 오류."

지금 있는 방어로는 안 잡힌다

rubrics.assert_related_misconceptions_exist() 는 참조된 ID 가 실재하는지만 본다.

missing = [t for t in rubric.related_misconceptions if t not in known]

related 가 비어 있거나 조건과 안 맞는 경우는 통과한다. 이 함수가 생긴 계기가
M07-YIELD-OVERCONFIDENCE 삭제였는데, 그때 남은 조건들이 어디로 갔는지는 아무도 안 봤다.

선택지 — (c) + (a) 를 권한다

무엇 누구 리허설 전
(a) 라이브러리에 유형·패턴 추가 (발행사 신용위험 등) + VAR-PARTIAL 링크 정세현 데이터 링크만이면 가능
(b) floor 가 misconception_conditions 문면도 유사도로 본다 내 엔진 안 한다
(c) 공백을 로딩 시점에 드러낸다 — 조건마다 강제/권고를 명시 내 영역 안전

(b) 는 리허설 전에 하지 않는다. 과탐 방향이라 게이트로선 안전한 실패지만, 채점 동작을
이틀 전에 바꾸면 데모에서 어떻게 나올지 재 볼 시간이 없다. 3주차 정량평가 뒤에 본다.

(c) 는 채점을 안 건드린다. 지금은 46개 중 무엇이 강제되고 무엇이 권고인지 코드도 문서도
말하지 않는데, 그걸 루브릭에 명시하게 하고 로딩 시점에 대조한다. 우리가 반복해서 쓴
"조용한 실패를 로딩 시점으로 끌어올린다" 와 같은 처리다.

(a) 중 VAR-PARTIAL-DEPOSIT-INSURANCE 링크 하나는 리허설 전에도 값이 있다 —
변액 예금자보호는 데모 시나리오에 들어가고, 지금은 그 항목의 결정론적 상향이 아예 없다.

물어보는 것

  1. @gitIt-sehyeon — VAR-PARTIAL-DEPOSIT-INSURANCE 의 M02 링크 누락이 의도인가?
    의도가 아니면 리허설 전에 붙이고 싶다(루브릭은 내 파일이라 내가 낸다).
  2. @gitIt-sehyeon — 발행사 신용위험 유형 추가는 source 근거가 필요할 텐데(8건이 아직
    TODO 인 것과 같은 문제) 3주차로 미루는 게 맞나?
  3. @hd0rable — (c) 로 드러난 공백이 게이트 쪽 판단에 영향을 주나. #268 → #275 에서
    "게이트가 우리가 계산한 값에만 반응한다" 를 정리하셨는데, 그 계산의 적용 범위가
    선언된 것의 5분의 1
    이라는 사실이 거기 붙는다.

측정 재현:

cd ai-service && .venv/bin/python -c "
import sys; sys.path.insert(0,\".\")
from app import misconception
print(misconception.match(\"증권사가 망할 리가 있나요\", \"ELS\").matches)"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

ai-serviceFastAPI (:8100, 내부망 전용)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions