개발/용어 사전

Query Rewrite는 검색을 어떻게 바꾸는가

cedis 2026. 6. 19. 01:34
검색 조합 심화

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는 사용자의 질문을 바꿔버립니다.

참고한 문서