15장 · 검색 품질 개선왜 검색 품질을 따져야 하는가 — 검색이 못 찾으면 답도 틀린다키워드 검색과 BM25 — 단어로 찾는 검색을 다시 꺼낸다하이브리드 검색 — 두 검색의 결과를 합친다쿼리 재작성과 리랭킹 — 질문을 고치고, 순서를 다시 매긴다따라하기 — 검색 네 단계 비교정리와 체크리스트실습문제와 해답
15장. 검색 품질 개선
정리와 체크리스트
15장에서 배운 것
- 검색 품질이 상한이다 — 검색이 정답 청크를 가져오지 못하면 생성 단계는 만회할 수 없습니다.
- BM25 — 단어가 겹치는 정도로 점수를 매기는 키워드 검색. 점수는 클수록 좋고, 겹치지 않으면 0건입니다.
- 하이브리드 검색 — 벡터 검색과 키워드 검색의 결과를 번갈아 담아 후보를 만듭니다.
- RRF — 검색마다 순위를 점수로 바꿔 더하는 순위 융합 방법. 번갈아 담기는 그 단순형입니다.
- 쿼리 재작성 — 고객의 말을 문서의 말로 바꿔 검색합니다. LLM 1번.
- 리랭킹 — 후보를 LLM이 읽고 순서를 다시 매깁니다. LLM 1번.
- 폴백 — 리랭킹의 답이 모자라거나 형식에 맞지 않으면 원래 순서로 채웁니다.
한눈에 보는 핵심
rewritten = rewrite_query(question) # ① 질문을 문서의 말로 (LLM)
candidates = hybrid_search(rewritten, k=6) # ② 넓게 모으기 (임베딩 + BM25)
final = llm_rerank(question, candidates, top_n=3) # ③ 좁게 고르기 (LLM)
| 방법 | 고치는 것 | 조심할 것 |
|---|---|---|
| 키워드 검색 | 드문 단어, 정확한 글자 | 공백으로만 자르면 조사 때문에 놓친다 |
| 하이브리드 | 한쪽 검색이 놓친 청크 | 양쪽 결과가 모두 앞자리에 오도록 번갈아 담는다 |
| 쿼리 재작성 | 구어체와 문서 용어의 거리 | 검색에만 쓴다. 답변에는 원래 질문을 쓴다 |
| 리랭킹 | 정답 청크의 순위 | 번호가 모자라면 원래 순서로 채워 개수를 맞춘다 |
| 누가 한 일인가 | 내용 |
|---|---|
| LLM | 질문을 문서의 말로 바꿨고, 후보를 읽고 번호를 골랐습니다 |
| 임베딩 모델 + Chroma, BM25 | 뜻과 단어로 후보를 찾았습니다 |
| 우리(개발자) | 후보를 몇 개 모을지(6), 몇 개 남길지(3), 어느 단계에 원래 질문을 넣고 어느 단계에 재작성한 문장을 넣을지, 두 검색을 어떻게 합칠지를 정했습니다 |
이번 장의 실습 전에 확인할 것
이 장의 파일도 chroma_db/가 있어야 벡터 검색이 동작합니다. 13장의 lesson13_rag_embedding.py를 먼저 실행해 두어야 합니다(없으면 안내를 찍고 멈춥니다). 그리고 BM25는 12장의 load_policy_chunks()로 만듭니다. 12장의 청킹을 바꿨다면 13장을 다시 실행해 두 색인이 같은 청크를 가리키게 합니다.
체크리스트
- [ ] "광고랑 다른 게 왔어요"에 14장의 함수가 신청 기간을 안내하지 못한 원인이 어느 단계에 있는지 설명할 수 있다.
- [ ] BM25가 점수를 매기는 두 가지 생각을 말할 수 있다.
- [ ] 벡터 검색과 키워드 검색이 각각 강한 곳과 약한 곳을 예를 들어 설명할 수 있다.
- [ ] "하루페이"를 키워드로 검색하면 0건이 나오는 이유를 설명할 수 있다.
- [ ]
hybrid_search가 두 결과를 번갈아 담는 이유를 설명할 수 있다. - [ ] RRF가 순위를 어떻게 점수로 바꾸는지, 번갈아 담기와 무엇이 다른지 말할 수 있다.
- [ ] 재작성한 문장을 답변에 쓰지 않고 검색에만 쓰는 이유를 설명할 수 있다.
- [ ] 모델이 번호를 두 개만 돌려줘도
llm_rerank(..., top_n=3)이 세 개를 돌려주는 이유를 코드로 설명할 수 있다. - [ ] 세 방법을 모두 쓰면 질문 하나에 LLM을 몇 번 부르는지 말할 수 있다.
- [ ] 검색 함수가 본문에 출처 꼬리표를 붙여 돌려주는 이유를 설명할 수 있다.
- [ ] 1위 거리가 가깝다고 해서 문서에 답이 있다는 뜻은 아님을 실제 거리 값으로 설명할 수 있다.
한 줄 핵심
검색을 고쳤다는 말은 "정답 청크가 몇 위에서 몇 위로 갔다"로 합니다. 넓게 모으고, 읽고 좁게 고릅니다.