16P by xguru 2달전 | favorite | 댓글과 토론
  • 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로 작업하는 모든 개발자가 제공된 쿡북을 사용하여 이러한 접근 방식을 실험해 보고 새로운 성능 수준을 달성할 것을 권장함