Anthropic Contextual Retrieval: 컨텍스트 임베딩과 BM25로 RAG 정확도 향상
컨텍스트 검색은 검색 과정에서 문서 컨텍스트를 보존하여 RAG(검색 증강 생성) 정확도를 획기적으로 향상시킵니다.
전통적인 RAG 솔루션은 문서를 청크로 나누고 임베딩을 생성하는 과정에서 중요한 컨텍스트가 제거되기 때문에 관련 정보를 검색하지 못하는 경우가 많습니다. 컨텍스트 검색은 각 청크가 임베딩되거나 인덱싱되기 전에 청크별 설명 컨텍스트를 각 청크 앞에 추가하여 이 문제를 해결합니다.
전통적인 RAG 시스템의 한계
RAG(검색 증강 생성)는 지식 베이스에서 관련 정보를 검색하여 사용자 프롬프트에 추가함으로써 AI 모델의 지식을 향상시키는 표준적인 방법입니다. 그러나 전통적인 RAG 시스템은 컨텍스트 손실과 정확한 일치 항목 포착 불가라는 두 가지 주요 한계를 가지고 있습니다.
문서가 효율적인 검색을 위해 더 작은 청크로 분할되면 이러한 개별 청크에는 충분한 컨텍스트가 없는 경우가 많습니다. 예를 들어, "회사의 매출이 전 분기 대비 3% 성장했습니다"라는 청크는 어떤 회사나 기간을 말하는지 알 수 없어 모호합니다.
또한 의미론적 임베딩은 광범위한 의미론적 관계를 포착하는 데 탁월하지만 중요한 정확한 일치 항목을 놓칠 수 있습니다. "TS-999"와 같은 정확한 오류 코드와 같은 정확한 단어 또는 구문 일치를 찾으려면 어휘 일치를 사용하는 BM25(Best Matching 25)와 같은 기술이 필요합니다.
전통적인 RAG 시스템은 TF-IDF 인코딩과 의미론적 임베딩을 생성하고, BM25를 사용하여 정확한 일치 항목을 찾은 다음, 순위 융합을 사용하여 결과를 결합하는 방식으로 이러한 방법을 결합할 수 있습니다. 그러나 이 접근 방식은 여전히 컨텍스트 문제로 어려움을 겪습니다.
컨텍스트 검색: 컨텍스트 문제에 대한 해결책
컨텍스트 검색은 표준 RAG에 내재된 컨텍스트 손실을 해결하여 검색 정확도를 향상시키는 전처리 기술입니다. 이는 컨텍스트 임베딩과 컨텍스트 BM25라는 두 가지 하위 기술을 통해 달성됩니다.
컨텍스트 임베딩은 모델(예: Claude)에 전체 문서를 기반으로 각 청크에 대한 간결하고 청크별 설명 컨텍스트를 생성하도록 지시하는 방식으로 작동합니다. 일반적으로 50-100 토큰인 이 결과 컨텍스트 텍스트는 임베딩되거나 인덱싱되기 전에 원래 청크 앞에 추가됩니다.
이 변환을 통해 검색 시스템은 청크를 둘러싼 컨텍스트를 이해할 수 있으므로 작은 청크도 검색될 때 의미가 있게 됩니다.
컨텍스트 검색의 성능 향상
실험 결과에 따르면 컨텍스트 검색은 코드베이스, 소설, 과학 논문 등 다양한 지식 영역에서 검색 정확도를 크게 향상시킵니다.
- 컨텍스트 임베딩만으로도 상위 20개 청크 검색 실패율이 35% 감소했습니다(5.7%에서 3.7%로).
- 컨텍스트 임베딩과 컨텍스트 BM25를 결합하면 상위 20개 청크 검색 실패율이 49% 감소했습니다(5.7%에서 2.9%로).
컨텍스트 검색은 Claude의 프롬프트 캐싱 기능을 사용할 때 저렴한 비용으로 배포할 수 있습니다. 800 토큰 청크, 8k 토큰 문서, 50 토큰 컨텍스트 지침, 청크당 100 토큰 컨텍스트를 가정하면 컨텍스트화된 청크를 생성하는 일회성 비용은 문서 토큰 100만 개당 $1.02입니다.
재순위화로 성능 추가 향상
컨텍스트 검색을 재순위화 단계와 결합하면 검색 정확도를 더욱 최적화할 수 있습니다. 재순위화는 가장 관련성 높은 청크만 생성 모델에 전달되도록 보장하는 필터링 기술로, 비용과 지연 시간을 줄여줍니다.
프로세스는 다음과 같습니다:
- 잠재적으로 관련된 대규모 청크 세트(예: 상위 150개)를 초기 검색합니다.
- 이러한 청크와 사용자 쿼리를 재순위화 모델에 전달합니다.
- 관련성과 중요성에 따라 각 청크에 점수를 매깁니다.
- 컨텍스트로 전달할 상위 K개 청크(예: 상위 20개)를 선택합니다.
재순위화된 컨텍스트 임베딩과 컨텍스트 BM25를 사용하면 상위 20개 청크 검색 실패율이 67% 감소합니다(5.7%에서 1.9%로).
구현 고려 사항
컨텍스트 검색을 구현하는 개발자는 성능을 최대화하기 위해 몇 가지 요소를 고려해야 합니다:
- 청크 경계: 청크 크기, 청크 경계, 청크 중첩의 선택은 검색 성능에 큰 영향을 미칩니다.
- 임베딩 모델: 컨텍스트 검색은 테스트된 모든 임베딩 모델에서 성능을 향상시키지만, Gemini 및 Voyage 임베딩이 특히 효과적인 것으로 나타났습니다.
- 사용자 지정 컨텍스트화 프롬프트: 일반적인 프롬프트가 제공되지만, 특정 도메인이나 사용 사례에 맞게 프롬프트를 조정하면(예: 핵심 용어 용어집 포함) 더 나은 결과를 얻을 수 있습니다.
- 청크 수: 청크가 많을수록 관련 정보가 포함될 가능성이 높아지지만, 너무 많은 정보를 추가하면 모델이 산만해질 수 있습니다. 테스트 결과 5개, 10개, 20개 중 20개 청크를 사용하는 것이 가장 성능이 좋은 것으로 나타났습니다.
요약하면, 성능을 최대화하는 가장 효과적인 접근 방식은 컨텍스트 임베딩(Voyage 또는 Gemini 사용)을 컨텍스트 BM25와 결합하고, 재순위화 단계를 거친 다음, 상위 20개 청크를 프롬프트에 전달하는 것입니다.
Sources
- OriginalIntroducing Contextual Retrieval