- AI 모델이 특정 컨텍스트에서 유용하려면 배경 지식에 접근할 필요가 있음
- 개발자들은 일반적으로 Retrieval-Augmented Generation(RAG)를 사용해 AI 모델의 지식을 향상시킴
- 전통적인 RAG 솔루션은 정보를 인코딩할 때 컨텍스트를 제거하여 관련 정보를 검색하지 못하는 경우가 많음
- Contextual Retrieval은 RAG의 검색 단계를 크게 개선하는 방법으로, Contextual Embeddings과 Contextual BM25라는 두 가지 하위 기술을 사용함
- 이 방법은 검색 실패율을 49% 감소시킬 수 있으며, 재순위화와 결합하면 67%까지 감소시킬 수 있음
- 개발자는 Claude와 함께 자신만의 Contextual Retrieval 솔루션을 쉽게 배포할 수 있음
긴 프롬프트 사용에 대한 참고 사항
- 지식 베이스가 200,000 토큰 미만인 경우 전체 지식 베이스를 모델에 제공하는 프롬프트에 포함시킬 수 있음
- 최근 Claude에 프롬프트 캐싱을 출시하여 이 접근 방식이 훨씬 빨라지고 비용 효율적임
- Knowledge Base가 커지면 더 확장 가능한 솔루션이 필요하고, 이럴때 Contextual Retrieval이 필요함
RAG 기본: 대규모 지식 베이스로 확장
- 컨텍스트 윈도우에 맞지 않는 더 큰 지식 베이스의 경우 일반적인 솔루션은 RAG임
- RAG는 지식 베이스를 더 작은 청크로 분해하고, 이를 벡터 임베딩으로 변환한 다음, 의미론적 유사성을 통해 검색할 수 있는 벡터 데이터베이스에 저장함
- 임베딩 모델은 의미 관계를 포착하는 데 뛰어나지만 중요한 정확한 일치를 놓칠 수 있음
- BM25는 정확한 단어나 구문 일치를 찾기 위해 어휘 매칭을 사용하는 랭킹 함수로, 고유 식별자나 기술 용어를 포함하는 쿼리에 특히 효과적임
- RAG 솔루션은 다음 단계를 사용하여 임베딩과 BM25 기술을 결합함으로써 가장 적용 가능한 청크를 더 정확하게 검색할 수 있음:
- 지식 베이스(문서의 "코퍼스")를 일반적으로 몇 백 토큰 이하의 더 작은 텍스트 청크로 분해
- 이러한 청크에 대한 TF-IDF 인코딩과 의미론적 임베딩 생성
- BM25를 사용하여 정확한 일치를 기반으로 상위 청크 찾기
- 임베딩을 사용하여 의미론적 유사성을 기반으로 상위 청크 찾기
- 순위 융합 기술을 사용하여 (3)과 (4)의 결과를 결합하고 중복 제거
- 상위 K개 청크를 프롬프트에 추가하여 응답 생성
Contextual Retrieval 도입
- 전통적인 RAG에서는 문서를 더 작은 청크로 분할하기 때문에 개별 청크가 충분한 맥락을 결여할 수 있음
- Contextual Retrieval은 각 청크 앞에 청크별 설명 컨텍스트를 추가하여 이 문제를 해결함
- Claude는 전체 문서의 맥락을 사용하여 청크를 설명하는 간결한 청크별 컨텍스트를 제공하도록 지시하는 프롬프트를 사용하여 Contextual Retrieval 구현을 지원함
- Contextual Retrieval은 프롬프트 캐싱 덕분에 Claude와 함께 저렴한 비용으로 이용 가능함
성능 개선
- Contextual Embeddings는 상위 20개 청크 검색 실패율을 35% 감소시킴 (5.7% → 3.7%)
- Contextual Embeddings와 Contextual BM25를 결합하면 실패율이 49% 감소함 (5.7% → 2.9%)
구현 시 고려사항
- 문서를 청크로 분할하는 방법 고려
- Contextual Retrieval은 모든 임베딩 모델에서 성능을 향상시키지만 일부 모델이 더 많은 혜택을 받을 수 있음
- 일반 프롬프트가 잘 작동하지만 특정 도메인이나 사용 사례에 맞춘 프롬프트로 더 나은 결과를 얻을 수 있음
- 컨텍스트 윈도우에 더 많은 청크를 추가하면 관련 정보를 포함할 가능성이 높아짐
- 항상 평가를 실행하여 컨텍스트화된 청크를 전달하고 컨텍스트와 청크를 구별하는 것이 응답 생성을 개선할 수 있음
재순위화(Reranking)로 성능 추가 향상
- 재순위화는 가장 관련성 높은 청크만 모델에 전달되도록 하는 일반적으로 사용되는 필터링 기술임
- 초기 검색을 수행하여 잠재적으로 관련성이 높은 상위 청크를 가져옴
- 상위 N개 청크와 사용자 쿼리를 재순위화 모델에 전달함
- 재순위화 모델을 사용하여 프롬프트와의 관련성과 중요성에 따라 각 청크에 점수를 부여한 다음 상위 K개 청크를 선택함
- 상위 K개 청크를 컨텍스트로 모델에 전달하여 최종 결과를 생성함
- 재순위화된 Contextual Embedding과 Contextual BM25는 상위 20개 청크 검색 실패율을 67% 감소시킴 (5.7% → 1.9%)
- 비용과 지연 시간 고려사항
- 재순위화는 특히 많은 수의 청크를 재순위화할 때 지연 시간과 비용에 영향을 줄 수 있음
- 더 나은 성능을 위해 더 많은 청크를 재순위화하는 것과 낮은 지연 시간과 비용을 위해 더 적은 수를 재순위화하는 것 사이에는 절충이 존재함
결론
- 위에서 설명한 모든 기술의 다양한 조합(임베딩 모델, BM25 사용, 컨텍스트 검색 사용, 재순위화 사용, 검색된 상위 K 결과의 총 개수)을 비교하는 많은 테스트를 다양한 데이터셋 유형에 걸쳐 수행함
- 그 결과는 다음과 같음:
- 임베딩+BM25가 임베딩 자체보다 더 좋음
- 테스트한 임베딩 중 Voyage와 Gemini가 가장 좋음
- 상위 20개 청크를 모델에 전달하는 것이 상위 10개나 5개만 전달하는 것보다 더 효과적임
- 청크에 컨텍스트를 추가하면 검색 정확도가 크게 향상됨
- 재순위화가 재순위화를 하지 않는 것보다 더 좋음
- 이 모든 이점이 누적됨: 성능 향상을 극대화하기 위해 컨텍스트 BM25와 재순위화 단계를 거친 컨텍스트 임베딩(Voyage 또는 Gemini의)을 결합하고 프롬프트에 20개의 청크를 추가할 수 있음
- Knowledge Base로 작업하는 모든 개발자가 제공된 쿡북을 사용하여 이러한 접근 방식을 실험해 보고 새로운 성능 수준을 달성할 것을 권장함