검색 증강 자기 회상 (Retrieval-Augmented Self-Recall) — 댓글이 내게 가르쳐준 것 (RE-call v0.3)
요약
RAG 시스템의 한계를 극복하기 위해 유사도 점수 대신 함의(entailment)를 검증하는 RE-call v0.3 기술을 소개합니다. 커뮤니티의 피드백을 바탕으로 설계된 이 방식은 검색된 메모리가 질문에 대한 실제 답변을 포함하는지 확인하여 오류를 줄입니다.
핵심 포인트
- 유사도 점수와 신뢰도 점수의 차이점 규명
- 검색된 정보가 답변을 함의하는지 검증하는 프로세스 도입
- 커뮤니티 피드백을 통한 설계 오류 수정 및 실험적 검증
- 임계값 기반 방식의 한계를 보완하는 새로운 평가 방식
Part 1: 자기 회상 논제의 후속편입니다. 이 시리즈는 Part 6까지 이어집니다. 코드: RE-call — 아래의 모든 내용은 측정 가능하며 재현 가능합니다 (make eval). 전체 연구 내용은 docs/ENTAILMENT_SUPERSESSION_STUDY.md에서 확인할 수 있습니다.
에이전트 메모리 (agent memory)에 관한 논제 포스트를 게시했고, 포스트 자체보다 더 나은 다섯 개의 댓글을 받았습니다.
그중 두 개의 댓글은 단순히 설계를 비판하는 데 그치지 않고, 왜 설계가 실패할 것인지와 무엇이 이를 해결할 수 있는지를 정확하게 설명했습니다. 그래서 저는 유일하게 합리적인 행동을 했습니다. 두 댓글 모두를 실험으로 전환하고, 이 시리즈가 구축된 것과 동일한 평가 하네스 (eval harness)에서 실행한 뒤, 살아남은 결과물을 출시했습니다. 그것이 바로 RE-call v0.3이며, 이 포스트는 그 증거입니다.
제가 왜 이런 방식으로 글을 쓰는지 명확히 하고 싶습니다. 이 시리즈를 게시한 목적은 방송이 아니라 **오류 수정 (error-correction)**이었습니다. 서랍 속에 넣어둔 설계는 확신을 쌓아가지만, 게시한 설계는 _반대 의견 (objections)_을 쌓아갑니다. 그리고 반대 의견은 당신이 얻을 수 있는 가장 저렴하고 고품질인 신호입니다. Part 1의 댓글 섹션은 혼자서 몇 주 동안 반복 작업(iteration)을 한 것보다 이 코드베이스에 더 많은 도움을 주었습니다. 이 포스트는 댓글 작성자들이 거의 받지 못하는 것, 즉 누군가가 경청하고, 측정하고, 코드를 변경했다는 증거를 보여줌으로써 그 보답을 하기 위해 존재합니다.
댓글 1: "유사도 점수 (similarity score)는 신뢰도 점수 (confidence score)가 아니다"
Vinicius Pereira는 제가 이후로 계속 인용하고 있는 문장으로 이를 한 줄로 요약했습니다:
근접성 (Proximity)은 후보일 뿐이며, 함의 (entailment)가 증거이다.
그의 주장은 이렇습니다: 가장 아픈 '빗나감(near-miss)'은 유사도는 높지만 틀린 것, 즉 쿼리와 의미적으로 인접하지만 답변을 제공하지는 않는 메모들입니다. 임계값 기반의 gap_warning (Part 3, Part 5)은 이러한 경우들을 구조상 그냥 통과시켜 버립니다. 왜냐하면 이들의 유사도가 설정할 수 있는 어떤 임계값을 넘기기 때문입니다. '거부(abstention)' 신호는 검색기(retriever) 자체의 점수가 될 수 없습니다. 검색된 메모가 실제로 답변을 **함의(entail)**하는지 확인하는 별도의 검사가 필요합니다.
그는 옳았고, 측정 가능할 정도로도 그러했습니다. 저는 10개의 '빗나감' 쿼리로 구성된 비보존 테스트 세트(held-out challenge set)를 만들었습니다. 각 쿼리는 질문된 사실(
절제 연구 (Ablation) 결과는 솔직히 놀라웠습니다. 임계값 (threshold) 없이 판사 (judge) 모델만 단독으로 실행했을 때, 원거리 격차 탐지 (far-gap detection) 성능이 저하되었습니다 (두 가지 시맨틱 임베더 (semantic embedder) 모두에서 gap FCR 0.00 → 0.40으로 변화). 코퍼스 (corpus)가 다루지 않는 주제의 가장 가까운 노이즈 (nearest-noise)가 입력되면, QNLI 모델은 이를 때때로 정답이라고 판단합니다. 따라서 함의 (entailment)가 보정된 임계값을 _대체_할 수는 없습니다. 이 두 가지는 **서로 다른 실패 유형 (failure classes)**을 방어하며 반드시 함께 쌓여 있어야 합니다. 임계값은 원거리 격차 (far gaps)를 잡아내고, 판사는 근접 오답 (near-misses)을 잡아냅니다.
또한 비용은 실재하며, 다음과 같이 발표되었습니다: CPU 기준 쿼리당 판사 실행 시간 약 0.1~1.0초, 두 시맨틱 임베더 모두에서 실제로 답변 가능한 쿼리 하나가 잘못 거부됨 (해당 쿼리의 골드 메모 (gold memo) 답변은 부정 (negation) 형태임 — "4xx 에러 시 재시도합니까?" → "재시도하지 않습니다" — 판사는 이를 답변하지 않는 것으로 읽음), 답변 가능한 쿼리에 대한 MRR은 1.000에서 0.929로 하락합니다. 잔여 근접 오답 FCR (0.40–0.60)은 판사 자체의 품질 한계입니다. 이는 한 단계 위에서 적용되는 파트 5의 법칙과 같습니다: 격차 탐지는 임베더에 의해 제한되며, 함의를 통한 기권 (abstention-by-entailment)은 판사에 의해 제한됩니다. 바로 이러한 이유들 때문에 기본적으로 기능이 꺼져(OFF) 있으며, 사용자는 모든 상황을 인지한 상태에서 선택적으로 사용(opt in)해야 합니다.
댓글 2: "대체 (Supersession)는 속성이 아니라 관계이다"
동일한 댓글에는 제가 이미 가장 취약하다고 고백했던 방어 기제(최신성 (freshness))에 관한 두 번째 논지가 담겨 있었습니다:
당신은 두 메모가 각각 고립된 상태에서는 모두 유효해 보일 때, 읽기 시점 (read time)에 두 메모 사이의 관계를 추론하려고 시도하고 있습니다. 그 추론은 패배할 수밖에 없는 게임입니다. 진실이 생성될 때 그것을 결합하십시오.
그리고 Mateo Ruiz는 우리가 목표로 하는 형태를 독립적으로 명명했습니다:
검색 (Retrieval)은 단순히 관련성 (relevance)뿐만 아니라 신뢰도 (confidence) + 출처 (provenance) + 유효성 (validity)을 반환해야 합니다.
이 문장은 이제 거의 그대로 RE-call의 신뢰 계층 (trust layer)이 스스로를 설명하는 방식이 되었습니다. 모든 히트 (hit)는 판결 (ok / superseded / expired / …), 보정된 신뢰도, 그리고 출처를 반환합니다. 메모는 _쓰기 시점 (write time)_에 프론트매터 (frontmatter)에 supersedes: old-memo.md를 선언하며, 검색은 해결되었지만 여전히 임베딩되어 있는 오래된 결정 대신 체인의 현재 헤드 (head)를 반환합니다.
v0.3에서는 "왜 그냥 타임스탬프(timestamps)를 사용하지 않나요?"라는 질문에 답하기 위한 실험을 추가했습니다. 이는 허수아비 공격(strawman)이 아닌, 가장 강력한 논거인 **철인 논법(steelman)**에 대응하는 것입니다: "확신할 수 있을 정도로 관련성이 높은 검색 결과들 중에서는 가장 최신 것을 신뢰한다"는 방식이며, 살아있는 코퍼스(corpus)가 끊임없이 동기화되는 방식처럼 후속 문서들이 나온 뒤에 오래된 문서들을 다시 수정(re-touch)하는 방식입니다. 대체된 신뢰율 (Superseded-trust rate, 오래된 메모가 정답으로 반환되는 빈도 — 낮을수록 좋음):
| Embedder | Plain search | Recency (steelman) | Declared supersedes: |
|---|---|---|---|
hashing-64 | 1.00 | 0.83 | 0.00 |
| ... |
bge-small 행을 보십시오: 타임스탬프 휴리스틱(heuristic)은 일반적인 관련성 순위 지정(plain relevance ranking)보다 성능이 나쁩니다. 즉, 순위 지정이 후속 문서를 선호했던 단 하나의 사례에서, 타임스탬프를 통한 타이 브레이크(tie-break)가 방금 동기화된 오래된 메모를 오히려 적극적으로 승격시켰습니다. 문서당 타임스탬프는 두 문서 간의 관계를 파악할 수 없으며, 타임스탬프를 "더 똑똑하게" 만든다고 해서 더 확신에 찬 오류를 범하게 될 뿐입니다. 선언된 관계(declared relation)는 동일한 실행 환경에서 0.00을 유지합니다.
Vinicius는 잔여 실패 모드(residual failure mode)를 미리 지적하기도 했습니다: 작성 시점의 바인딩(write-time binding)은 작성자의 규율만큼만 유효하다는 것입니다. 즉, 잊혀진 링크는 영원히 유효해 보이는 고아 메모(orphan memo)가 됩니다. 하지만 당시 제가 답변했듯이, _추론 불가능한 것(impossible to enforce)_이 _강제 가능한 것(possible to enforce)_이 됩니다. 그래서 v0.3에는 recall lint가 포함되어 배포됩니다. 이는 매달린 supersedes: 참조, 순환(cycles), 모호한 후속 문서, 선언된 엣지(edge)가 없는 버전화된 형제 문서, 산문(prose) 내에서만 선언된 클로저(closures) 등을 찾아냅니다. 별도의 DB 없이, 에러 발생 시 exit 1을 반환하며, 한 줄의 명령어로 CI(지속적 통합)에 바로 적용할 수 있습니다. (이 도구는 배포되기도 전에 제 값을 했습니다. 테스트를 작성하는 과정에서 스칼라 형태의 [[wikilink]]가 YAML 리스트로 읽혀, 소리 없이 해결되지 않는 엣지를 생성하는 실제 파서(parser) 버그를 발견했기 때문입니다.)
내가 여전히 빚지고 있는 실험
내가 여전히 빚지고 있는 실험
Nazar Boyko는 Part 5가 공개되기도 전에, 간격 임계값(gap threshold)이 각 임베더별로 재조정되는 절대적인 절단점(absolute cutoff)보다는 _상대적_이어야 하는지—즉, 최고 점수와 나머지 배치 전체를 비교하는 방식—에 대해 질문했습니다. 이는 의심스러운 허점(spread-based check는 단일한 자신감 있는 방해 요소(distractor)—바로 위에서 언급된 근접 실패 클래스(near-miss class)가 그렇습니다—을 놓칠 수 있다는 점에서 좋은 아이디어이지만, 의심은 측정치가 아닙니다. 그것은 목록에 올라 있으며, 이제 그 질문에 답하도록 장치(harness)가 만들어졌습니다.
그리고 Tae Kim의 지적—'실제 매칭 없음(no real match)' 신호가 조용히 누락되는 것을 막기 위한 타이핑된 coverage_check 슬롯—은 전체 스택을 관통하는 디자인 규칙을 더욱 명확하게 만들었습니다: 리트리버(retriever)가 신호를 계산하고, 스키마(schema)가 그것을 담아 전달한다. '계산된 것(Computed)'은 측정치이며, 모델에 의해 자체 보고되는 것은 선언입니다. 이 둘은 매우 다르게 실패합니다.
내가 실제로 주장하는 바
내가 한 번도 만난 적 없는 다섯 명의 사람들이 틈새 RAG 문제에 대한 게시글을 읽고, 그들 사이에서 다음과 같은 것들을 만들어냈습니다: 나의 부재(abstention) 메커니즘에 대한 반증 가능한 비판, 우월성(supersession)을 위한 올바른 아키텍처, 벤치마킹할 가치가 있는 제안된 대안, 그리고 스키마 설계 원칙. 나에게 총 비용은: 틀릴 수 있을 만큼 구체적인 무언가를 출판하고, 그 답변들을 충분히 진지하게 다루어 실행하는 것입니다.
이것이 전체 모델입니다. '콘텐츠'나 도달률(reach)이 아닙니다—공개적으로 작업하며 동료 검토의 한 형태로 기능하는 것입니다. 비대칭성은 터무니없이 유리합니다: 당신은 하나의 설계를 기여하고, 혼자서 몇 달 동안 발견했을 실패 모드들을 되돌려 받습니다. 유일한 대가는
만약 당신이 이 글을 읽으면서 다음의 허점 — 부정에 눈먼 판정기 (negation-blind judge), 부채가 있는 상대적 임계값 벤치마크 (owed relative-threshold benchmark), 더 강력한 함의 모델 (entailment model), 혹은 제가 미처 상상하지 못한 무언가 — 을 발견한다면, 댓글창은 열려 있으며 테스트 도구 (harness)는 공개되어 있습니다. 분명히, 이것은 작동합니다.
코드: RE-call (MIT). 모든 표가 포함된 v0.3 전체 연구: docs/ENTAILMENT_SUPERSESSION_STUDY.md. 시리즈 인덱스: Part 1.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기