1. 검색의 두 가지 방식
키워드 검색 (BM25)
"정확한 단어"를 찾는 방식
- "Java Spring 오류" 검색 → Java, Spring, 오류 단어가 포함된 문서를 찾음
- "스프링 에러" 라고 쓰면 못 찾을 수 있음
벡터 검색 (Semantic Search)
"의미"를 찾는 방식
- 문서를 숫자 벡터로 변환해서 저장
- "스프링 에러", "Spring 오류", "Java 예외" 다 비슷한 의미로 인식
- 정확한 단어 매칭은 약함
2. Hybrid Search
두 방식을 같이 사용
키워드 검색 결과 → [문서A 1위, 문서B 2위, 문서C 5위]
벡터 검색 결과 → [문서C 1위, 문서A 3위, 문서D 2위]
↓
이 두 결과를 어떻게 합칠까?
3. RRF (Reciprocal Rank Fusion)
두 결과를 합치는 공식
각 문서의 순위를 점수로 변환해서 합산
점수 = 1/(순위 + 60)
문서A: 키워드 1위 → 1/61 = 0.0164
벡터 3위 → 1/63 = 0.0159
합계 = 0.0323 ← 최종 1위
문서C: 키워드 5위 → 1/65 = 0.0154
벡터 1위 → 1/61 = 0.0164
합계 = 0.0318 ← 최종 2위
4. Reranker
Hybrid Search가 뽑아온 후보들을 다시 한번 정밀 평가
Hybrid Search 결과 (상위 20개)
↓
Reranker 모델이 질문과 각 문서를 쌍으로 비교
↓
진짜 관련성 높은 순서로 재정렬 (상위 5개 선택)
벡터 검색은 빠르지만 부정확할 수 있음.
Reranker는 느리지만 정확도가 높음.
>> "빠른 검색으로 후보 추리기 → 정확한 reranker로 최종 정렬" 패텬 사용
5. 질의 재작성 (Query Rewriting)
사용자 질문을 검색에 더 유리하게 변환
사용자 입력: "저번에 말한 그 오류 어떻게 고쳐?"
↓
LLM이 재작성: "Java Spring NullPointerException 해결 방법"
↓
이걸로 검색하면 훨씬 잘 찾아짐
또는 질문 하나를 여러 개로 분해
"Pub/Sub 메시지 중복이랑 ack deadline 설정법 알려줘"
↓
질문1: "GCP Pub/Sub 메시지 중복 처리"
질문2: "Pub/Sub ack deadline 설정 방법"
각각 검색 후 합치면 커버리지가 넓어짐
전체 파이프라인 요약
사용자 질문
↓
[질의 재작성] → 검색에 최적화된 쿼리로 변환
↓
[Hybrid Search] → 키워드 + 벡터 검색 동시 실행
↓
[RRF] → 두 결과를 하나로 합산 정렬
↓
[Reranker] → 상위 후보 정밀 재정렬
↓
최종 문서 → LLM에 전달 → 답변 생성
각 단계가 이전 단계의 약점을 보완하는 구조
'AI' 카테고리의 다른 글
| [AI] 벡터 임베딩 (0) | 2025.03.17 |
|---|