요약 (TL;DR)
- 개인화된 RAG 어시스턴트는 세 가지 역할을 수행하며, 그중 첫 번째 역할에만 주목해야 합니다. 질문에 답할 구절을 검색하고, 답변의 모든 주장을 해당 출처 구절과 연결하며, 관련 내용이 검색되지 않을 때는 답변을 거부하는 것입니다.
- Anthropic의 Contextual Retrieval 작업은 검색(retrieval) 부분에 수치를 부여했습니다. 임베딩 및 인덱싱 전에 각 청크(chunk)에 50~100 토큰의 청크별 컨텍스트를 추가하고, 실패율이 49% 감소했으며, 리랭킹(reranking)을 추가하면 그 감소 폭은 67%에 달합니다. 이 배경 지표는 1 minus recall@20이며, 실패율은 5.7%에서 2.9%, 그리고 1.9%로 변화했습니다.
- 검색 품질은 모델의 속성이 아닙니다. Dense embeddings는 정확한 식별자(identifier)를 놓치고, BM25는 의역(paraphrase)을 놓치며, Qdrant 자체 문서에서도 이 사실을 명확히 밝히고 있습니다: 검색 결과가 그럴듯해 보일지라도 여전히 틀릴 수 있으며, 사용자의 로그에는 성공적인 쿼리가 기록될 수 있습니다.
- 인용(Citations)이 답변을 검증 가능하게 만듭니다. Claude citations API는 문서를 문장 단위로 청킹하고 각 주장에 대한 출처 텍스트를 가리키는 포인터(pointer)를 반환하므로, 주장과 구절 간의 연결은 프롬프트 내의 지침이 아니라 API에 의해 생성됩니다.
- 20명 규모의 코퍼스에 적용하는 것은 채팅 인터페이스가 첨부된 측정 프로젝트입니다: 알려진 답변을 가진 30~50개의 레이블링된 질문, 결합(fusion) 설정과 리랭커 차단점(reranker cut-off)은 측정 가능한 다이얼로 취급되며, 코퍼스가 변경될 때마다 재측정을 수행합니다.
근거 기반 답변의 구성 요소
네 단계로 이루어져 있으며, 각 단계는 독립적으로 실패할 수 있습니다. 인제스천(Ingestion)은 코퍼스를 청크로 분할합니다. 인덱싱(Indexing)은 각 청크를 검색 가능한 무언가, 보통 벡터와 어휘적 표현으로 변환합니다. 검색(Retrieval)은 질문을 받아 구절의 짧은 목록을 반환합니다. 조립(Assembly)은 이 구절들을 모델에 전달하고 그 기반으로 답변을 요청합니다.
어시스턴트가 '접지(grounded)'되었다는 것은 네 번째 단계에서 세 번째 단계가 검색한 내용만을 사용할 수 있고, 답변이 하는 모든 주장마다 근거를 제시할 때입니다. 이 정의는 상업적으로 중요합니다. 이는 질문을 한 사람이 검토할 수 있는 시스템과 채팅창 속도에 맞춰 자신감 넘치는 산문을 생성하는 시스템 사이의 차이를 만듭니다.
Netics editorial diagram: what a grounded answer contains
Netics의 편집자 정의 카드에 따르면, '접지된 답변'은 실제로 사용자의 문서에서 검색된 구절들로 구성되며, 모든 주장은 해당 구절과 연결되어 있어야 합니다.
구체적인 사례를 들어보겠습니다. 3개 언어로 작성된 4,000개의 공급업체 계약서, 세관 신고서 및 내부 절차 문서를 보유한 카사블랑카의 물류 회사를 상상해 보세요. 그리고 이 법무팀은 문서가 회사 통제 인프라 내에 머물러 있는 도구만을 승인할 것입니다. 여기서 코퍼스(corpus) 자체가 자산입니다. 어시스턴트는 그 코퍼스를 읽는 독서가이며, 아래 내용은 그것이 얼마나 잘 읽는지에 관한 것입니다.
검색이 중요한 구절을 놓치는 방법
두 실패 모두 외부에서는 감지되지 않습니다. 왜냐하면 둘 다 결과를 반환하기 때문입니다. 이것이 Qdrant가 하이브리드 검색(hybrid search) 관련 아티클 초반에 제시하는 핵심 내용입니다. 즉, 밀집 검색(dense retrieval)은 적절한 주제의 문서를 반환할 수 있지만 쿼리에 복사된 정확한 식별자(identifier)를 놓칠 수 있고, 희소 검색(sparse retrieval)은 쿼리가 코퍼스에서 한 번도 사용되지 않은 용어를 사용할 경우 관련 문서를 놓칠 수 있습니다. 어느 쪽이든 쿼리 로그에는 성공 기록이 남습니다.
이러한 사각지대(blind spot)는 정확도가 아닌 비용 측면에서 두 번째 문제를 야기합니다. 두 번째 리트리버를 추가한다는 것은 포인트당 희소 벡터(sparse vector)가 필요하고, 두 번째 인덱스 및 모든 쿼리에 대한 추가 검색을 의미합니다. Qdrant는 한 컨테이너가 한 번에 하나의 요청을 처리하는 상황에서 이를 측정했으며, 추가 검색으로 인해 중앙값 쿼리 지연 시간(median query latency)이 0.60ms에서 1.47ms까지 증가했습니다. 이미 밀집 벡터를 포함하고 있는 컬렉션에 희소 벡터를 추가하려면 새로운 컬렉션과 전체 재인덱싱(full reindex)이 필요합니다. 이는 벡터 구성(vector configuration)이 컬렉션을 생성할 때 고정되기 때문입니다.
Official Anthropic figure: the standard RAG pipeline
Anthropic의 공식 자료(Contextual Retrieval 게시물 출처: anthropic.com/news/contextual-retrieval, 2024-09-19): 표준 RAG 파이프라인은 전처리 과정(코퍼스, 청크, 임베딩 모델, TF-IDF, 벡터 데이터베이스)과 실행 시간(쿼리, 순위 융합(rank fusion), 상위 K개 청크(top-K chunks), 생성 모델(generative model))으로 분리됩니다.
하이브리드 검색이 실패율을 바꾸는 이유
두 리트리버를 동일한 쿼리에 대해 모두 실행하고 두 개의 순위 목록을 병합합니다. 이 병합 과정에서 대부분의 구현체가 조용히 잘못되는 경우가 많습니다. 왜냐하면 코사인 유사도(cosine similarity) 0.7과 BM25 점수 12.4는 같은 척도를 공유하지 않으며, 그 사이에 설정하는 고정 가중치(fixed weight)는 코퍼스나 쿼리 조합이 변경될 때마다 재조정이 필요한 숫자이기 때문입니다.
순환 순위 융합(Reciprocal Rank Fusion)은 순위 위치만을 사용하여 비교 과정을 우회합니다. 문서의 융합 점수는 해당 문서가 등장하는 목록들 각각에 대해 $\frac{1}{(\text{상수} + \text{순위})}$을 합산한 값입니다. Cormack, Clarke와 Buettcher는 이 방법을 2009년에 소개했으며, 좋은 이유로 인해 여전히 기본값으로 사용되고 있습니다. Qdrant의 보고서에 따르면, 다섯 개의 공개 데이터셋에서 기본 RRF가 더 강력한 개별 검색기보다 네 번이나 우수했습니다. 대안은 분포 기반 점수 융합(Distribution-Based Score Fusion)이며, 이는 점수 격차를 평탄화하기보다는 그 크기를 보존합니다.
문제의 맥락적 측면은 융합보다 상류에 위치합니다. "매출이 지난 분기 대비 3% 증가했다"라는 구절은 인덱스가 해당 문장이 어느 회사와 어떤 분기에 속하는지 알고 있을 때만 검색될 수 있습니다. Anthropic의 해결책은 모델을 사용하여 누락된 맥락을 생성하고, 이를 임베딩 및 인덱싱 전에 청크(chunk)에 붙이는 것입니다. 이는 청크의 비용을 약간 증가시키지만 검색 가능성을 크게 향상시킵니다. 발표된 일회성 비용은 프롬프트 캐싱(prompt caching)을 사용하여 백만 개의 문서 토큰당 $1.02였으며, 측정된 효과는 실패한 검색이 49% 감소했고 리랭킹(reranking)을 적용했을 때는 67%까지 증가했습니다.
Netics editorial diagram: what retrieval alone and retrieval with citations miss
Qdrant 기사와 Anthropic의 실패율 수치를 바탕으로 한 Netics 편집 비교: 검색 전용 설계는 정확한 식별자나 의역을 놓치고 쿼리를 성공적으로 기록하는 반면, 인용 레이어(citation layer)는 그 배경에 해당 구절이 없는 주장까지도 표출합니다.
인용은 답변을 검증 가능한 것으로 만듭니다
맥락 창(context window) 내의 정확한 구절은 필수 조건입니다. 독자가 어떤 구절이 어떤 문장을 생성했는지 볼 수 있을 때 비로소 유용한 답변이 됩니다.
Claude citations API가 이를 기계적으로 수행합니다. 인용(Citations)은 요청별로 문서 단위로 활성화됩니다. 일반 텍스트 문서는 문장 단위로 청크 처리되어, 하나의 인용이 단일 문장을 가리키거나 연속된 문장들을 연결할 수 있게 하며, API는 각 주장(claim)에 대해 해당 주장이 나온 원문 텍스트를 참조하여 반환합니다. 이로 인해 두 가지 결과가 따릅니다. 인용 필드를 통해 반환되는 출처 텍스트는 출력 토큰에 포함되지 않으므로, 증거 자료를 요청 모델이 직접 인용문을 재현하도록 하는 것보다 비용 효율적입니다. 또한 API가 응답에서 인용을 파싱하기 때문에, 인용은 모델이 임의로 따옴표 사이에 작성한 내용이 아니라 제공된 문서에 대한 유효한 포인터를 포함할 것이라는 점이 보장됩니다.
여기서 도출되는 설계상의 시사점은 간단하며, 팀들이 건너뛰는 부분입니다. 만약 어떤 문장이 특정 구절로 추적될 수 없다면, 답변은 완성되지 않은 것입니다. 주장 수준의 추적 가능성(Claim-level traceability)은 답변이 조립되는 방식의 속성이며, 요약문으로는 결코 가질 수 없는 감사자(auditor)와의 접촉에서도 유지됩니다.
거절 경로가 검색 측정 지표가 되다
거절(Refusal)은 안전 기능이나 프롬프트 지침으로 취급되는 경향이 있습니다. 문서 어시스턴트에서는 이것이 산술 문제입니다. 검색된 구절들이 관련성 기준을 충족하지 못하면, 답변할 내용이 없다는 것이고, 정직한 출력은 코퍼스가 질문을 다루지 못한다는 진술입니다.
이는 곧 거절의 품질이 전적으로 검색 지표(retrieval metric)의 품질에 의존함을 의미합니다. Anthropic의 측정 방식은 1 - recall@20입니다. 이는 상위 20개 청크 안에 나타나지 못한 관련 문서들의 비율을 계산하는 것입니다. 이 수치는 오직 누락된 것(misses)을 세기 때문에 의미가 있습니다. 자신이 마음에 드는 답변들만 측정하는 팀은 어시스턴트가 결코 볼 수 없었던 것이 무엇인지 알 방법이 없습니다.
[Official Anthropic figure: contextual retrieval preprocessing](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flwrpyoq6cd58q1sp4tee.png
Official Anthropic figure from the Contextual Retrieval post (anthropic.com/news/contextual-retrieval, 2024-09-19): 모든 프롬프트에 대해 Claude는 50~100 토큰의 컨텍스트를 응답하며, 이 컨텍스트가 임베딩 및 BM25 인덱스가 구축되기 전에 해당 청크 앞에 추가됩니다.
Netics는 이러한 시스템을 구축한 후 측정(measurement)이 가장 먼저 오고 프롬프트가 마지막에 와야 한다고 주장합니다. 실제 코퍼스에서 추출된 정답을 가진 30~50개의 질문을 만들고, 어떤 구절이 각 질문에 답하는지 기록한 다음 측정해야 합니다. 거부 행동(Refusal behaviour)은 이 표를 가지고 결정하는 임계값(threshold decision)이며, 컨텍스트 청킹(contextual chunking)과 리랭킹(reranking) 중 어느 것이 지연 시간(latency) 측면에서 가치가 있는지 알려주는 것도 바로 그 표입니다.
20인 규모의 코퍼스에 적용하기
소규모 코퍼스로의 첫 구현은 채팅 인터페이스가 부착된 측정 프로젝트입니다. 추출 파이프라인을 어시스턴트와 분리하여, 청크를 재구성(re-chunk)할 때 한 가지 요소만 변경되도록 합니다. 평가 질문은 답변하는 코드 옆에 저장소에 보관합니다. 검색 매개변수(retrieval parameters)는 눈에 보이게 유지해야 합니다. 퓨전 방식(fusion method), 사전 가져오기 제한(prefetch limits), 리랭커의 차단점(reranker's cut-off)은 관련성(relevance)을 움직이는 다이얼이며, 이들 각각은 동일한 레이블링된 세트와 비교하여 측정될 수 있습니다.
설계가 가치를 발휘하는 지점은 경계(boundary)입니다. 어시스턴트가 어떤 문서를 읽을 수 있는지, 어떤 구절이 각 답변을 뒷받침하는지, 그리고 어시스턴트가 언제 거부하는지를 말할 수 있는 회사는 클라이언트 대면 팀(client-facing team)에 이 도구를 배치할 수 있습니다. 프랑스와 모로코의 데이터 상주성 제약(data-residency constraints)은 코퍼스, 인덱스, 모델 호출이 모두 운영하는 인프라에 놓여 있을 때 충족하기가 더 쉽습니다. Netics 페이지의 문서를 위한 비공개 AI 어시스턴트는 이 기둥(pillar)이 지원하는 오퍼링을 설명합니다.
Netics editorial diagram: the operating rules of a document assistant