
Retriever란
- RAG 시스템에서 사용자의 질문과 관련된 문서를 벡터 데이터베이스(VectorStore) 로부터 신속하고 정확하게 문서를 찾아내는 역할을 한다
- 이 과정은 RAG 시스템의 전반적인 성능을 결정짓는 단계이므로 정확한 정보 검색 -> 응답 품질 -> 사용자 경험으로 이어지는 전체 흐름에 직접적인 영향을 미친다
- 상황에 따라 Sparse, Dense, Ensemble, Contextual 등 다양한 방식을 적절하게 조합하여 최적화하는 것이 중요하다
Retriever의 필요성
1. 정확한 정보 제공
- 사용자의 질문과 가장 관련성 높은 문서를 검색하여 신뢰할 수 있는 컨텍스트를 기반으로 LLM이 답변을 생성하도록 유도한다
- 검색 품질이 낮을 경우 모델이 비관련 문서를 참고하여 할루시네이션 문제가 발생할 수도 있다
2. 응답시간 단축
- 효율적인 검색 알고리즘을 통해 데이터베이스에서 관련 정보를 빠르게 탐색함으로써 시스템 응답 속도를 향상 시킨다
- 이는 사용자 경험 향상과 시스템 처리 효율성 개선으로 이어진다
3. 자원 최적화
- 필요한 정보만 선택적으로 반환함으로써 불필요한 데이터 접근은 줄이고
- 메모리 및 토큰 사용량을 최소화하여 시스템 자원을 효율적으로 활용한다
Retriever 동작의 방식
1. 질문 벡터화
- 사용자의 자연어 질문을 임베딩 모델을 통해 벡터 형태로 변환된다
- 이 벡터는 후속 단계에서 유사도 계산의 기준으로 사용된다
2. 유사도 계산
- 데이터베이스에서 저장된 문서 벡터들과 질문 벡터간의 코사인 유사도 혹은 L2 거리를 계산한다
3. 상위 문서 선정
- 계산된 유사도 점수를 기반으로 상위 문서를 K개로 반환한다
4. 문서 정보 반환
- 선택된 문서를 llm 프롬프트에 전달하여 컨텍스트 기반 응답 생성 단계로 넘어간다
Retriever의 종류
1. Sparase Retriever
- 문서와 쿼리를 단어 벡터(키워드 기반 벡터)로 변환하여 검색하는 방식
- 대표적으로 사용되는 알고리즘
TF-IDF
- 단어가 문서에 나타나는 빈도와 그 단어가 몇개의 문서에서 나타나는지를 반영하여 단어의 중요도 반영
- TF : 단어의 빈도
- IDF : 전체 문서에서 얼마나 드문지를 나타냄
- 장점 : 직관적이며, 불용어의 영향을 줄임
- 단점 : 의미 반영과 유사 의미어 구분 불가
BM25
- TF-IDF를 개선한 확률적 정보 검색
- 단어의 빈도와 문장의 길이를 고려하여 점수 계산
- 장점 : 단어 빈도 포화 처리, 높은 실제 검색 정확도
- 단점 : 의미 반영과 유사 의미어 구분 불가
2. Dense Retriever
- 임베딩 모델을 사용하여 문서와 쿼리를 의미 벡터에 매핑한다
- 이후 두 벡터 간의 거리를 기반으로 의미적 유사성을 계산한다
- 장점 : 문맥 이해 가능, 자연어 질의에 강함
- 단점 : 임베딩 모델의 품질과 가격에 의존적
Sparse vs Dense
1. 표현 방식 : Spares (키워드 기반) vs Dense (의미 기반)
2. 의미적 처리 능력
- Sparse는 키워드 기반이기 때문에 키워드가 일치하지 않은 이상 같은 의미의 단어여도 동일하게 판단하지 않음
- 하지만 Dense는 의미 기반이기 때문에 용어가 완전히 일치하지 않아도 의미적으로 관련/유사하면 관련 문서를 검색할 수 있음
3. 적용 범위
- 복잡한 질문이나 자연어 쿼리에서는 Dense가 유용
- 간단하고 명확한 키워드 검색에서는 Sparse가 더 유용
Vectorstore 기반 검색기
- 유사도 검색, MMR 과 같은 검색 매서드를 사용하여 문서 검색
MMR 알고리즘이란?
- 중복을 줄이고 다양성을 확보하기 위해 사용하는 알고리즘
- 질문과 관련성이 높으면서도 이미 선택된 문서들과는 겹치지 않게 다양성을 확보하는 방식
동작 원리 : 문서간의 관련성과 중복도를 고려해 문서를 순차적으로 선택해 나감
- 모든 문서의 쿼리와 유사도 계산
- 이미 선택돈 문서들과의 중복도 계산
- 두 값을 적절히 조합하여 점수를 만든 후 그 점수가 높은 순대로 문서 선택
중복된 문서는 제거하고, 질문과 관련성이 높은 다른 관점의 문서들을 반환할 수 있다
즉, 검색의 다양성을 확보해 더 풍부하고 정확한 답변을 생성하도록 돕는다
문맥 압축 검색기 (contextual compression retriever)
- 대규모 문서 내에서 질문과 관련된 정보만 압축하여 반환하는 검색기
- 이는 비관련 텍스트로 인한 할루시네이션, 토큰 낭비를 줄이기 위해 사용됨
- Base Retriever가 반환한 문서중에서 핵심만 추출
- LLM 또는 임베딩 모델을 이용해 문맥 압축 수행
- LLM 기반 압축 : 높은 정확도, 높은 비용
- 임베딩 기반 압축 : 낮은 비용, 낮은 문맥 보존력
- 상황에 따라 성능 vs 비용
앙상블 검색기 (ensemble retriever)
- 여러 검색기를 결합하여 더 강력한 검색 결과를 제공하는 방법
- 다양한 검색 알고리즘의 장점을 활용하여 단일 알고리즘보다 더 나은 성능을 달성할 수 있다
- 여러 검색기 통합 : 다양한 유형의 검색기를 입력으로 받아 결과를 결합
- 결과 재순위화 : rrf 알고리즘을 통해 결과 재순위함
- 하이브리드 검색 : 비슷한 기능을 가진 retriever보다는 다른 기능을 가진 retriever 해보는게 좋다
긴 문맥 재정렬
- LLM은 문서의 처음과 끝 부분에 집중하는 경향이 있음
- 따라서 긴 문서를 입력할때는 중요도 기반으로 재배치하여 모델의 주의 집중도를 최적화하는 전략을 사용할 수 있다
- 중요 문서 : 하단 배치
- 중간 중요도 문서 : 상단 배치
- 덜 중요한 문서 : 중간 배치
상위 문서 검색기(Parent Document Retriever)
문서를 작은 단위(청크)로 나누면 아무리 overlap을 해도 의미 손실이 발생할 수 있다
Parent Document Retriever는 이를 보완하기 위해 다음을 수행한다
1. 문서를 여러 청크로 분할
2. 검색 시 청크 단위로 탐색
3. 선택딘 청크의 부모 문서를 함께 반환하여 문맥 복원
이때 부모 문서는 작은 문서의 원본 문서, 전체 문서일 수도 있고 문서의 일부(비교적 더 큰 문서)일수도 있음
다중 쿼리 검색 (MultiQuery Retriever)
- 사용자 질문을 통해 llm을 통해 여러개의 질문을 만들어서 검색을 통해 답변을 생성
- 사용자가 넣는 질문은 그렇게 친절하지 않다. 따라서 llm으로 만들어낸 성능이 더 좋을 수 도 있다
다중 벡터저장소 검색기(MultiVector Retriever)
- 벡터 스토어를 여러개 사용하는 것이 아니라
- vectorstore와 doc store를 함께 사용하는 것을 말한다
- 문서를 여러 벡터로 저장하고 관리할 수 있어, 정보 검색의 정확도와 효율성을 대폭 향상시킬 수 있다
1. 작은 청크 생성
- 문서를 더 작은 단위로 나눈 후 각 청크에 대해 별도의 임베딩을 생성
- 이방식을 사용하면 문서의 특정 부분에 좀 더 세심한 주의를 기울일 수 있다.
- 이때 전체 문서에서 작은 부분만 가져와서 사용할것인지 아니면
- 작은 문서의 전체 문서를 가져와서 쓸것인지 아니면 둘다 사용할것인지를 정할 수 있다
2. 요약 임베딩
- 각 문서의 요약을 생성하고 이 요약을 임베딩으로 만든다.
- 요약 임베딩은 문서의 핵심 내용을 신속하게 파악하는데 도움이 된다
3. 가설 질문 활용
- 해당 문서에 대해 어떤 질문들이 들어올지 미리 저장하여 이를 임베딩한다.
- 특정 주제나 내용에 대해 깊이 있는 탐색을 원활때 이 방법이 유용하다
- 가설 질문은 문서의 내용을 다양한 관점에서 접근하게 해준다
4. 수동 추가 방식
- 사용자가 문색 검색시 고려해야할 특정 질문이나 아니면 쿼리를 추가할 수 있다.
- 이 방법을 통해 사용자는 검색 과정에서 보다 세밀한 제어를 진행할 수 있다.
셀프 쿼리(SelfQueryRetriever)
- LLM이 스스로 질의를 구조화하고 메타데이터 필터를 생성하는 검색기이다
- 자연어 질의를 분석해 문서 메타데이터 기반을 추출하고 이를 벡터 검색과 결합하여 보다 정교한 결과를 반환한다
- 즉, 단순 의미를 넘어 필터 기반 검색이 가능하다
시간 가중 벡터저장소 리트리버(TimeWeightedVectorStoreRetriever)

- 의미론적 유사성과 시간에 따른 감쇠를 결합해 사용하는 검색 도구
- 문서 또는 데이터의 신선함과 관련된성을 모두 고려하여 결과를 제공
- 문서의 timestamp를 기준으로 시간이 지날수록 점수를 낮추면
- 최근 생성된 문서를 더 높은 우선 점수로 반환한다
'개발공부 > RAG' 카테고리의 다른 글
| 밀도가 높은 문서 요약 방법 (0) | 2025.11.03 |
|---|---|
| ReRanker (0) | 2025.10.31 |
| VectorDB (0) | 2025.10.13 |
| Embedding (임베딩) (0) | 2025.10.10 |
| Text Splitter (텍스트 분할) (0) | 2025.09.28 |