본문으로 건너뛰기
📄 원문: Contextual Retrieval in AI Systems
  • 출처: Contextual Retrieval in AI Systems
  • 저자: Anthropic
  • 원문 발행일: 2024년 9월 19일
  • 라이선스: 저작권 Anthropic
  • 번역일: 2025년 6월 27일
  • 번역 및 감수: Claude and 공부하우
  • 참고: 이 번역은 교육 목적으로 작성되었으며, Anthropic의 공식 번역이 아닙니다.
⚖️ 저작권 안내

이 번역문은 교육 및 정보 제공 목적으로 작성되었습니다. 원문의 저작권은 Anthropic에 있으며, 이 번역은 Anthropic의 공식 번역이 아닙니다.


본 번역은 다음과 같은 교육적 공정 사용(Fair Use) 원칙에 따라 제공됩니다:

- 비영리 교육 목적

- 원문 출처의 명확한 표시

- 한국어 사용자의 기술 이해 증진을 위한 변형적 사용

- 원저작물의 시장 가치에 부정적 영향을 미치지 않음


저작권 관련 문제가 제기될 경우, 즉시 적절한 조치를 취하겠습니다. 상업적 사용이나 재배포 전에 원저작권자의 허가를 받으시기 바랍니다.


문의사항이나 우려사항이 있으시면 오른쪽 템플릿 복사를 클릭 하신 뒤, 연락 페이지를 통해 알려 주시기 바랍니다.

AI 시스템의 맥락적 검색

AI 모델이 특정 맥락에서 유용하려면 배경 지식에 접근해야 하는 경우가 많습니다. 예를 들어, 고객 지원 챗봇은 사용되는 특정 비즈니스에 대한 지식이 필요하고, 법률 분석가 봇은 방대한 과거 사례들에 대해 알아야 합니다.

개발자들은 일반적으로 검색 증강 생성 (Retrieval-Augmented Generation, RAG)을 사용하여 AI 모델의 지식을 강화합니다. RAG는 지식 베이스에서 관련 정보를 검색하여 사용자의 프롬프트에 추가함으로써 모델의 응답을 크게 향상시키는 방법입니다. 문제는 전통적인 RAG 솔루션이 정보를 인코딩할 때 맥락을 제거하여 시스템이 지식 베이스에서 관련 정보를 검색하지 못하는 경우가 많다는 것입니다.

이 게시물에서는 RAG의 검색 단계를 극적으로 개선하는 방법을 설명합니다. 이 방법은 "맥락적 검색"이라고 하며 두 가지 하위 기술인 맥락적 임베딩 (Contextual Embeddings)맥락적 BM25 (Contextual BM25)를 사용합니다. 이 방법은 실패한 검색의 수를 49% 줄일 수 있으며, 재순위화와 결합하면 67%까지 줄일 수 있습니다. 이는 검색 정확도의 상당한 개선을 나타내며, 이는 다운스트림 작업의 성능 향상으로 직접 이어집니다.

저희의 쿡북을 사용하여 Claude와 함께 자신만의 맥락적 검색 솔루션을 쉽게 배포할 수 있습니다.

더 긴 프롬프트를 단순히 사용하는 것에 대한 참고

때로는 가장 간단한 해결책이 최선입니다. 지식 베이스가 200,000 토큰(약 500페이지 분량)보다 작다면, RAG나 유사한 방법 없이 전체 지식 베이스를 모델에 제공하는 프롬프트에 포함시킬 수 있습니다.

몇 주 전, 우리는 Claude를 위한 프롬프트 캐싱을 출시했는데, 이는 이 접근 방식을 훨씬 빠르고 비용 효율적으로 만듭니다. 개발자들은 이제 자주 사용되는 프롬프트를 API 호출 간에 캐시할 수 있어, 지연 시간을 2배 이상 줄이고 비용을 최대 90%까지 절감할 수 있습니다(프롬프트 캐싱 쿡북을 읽어 작동 방식을 확인할 수 있습니다).

