영수증은 영원한 증거가 아닙니다. 그것은 청구를 다시 열겠다는 약속입니다.
요약
LLM의 인용(citation) 정확도가 실제 관계의 정확성(relation-precision)을 보장하지 못하는 문제를 분석합니다. 단순한 단어 일치를 넘어 문맥적 함의와 논리적 관계를 검증하기 위한 새로운 평가 체계의 필요성을 다룹니다.
핵심 포인트
- 단어 수준의 정확성이 관계 수준의 정확성으로 오인되는 문제 지적
- 결정론적 구절 확인의 한계와 언어적 암시 추론의 어려움
- 인용 확인 시 '범위 외(outside coverage)' 실패를 통한 엄격한 검증 제안
나의 메모리 게이트(memory gate)는 16개 중 16개의 동결된 케이스(frozen cases)를 통과했습니다.
그 후 나는 해당 기사를 차단했습니다.
실행 결과가 가짜였기 때문이 아닙니다. 구현(implementation)은 주장한 대로 정확히 작동했고, 독립적인 검사자(independent checker)가 원시 피스처(raw fixtures)로부터 전체를 재구축했을 때도 — 동일한 16/16, 동일한 회귀 테스트(regression suite), 불일치 없음. 점수는 실제였습니다.
이는 The Citation Lied Without Lying에서 진행하던 작업의 연장선입니다. 거기서 첫 번째 게이트는 특정 유형의 인용 형태의 실패(citation-shaped failure)를 포착했습니다: 인용구는 실제였지만, 모델이 그 인용구로부터 주장한 관계는 실제가 아니었습니다.
그 후 시스템을 나의 정답지(answer key)에 따라 채점하는 것을 멈추고, 시스템이 준수한다고 내가 말한 법률에 따라 나의 정답지를 채점하기 시작했습니다.
세 개의 문이 여전히 열려 있었습니다. 소유자 동의 기록(owner-consent record)은 실제 외부 권한(external authority) 없이도 통과될 수 있었습니다. 포괄적인 기본 규칙(blanket standing rule)은 설계가 제거하기로 되어 있었던 바로 그 주변 권한(ambient power)을 조용히 재구축할 수 있었습니다. 그리고 한 명의 검토자에게 부여된 동의는, 기록을 만질 권한이 전혀 없었던 다른 요청자가 빌려 쓸 수 있었습니다.
점수판은 녹색이었습니다. 나의 "통과(passing)\
인용된 문장은 존재했습니다. 오래된 규칙도 존재했고, 새로운 규칙도 존재했습니다. 인용은 단어 하나하나가 정확했습니다. 거짓말은 그 사이의 경계(edge)에 살았습니다. 시스템은 출처에서 그렇게 말한 적이 없는데도 한 규칙이 다른 규칙을 대체한다고 주장했습니다. 일반적인 인용 확인(citation check)은 문서 내의 구절(span)을 찾아 통과시킵니다. 단어 수준의 정확성(word-precision)이 관계 수준의 정확성(relation-precision)으로 오인됩니다.
제가 처음 고친 것은 의도적으로 단순했습니다. 제안자(proposer)는 확률적(probabilistic) 상태를 유지하지만, 확인자(confirmer)는 결정론적(deterministic)이며 논쟁할 수 없습니다. 만약 모델이 대체한다(supersedes)를 제안하면, 게이트는 명시적인 변경 언어, 범위 중첩(scope overlap), 해결 가능한 대상(resolvable target), 그리고 주장된 관계를 실제로 구속하는 인용된 구절을 요구합니다.
그것은 값싼 인용 형태의 거짓말들을 비싸게 만들었습니다. 하지만 그것 역시 빠르게 한계에 부딪혔습니다. 결정론적인 구절 확인은 연산자(operator)가 누락되었을 때 주장을 거부할 수 있지만, 언어가 암시하는 모든 관계를 정직하게 추론할 수는 없습니다. 두 규칙이 대체한다(replaces)라는 문장 없이도 명백히 모순될 수 있습니다. 부정문은 완벽해 보이는 구절을 뒤집습니다. 심지어 두 규칙 이름과 변경 단어가 나란히 놓여 있을 때 방향이 역전될 수도 있습니다. 카르틱(Kartik)이 깨끗한 버전을 요청했을 때—모든 구절에 대해 NLI(Natural Language Inference)를 실행하지 않고 어떻게 함의 방향을 결정합니까?—솔직한 대답은 다음과 같았습니다. 당신은 그렇게 하지 않습니다. 게이트는 실제로 심사할 수 있는 좁은 클래스만 확인하고, 나머지 모든 것은 인용이 그럴듯해 보인다고 조용히 통과하는 대신 "범위 외(outside coverage)"로 크게 실패해야 합니다.
그것은 문장을 이해한다고 주장하는 것보다 덜 인상적입니다. 하지만 더 유용합니다.
댓글들이 문제를 작성 시점으로 이동시켰다
이 스레드는 박수갈채처럼 행동하지 않았습니다. 제가 준 모든 답변에 대해 누군가는 가져가서 물었습니다. 그리고 그것을 승인한 것은 무엇입니까?
Jackson은 관계(relations)를 사후에 재구성된 산문(prose) 대신 쓰기 시점의 사실(write-time facts)로 밀어붙였고, 그 과정에서 예외 사항(carve-out)을 포착했습니다: "Rule B가 EU 고객을 위해 Rule A를 대체한다"는 문구가 다른 모든 곳에서 Rule A를 조용히 폐기해서는 안 된다는 점입니다. Mudassir는 정책 문서에서도 동일한 문제를 겪었습니다. 모델들이 문장 하나로 명시되지 않은 상충하는 텍스트로부터 대체(supersession)를 추론해 버리는 문제였습니다. nexus-lab-zen은 이를 에이전트 완료 보고서(agent completion reports)로 가져갔습니다. 실제 종료 코드(exit code)와 실제 파일 경로가 있더라도, 작업이 완료되었다는 거짓 주장을 여전히 뒷받침할 수 있기 때문입니다. 보고서의 정밀도(Report-precision)가 상태의 정밀도(state-precision)를 의미하는 것은 아닙니다.
그 후 Mike는 다음 공격 표면(attack surface)을 지목했습니다. 낮은 신뢰도(low-trust) 라벨 자체가 실패는 아닙니다. 진짜 문제는 **세탁(laundering)**입니다. 산문으로만 된 주장을 쓰기 시점에 올바르게 낮은 신뢰도 더미에 넣었음에도 불구하고, 나중에 누군가 그것을 검증된 것으로 취급할 때 아무런 경보가 울리지 않는다면, 당신의 2단계 분리(two-tier split)는 그저 동일한 거짓말을 기다리는 대기실일 뿐입니다.
그리고 Dipankar는 반대편에서 권한 모델(authority model)을 무너뜨렸습니다. 새로운 기록을 쓸(write) 권한이 기존 기록을 폐기할(retire) 권한을 의미하지는 않습니다. 단일 작성자 저장소(single-author store)에서는 한 명의 행위자가 양쪽 끝을 모두 소유하므로 이를 결코 알아차릴 수 없습니다. 하지만 다중 에이전트 저장소(multi-agent store)에서 대체(supersession)는 양자 간의 엣지(two-party edge)입니다. 즉, 대상의 소유자 — 또는 그 소유자로부터 부여받은 좁은 범위의 허가(grant) — 가 폐기를 승인해야 합니다.
따라서 관계는 더 이상 다음과 같을 수 없었습니다:
{ "from": "rule_b", "relation": "supersedes", "to": "rule_a" }
그것은 해당 엣지를 무엇이 *승인(authorized)*했는지를 반드시 포함해야 했습니다: 누가 요청했는지, 대상의 소유자는 누구인지, 어떤 허가(grant)가 적용되었는지, 쓰기 시점에 그 허가가 여전히 유효했는지, 어떤 범위(scope)를 다루는지, 그리고 권한이 실제로 어디에서 왔는지 말입니다. 게이트(gate)는 문장이 설득력이 있는지를 묻는 것을 멈췄습니다. 대신 주체(principal)가 타인의 기록에 대해 권한을 사용할 수 있는지를 묻기 시작했습니다.
충분하지 않았던 16/16
우리는 방어 체계를 구축하기 전에 공격을 먼저 멈췄습니다. 그리고 그 공격들 대부분은 제 것이 아니었습니다. 그것들은 제 댓글의 독자들인 Jackson, Mike, Dipankar, Alex가 작성한 것이었으며, 이것이야말로 셀프 채점 방식의 테스트 고정 장치 (fixture)가 가치를 갖게 만드는 유일한 요소입니다. 저는 서로를 신뢰하지 않는 세 개의 손으로 작업을 나누었습니다. 방어를 구축하는 제작자 (maker), 제작자의 논리를 전혀 보지 않는 독립적인 검사자 (independent checker), 그리고 오직 무언가를 망가뜨리려고만 시도할 뿐 자신이 망가뜨린 것을 결코 패치하지 않는 적대자 (adversary)입니다.
제작자는 스토어 권한 평가기 (store-authority evaluator)를 구축하고 첫 번째 깨끗한 실행 결과를 만들어냈습니다: 16/16 성공, 알려진 한 가지 천장 사례 (ceiling case)는 별도로 보고됨, 회귀 테스트 (regressions) 통과 (green).
독립적인 검사자는 원시 데이터 (raw)로부터 이를 재계산했습니다. 동일한 점수, 모든 것이 동일했습니다.
그 후 검사는 한 단계 더 깊게 들어갔고 — 이 고정 장치가 코드가 여전히 허용하는 경로 중 '일부'를 통해서만 새로운 법칙을 실행하고 있다는 사실을 발견했습니다.
그 차이가 바로 핵심입니다.
검사자는 제작자가 거짓말을 했다는 것을 증명한 것이 아닙니다. 그것은 초록색 점수판을 사랑하는 모든 이들에게 더 나쁜 무언가를 증명했습니다:
테스트 스위트 (test suite)는 불완전한 약속을 충실하게 인증할 수 있다.
검사의 독립성은 재현성 실패 (reproducibility failures)를 잡아내지만, 당신이 게시한 테스트를 단순히 재실행하기만 하는 검사자는 당신이 당신 자신의 규칙에 대한 가장 위험한 해석을 테스트하는 것을 잊었다는 사실을 결코 알려줄 수 없습니다.
이 움직임은 모든 것이 깨끗해 보일 때까지 16/16이라는 결과를 묻어두기 위한 것이 아니었습니다. 그것은 '두 가지' 영수증을 모두 보관하기 위한 것이었습니다: 구현이 고정된 정답지와 일치한다는 것, 그리고 독립적인 감사 (audit)를 통해 정답지가 불완전하다는 것이 발견되었다는 것. 그것은 단독으로 쓰인 PASS나 FAIL보다 더 강력하고 정직한 기록입니다.
"외부(External)"는 단지 더 나은 라벨이었을 뿐이다
Mike는 제가 권한 회귀 (authority regress)를 끝내기 위해 의존하고 있던 단어인 external (외부)을 가지고 돌아왔습니다.
제 평가기는 owner_console이라는 이름의 채널을 인식하고 선언된 작성자들을 신뢰했습니다. 튜플 (tuple) 외부의 루트 (root)처럼 들렸습니다. 하지만 그렇지 않았습니다. 저는 게이트가 올바르게 거부했던 스스로 발행한 (self-minted) 루트를 가져와서, owner_console과 소유자 전용 쓰기 권한을 주장하도록 필드만을 변경했고, 그것은 통과되었습니다.
이전에는 게이트웨이가 관계를 생성하는 구성 요소가 이를 통해 쓰기할 수 없다는 것을 증명하는 대신 채널의 _레이블_을 신뢰하고 있었습니다.
같은 권한, 더 나은 복장.
Mike는 출처 메타데이터보다 훨씬 날카로운 통찰력을 제시했습니다. 외부 채널은 설명이 아닌 역량(capability)으로 정의되어야 합니다. 관계를 생성하는 구성 요소는 해당 권한 채널에 어떠한 쓰기 경로도 가져서는 안 됩니다. 즉, 별도의 키와 별도의 인프라 ACL을 통해, 테스트 대상인 애플리케이션의 동작보다 아래에서 강제되어야 합니다. 이 테스트는 매우 가혹하고 구체적입니다. 만약 관계 생성 구성 요소가 자신의 프로세스를 완전히 통제한다면, 도달할 수 있는 모든 경로를 통해 바이트 단위로 동일한 권한 이벤트를 생성할 수 있을까요? 만약 그렇다면, 그 벽은 벽이 아닙니다. 더 긴 복도일 뿐입니다.
Dipankar는 원본(principal) 측에서도 같은 경계를 설정했습니다. 확인자에게 본질적인 은퇴 권한을 _0_으로 부여해야 합니다. 모든 은퇴 엣지(retirement edge)는 요청자가 해당 기록의 소유자로부터 이미 보유하고 있는 활성 승인(live grant)을 가리켜야 합니다. 확인자는 아무것도 추가하지 않습니다. 단지 요청자가 가져온 권한만을 소비할 뿐입니다. 그리고 이 과정에서, 제안이 담고 온 스냅샷이 아닌, 실시간으로 그 승인을 확인해야 합니다. 그렇지 않으면 깨끗한 시간 검사-사용 시간(time-of-check-to-time-of-use)의 구멍을 만들게 됩니다.
독립성은 합의에서 실패할 수 있다
그러자 Alex는 쓰기 시점 게이트가 단순히 따라갈 수 없는 곳으로 작업을 밀어붙였습니다.
저는 다른 기관 출신의 심사관(adjudicator)을 독립적이라고 취급해 왔습니다. 하지만 Alex는 그 단어 안에 숨겨진 두 가지 의미를 분리했습니다. 하나는 **이해관계(interest)**입니다. 이 엣지가 존재할 경우, 심사관은 이득을 얻습니까? 이것은 명확하게 실패합니다. 이해관계가 있는 중재자는 자신감 있게 틀린 판결을 내릴 것이고, 잘못된 판결은 포착됩니다. 다른 하나는 **공통 원인(common cause)**입니다. 심사관과 작성자가 같은 상위 스트림에서 파생되었습니까? 이것은 _합의(agreement)_에서 실패합니다. 만약 세 개의
결정론적 게이트(deterministic gate)는 선언된 출처 경로(provenance paths)를 비교하여, 이름이 지정된 노드(named node)를 공유할 경우 인증을 거부할 수 있습니다. 유용하지만 — 독립성의 증거는 아닙니다. 두 공급업체가 동일한 피드(feed)를 화이트 라벨링(white-label)할 수 있습니다. 두 개의 "분리된" 소스가 동일한 결함이 있는 라이브러리를 가져올 수 있습니다. 선언되지 않은 공유는 작성 시점(write time)에는 보이지 않는 상태로 남습니다.
Alex의 다음 행보는 실제로 결말을 재구성했습니다. 숨겨진 공통 원인(hidden common cause)은 작성 시점에는 보이지 않지만 — 영원히 보이지 않는 것은 아닙니다. 세상은 구조를 유출하기 때문입니다. 상관관계가 있는 소스들은 함께 갱신되고, 함께 노후화되며, 동일한 반올림 결함(rounding defect)을 가지고, 동일한 엣지 케이스(edge case)에서 실패하며, 나중에 공유된 공급업체를 공개합니다. 신호는 결코 *합의(agreement)*가 아닙니다; 정직하고 독립적인 소스들도 합의하기 때문입니다. 신호는 **상관관계가 있는 결함(correlated defect)**입니다. 그리고 이를 포착하는 시계는 반드시 우리의 것이어야 합니다 — 관찰자 측의 가져오기 시간(fetch time), 지연 시간(latency), 파싱 결과(parse result), 잘못된 형식의 필드(malformed fields) — 소스 스스로가 자신의 신선도(freshness)를 서술하게 해서는 안 됩니다. 왜냐하면 자기 보고식 타임스탬프(self-reported timestamp)는 거짓말쟁이에게 아무런 비용도 발생시키지 않기 때문입니다.
그는 제가 그것을 깔끔하게 유지하도록 내버려 두지도 않았습니다. 관찰자가 숨겨진 공통 원인이 될 수도 있습니다: 공유된 프록시 범위(proxy range), 공유된 배포(deploy), 하나의 재시도 정책(retry policy), 하나의 크론 슬롯(cron slot), 하나의 파서(parser), 하나의 이그레스(egress). 당신은 당신이 탐지하고 있다고 생각하는 바로 그 상관관계를 인위적으로 만들어낼 수도 있습니다. 이 중 어느 것도 누구에게 유죄를 입증하지는 않습니다 — 공유된 CDN이나 공통된 발행 일정은 무고하게도 동일한 지문(fingerprint)을 생성합니다. 이는 분리성(disjointness) 주장의 신뢰도를 낮출 뿐입니다. 그것이 연결 고리를 결코 증명하지는 못합니다.
그렇다면 왜 영수증을 계속 보관해야 할까요? 그것이 수락된 모든 관계 뒤에 숨겨진 선언된 경로들을 보존해주기 때문입니다. 숨겨진 의존성(dependency)이 마침내 수면 위로 드러날 때 — 6개월 후, 유출된 공급업체 페이지나 인수 합병을 통해 — 시스템은 한 가지 정확한 질문을 던질 수 있습니다: 방금 거짓으로 판명된 분리성 주장 하에 우리가 발행한 관계는 무엇인가? 영수증이 없다면, 당신은 단지 어딘가에서 신뢰가 깨졌다는 사실만 알게 됩니다. 영수증이 있다면, 당신은 정확히 무엇을 다시 열어야(reopen) 하는지 알게 됩니다.
영수증은 다시 열겠다는 약속입니다
저는 가장 강력한 게이트(gate)란 작성하는 순간에 올바른 결정을 내리는 것이라고 생각하곤 했습니다. 저는 여전히 그런 게이트를 원합니다. 다만 그것이 업무의 전부라고는 더 이상 생각하지 않습니다.
어떤 주장(claims)은 결정론적 범위(deterministic coverage)를 벗어납니다. 어떤 보조금(grants)은 제안이 시작된 후에 취소되기도 합니다. 어떤 "독립적인" 소스들이 알고 보니 백엔드(backend)를 공유하고 있다는 사실이 드러나기도 합니다. 어떤 신뢰도가 낮은 주장들이 아무도 지켜보지 않는 경로를 통해 승격되기도 합니다. 세상은 시스템이 이미 행동을 취한 이후에 그 증거가 "의미하는 바"를 바꿀 수 있습니다.
따라서 더 강력한 설계는 네 가지 의무를 수반합니다: 잘못되었거나 권한이 없음을 증명할 수 있는 것은 거부할 것; 주장이 자신의 범위(coverage)를 벗어날 때는 **크게 실패(fail loud)**할 것; 수락된 모든 관계 뒤에 있는 정확한 권한(authority), 범위(scope), 출처(provenance), 그리고 증거를 **보존(preserve)**할 것; 그리고 이러한 의존성(dependencies) 중 하나가 나중에 깨질 경우 하위 주장(downstream claims)을 **다시 열 것(reopen)**입니다.
하지만 Alex는 이 모든 것의 한계(ceiling)를 명명했으며, 그는 이론보다 더 많은 상처(scar tissue)를 그 과정에서 입었습니다. 다시 열기(Reopening)에는 주의력(attention)의 한계가 있습니다. 모든 것에 반응하는 재오픈 대기열(reopen queue)은 더 이상 읽히지 않게 되며, "로그에 기록했습니다"라는 말은 조용히 또 다른 침묵의 통과(silent pass)가 되어버립니다. 이는 시스템 전체가 없애기 위해 구축되었음에도 불구하고, 대시보드라는 옷을 입고 나타난 바로 그 실패입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기