"RAG 핵심 학습 (18/26) — Query Rewrite와 Expansion: HyDE / Step-back / Multi-query"
사용자 질문은 항상 검색 엔진이 좋아하는 형태로 들어오지 않는다. Rewrite는 질문을 더 잘 찾히는 형태로 바꾸는 단계다.
사용자가 던지는 질문은 짧고 모호하고 생략이 많다. 특히 검색용으로 학습된 임베딩 모델은 "검색 친화적 질문"에서 더 잘 동작할 때가 많다. Query Rewrite는 원래 질문을 버리는 것이 아니라, 원래 의도를 보존한 채 검색에 유리한 형태로 바꾸는 단계다. 이번 글은 HyDE, Step-back, Multi-query, 그리고 model-aware query formatting을 함께 정리한다.
0. Prerequisites
- 17편 query classification
- 12편 hybrid search
- 3편 ingestion 설계의 model-aware schema
1. 학습 목표
- query rewrite가 왜 필요한지 설명한다.
- HyDE, Step-back, Multi-query의 차이를 구분한다.
- model-aware query formatting의 의미를 이해한다.
- rewrite가 항상 좋은 것은 아니라는 점을 안다.
2. 핵심 요약
Query Rewrite는 사용자의 질문을 검색에 더 잘 맞는 형태로 바꾸는 단계다. HyDE는 가상의 답변 문서를 먼저 만들고 그 문서로 검색해 dense retrieval을 돕고, Step-back은 질문을 한 단계 추상화해 더 넓은 개념 문서를 회수하게 돕는다. Multi-query는 동의어, 표현 차이, 관점 차이를 여러 질의로 확장한다. 여기에 더해 model-aware formatting은 임베딩 모델이 학습된 query 형식에 맞춰 질문을 다듬는다. 다만 rewrite가 원 질문 의도를 바꿔 버리면 오히려 성능이 악화된다.
3. 직관 — 왜 원 질문 그대로는 놓치는가
질문: "환율 적용 기준이 뭐야?"
문서에는 "통화 환산 원칙", "FX conversion rule", "회계 보고 환산 기준"처럼 다양한 표현이 있을 수 있다. 원 질문 그대로는 일부 문서를 놓친다. rewrite는 질문을 이렇게 바꿀 수 있다.
- "회계 보고에서 환율 적용 기준은 무엇인가?"
- "통화 환산 원칙과 적용 기준"
- "FX conversion rule for quarterly reporting"
즉 rewrite는 의도를 유지하면서 검색 표면을 넓히는 작업이다.
4. 정의 — 대표 query rewrite 패턴
| 패턴 | 정의 |
|---|---|
| HyDE | hypothetical document 생성 후 그 문서 임베딩으로 검색 |
| Step-back | 구체 질문을 더 상위 개념 질문으로 추상화 |
| Multi-query | 여러 표현 변형 질의를 병렬 생성 |
| Query Expansion | 동의어, 약어, 관련 개념 추가 |
| Model-aware Formatting | 임베딩 모델이 좋아하는 입력 형식으로 정리 |
5. 메커니즘 — 질문을 바꾸는 네 가지 이유
질문 rewrite가 필요한 이유는 보통 네 가지다.
- 사용자가 너무 짧게 물었다
- 문서와 질문의 표현이 다르다
- 임베딩 모델이 특정 query 형식에 더 잘 반응한다
- 질문이 지나치게 구체적이어서 상위 개념 문서를 놓친다
따라서 rewrite는 "장식"이 아니라 retrieval failure를 줄이기 위한 보정 단계다.
6. 원리 워크스루 — HyDE, Step-back, Multi-query
6.1 HyDE
def hyde_query(query, llm):
prompt = f"다음 질문에 답하는 짧은 문서를 써라: {query}"
hypothetical_doc = llm.generate(prompt)
return hypothetical_doc
search_text = hyde_query(query, llm)
hits = dense_retriever.search(search_text, k=20)
HyDE는 질문을 직접 임베딩하지 않고, "정답처럼 생긴 문서"를 만들어 그 문서 임베딩으로 검색한다.
6.2 Step-back
step_back_query = "회계 보고에서 통화 환산 원칙은 무엇인가?"
hits = retriever.search(step_back_query, k=20)
구체적 표현을 한 단계 위 개념으로 올려 더 넓은 배경 문서를 찾는다.
6.3 Multi-query
queries = [
query,
"회계 보고 환산 기준은 무엇인가?",
"FX conversion rule for quarterly reporting",
]
all_hits = [retriever.search(q, k=10) for q in queries]
각 질의 결과를 fusion하면 recall이 높아질 수 있다.
자기 설명: rewrite가 "원 질문을 버리는 것"이 아닌 이유를 한 문장으로 답해 보라.
7. 변형과 사례
7.1 HyDE
무엇이 바뀌는가
질문 대신 가상의 답변 문서를 검색 입력으로 쓴다.
왜 등장했는가
dense retrieval이 답변 문서의 의미 공간에 더 잘 반응할 수 있기 때문이다.
무엇이 가능해졌는가
짧고 모호한 질문에서도 의미 기반 회수를 강화할 수 있다.
한계와 다음 단계
가상 문서가 엉뚱하면 노이즈가 커진다.
7.2 Step-back
구체 질문을 상위 원리나 일반 개념으로 바꾼다. 특히 절차 뒤의 원칙 문서를 찾는 데 유용하다.
7.3 Multi-query
서로 다른 표현 변형을 병렬로 만들어 recall을 높인다. 다만 비용과 중복 후보가 늘어난다.
7.4 Model-aware query formatting
instruction-tuned embedding 모델은 "query:" 접두나 완전한 질문 문장 형식에서 더 잘 동작할 수 있다. 이는 3편의 model-aware ingestion과 대응되는 개념이다.
8. 한계와 실패 양상
8.1 rewrite가 의도를 바꿔 버릴 수 있다
"최신"이 중요한 질문을 일반 개념 질문으로 바꾸면 정답에서 멀어진다.
8.2 비용과 latency가 늘어난다
LLM을 한 번 더 부르면 전체 검색 지연이 커진다. 따라서 모든 질문에 일괄 적용하기보다 17편 분류 결과와 연결하는 편이 낫다.
8.3 multi-query는 노이즈도 늘린다
여러 질의를 만들면 recall이 늘 수 있지만, 관계없는 후보도 함께 늘어난다. 그래서 fusion과 reranker가 다시 중요해진다.
8.4 다음 단계 — 어느 문서군으로 보낼지를 정해야 한다
질문을 잘 다듬었더라도, 여전히 어느 collection과 retriever로 보낼지는 남아 있다. 그게 19편 query routing이다.
8.5 입문자가 자주 빠지는 함정 5선
| # | 함정 | 증상 | 빠른 점검 |
|---|---|---|---|
| 1 | 모든 질문에 rewrite 적용 | latency 증가 | 질문 유형별 선택 적용 |
| 2 | rewrite 품질 검증 없음 | 의도 변형 | 원 질문과 의미 보존 확인 |
| 3 | multi-query만 늘림 | 노이즈 증가 | fusion 전후 recall 비교 |
| 4 | model-aware 형식 무시 | 임베딩 효율 저하 | 모델 카드 입력 형식 확인 |
| 5 | 최신성 질의를 추상화 | 정답 이탈 | time-sensitive 질문 예외 처리 |
9. 정리된 결론 — 보지 않고 답해 보라
Q1. query rewrite의 핵심 목적은?
정답 사용자 의도를 보존하면서 검색 친화적으로 질문을 바꾸는 것이다.
왜 질문과 문서 표현이 다를 때 retrieval failure를 줄이기 위해서다.
Q2. HyDE는 어떻게 작동하는가?
정답 가상의 답변 문서를 만든 뒤 그 문서로 검색한다.
왜 dense retrieval이 답변형 문서 표현에서 더 잘 작동할 수 있기 때문이다.
Q3. Step-back은 언제 유용한가?
정답 지나치게 구체적인 질문에서 상위 원리 문서를 찾고 싶을 때다.
왜 질문을 더 추상적인 개념으로 올려 검색 범위를 재구성하기 때문이다.
Q4. rewrite가 항상 좋은 것은 아닌 이유는?
정답 질문 의도를 바꿔 버리거나 latency를 늘릴 수 있기 때문이다.
왜 rewrite도 또 다른 모델 판단이기 때문이다.
Cheat Sheet — 이 편의 식·정의 1페이지
정의 - HyDE: hypothetical document embedding - Step-back: 상위 개념으로 질문 추상화 - Multi-query: 다중 표현 질의 확장
최소 코드
queries = [query, rewrite_1, rewrite_2]
hits = [retriever.search(q, k=10) for q in queries]
언제 무엇을 | 상황 | 선택 | |---|---| | 짧고 모호한 질문 | HyDE | | 상위 원리 문서 필요 | Step-back | | 표현 다양성 큼 | Multi-query | | instruction-tuned embedding | model-aware formatting |
참고 자료
1차 자료
- Gao, L. et al. Precise Zero-Shot Dense Retrieval without Relevance Labels. 2022.
- Step-back prompting references.
보조 자료
- 사용자 노트 15장 query rewrite
- 사용자 노트 35-3절 query formatting
다음 편으로 이어지는 흐름
질문을 더 잘 찾히는 형태로 바꿨다면, 이제 남는 질문은 "어느 retriever와 어느 collection으로 보낼 것인가"다. 다음 19편은 query routing을 다룬다.
댓글
댓글 쓰기