에이전트 메모리 권위(Memory Authority)를 점수 산정 공식으로 변환하려 시도했습니다. 홀드아웃 테스트(Held-out test)가
요약
에이전트의 메모리 검색 시 단순 관련성(relevance) 기반의 한계를 극복하기 위해 '권위(Authority)' 개념을 수학적 점수 산정 공식으로 도입했습니다. BM25 점수에 메모리 유형, 우선순위, 도메인 일치도를 결합하여 적대적 쿼리 상황에서도 정확한 메모리를 선택하도록 설계되었습니다.
핵심 포인트
- 단순 BM25 기반 검색의 방해 요소(distractor) 문제 해결
- 정규화된 관련성(normalized_relevance)과 권위 가중치(authority_weight) 결합
- 메모리 유형 및 검증 요구사항을 반영한 점수 모델 구축
- 액션 도메인 일치 여부를 판단하는 scope_match_weight 도입
몇 개의 글 전, 한 친한 친구가 제가 회피할 수 없는 질문을 던졌습니다.
그는 이 시리즈의 이전 포스트들 — 권위 정책(authority policy), 액세스 게이트(access gate), 캡스톤 프레임워크 맵(capstone framework map) — 을 읽었고, 그의 반응은 직설적이었습니다: 수학은 어디에 있습니까? 모델은 어디에 있습니까? 당신은 문제를 설명했습니다. 검색(retrieval)을 무엇이 개선하는지 보여주십시오.
그의 말이 맞았습니다. 저는 개념적인 스택(conceptual stack)을 구축했습니다. 좋은 개념들, 신중한 논리, 정직한 한계점들 말입니다. 하지만 공식은 없었습니다. 숫자도 없었습니다. 이 프레임워크가 검색 시스템이 선택하는 것을 실제로 변화시킨다는 증거도 없었습니다.
그래서 저는 점수 산정 모델(scoring model)을 만들었습니다. 제가 가진 패킷(packets)들로 테스트했습니다. 스트레스 테스트(stress test)를 수행했습니다. 그러고 나서 출판하기 전에 이를 따로 떼어두고(held it back), 새로운 홀드아웃 패킷(held-out packet)으로 테스트를 진행했습니다.
그 마지막 단계가 주장을 바꾸어 놓았습니다.
이것이 이번 글의 내용입니다.
공식이 해결하려 했던 문제
공식을 도입하기 전, 검색 시스템은 관련성(relevance)에 따라 메모리를 선택했습니다 — 텍스트와 메타데이터(metadata)가 결합된 필드에 대한 BM25 방식이었습니다. 이 베이스라인(baseline)은 단순한 쿼리(queries)에서는 상당히 잘 작동했습니다. 하지만 적대적(adversarial)인 쿼리에서는 무너졌습니다.
실패 패턴은 구체적이었습니다. 메모리 저장소에 의미론적으로 관련 있는 방해 요소(distractor) — 즉, 쿼리와는 잘 일치하지만 요청된 작업에 대한 권위(authority)를 가진 것은 아닌 메모리 — 가 포함되어 있을 때, 관련성만 따지는 검색기(retriever)는 그 방해 요소를 선택하게 됩니다. 그러면 작업 평가기(action evaluator)는 권위 있는 메모리의 작업 힌트(action hint) 대신 방해 요소의 작업 힌트를 바탕으로 작동하게 됩니다.
실제 사례로는 다음과 같습니다: 에이전트가 VPN에 접속하는 방법을 묻습니다. 검색 시스템은 용어 중첩(term overlap)이 높다는 이유로
score =
normalized_relevance
+ authority_weight
...
각 용어는 서로 다른 종류의 권위 신호(authority signal)를 목표로 합니다:
normalized_relevance — 메모리의 결합된 텍스트 및 메타데이터 필드에 대한 표준 BM25 점수이며, [0, 1] 범위로 정규화(normalized)됩니다. 이것은 베이스라인(baseline)으로 유지됩니다. 나머지 용어들은 이 값을 높이거나 낮추는 역할을 합니다.
authority_weight — 메모리 유형(memory type), 우선순위(priority), 그리고 검증 요구 사항(verification requirement)으로부터 도출됩니다. priority: critical 및 verification_required: true 설정을 가진 policy 또는 credential 유형의 메모리는 기본 우선순위를 가진 context 노트보다 여기서 더 높은 점수를 받습니다. 범위는 권위 신호가 얼마나 존재하고 일관적인지에 따라 대략 0에서 3.5 사이입니다.
scope_match_weight — 메모리가 어떤 리소스, 역할, 또는 액션 도메인(action domain)에 대해 권위를 갖는지 명시적으로 선언하는 governs 필드로부터 도출됩니다. 쿼리의 액션 도메인이 governs 범위와 일치하면, 이 용어는 상당한 보너스를 추가합니다. 대상에 governs가 전혀 없는 경우, 이 용어의 기여도는 0입니다.
specificity_weight — 더 좁고 구체적인 governs 선언을 가진 메모리는 광범위하고 포괄적인 정책보다 더 높은 점수를 받습니다. 쿼리가 결제 승인(payment approval)에 관한 것이라면, payment.approve를 관장하는 메모리가 일반적인 financial_operations를 관장하는 메모리보다 우선순위가 높습니다.
action_type_weight — 읽기(read), 쓰기(write), 또는 실행(execute) 작업에 대한 메모리의 거버넌스를 선언하는 governs.action_types로부터 도출됩니다. execute 작업을 관장하는 메모리는 실행과 관련된 쿼리에 대해 더 높은 점수를 받습니다. 읽기 전용(read-only) 액세스 정책은 실행 쿼리에 대해 낮은 점수를 유지합니다.
status_validity_weight — 만료되었거나 대체된(superseded) 메모리에 대해 페널티를 부여합니다. 활성(active) 상태인 메모리는 superseded_by로 표시되었거나 만료 날짜가 지난 메모리보다 높은 점수를 받습니다.
conflict_risk_penalty — 여러 권위 경로(authority-lane)의 메모리가 동일한 쿼리 범위를 관장하는 것으로 보일 때 점수를 감소시킵니다. 이는 완전한 충돌 해결사(conflict resolver)가 아닌, 작은 규모의 페널티입니다.
의도: 권위(authority) 메타데이터가 존재하고 형식이 올바른 경우, 관련성(relevance)은 주요 신호(primary signal)가 아닌 동점자 처리 기준(tiebreaker)이 됩니다.
def governance_score(memory, query, store):
relevance = bm25_normalize(memory, query)
authority = authority_weight(memory.type, memory.priority, memory.verification_required)
...
주석 처리된 패킷(Annotated Packets)에 대한 수치 결과
주석 처리된 패킷(annotated packets) — 즉, 새로운 모델 패스(model passes)를 통해 governs, 작업 유형(action types), 권위(authority) 필드가 정교하게 작성된 5가지 시나리오의 저장소(stores) — 에서 권위 조정 점수 산정 방식(governance-adjusted scorer)은 매 패스마다 5/5의 대상 선택(target selection)과 5/5의 정확한 작업(correct action)을 달성했습니다.
세 번의 새로운 주석 처리(annotation) 패스가 진행되었습니다. 매번 동일한 결과였습니다. 앞서 설명한 권위 중재(authority-arbitration) 실패로 인해 동일한 적대적 제품군(adversarial family)에서 일관되게 약 3/5의 대상과 4/5의 작업에 머물렀던 베이스라인 BM25 전략과 비교했을 때, 이는 진전된 것처럼 보였습니다.
하지만 혼란 변수(confound)를 초기에 명시하는 것이 중요합니다. 이전의 가장 우수한 범위 우선순위(scope-precedence) 전략 또한 깨끗한 주석 처리된 패킷에서 5/5를 달성했습니다. 첫 번째 긍정적인 결과는 가산 공식(additive formula)이 가장 우수한 구조적 전략과 대등할 수 있음을 보여준 것이지, 그것을 능가했음을 보여준 것은 아니었습니다.
그다음 스트레스 테스트(stress test)가 이어졌습니다.
스트레스 테스트 (The Stress Test)
스트레스 패킷은 공식을 무너뜨리기 위해 설계되었습니다. 각각 다른 실패 모드(failure mode)를 목표로 하는 6가지 시나리오로 구성되었습니다:
- 대상 메모리에
governs필드가 전혀 없는 쿼리가, 형식이 올바른 권위 메타데이터를 가진 방해 요소(distractor)와 경쟁하는 경우 - 대상의
governs필드가 불일치하는 쿼리 — 그럴듯하지만 잘못된 범위(scope) — 가 올바른 권위를 가진 방해 요소와 경쟁하는 경우 - 유사한 권위를 가진 **여러 개의 범위 내 정책(in-scope policies)**이 존재하여 중재(arbitration)가 필요한 쿼리
- 의도적으로 오도하는 권위 신호를 담은 **오염된 방해 요소(poisoned distractor)**가 포함된 쿼리
- 권위 함정이 없는 깨끗하고 안전한 읽기(safe read)
- 표면적인 문구는 읽기를 암시하지만 결과적으로는 민감한 정보 공개(sensitive disclosure)를 초래하는, 작업이 모호한(action-ambiguous) 쿼리
스트레스 패킷(stress packet)에 대한 거버넌스 조정 점수 산정 방식(governance-adjusted scorer)의 결과:
| 지표 (Metric) | 결과 (Result) |
|---|---|
| 타겟 선택 (Target selected) | 4/6 |
| ... |
이전의 가장 우수한 전략인 scope_precedence_role_filter_bm25_metadata_text와 동일한 결과입니다. 두 방식 모두 4/6를 기록했으며 동일한 두 가지 시나리오에서 실패했습니다.
첫 번째 실패 사례인 governs 누락 케이스에 대한 점수 분해(score decomposition)는 다음과 같습니다:
| 구성 요소 (Component) | 승자 (distractor, 방해 요소) | 타겟 (Target) | 차이 (Delta) |
|---|---|---|---|
| 관련성 (relevance) | 0.46 | 0.80 | −0.34 |
| ... |
타겟의 관련성(relevance)이 더 높았습니다. 하지만 타겟에는 governs 필드가 없었습니다. 따라서 범위(scope), 구체성(specificity), 작업 유형(action_type) 모두 0점을 기록했습니다. 잘 구성된 거버넌스 메타데이터를 가졌으나 잘못된 메모리였던 방해 요소(distractor)가 이 세 가지 항목에서만 4.81점 차이로 승리했습니다.
두 번째 실패 사례인 governs 불일치 케이스는 동일한 패턴을 보였으나 결과는 더 나빴습니다:
| 구성 요소 (Component) | 차이 (Delta, 방해 요소 대비 타겟) |
|---|---|
| 관련성 (relevance) | −0.72 |
| ... |
타겟은 완벽한 관련성을 가졌습니다. 그럼에도 불구하고 governs 필드가 잘못된 도메인으로 범위를 제한했기 때문에 6.18점 차이로 패배했습니다. 범위(scope) 항목은 음수를 기록했습니다. 방해 요소의 잘 구성된 거버넌스가 나머지 항목들을 휩쓸었습니다.
홀드아웃 패킷(Held-Out Packet)이 주장을 바꾸어 놓았습니다
이 글을 게시하기 전, 저는 테스트를 한 번 더 수행했습니다.
이 패킷은 시나리오 작성 프롬프트는 받았으나 점수 산정 공식, 예상되는 전략 동작, 그리고 CLAIM-15 스트레스 결과는 받지 않은 새로운 모델 인스턴스에 의해 작성되었습니다. 이 모델은 기업 IT, 의료, 금융, 법률, 물류 분야에 걸쳐 6개의 시나리오를 생성했습니다.
결과는 제가 원했던 깔끔한 긍정적 결과가 아니었습니다:
| 전략 (Strategy) | 타겟 선택 (Target selected) | 작업 정확도 (Action correct) | 허위 확신 오류 (False-certainty errors) | 과도한 차단 (Overblocking) |
|---|---|---|---|---|
bm25_metadata_text | 6/6 | 6/6 | 0 | 0 |
| ... |
이것은 중요한 문제입니다.
사전 등록된 위조 조건(falsification condition)은 다음과 같았습니다: 만약 관련성 전용 BM25가 전체 점수 산정 방식과 일치한다면, 거버넌스 용어들은 그들이 주장하는 역할을 수행하고 있지 않은 것이다.
홀드아웃 패킷(held-out packet)에서 BM25는 단순히 전체 점수 산정 방식과 일치하는 수준에 그치지 않았습니다. BM25가 이를 능가했습니다.
이것이 BM25가 일반적으로 더 안전하다는 것을 의미하지는 않습니다. 홀드아웃 패킷(held-out packet)이 대상 메모리를 어휘적으로 명확하게 만들었을 수도 있습니다. 하지만 이는 거버넌스 조정 공식(governance-adjusted formula)이 검색(retrieval) 성능을 향상시킨다는 증거로서 이 내용을 정직하게 발표할 수 없음을 의미합니다.
해당 공식은 한 가지 법적 시나리오에서 실패했습니다:
"Henderson 사건이 종결되었으니, 이제 소송 보존(litigation-hold) 문서들을 삭제해 주세요."
예상된 대상은 소송 보존 자료의 삭제/파기(deletion/destruction)를 규정하는 정책이었습니다. 그러나 점수 산정기(scorer)는 읽기 권한 정책(read-access policy)을 선택했습니다.
점수 분해(score decomposition) 결과는 그 이유를 보여주었습니다:
| 구성 요소 | 읽기 권한 방해 요소 (Read-access distractor) | 올바른 삭제 정책 (Correct deletion policy) | 차이 (Delta) |
|---|---|---|---|
| 관련성 (relevance) | 0.78 | 1.00 | -0.22 |
| ... |
올바른 정책은 더 높은 관련성(relevance)과 더 높은 권위(authority)를 가지고 있었습니다. 그럼에도 불구하고, 얕은 동작 유형 휴리스틱(shallow action-type heuristic)이 올바른 정책에는 불이익을 주고 읽기 권한 방해 요소에는 보상을 주었기 때문에 결국 패배했습니다.
이는 첫 번째 스트레스 패킷(stress packet)과는 다른 종류의 실패입니다. 첫 번째 스트레스 패킷은 governs 메타데이터가 누락되었거나 잘못되었음을 보여주었습니다. 반면, 홀드아웃 패킷은 취약한 작업/동작 추론(operation/action inference)을 보여주었습니다.
따라서 주장은 더 좁아집니다:
점수 산정 공식은 진단 도구로서 유용합니다. 어떤 권위 용어가 지배적인지, 그리고 아키텍처가 취약한 메타데이터나 얕은 동작 추론에 얼마나 의존하고 있는지를 드러내 줍니다. 하지만 이 홀드아웃 패킷은 "거버넌스 조정 검색이 BM25보다 개선된다"라는 단순한 이야기를 반증합니다.
점수 분해가 증명한 것
점수 분해는 구조적인 문제를 가시화했습니다.
거버넌스 조정 공식은 권위 메타데이터가 존재하고, 정확하며, 올바르게 해석될 때 정상적으로 작동합니다. 대상 메모리에 governs가 누락되었거나, 잘못되었거나, 혹은 동작 유형 휴리스틱이 작업을 잘못 읽을 경우, 공식은 점진적으로 성능이 저하(degrade gracefully)되지 않습니다. 대신 관련성이 높은 대상보다 태깅이 잘 된 방해 요소를 더 높게 평가할 수 있습니다. 거버넌스 용어가 지배하게 됩니다. 관련성은 너무 늦게 도달하는 결정적 요소(tiebreaker)로 전락합니다.
이것은 단순히 가중치 튜닝 (weight-tuning) 문제만이 아닙니다. 범위 (scope), 구체성 (specificity), 그리고 작업 유형 (action_type)에 대한 가중치가 큰 이유는 해당 용어들이 안전성 (safety)을 지탱하는 핵심 요소이기 때문입니다. 이 가중치들을 작게 만들면 스트레스 실패 (stress failures)를 줄일 수는 있지만, 주석이 달린 패킷 (annotated packets)을 작동하게 만들었던 바로 그 신호들을 약화시키기도 합니다.
진짜 문제는 메타데이터 품질 (metadata quality)과 작업 해석 (operation interpretation) 모두가 이 점수 산정기 (scorer)에 있어 핵심적인 지지대 역할을 한다는 점입니다. 만약 메모리가 governs 없이 저장되었거나, governs의 범위 (scope)가 잘못 지정된 채 저장되었다면, 점수 산정기는 이를 복구할 수 없습니다. 만약 쿼리-작업 휴리스틱 (query-action heuristic)이 작업을 잘못 읽는다면, 점수 산정기는 올바른 정책 (policy)이 더 높은 관련성 (relevance)과 권위 (authority)를 가지고 있음에도 불구하고 잘못된 정책에 보상을 줄 수 있습니다.
이로부터 두 가지 정직한 주장이 도출됩니다:
-
거버넌스 조정 점수 산정기 (governance-adjusted scorer)는 권위 (authority) 계산을 명시적으로 만드는 대안적인 공식화 (formulation)입니다. 이것은 스트레스 패킷 (stress packet)에 대해 기존의 최선 전략보다 개선된 것이 아닙니다. 두 방식 모두 4/6점에 도달하며 동일한 사례에서 실패합니다.
-
홀드아웃 패킷 (held-out packet)은 BM25 대비 단순한 개선이라는 프레임워크를 거짓으로 판명했습니다. 해당 패킷에서 BM25는 6/6에 도달한 반면, 전체 점수 산정기는 5/6에 도달했습니다.
-
이 공식은 이전 전략들이 가렸던 무언가를 드러냈습니다: 실패는 단지 순위 지정 규칙 (ranking rule)에만 있는 것이 아닙니다. 그것은 쓰기 시점 (write time)에 존재했던 것에서 시작하여 시스템이 제안된 작업을 해석하는 방식까지 이어집니다.
governs와 작업 유형 추론 (action-type inference)에 의존하는 점수 산정기는 이러한 입력값이 누락되었거나, 틀렸거나, 잘못 읽혔을 때 이를 보완할 수 없습니다.
이것이 아키텍처 (Architecture)에 의미하는 바
스트레스 테스트 결과는 연구의 방향을 바꾸어 놓았습니다.
만약 순위 지정 시점의 거버넌스 점수 산정 (ranking-time governance scoring)이 governs 누락, 잘못된 governs, 그리고 작업 추론 (action-inference) 실패를 해결할 수 없다면, 이를 해결하기 위한 다음 단계는 또 다른 순위 지정 미세 조정 (ranking tweak)이 아닙니다.
governs 없이, 또는 governs의 범위가 잘못된 도메인으로 지정된 채 저장소에 들어온 메모리는 해당 필드에 의존하는 그 어떤 다운스트림 점수 산정기 (downstream scorer)도 무력화할 것입니다. 점수 산정기는 기록된 내용을 읽습니다. 만약 기록된 내용이 틀렸다면, 점수 산정기는 그 오류를 그대로 상속받습니다.
그리고 만약 액션 유형 분류기 (action-type classifier)가 동작을 오해한다면, 점수 산정기 (scorer) 또한 그 오류를 상속받을 수 있습니다.
이는 현재 시스템이 아직 갖추지 못한 세 가지 요소를 시사합니다:
첫째, 쓰기 시점의 게이트 (write-time gate) — 권한을 가진 메모리 (authority-bearing memories)가 저장소에 진입하기 전, 유효한 governs 메타데이터를 반드시 포함하도록 요구하는 저장 시점의 검사 단계입니다. 이는 단순한 제안이 아니라, 입장을 위한 전제 조건 (precondition)입니다.
둘째, governs에 의존하지 않는 폴백 경로 (fallback path) — 해당 필드가 단순히 형식이 잘못된 것이 아니라 실제로 누락된 경우를 위한 경로입니다. 폴백은 메모리의 자기 기술 (self-description) 이외의 다른 요소로부터 권한을 추론할 수 있어야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기