검색 조합 심화
Query Rewrite는 사용자의 질문을 검색에 더 알맞은 형태로 바꾸는 과정입니다. 원문 질문을 그대로 검색하지 않고, 검색 엔진이 이해하기 쉬운 표현으로 다시 쓰는 방식입니다.
잘 쓰면 검색 recall이 좋아지지만, 잘못 쓰면 사용자의 의도에서 벗어난 문서를 찾을 수도 있습니다.
Query Rewrite가 들어가는 위치
1단계
원 질문
사용자는 짧고 모호하게 질문할 수 있습니다.
2단계
질문 재작성
질문에 빠진 맥락을 보충하거나 검색어를 명확하게 만듭니다.
3단계
검색 실행
재작성된 질문으로 BM25, vector, hybrid search를 수행합니다.
4단계
결과 검증
원 질문과 검색 결과가 여전히 같은 의도를 향하는지 확인합니다.
자주 쓰이는 변형 방식
단순 재작성
짧거나 모호한 질문을 더 구체적인 검색 질의로 바꿉니다.
질문 분해
복합 질문을 여러 개의 작은 검색 질문으로 나눕니다.
Step-back 질문
너무 구체적인 질문에서 한 단계 일반화한 배경 질문을 만듭니다.
동의어 보강
사용자가 쓴 단어와 문서에 쓰인 단어가 다를 때 관련 표현을 함께 찾습니다.
유리한 점과 위험한 점
| 구분 | 효과 | 위험 |
|---|---|---|
| 짧은 질문 | 빠진 맥락을 보충 | 없는 의도를 만들어낼 수 있음 |
| 전문 용어 | 관련 용어와 약어를 확장 | 잘못된 분야로 확장될 수 있음 |
| 복합 질문 | 하위 질문별로 검색 가능 | 검색 결과가 흩어질 수 있음 |
| RAG 답변 | context 품질 개선 가능 | 원 질문과 다른 근거가 들어갈 수 있음 |
작은 실험: 질문을 확장했을 때 검색 결과가 바뀌는지 보기
아래 코드는 사용자의 원 질문을 관련 검색어로 확장한 뒤 검색 결과가 어떻게 바뀌는지 보여줍니다. 실제 서비스에서는 LLM이 rewrite를 만들 수 있지만, 여기서는 규칙 기반으로 흐름만 관찰합니다.
docs = [
"JWT 토큰 만료 시 재로그인 처리",
"로그인 화면 버튼 스타일 수정",
"세션 만료와 인증 실패 로그 분석",
]
query = "로그인이 자꾸 풀려요"
rewrite_rules = {
"로그인": ["로그인", "인증", "JWT", "세션"],
"풀려": ["만료", "실패", "재로그인"],
}
def rewrite(query):
expanded = query.split()
for key, words in rewrite_rules.items():
if key in query:
for word in words:
if word not in expanded:
expanded.append(word)
return " ".join(expanded)
def search(q):
terms = q.split()
scored = []
for doc in docs:
score = sum(1 for term in terms if term in doc)
scored.append((score, doc))
return sorted(scored, reverse=True)
rewritten = rewrite(query)
print("original query:", query)
for score, doc in search(query):
print(score, doc)
print()
print("rewritten query:", rewritten)
for score, doc in search(rewritten):
print(score, doc)
관찰할 것
- 원 질문만 검색했을 때 점수가 낮게 나오는 문서를 봅니다.
- 재작성 후 JWT, 세션, 만료 같은 단어가 검색에 반영되는지 봅니다.
- 확장어가 너무 많아지면 의도가 흐려질 수 있다는 점도 함께 봅니다.
예상 출력의 모양
original query: 로그인이 자꾸 풀려요
0 세션 만료와 인증 실패 로그 분석
0 로그인 화면 버튼 스타일 수정
0 JWT 토큰 만료 시 재로그인 처리
rewritten query: 로그인이 자꾸 풀려요 로그인 인증 JWT 세션 만료 실패 재로그인
4 세션 만료와 인증 실패 로그 분석
4 JWT 토큰 만료 시 재로그인 처리
1 로그인 화면 버튼 스타일 수정
실패를 줄이는 기준
- 재작성된 질문만 보지 말고 원 질문과 함께 저장합니다.
- 검색 결과가 원 질문에 답할 수 있는지 검증합니다.
- 민감한 업무나 법률·의료 영역에서는 query rewrite를 더 보수적으로 적용합니다.
- 질문 재작성 결과가 너무 길어지면 핵심 키워드가 흐려질 수 있습니다.
기억할 것
- Query Rewrite는 검색 전에 질문을 정리하는 단계입니다.
- 좋은 rewrite는 검색 의도를 또렷하게 만듭니다.
- 나쁜 rewrite는 사용자의 질문을 바꿔버립니다.