[Antropic 리뷰] Introducing Contextual Retrieval
출처 :
https://www.anthropic.com/news/contextual-retrieval
Introducing Contextual Retrieval
Anthropic is an AI safety and research company that's working to build reliable, interpretable, and steerable AI systems.
www.anthropic.com
CookBook : https://github.com/anthropics/anthropic-cookbook/blob/main/skills/contextual-embeddings/guide.ipynb
Conclusion
모든 기술(임베딩 모델, BM25 사용, Contextual Retrieval 사용, ReRanker 사용, 검색된 상위 K개 결과의 총 수)의 다양한 조합을 비교하는 많은 테스트를 다양한 데이터셋 유형에 걸쳐 실행.
다음은 발견한 내용을 요약한 것입니다:
- 임베딩만 사용하는 것보다 임베딩과 BM25를 함께 사용하는 것이 더 좋다.
- 우리가 테스트한 임베딩 중에서는 Voyage와 Gemini가 가장 좋다.
- 모델에 상위 5개나 10개보다 상위 20개 조각을 전달하는 것이 더 효과적.
- 조각에 맥락을 추가하면 검색 정확도가 크게 향상.
- ReRanking을 사용하는 것이 사용하지 않는 것보다 낫다.
- 이 모든 이점은 누적됩니다: 성능을 극대화하려면 Contextual Embeddings(Voyage나 Gemini의)와 Contextual BM25를 결합하고, ReRanking 단계를 추가한 다음, 20개의 조각을 프롬프트에 추가.
Abstract
- AI 모델 한계 : 특정 상황 활용을 위해 배경지식 필요
- 예: 고객 지원 챗봇은 해당 기업 정보 필요
- 예: 법률 분석 봇은 다양한 과거 사례 지식 필요
- 개발자들이 AI 지식 향상에 사용하는 방법: RAG
- RAG : 지식 베이스에서 관련 정보 검색해 사용자 질문에 추가
- 문제점 : 기존 RAG는 정보 인코딩 시 맥락이 제거되어 검색 실패 발생
- 새로운 방법 소개: 'Contextual Retrieval'
- 세부 기술: 'Contextual Embedding'과 'Contextual BM25' 사용
- 효과 : 검색 실패율 49% 감소 (ReRank 기법 결합 시 67% 감소)
- 결과 : 검색 정확도 크게 향상, 다양한 작업 성능 개선
- Claude AI로 맥락적 검색 솔루션 구현 가능
- 상세 방법은 가이드북 참조
Contextual Retrieval의 간단한 대안적용 가능 조건: 지식 베이스가 200,000 토큰(약 500페이지) 미만일 때방법: 전체 지식 베이스를 프롬프트에 직접 포함
A primer on RAG : scaling to larger knowledge bases
컨텍스트 윈도우(AI 모델이 한 번에 처리할 수 있는 텍스트의 양)에 맞지 않는 더 큰 지식 베이스의 경우, RAG가 일반적인 해결책
RAG는 다음과 같은 단계로 지식 베이스를 전처 한다.:
- 지식 베이스(문서의 "말뭉치")를 보통 몇 백 토큰을 넘지 않는 작은 텍스트 조각으로 나누고
- 임베딩 모델을 사용해 이 조각들을 의미를 인코딩하는 벡터 임베딩으로 변환
- 이 임베딩을 의미적 유사성으로 검색할 수 있는 벡터 데이터베이스에 저장
임베딩 모델의 한계
- 장점: 의미적 관계 포착에 뛰어남
- 단점: 정확한 단어/구문 일치를 놓칠 수 있음
- 보완 : BM25
BM25 (Best Matching 25)의 역할
- 기능: 정확한 단어/구문 일치를 찾는 순위 함수
- 기반: TF-IDF (Term Frequency-Inverse Document Frequency) 개념
- 장점: 문서 길이 고려, 일반적인 단어의 과도한 영향 방지
- 특징: 고유 식별자나 기술 용어 검색에 효과적
- BM25가 의미 있는 예) :
사용자가 데이터베이스에서 "오류 코드 TS-999"를 검색한다고 가정. 임베딩 모델은 일반적인 오류 코드에 대한 내용은 찾을 수 있지만, 정확한 "TS-999" 일치를 놓칠 수 있다. BM25는 이 특정 텍스트 문자열을 찾아 관련 문서를 식별한다.
RAG와 BM25 결합 방식
- 지식 베이스를 작은 조각으로 분할
- 각 조각에 대해 TF-IDF 인코딩과 의미적 임베딩 생성
- BM25로 정확한 일치 기반 상위 조각 검색
- 임베딩으로 의미적 유사성 기반 상위 조각 검색
- 두 결과를 결합하고 중복 제거 (Using rank fusion techniques)
- 최종 선택된 상위 조각들을 AI 모델에 제공
이 방식의 장점
- 더 포괄적이고 정확한 결과 제공
- 정확한 용어 매칭과 넓은 의미적 이해 사이의 균형
- 매우 큰 지식 베이스로의 비용 효율적 확장 가능
현재 RAG 시스템의 주요 한계
- 맥락 파괴: 정보를 작은 조각으로 나누는 과정에서 전체적인 맥락이 손실될 수 있음
- 문서를 작은 조각으로 나누면서 맥락이 손실됨
- 이로 인해 관련 정보 검색 실패 가능성 증가
Introducing Contextual Retrieval
각 조각에 맥락 정보를 추가하는 새로운 방법
- 문서 검색은 임베딩 전에 각 청크에, 청크별 설명 문맥을 추가하고 BM25인덱스를 생성함으로서 문제를 해결
- whole document + chunk1 -> LLM -> context1 + chunk 1
- whole document + chunk2 -> LLM -> context2 + chunk 2
- whole document + chunk3 -> LLM -> context3 + chunk3
과거 방법들...
- 청크에 일반적인 문서 요약을 추가하는 방법(매우 제한적인 성능 향상)
- 가상 문서 임베딩, 요약 기반 인덱싱(실험해보니 성능이 낮았음.)
Context Example)
Implementing Contextual Retrieval
지식 베이스의 수많은 청크에 수동으로 주석을 달기에는 불가능
모델에게 전체 문서의 맥락을 사용해 조각을 설명하는 간결하고 조각별 맥락을 제공하는 프롬프트 작성
결과 : 결과로 나온 context text는 50-100토큰 조각이고, BM25와 Embedding전에, chunk앞 부분에 위치하게 된다.
(context + chunk)
Using Prompt Caching to reduce the costs of Contextual Retrieval
(제가 알기로, google에서 먼저 제안한 기술)
- 프롬프트 캐싱 기능으로 낮은 비용 가능
- 모든 chunk에 대해 참조 문서를 전달할 필요가 없음.
- 문서를 캐시에 로드한 다음 이전에 캐시된 내용을 참조하면 된다.
Methodology(Appendix II)
- 다양한 지식 도메인(코드베이스, 소설, ArXiv 논문, 과학 논문)
- 다양한 임베딩 모델
- 다양한 검색 전략
- 다양한 평가 지표
최고 성능...
- 임베딩 : Gemini Text 004
- 검색 전략(retrieve 수) : 20개 chunk를 검색하는 방식
위 두 조합을 할 경우, 아래와 같은 결과과 나온다.
실험 결과 :
- Contextual Embeddings는 상위 20개 조각 검색 실패율은 35% 줄었다(5.7% → 3.7%).
- Contextual Embeddings와 Contextual BM25를 결합하면 상위 20개 조각 검색 실패율은 49% 줄었다(5.7% → 2.9%).
Implementation Considerations
- Chunk boundaries : 문서를 조각으로 나누는 방법을 고려. chunk (크기, 경계, 중복) 선택이 검색 성능에 영향을 미침.
- Embedding model : Contextual Retrieval은 테스트한 모든 임베딩 모델에서 성능을 향상시키지만, 일부 모델은 다른 모델보다 더 좋은 성능을 얻을 수 있음. (Gemini와 Voyage 임베딩이 특히 효과적)
- Custom contextualizer prompts : 일반적인 프롬프트도 잘 작동하지만, 특정 도메인이나 사용 사례에 맞춘 프롬프트를 사용하면 더 나은 결과를 얻을 수 있다(예: 지식 베이스의 다른 문서에서만 정의될 수 있는 주요 용어 목록 포함).
- Number of chunks : context window에 더 많은 조각을 추가하면 관련 정보를 포함할 가능성이 높아진다. 그러나 정보가 너무 많으면 모델에게 혼란을 줄 수 있어 한계가 있다. 우리는 5, 10, 20개의 조각을 전달하는 실험을 했고, 20개를 사용하는 것이 이 옵션들 중 가장 성능이 좋았다(비교는 부록 참조). 하지만 데이터마다 optimal 조각 갯수가 다르므로 실험해보길 권장한다.
- Always run evals : contextualized chunk와 원본 chunk를 구분하여 전달하는게, 응답 성능을 향상시킬 수 있다.
Further boosting performance with Reranking
- 마지막 단계로, Contextual Retrieval과 또 다른 기술을 결합하여 더 큰 성능 향상을 얻을 수 있다.
- 큰 지식 베이스의 경우, 수백 개를 반환한다.
- ReRanking은 가장 관련성 높은 조각만 모델에 전달되도록 하는 일반적으로 사용되는 필터링 기술.
- ReRanking은 모델이 처리하는 정보량을 줄여 더 나은 응답을 제공하고 비용과 지연 시간을 줄인다.
주요 단계 :
- 초기 검색을 수행하여 잠재적으로 관련 있는 상위 조각들을 가져온다(여기서는 상위 150개 사용 했다고 함).
- 상위 N개의 조각과 사용자의 질문을 ReRanking 모델에 전달
- ReRanking 모델을 사용하여 각 조각에 프롬프트에 대한 관련성과 중요도를 기반으로 점수를 매긴 다음 상위 K개의 조각을 선택(우리는 상위 20개 사용).
- 선택된 상위 K개의 조각을 최종 결과를 생성하기 위한 맥락으로 모델에 전달
Performance Improvements
- 상용화된 여러 ReRanking 모델이 있다.
- 여기서는 Cohere ReRanker로 테스트를 진행.
- Voyage도 ReRanker를 제공하지만, 우리는 시간 관계로 테스트하지 못함.
- 실험은 다양한 도메인에서 ReRanking 단계를 추가하면 검색을 더욱 최적화한다는 것을 보여줌
- 구체적으로, Reranked Contextual Embedding과 Contextual BM25를 사용하면 상위 20개 조각 검색 실패율을 67% 줄었다(5.7% → 1.9%).
Cost and latency considerations
ReRanking할 때 지연 시간과 비용 발생. 특정 사용 사례에 대해 다양한 설정으로 실험해 보고 적절한 균형을 찾는 것을 권장
Codebase에 실험 : 출처 : https://assets.anthropic.com/m/1632cded0a125333/original/Contextual-Retrieval-Appendix-2.pdf
고민할 부분 :
블로그에 나온 방법대로, 코드에 적용하기 위해서는 어떻게 해야하지? context 정보를 어떻게 chunk 앞 부분에 넣지?Chunking strategy는 뭐지?