그러나 지식 베이스가 성장함에 따라 더 확장 가능한 솔루션이 필요합니다. 바로 이때 맥락적 검색이 필요합니다.

RAG 입문: 더 큰 지식 베이스로 확장하기

컨텍스트 윈도우에 맞지 않는 더 큰 지식 베이스의 경우, RAG가 일반적인 솔루션입니다. RAG는 다음 단계를 사용하여 지식 베이스를 사전 처리하는 방식으로 작동합니다:

  • 지식 베이스(문서의 "말뭉치")를 더 작은 텍스트 청크 (chunk)로 분할합니다. 일반적으로 수백 개 토큰을 넘지 않습니다.
  • 임베딩 모델 (embedding model)을 사용하여 이러한 청크를 의미를 인코딩하는 벡터 임베딩으로 변환합니다.
  • 이러한 임베딩을 의미적 유사성으로 검색할 수 있는 벡터 데이터베이스 (vector database)에 저장합니다.

런타임에 사용자가 모델에 쿼리를 입력하면, 벡터 데이터베이스를 사용하여 쿼리와의 의미적 유사성을 기반으로 가장 관련성 높은 청크를 찾습니다. 그런 다음 가장 관련성 높은 청크가 생성 모델로 전송되는 프롬프트에 추가됩니다.

임베딩 모델은 의미적 관계를 포착하는 데 뛰어나지만, 중요한 정확한 일치를 놓칠 수 있습니다. 다행히 이러한 상황에서 도움이 될 수 있는 오래된 기술이 있습니다. BM25 (Best Matching 25)는 어휘 매칭을 사용하여 정확한 단어나 구문 일치를 찾는 순위 함수입니다. 고유 식별자나 기술 용어가 포함된 쿼리에 특히 효과적입니다.

BM25는 TF-IDF (Term Frequency-Inverse Document Frequency) 개념을 기반으로 작동합니다. TF-IDF는 단어가 컬렉션의 문서에 얼마나 중요한지 측정합니다. BM25는 문서 길이를 고려하고 용어 빈도에 포화 함수를 적용하여 이를 개선하므로, 일반적인 단어가 결과를 지배하는 것을 방지하는 데 도움이 됩니다.

BM25가 의미적 임베딩이 실패하는 곳에서 성공할 수 있는 방법은 다음과 같습니다: 사용자가 기술 지원 데이터베이스에서 "Error code TS-999"를 쿼리한다고 가정해 보겠습니다. 임베딩 모델은 일반적인 오류 코드에 대한 콘텐츠를 찾을 수 있지만 정확한 "TS-999" 일치를 놓칠 수 있습니다. BM25는 이 특정 텍스트 문자열을 찾아 관련 문서를 식별합니다.

RAG 솔루션은 다음 단계를 사용하여 임베딩과 BM25 기술을 결합하여 가장 적용 가능한 청크를 더 정확하게 검색할 수 있습니다:

  • 지식 베이스(문서의 "말뭉치")를 더 작은 텍스트 청크로 분할합니다. 일반적으로 수백 개 토큰을 넘지 않습니다.
  • 이러한 청크에 대한 TF-IDF 인코딩과 의미적 임베딩을 생성합니다.
  • BM25를 사용하여 정확한 일치를 기반으로 상위 청크를 찾습니다.
  • 임베딩을 사용하여 의미적 유사성을 기반으로 상위 청크를 찾습니다.
  • 순위 융합 기술을 사용하여 (3)과 (4)의 결과를 결합하고 중복을 제거합니다.
  • 응답을 생성하기 위해 상위 K개 청크를 프롬프트에 추가합니다.

BM25와 임베딩 모델을 모두 활용함으로써, 전통적인 RAG 시스템은 정확한 용어 매칭과 더 넓은 의미적 이해의 균형을 맞추어 더 포괄적이고 정확한 결과를 제공할 수 있습니다.

전통적인 RAG 시스템 다이어그램 - 문서를 청크로 분할하고 임베딩과 BM25로 검색한 후 최고의 청크를 모델에 전달하는 과정

이 접근 방식을 사용하면 단일 프롬프트에 맞출 수 있는 것보다 훨씬 큰 거대한 지식 베이스로 비용 효율적으로 확장할 수 있습니다. 그러나 이러한 전통적인 RAG 시스템에는 상당한 제한이 있습니다: 종종 맥락을 파괴한다는 것입니다.

전통적인 RAG의 맥락 문제

전통적인 RAG에서 문서는 일반적으로 효율적인 검색을 위해 더 작은 청크로 분할됩니다. 이 접근 방식은 많은 애플리케이션에서 잘 작동하지만, 개별 청크에 충분한 맥락이 부족할 때 문제가 발생할 수 있습니다.

예를 들어, 지식 베이스에 금융 정보 모음(예: 미국 SEC 제출 서류)이 포함되어 있고 다음과 같은 질문을 받았다고 상상해 보세요: "2023년 2분기 ACME Corp의 매출 성장률은 얼마였습니까?"

관련 청크에는 다음과 같은 텍스트가 포함될 수 있습니다: "회사의 매출은 이전 분기 대비 3% 성장했습니다." 그러나 이 청크 자체만으로는 어떤 회사를 언급하는지 또는 관련 기간이 무엇인지 명시하지 않아 올바른 정보를 검색하거나 정보를 효과적으로 사용하기 어렵습니다.

맥락적 검색 소개

맥락적 검색은 임베딩("맥락적 임베딩")과 BM25 인덱스("맥락적 BM25")를 생성하기 전에 각 청크에 청크별 설명 맥락을 앞에 추가하여 이 문제를 해결합니다.

SEC 제출 서류 컬렉션 예제로 돌아가 봅시다. 청크가 어떻게 변환될 수 있는지의 예는 다음과 같습니다:

original_chunk = "회사의 매출은 이전 분기 대비 3% 성장했습니다."

contextualized_chunk = "이 청크는 2023년 2분기 ACME corp의 실적에 대한 SEC 제출 서류에서 발췌한 것입니다. 이전 분기의 매출은 3억 1,400만 달러였습니다. 회사의 매출은 이전 분기 대비 3% 성장했습니다."

과거에 검색을 개선하기 위해 맥락을 사용하는 다른 접근 방식이 제안되었다는 점은 주목할 가치가 있습니다. 다른 제안에는 청크에 일반적인 문서 요약 추가(실험했지만 매우 제한적인 이득만 보았음), 가상 문서 임베딩, 요약 기반 인덱싱(평가했지만 낮은 성능을 보임)이 포함됩니다. 이러한 방법은 이 게시물에서 제안하는 것과 다릅니다.

맥락적 검색 구현

물론 지식 베이스의 수천 개 또는 수백만 개의 청크에 수동으로 주석을 다는 것은 너무 많은 작업이 될 것입니다. 맥락적 검색을 구현하기 위해 우리는 Claude에게 의존합니다. 우리는 전체 문서의 맥락을 사용하여 청크를 설명하는 간결하고 청크별 맥락을 제공하도록 모델에 지시하는 프롬프트를 작성했습니다. 각 청크에 대한 맥락을 생성하기 위해 다음 Claude 3 Haiku 프롬프트를 사용했습니다:

<document>
{{WHOLE_DOCUMENT}}
</document>
여기에 전체 문서 내에서 위치시키고자 하는 청크가 있습니다
<chunk>
{{CHUNK_CONTENT}}
</chunk>
청크의 검색 검색을 개선하기 위해 전체 문서 내에서 이 청크를 위치시키는 짧고 간결한 맥락을 제공해 주세요. 간결한 맥락만 답하고 다른 것은 없습니다.

일반적으로 50-100 토큰인 결과 맥락 텍스트는 임베딩하고 BM25 인덱스를 생성하기 전에 청크 앞에 추가됩니다.

실제로 전처리 흐름은 다음과 같습니다:

맥락적 검색 전처리 흐름도 - 문서를 청크로 분할한 후 Claude를 사용해 각 청크에 맥락을 추가하고 임베딩과 BM25 인덱스를 생성하는 과정

맥락적 검색을 사용하는 데 관심이 있다면 저희의 쿡북으로 시작할 수 있습니다.

프롬프트 캐싱을 사용하여 맥락적 검색 비용 절감

맥락적 검색은 위에서 언급한 특별한 프롬프트 캐싱 기능 덕분에 Claude로 저렴한 비용으로 고유하게 가능합니다. 프롬프트 캐싱을 사용하면 모든 청크에 대해 참조 문서를 전달할 필요가 없습니다. 문서를 캐시에 한 번 로드한 다음 이전에 캐시된 콘텐츠를 참조하기만 하면 됩니다. 800개 토큰 청크, 8k 토큰 문서, 50개 토큰 맥락 지침 및 청크당 100개 토큰의 맥락을 가정하면, 맥락화된 청크를 생성하는 일회성 비용은 백만 문서 토큰당 $1.02입니다.

방법론

우리는 다양한 지식 도메인(코드베이스, 소설, ArXiv 논문, 과학 논문), 임베딩 모델, 검색 전략 및 평가 메트릭에 걸쳐 실험했습니다. 각 도메인에 사용한 질문과 답변의 몇 가지 예를 부록 II에 포함했습니다.

아래 그래프는 최고 성능의 임베딩 구성(Gemini Text 004)과 상위 20개 청크 검색을 사용한 모든 지식 도메인의 평균 성능을 보여줍니다. 우리는 평가 메트릭으로 1 - recall@20을 사용하는데, 이는 상위 20개 청크 내에서 검색되지 못한 관련 문서의 비율을 측정합니다. 전체 결과는 부록에서 볼 수 있습니다 - 맥락화는 우리가 평가한 모든 임베딩-소스 조합에서 성능을 향상시킵니다.

성능 개선

우리의 실험은 다음을 보여주었습니다:

  • 맥락적 임베딩은 상위 20개 청크 검색 실패율을 35% 감소시켰습니다 (5.7% → 3.7%).
  • 맥락적 임베딩과 맥락적 BM25를 결합하면 상위 20개 청크 검색 실패율을 49% 감소시켰습니다 (5.7% → 2.9%).

맥락적 검색 성능 비교 차트 - 기존 임베딩, 맥락적 임베딩, 맥락적 임베딩+BM25의 실패율 감소를 보여주는 막대 그래프

구현 고려사항

맥락적 검색을 구현할 때 염두에 두어야 할 몇 가지 고려사항이 있습니다:

  • 청크 경계: 문서를 청크로 분할하는 방법을 고려하세요. 청크 크기, 청크 경계 및 청크 중첩의 선택은 검색 성능에 영향을 줄 수 있습니다.
  • 임베딩 모델: 맥락적 검색이 우리가 테스트한 모든 임베딩 모델에서 성능을 향상시키지만, 일부 모델은 다른 모델보다 더 많은 이점을 얻을 수 있습니다. GeminiVoyage 임베딩이 특히 효과적이라는 것을 발견했습니다.
  • 맞춤형 맥락화 프롬프트: 우리가 제공한 일반적인 프롬프트가 잘 작동하지만, 특정 도메인이나 사용 사례에 맞춘 프롬프트로 더 나은 결과를 얻을 수 있습니다(예: 지식 베이스의 다른 문서에서만 정의될 수 있는 주요 용어의 용어집 포함).
  • 청크 수: 컨텍스트 윈도우에 더 많은 청크를 추가하면 관련 정보를 포함할 가능성이 높아집니다. 그러나 더 많은 정보는 모델에 방해가 될 수 있으므로 한계가 있습니다. 우리는 5개, 10개, 20개 청크를 전달해 보았고, 이 중 20개를 사용하는 것이 가장 성능이 좋다는 것을 발견했습니다(비교는 부록 참조). 하지만 사용 사례에 대해 실험해 볼 가치가 있습니다.

항상 평가를 실행하세요: 맥락화된 청크를 전달하고 무엇이 맥락이고 무엇이 청크인지 구별하여 응답 생성을 개선할 수 있습니다.

재순위화로 성능 더욱 향상시키기

마지막 단계에서 맥락적 검색을 다른 기술과 결합하여 더 많은 성능 개선을 얻을 수 있습니다. 전통적인 RAG에서 AI 시스템은 지식 베이스를 검색하여 잠재적으로 관련된 정보 청크를 찾습니다. 대규모 지식 베이스의 경우, 이 초기 검색은 종종 다양한 관련성과 중요도를 가진 많은 청크(때로는 수백 개)를 반환합니다.

재순위화 (Reranking)는 가장 관련성 높은 청크만 모델에 전달되도록 하는 일반적으로 사용되는 필터링 기술입니다. 재순위화는 모델이 더 적은 정보를 처리하므로 더 나은 응답을 제공하고 비용과 지연 시간을 줄입니다. 주요 단계는 다음과 같습니다:

  • 잠재적으로 관련된 상위 청크를 얻기 위해 초기 검색을 수행합니다(우리는 상위 150개를 사용했습니다).
  • 상위 N개 청크를 사용자의 쿼리와 함께 재순위화 모델에 전달합니다.
  • 재순위화 모델을 사용하여 프롬프트에 대한 관련성과 중요도를 기반으로 각 청크에 점수를 부여한 다음 상위 K개 청크를 선택합니다(우리는 상위 20개를 사용했습니다).
  • 상위 K개 청크를 맥락으로 모델에 전달하여 최종 결과를 생성합니다.

재순위화가 포함된 맥락적 검색 파이프라인 - 초기 검색으로 상위 150개 청크를 가져온 후 재순위화 모델로 상위 20개를 선택하는 과정

성능 개선

시장에는 여러 재순위화 모델이 있습니다. 우리는 Cohere 재순위화기로 테스트를 실행했습니다. Voyage도 재순위화기를 제공하지만 테스트할 시간이 없었습니다. 우리의 실험은 다양한 도메인에서 재순위화 단계를 추가하면 검색이 더욱 최적화된다는 것을 보여주었습니다.

구체적으로, 재순위화된 맥락적 임베딩과 맥락적 BM25가 상위 20개 청크 검색 실패율을 67% 감소시켰습니다 (5.7% → 1.9%).

재순위화 추가 시 성능 향상 차트 - 맥락적 임베딩+BM25+재순위화로 검색 실패율을 67% 감소시킨 결과를 보여주는 막대 그래프

비용 및 지연 시간 고려사항

재순위화와 관련된 중요한 고려사항 중 하나는 특히 많은 수의 청크를 재순위화할 때 지연 시간과 비용에 미치는 영향입니다. 재순위화는 런타임에 추가 단계를 추가하므로 재순위화기가 모든 청크를 병렬로 점수를 매기더라도 필연적으로 약간의 지연 시간을 추가합니다. 더 나은 성능을 위해 더 많은 청크를 재순위화하는 것과 더 낮은 지연 시간과 비용을 위해 더 적은 청크를 재순위화하는 것 사이에는 본질적인 트레이드오프가 있습니다. 올바른 균형을 찾기 위해 특정 사용 사례에서 다양한 설정으로 실험하는 것이 좋습니다.

결론

우리는 위에서 설명한 모든 기술(임베딩 모델, BM25 사용, 맥락적 검색 사용, 재순위화기 사용, 검색된 상위 K개 결과의 총 수)의 다양한 조합을 비교하여 다양한 데이터셋 유형에 걸쳐 많은 수의 테스트를 실행했습니다. 우리가 발견한 내용의 요약은 다음과 같습니다:

  • 임베딩+BM25는 임베딩만 사용하는 것보다 낫습니다.
  • Voyage와 Gemini는 우리가 테스트한 것 중 최고의 임베딩을 가지고 있습니다.
  • 상위 20개 청크를 모델에 전달하는 것이 상위 10개 또는 상위 5개만 전달하는 것보다 더 효과적입니다.
  • 청크에 맥락을 추가하면 검색 정확도가 크게 향상됩니다.
  • 재순위화는 재순위화가 없는 것보다 낫습니다.
  • 이 모든 이점이 누적됩니다: 성능 개선을 최대화하기 위해 맥락적 임베딩(Voyage 또는 Gemini에서)과 맥락적 BM25, 그리고 재순위화 단계를 결합하고 프롬프트에 20개 청크를 추가할 수 있습니다.

우리는 지식 베이스로 작업하는 모든 개발자가 저희의 쿡북을 사용하여 이러한 접근 방식을 실험하여 새로운 수준의 성능을 발휘할 것을 권장합니다.

부록 I

아래는 데이터셋, 임베딩 제공자, 임베딩 외에 BM25 사용, 맥락적 검색 사용, 검색 @ 20에 대한 재순위화 사용에 걸친 결과 분석입니다.

검색 @ 10 및 @ 5에 대한 분석과 각 데이터셋에 대한 예제 질문 및 답변은 부록 II를 참조하세요.

부록 I 상세 결과 표 - 다양한 데이터셋, 임베딩 제공자, 검색 방법에 따른 성능 비교 결과표


공부하우 추가 설명

아래 내용은 독자의 이해를 돕기 위해 공부하우가 추가한 설명입니다. 원문에는 없는 내용입니다.

주요 용어 설명

이 문서에서 사용된 주요 기술 용어들을 설명합니다:

검색 및 AI 관련 용어

검색 증강 생성 (Retrieval-Augmented Generation, RAG)
AI 모델이 응답을 생성할 때 외부 지식 베이스에서 관련 정보를 검색하여 추가하는 기술입니다. 이를 통해 모델이 학습하지 않은 최신 정보나 특정 도메인 지식을 활용할 수 있습니다.

청크 (Chunk)
큰 문서를 검색과 처리가 용이하도록 나눈 작은 텍스트 조각입니다. 일반적으로 수백 개의 토큰(단어나 문자) 단위로 분할됩니다.

임베딩 (Embedding)
텍스트를 숫자 벡터로 변환한 것으로, 의미적 유사성을 수학적으로 계산할 수 있게 합니다. 비슷한 의미의 텍스트는 벡터 공간에서 가까운 위치에 있습니다.

벡터 데이터베이스 (Vector Database)
임베딩된 벡터를 저장하고 의미적 유사성으로 빠르게 검색할 수 있는 특수한 데이터베이스입니다.

검색 알고리즘 용어

BM25 (Best Matching 25)
단어의 정확한 일치를 찾는 전통적인 검색 알고리즘입니다. 특정 용어나 코드 번호 같은 정확한 텍스트를 찾는 데 효과적입니다.

TF-IDF (Term Frequency-Inverse Document Frequency)
문서에서 단어의 중요도를 측정하는 방법입니다. 자주 나타나는 단어(TF)와 전체 문서에서 희귀한 단어(IDF)를 고려합니다.

재순위화 (Reranking)
초기 검색 결과를 다시 평가하여 가장 관련성 높은 결과를 선별하는 과정입니다. 이를 통해 품질은 높이고 처리할 정보량은 줄일 수 있습니다.

성능 평가 용어

Recall@K
상위 K개 검색 결과 중에 실제 관련 문서가 포함된 비율입니다. 예를 들어, Recall@20은 상위 20개 결과에 관련 문서가 포함될 확률을 나타냅니다.

프롬프트 캐싱 (Prompt Caching)
자주 사용되는 프롬프트를 저장해두고 재사용하는 기능으로, 처리 시간과 비용을 크게 절감할 수 있습니다.

관련 글