AWS Bedrock으로 구현한 Contextual Retrieval
지난 글에서 소개했던 Anthropic의 Contextual Retrieval을 AWS Bedrock 서비스를 활용하여 직접 구현해 보았습니다. 특히 기존 RAG 시스템의 한계를 극복하고자 하는 이 방식의 효과를 실제로 확인해보고 싶었습니다.
RAG 시스템의 한계
기존 RAG(Retrieval-Augmented Generation) 시스템은 긴 문서를 작은 청크로 나누어 처리하는 과정에서 다음과 같은 문제점들이 발생합니다:
- 청크 크기 제한: LLM의 컨텍스트 윈도우 제한으로 인한 강제 분할
- 독립적 임베딩: 각 청크를 독립적으로 벡터화하여 저장
- 문서 구조 손실: 목차, 섹션 등 문서의 구조적 정보 손실
- 참조 정보 단절: 이전/이후 내용에 대한 참조 관계 유실
이러한 한계는 다음과 같은 실패 사례로 이어집니다.
사용자 질문: "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
구현한 검색 모드
- Contextual Embedding만 사용
- Contextual Embedding + BM25 하이브리드 검색
- 하이브리드 검색 + 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년 「일자리 채움 청년지원금」 사업운영 지침(안)"을 선택했습니다. 이 문서는
- 약 90페이지 분량의 복잡한 공문서
- 한국어 특유의 행정 용어와 복잡한 문장 구조
- 다양한 예외사항과 조건들이 문서 전반에 걸쳐 분산됨
이런 특성을 가진 문서는 기존 RAG 시스템의 한계를 잘 보여줄 수 있는 좋은 테스트 케이스였습니다.
테스트 결과
동일한 질문 "일자리 채움 청년지원금 중복 지원 가능한 경우에 대해 알려줘"로 각 모드를 테스트했습니다.
1. Contextual Embedding 검색
기본적인 맥락 정보는 포함되었지만, 중복 지원이라는 특정 예외사항을 찾지 못해 "제공된 검색 결과에서 중복 지원에 대해 명확하게 언급된 내용은 없습니다"라는 잘못된 답변을 제공했습니다.
2. Contextual Embedding + BM25
BM25를 추가하여 키워드 기반 검색을 결합하자, 문서 중간에 있던 중복 지원 관련 내용을 정확하게 찾아내어 올바른 답변을 제공했습니다.
3. Reranking 추가
재순위화까지 적용하니 가장 관련성 높은 내용을 우선적으로 제공하며, 맥락을 잘 파악한 답변을 생성했습니다.
성능 향상 요소
Anthropic의 연구 결과와 유사하게, 이번 구현에서도 각 요소 추가에 따른 성능 향상을 확인할 수 있었습니다.
- Contextual Embeddings: 검색 실패율 35% 감소
- Contextual Embeddings + BM25: 검색 실패율 49% 감소
- Reranking 추가 시: 검색 실패율 67% 감소
전체 코드는 GitHub에 공개했으니, 관심 있으신 분들은 직접 테스트해보실 수 있습니다.
'Tech & Development > AI' 카테고리의 다른 글
OpenAI, Sora(소라) 사용방법 가이드 (0) | 2024.12.13 |
---|---|
Claude의 새로운 기능: 맞춤형 응답 스타일 설정 (0) | 2024.11.28 |
Anthropic의 Model Context Protocol(MCP) : 사용 가이드 (0) | 2024.11.27 |
AI 에이전트 시작하기: LangGraph 개념과 실습 (0) | 2024.11.26 |
LLM의 토큰(Token): AI의 글자 단위 (0) | 2024.11.10 |
댓글
이 글 공유하기
다른 글
-
OpenAI, Sora(소라) 사용방법 가이드
OpenAI, Sora(소라) 사용방법 가이드
2024.12.13 -
Claude의 새로운 기능: 맞춤형 응답 스타일 설정
Claude의 새로운 기능: 맞춤형 응답 스타일 설정
2024.11.28 -
Anthropic의 Model Context Protocol(MCP) : 사용 가이드
Anthropic의 Model Context Protocol(MCP) : 사용 가이드
2024.11.27 -
AI 에이전트 시작하기: LangGraph 개념과 실습
AI 에이전트 시작하기: LangGraph 개념과 실습
2024.11.26