@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 링크 하나는 리허설 전에도 값이 있다 —
변액 예금자보호는 데모 시나리오에 들어가고, 지금은 그 항목의 결정론적 상향이 아예 없다.
물어보는 것
@gitIt-sehyeon — VAR-PARTIAL-DEPOSIT-INSURANCE 의 M02 링크 누락이 의도인가?
의도가 아니면 리허설 전에 붙이고 싶다(루브릭은 내 파일이라 내가 낸다).
@gitIt-sehyeon — 발행사 신용위험 유형 추가는 source 근거가 필요할 텐데(8건이 아직
TODO 인 것과 같은 문제) 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)"
@gitIt-sehyeon@hd0rable—#279(eval 재생성)에서 두 분이 독립으로 같은 지적을 하셔서원인을 팠다. 개별 결함이 아니라 구조적 공백이었다.
발단 —
els-0028이U4 → U2로 내려갔다두 분 다 루브릭 문면으로 대조해서 U4 가 맞다고 읽으셨다. 그 근거가 이것이다.
루브릭은 이 오해를 이미 선언해 놨다. 그런데도 통과했다.
왜 통과했나 — floor 는 이 목록을 안 본다
두 목록이 서로 대조되지 않는다.
ELS-ISSUER-CREDIT-RISK의related는M01-PRINCIPAL-GUARANTEE·M02-DEPOSIT-INSURANCE인데 둘 다 "기초자산만 오르면 안전하다"와 무관하고, 애초에 발행사 신용위험에 해당하는 유형이 9종 안에 없다.
실측이다.
두 번째가 중요하다.
증권사가 망할 리 없다는 선언된 조건과 사실상 같은 문장인데도라이브러리가 못 잡는다. 즉 선언된 조건은 매처의 입력이 전혀 아니다 — 매칭은
misconceptions.yaml의patterns라는 별개의, 더 좁은 어휘로만 돈다.공백의 크기
가장 눈에 띄는 것.
첫 조건은 누가 봐도
M02-DEPOSIT-INSURANCE자리인데 링크가 비어 있다. 이건 단순 누락으로보인다. (실측:
"예금처럼 전액 보호되는 거죠?"→ 매칭 없음.)왜 이게 우리가 계속 고쳐 온 것과 같은 모양인가
굳은 원칙 두 개에 정면으로 걸린다.
여기는 규칙을 선언까지 해 놓고 강제를 모델에게 맡겼다. 그리고
#268에서 확인한 것과같은 자리다 — 거기서도
R-05를 실제로 발동시킨 건 우리 계산(복창 캡)이었지 모델이 아니었다.실패 방향이 미탐이라는 게 제일 나쁘다.
U4 → U2면 게이트가R-01RED 대신R-04YELLOW 를 낸다. 라벨링 지침 §2.1 이 U4 를 맨 앞에 둔 이유를 강희진이
#279리뷰에서그대로 인용하셨다 — "U2 로 붙이면 게이트가 통과시킨다. 이 시스템에서 제일 비싼 오류."
지금 있는 방어로는 안 잡힌다
rubrics.assert_related_misconceptions_exist()는 참조된 ID 가 실재하는지만 본다.related가 비어 있거나 조건과 안 맞는 경우는 통과한다. 이 함수가 생긴 계기가M07-YIELD-OVERCONFIDENCE삭제였는데, 그때 남은 조건들이 어디로 갔는지는 아무도 안 봤다.선택지 — (c) + (a) 를 권한다
VAR-PARTIAL링크misconception_conditions문면도 유사도로 본다(b) 는 리허설 전에 하지 않는다. 과탐 방향이라 게이트로선 안전한 실패지만, 채점 동작을
이틀 전에 바꾸면 데모에서 어떻게 나올지 재 볼 시간이 없다. 3주차 정량평가 뒤에 본다.
(c) 는 채점을 안 건드린다. 지금은 46개 중 무엇이 강제되고 무엇이 권고인지 코드도 문서도
말하지 않는데, 그걸 루브릭에 명시하게 하고 로딩 시점에 대조한다. 우리가 반복해서 쓴
"조용한 실패를 로딩 시점으로 끌어올린다" 와 같은 처리다.
(a) 중
VAR-PARTIAL-DEPOSIT-INSURANCE링크 하나는 리허설 전에도 값이 있다 —변액 예금자보호는 데모 시나리오에 들어가고, 지금은 그 항목의 결정론적 상향이 아예 없다.
물어보는 것
@gitIt-sehyeon—VAR-PARTIAL-DEPOSIT-INSURANCE의M02링크 누락이 의도인가?의도가 아니면 리허설 전에 붙이고 싶다(루브릭은 내 파일이라 내가 낸다).
@gitIt-sehyeon— 발행사 신용위험 유형 추가는source근거가 필요할 텐데(8건이 아직TODO인 것과 같은 문제) 3주차로 미루는 게 맞나?@hd0rable— (c) 로 드러난 공백이 게이트 쪽 판단에 영향을 주나.#268→#275에서"게이트가 우리가 계산한 값에만 반응한다" 를 정리하셨는데, 그 계산의 적용 범위가
선언된 것의 5분의 1 이라는 사실이 거기 붙는다.
측정 재현: