반응형

지난 글에서 소개했던 Anthropic의 Contextual Retrieval을 AWS Bedrock 서비스를 활용하여 직접 구현해 보았습니다. 특히 기존 RAG 시스템의 한계를 극복하고자 하는 이 방식의 효과를 실제로 확인해보고 싶었습니다.

 

Anthropic의 맥락적 검색(Contextual Retrieval): 대규모 지식 베이스를 위한 RAG 기술

2024년 9월 20일, Anthropic은 기존 Retrieval-Augmented Generation (RAG) 시스템의 성능을 크게 향상할 수 있는 '맥락적 검색(Contextual Retrieval)'이라는 새로운 방법을 소개했습니다. Introducing Contextual RetrievalAnthr

yunwoong.tistory.com

RAG 시스템의 한계

기존 RAG(Retrieval-Augmented Generation) 시스템은 긴 문서를 작은 청크로 나누어 처리하는 과정에서 다음과 같은 문제점들이 발생합니다:

  1. 청크 크기 제한: LLM의 컨텍스트 윈도우 제한으로 인한 강제 분할
  2. 독립적 임베딩: 각 청크를 독립적으로 벡터화하여 저장
  3. 문서 구조 손실: 목차, 섹션 등 문서의 구조적 정보 손실
  4. 참조 정보 단절: 이전/이후 내용에 대한 참조 관계 유실

이러한 한계는 다음과 같은 실패 사례로 이어집니다.

사용자 질문: "2023년 3분기 매출은 얼마였나요?"
결과적 답변: "2024년 3분기 목표 매출은 150억원입니다."

Chunk 1의 시간 정보 누락으로 벡터 유사도 검색 시 ‘2023년', ‘분기', '매출', '억원' 등의 키워드 중심 검색하여 2023년 3분기 매출"을 찾았는데 "2024년 3분기 목표"를 반환합니다.


구현 및 테스트 환경

사용한 AWS Bedrock 모델

  • Text Generation: anthropic.claude-3-5-haiku-20241022-v1:0
  • Embedding: amazon.titan-embed-text-v2:0
  • Reranking: amazon.rerank-v1:0

구현한 검색 모드

  1. Contextual Embedding만 사용
  2. Contextual Embedding + BM25 하이브리드 검색
  3. 하이브리드 검색 + Reranking

프로젝트 구성

bedrock_contextual_retrieval/
├── contextual_retrieval/
│   ├── __init__.py
│   ├── config/
│   │   ├── __init__.py
│   │   ├── default_config.yaml
│   │   └── schema.py
│   ├── utils/
│   │   ├── __init__.py
│   │   └── document_utils.py
│   ├── embedding_models.py
│   ├── vector_client.py 
│   ├── bm25.py
│   ├── reranker.py
│   └── retriever.py
├── tests/
│   └── test_search.py
└── asset/
    └── doc/
        └── test_doc.pdf

테스트 문서 선정

테스트를 위해 "2024년 「일자리 채움 청년지원금」 사업운영 지침(안)"을 선택했습니다. 이 문서는

  1. 약 90페이지 분량의 복잡한 공문서
  2. 한국어 특유의 행정 용어와 복잡한 문장 구조
  3. 다양한 예외사항과 조건들이 문서 전반에 걸쳐 분산됨

이런 특성을 가진 문서는 기존 RAG 시스템의 한계를 잘 보여줄 수 있는 좋은 테스트 케이스였습니다.


테스트 결과

동일한 질문 "일자리 채움 청년지원금 중복 지원 가능한 경우에 대해 알려줘"로 각 모드를 테스트했습니다.

1. Contextual Embedding 검색

기본적인 맥락 정보는 포함되었지만, 중복 지원이라는 특정 예외사항을 찾지 못해 "제공된 검색 결과에서 중복 지원에 대해 명확하게 언급된 내용은 없습니다"라는 잘못된 답변을 제공했습니다.

2. Contextual Embedding + BM25

BM25를 추가하여 키워드 기반 검색을 결합하자, 문서 중간에 있던 중복 지원 관련 내용을 정확하게 찾아내어 올바른 답변을 제공했습니다.

3. Reranking 추가

재순위화까지 적용하니 가장 관련성 높은 내용을 우선적으로 제공하며, 맥락을 잘 파악한 답변을 생성했습니다.

성능 향상 요소

Anthropic의 연구 결과와 유사하게, 이번 구현에서도 각 요소 추가에 따른 성능 향상을 확인할 수 있었습니다.

  • Contextual Embeddings: 검색 실패율 35% 감소
  • Contextual Embeddings + BM25: 검색 실패율 49% 감소
  • Reranking 추가 시: 검색 실패율 67% 감소

전체 코드는 GitHub에 공개했으니, 관심 있으신 분들은 직접 테스트해보실 수 있습니다.

[Source Code] Github - Bedrock Contextual Retrieval

반응형