관련성(Relevance)은 답변 가능성(Answerability)이 아니다: 6가지 신호, 그리고 그 중 어떤 것도 단순
요약
AI 시스템에서 검색된 정보의 관련성(Relevance)이 반드시 답변 가능성(Answerability)을 보장하지 않는 문제를 다룹니다. 단순한 코사인 유사도 임계값 조절로는 답변 불가능한 질문에 대한 오탐 기권(False-abstain) 문제를 해결하기 어렵다는 점을 분석합니다.
핵심 포인트
- 검색 품질이 높더라도 신뢰 계층에서 답변을 거부하면 시스템 성능이 저하됨
- 코사인 유사도 임계값 조정만으로는 답변 가능성과 불가능성을 분리하기 어려움
- 문제가 쉬워질수록(유사도가 높아질수록) 오히려 오탐 기권율이 증가하는 역설 발생
- 단순 임계값 설정이 아닌 새로운 신호(Signal)를 통한 접근이 필요함
**답변 가능성 문제 (The Answerability Problem)**의 파트 2입니다. 파트 1에서는 거절(Refusal)을 테스트하는 질문을 제외하는 표준 하네스(Harness), 제 시스템의 점수가 0.000인 점, 그리고 제가 출시한 모든 레버(Lever)가 실패했음을 보여주었습니다. 파트 1에서는 저렴한 신호(Signal)가 "관련성(Relevant)"과 "답변 가능성(Answerable)"을 분리할 수 있는지 물었습니다. 이것이 바로 대결(Bake-off)입니다. 코드: RE-call.
LongMemEval은 이 분야의 또 다른 공개 벤치마크(Benchmark)이며, LOCOMO와 달리 기권(Abstention)을 일급 질문 유형으로 명시합니다. 합성된 사용자 채팅 기록에 대한 500개의 질문: 470개는 답변 가능하며, 30개는 답변이 전혀 언급되지 않은 질문입니다.
제 검색(Retrieval)은 이 테스트에서 좋은 성능을 보입니다. 올바른 세션이 반환된 집합에 포함되는 비율이 **97%**에 달합니다.
하지만 신뢰 계층(Trust layer)이 그중 48%에 대해 답변을 거부합니다.
이 수치의 형태를 가만히 들여다보십시오. 시스템이 답변을 찾아내고 보유하고 있음에도 불구하고, 성공한 사례의 거의 절반에 달하는 경우에서 사용을 거부합니다. 이는 기권 계층이 아예 없는 것보다 못한 제품이 됩니다. 검색 품질을 위해 비용을 지불하고 나서 마지막 관문에서 그것을 버려버리는 셈이니까요.
그리고 상황은 더 이상해집니다. 문제가 쉬워질수록 오탐 기권(False-abstain)이 증가합니다: 건초더미(Haystack)를 좁혀감에 따라 0.328 → 0.409 → 0.481로 증가하는 반면, 설정된 임계값(Threshold)은 감소합니다 (0.752 → 0.723 → 0.713). 건초더미가 작아진다는 것은 상위 히트(Top hit)가 더 좋아진다는 것을 의미하며, 이는 전반적으로 더 높은 코사인(Cosine) 유사도를 의미합니다. 그런데 그 높아진 코사인 값들 중 상당수가 답변 불가능한 질문에 속해 있습니다.
가장 먼저 테스트해 본, 명백하지만 틀린 진단
저를 포함한 모든 엔지니어의 첫 번째 본능은 임계값이 잘못된 위치에 있다는 것입니다. 그래서 저는 두 분포를 직접 측정했습니다. 500개 질문 전체에 대한 Top-1 코사인(Cosine) 유사도:
| 답변 가능 (n=470) | 답변 불가능 (n=30) | |
|---|---|---|
| q05 / q25 | 0.612 / 0.671 | n/a / 0.620 |
| ... | ||
| AUC 0.753. 답변 불가능한 범위가 거의 전적으로 답변 가능한 범위 내부에 위치합니다. |
임계값(Threshold)은 존재하지 않습니다. 이 샘플들에서 얻을 수 있는 최적의 임계값은 출시된 규칙(shipped rule)의 0.305 대비 0.285의 균형 오차(balanced error)를 기록하며 0.02의 개선을 보였으나, 이 0.285는 인샘플(in-sample) 상한선이므로, 홀드아웃(held-out) 데이터셋에서는 그 격차가 훨씬 더 작아집니다. 만약 오답 거부(false-abstain)를 출시 가능한 수준인 0.05까지 낮추고 싶다면, 그 대가로 약 **0.78의 오답 확신(false-confidence)**을 지불해야 합니다.
재교정(Recalibration)은 논리가 아닌 측정에 의해 배제되었습니다. 이 차이는 저에게 중요합니다. "생각해 봤는데 안 될 것 같아서"라는 식의 접근은 제가 파트 1에서 틀렸던 방식처럼 결국 잘못된 결론에 도달하게 만들기 때문입니다.
6가지 신호, 하나의 측정
만약 임계값이 문제가 아니라 _신호(signal)_가 문제라면, 신호를 교체하면 됩니다. 저는 동일한 500개의 질문과 동일한 건초더미(haystacks)를 사용하여, 게이트(gate)가 읽는 수치만 다르게 하여 6가지 후보를 측정했습니다.
| 신호 (signal) | 계열 (family) | AUC | 95% CI |
|---|---|---|---|
dense_top1 (출시됨) | 관련성 (relevance), 바이-인코더 (bi-encoder) | 0.753 | [0.680, 0.826] |
| ... |
이미 출시된 신호를 능가하는 것은 없었습니다. 그리고 정보가 담긴 두 행은 첫 번째 행이 아닙니다.
발견은 크로스-인코더(cross-encoder)에 있다
rerank_top1은 크로스-인코더 (cross-encoder)입니다. 이는 쿼리(query)와 문서(document)를 각각 임베딩하여 벡터를 비교하는 방식이 아닙니다. 대신 두 요소를 결합하여 (jointly), 서로 간의 완전한 어텐션(attention)을 통해 읽어들입니다. 이는
그 결과는 저의 사고 모델(mental model)을 완전히 재구성했습니다. Cross-encoder가 실패하는 이유는 모델이 작거나 학습이 잘못되었기 때문이 아닙니다. 그것은 **관련성 (relevance)**을 위해 학습되었기 때문이며, 관련성 측면에서는 매우 뛰어난 성능을 보입니다. 하지만 관련성은 답변 가능성 (answerability)과는 다른 양(quantity)입니다. 사용자가 자신의 구직 활동에 대해 길게 논의하는 세션은, 사용자가 회사 이름을 언급했는지 여부와 상관없이 "사용자가 어느 회사에 입사한다고 말했는가?"라는 질문에 대해 최대한의 관련성을 가집니다.
관련성 (Relevance)은 _이것이 동일한 주제에 관한 것인가?_를 묻습니다. 답변 가능성 (Answerability)은 _그 구체적인 사실이 여기에 들어있는가?_를 묻습니다. 관련성 목적 함수 (relevance objective) 중 그 어떤 것도 모델이 두 번째 요소를 학습하도록 요구하지 않습니다.
그리고 답변 가능성 모델은 단순 코사인 유사도보다 낮은 성능을 보였다
entail_max는 QNLI 판정기(judge)입니다. 이는 "이것이 이 질문에 답하는가"를 위해 실제로 학습된 내장형 판정기로, 지난 시리즈의 독자 댓글을 통해 구축되었으며 제가 기쁘게 출시한 것입니다.
0.648. 코사인 유사도보다 낮습니다. 튜닝되지 않은 자체 경계값에서 이 모델은 0.533의 잘못된 확신 (false-confidence) 점수를 기록합니다.
그리고 이것이 단순히 운이 나빴던 날이 아니라 실제적인 발견이 되는 지점이 있습니다. 몇 달 전, 판정기가 전혀 본 적 없는 완전히 다른 말뭉치(corpus)에서, 저는 이 모델의 잔여 근접 잘못된 확신 (residual near-miss false-confidence)을 0.50으로 측정했습니다. 경계값이 정확히 전이되었습니다. 이 모델은 이 작업 부하(workload)에 대해 결코 충분히 좋았던 적이 없었습니다. 단지 그 사실을 가시화할 수 있는 작업 부하를 대상으로 테스트된 적이 없었을 뿐입니다.
낮은 게이트(gate) 뒤에 스태킹(stacking)하는 것도 해결책이 되지 못합니다:
| 설정 (configuration) | 잘못된 기권 (false-abstain) | 잘못된 확신 (false-confident) | 균형 (balanced) |
|---|---|---|---|
| 출시된 코사인 @0.713 | 0.443 | 0.167 | 0.305 |
| ... |
가장 좋은 스택은 단순 임계값(threshold)과 동일한 성능을 내면서, 쿼리당 모델 통과(model pass) 비용을 발생시킵니다.
이 모든 것을 거의 매몰시킬 뻔했던 오차 막대
이제 방법론적인 부분입니다. 제가 실제로 읽고 싶어 하는 부분이죠.
답변할 수 없는 질문이 30개 있습니다. 이는 샘플링 선택이 아니라 벤치마크 자체의 클래스 크기이며, 제가 더 크게 다시 실행할 수도 없습니다. 표본 크기(Small-n)가 작은 결과는 의심해 볼 가치가 있으므로, AUC에 구간(interval)을 설정했습니다.
첫 번째 버전에서는 sqrt(A(1-A)/n_min)를 사용했으며, 값은 대략 0.08이었습니다.
그것은 틀렸으며, 심지어 책임감 있게 느껴지는 방향으로 틀렸습니다. 이 방식은 더 작은 클래스만을 사용하고 470개의 샘플이 있는 클래스는 완전히 버리며, 애초에 AUC의 표준 오차(standard error)도 아닙니다. 두 클래스를 모두 고려하는 Hanley & McNeil (1982) 추정량(estimator)을 사용하면 0.037이 나옵니다.
제 오차 막대(error bar)는 2.1배나 너무 넓었습니다.
그 결과는 단순히 외관상의 문제에 그치지 않았습니다. ±0.08일 경우, 0.90의 사용성 기준선(usability bar)이 가장 좋은 신호의 구간 _안쪽_으로 떨어지게 되며, 연구 결과는 "측정된 배제(measured exclusion)"에서 "결론을 내릴 수 없음, 더 많은 데이터 필요"로 격하됩니다. 그랬다면 저는 무책임한 결론을 발표했을 것입니다. 올바른 추정량을 사용하면, 가장 좋은 신호의 구간 상한선은 0.826이며 기준선은 그 _바깥_에 위치합니다.
이것이 _"판단할 수 없었다"_와 "이 신호들 중 그 어떤 것도 충분히 좋지 않으며, 여기 그 증거가 있다" 사이의 차이입니다. 데이터는 동일합니다. 발견의 전체 내용이 분산 추정량(variance estimator)에 달려 있었던 것입니다.
그 과정에서 두 가지 결과가 도출되었으며, 두 가지 모두 배포됩니다:
- 추정량은 이제 테스트로 고정된 라이브러리 함수인
recall.calibration.separability_interval이 되었습니다. 따라서 발표된 표와 라이브러리 자체의 런타임 인증(runtime certification)은 하나의 구현체를 읽게 되며 서로 어긋날 수 없습니다. - 인증은 점 추정치(point estimate)가 아닌 구간의 **하한선(lower bound)**을 테스트합니다. 이 모듈이 허용하는 클래스당 최소 20개의 샘플 조건에서, 측정된 AUC가 0.95일 때 하한선은 0.879입니다. 이는 점 추정치로는 기준을 통과하지만, 기준을 확립한 것은 아닙. 점 추정치로 인증하는 것은 소규모 샘플 노이즈를 통해, 이 모든 작업이 폭로하고자 하는 바로 그 '침묵의 실패(silent failure)'를 다시 허용하게 될 것입니다.
저는 n=30이 저에게 무엇을 제공하지 못하는지에 대해서도 똑같이 명확히 알고 있습니다. 0.74–0.75 구간에 있는 세 가지 관련성 신호(relevance signals)는 서로 구별되지 않습니다. 이들의 구간은 거의 완전히 겹치며, 이들 사이의 순서는 노이즈에 불과하며, 여기서 어떠한 주장도 그 순서에 근거하지 않습니다. 해당 표를 보고 "밀집(dense) 방식이 기권(abstention)을 위한 재순위화(rerank) 방식보다 우수하다"라고 읽는 사람이 있다면, 이는 데이터가 보여주는 범위를 넘어서서 해석하는 것입니다. 이 샘플이 뒷받침하는 유일한 결론은 제가 도출하고 있는 결론입니다: 그 어떤 신호도 사용 가능한 게이트(gate)가 필요로 하는 ~0.90 수준에 도달하지 못합니다.
그렇다면 실제 문제의 형태는 무엇인가?
구조적으로 서로 다른 세 가지 관련성 신호가 0.74–0.75에 밀집해 있습니다. 라인업 중 답변 가능성(answerability)을 기반으로 학습된 단 하나의 모델은 이들보다 낮은 수치를 기록했습니다. 두 가지 분포 신호(distributional signals)는 그보다 더 낮게 나타났습니다. 별도로 테스트된 더 강력한 판사(judge) 모델은 곡선을 끌어올리지 못한 채 곡선을 따라 이동할 뿐입니다.
일주일 전의 저라면 유혹적인 결론을 내렸을 것입니다: 답변 가능성은 검색 기하학(retrieval geometry)으로부터 전혀 회복할 수 없다. 하지만 저는 그런 결론을 내리지 않습니다. 왜냐하면 이를 테스트하는 대조군(control) 실험을 수행했고, 결과가 그 반대로 나왔기 때문입니다.
적대적(adversarial)인 세트 대신, 기계적으로 라벨링 없이 구성된 평범한 답변 불가능 세트를 구축해 보십시오. 787개의 문서 코퍼스를 가져와서, 그중 657개를 인덱싱하고 120개를 제외(hold out)한 뒤, 각 문서의 요약문을 쿼리(query)로 사용합니다. 인덱싱된 문서에 대한 쿼리는 답변 가능하며, 제외된 문서에 대한 쿼리는 문서가 실제로 존재하지 않으므로 답변 불가능합니다. 해당 세트에서 단순 코사인(cosine) 유사도는 AUC 0.780에서 분리되며, 답변 불가능한 질문의 절반에 대해 기권할 경우 **13.7%**의 잘못된 기권(false-abstain) 비용이 발생합니다. 이는 0.90 기준의 사용 가능한 게이트는 아니지만, 벤치마크가 보여주는 동전 던지기 수준과는 전혀 다릅니다.
따라서 정직한 진술은 더 좁지만 더 유용합니다:
유사도(Similarity)는 답변 불가능한 질문이 실제로 무언가 결여된 상태일 때는 답변 가능한 질문과 답변 불가능한 질문을 구분해 냅니다. 하지만 답변 불가능한 질문이 인접하도록 _설계(constructed)_된 경우에는 실패하며, 오히려 결과가 역전됩니다. LOCOMO의 cat5, LongMemEval의 unanswerable 클래스, 그리고 BEAM의 abstention split은 모두 설계상 두 번째 유형에 해당합니다.
역전 현상은 유심히 살펴볼 가치가 있는 부분입니다. BEAM에서는 답변 불가능한 질문의 점수가 답변 가능한 질문보다 더 높게 나타나며, 코사인(cosine) 유사도와 수학적 연관성이 전혀 없는 어휘적 커버리지(lexical-coverage) 신호 또한 동일한 방향으로 역전됩니다 (답변 불가능한 질문 0.741 대 답변 가능한 질문 0.717). 서로 관련 없는 두 신호가 동일하게 실패한다는 것은 리트리버(retriever)의 문제가 아니라 질문의 문제임을 시사합니다.
이는 해당 벤치마크들이 무엇을 측정하는지에 대한 재정의를 요구합니다. 이들은 난이도의 상한선(upper bounds)이지, 실제 배포된 동작의 추정치가 아닙니다. 적대적 기법이 적용된 abstention 점수를 마치 실제 운영 환경(production)을 설명하는 것처럼 보고하는 것은 그 자체로 일종의 과장이며, 저 또한 두 단락 전까지만 해도 그런 실수를 저지를 뻔했습니다.
Part 3에서는 그 경계가 연속적인 축과 좌표 위에서 적절히 위치하게 되며, 진짜 결함이 어디에 있는지 밝혀집니다. 즉, 결함은 신호(signal)나 임계값(threshold)에 있는 것이 아니라, 점수가 읽히는 방식에 있습니다.
내포된 상쇄 요인
뻔한 반론은 이 신호들이 모두 약한 이유가 _리트리벌(retrieval)_이 약하기 때문이라는 것입니다. 그렇지 않습니다. 저는 이를 정확하게 수치화할 수 있습니다. 크로스-인코더 리랭커(cross-encoder reranker)를 활성화하면 n=1,536에서 hit@5가 0.671에서 0.777로 상승하는데, 이는 본 프로젝트에서 가장 큰 임베더(embedder) 효과의 약 두 배에 달하며, k=10까지 베이스라인과 겹치지 않는 구간을 형성합니다. 세 가지 검증을 통해 이 이득이 실재함을 확인했습니다: 고정된 풀(pool)을 재정렬해야 하는 특성상 hit@20은 거의 변하지 않으며 (0.855 → 0.870), 이득은 메커니즘이 예측하는 것과 정확히 일치하게 깊이에 따라 감소합니다 (k=1에서 +0.155 → k=20에서 +0.016). 또한, 파라미터 수가 12배 더 많은 관련 없는 크로스-인코더를 사용했을 때는 비용이 6.3배 더 들었음에도 불구하고 _노이즈 범위 내_에 머물렀습니다. 따라서 이 효과는 모델이 아닌 **리랭킹(reranking)**에 속하는 것입니다.
세 가지 리랭크(rerank) 팔 모두에서 포기(Abstention): 0.00, 0.00, 0.00.
프로젝트에서 가장 좋은 검색(retrieval) 작업은 정직성(honesty)을 아무것도 바꾸지 못했습니다. 리랭킹은 검색이 반환한 것을 재배열할 뿐이며, 무엇이 돌아왔는지에 답변이 포함되어 있는지를 건드리지 않습니다. 당신의 검색 품질 지표와 당신의 정직성 지표는 상관관계가 없으며, 전자를 개선하는 것이 후자도 개선되는 것처럼 느껴지게 할 것입니다.
Part 3에서 이것은 벽이 아니라 측정치가 됩니다: 두 공개 벤치마크가 포기(abstention)에 대해 의견이 다른 이유가 있으며, 이를 명명하는 것은 예/아니오 질문을 좌표로 바꿉니다.
댓글 질문: 만약 당신이 _
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기