"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. 학습 목표

  1. query rewrite가 왜 필요한지 설명한다.
  2. HyDE, Step-back, Multi-query의 차이를 구분한다.
  3. model-aware query formatting의 의미를 이해한다.
  4. 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가 필요한 이유는 보통 네 가지다.

  1. 사용자가 너무 짧게 물었다
  2. 문서와 질문의 표현이 다르다
  3. 임베딩 모델이 특정 query 형식에 더 잘 반응한다
  4. 질문이 지나치게 구체적이어서 상위 개념 문서를 놓친다

따라서 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을 다룬다.

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"