본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

쿼리를 다듬는 기법: HyDE와 다중 쿼리

~20 min · hybrid, queries, advanced

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

쿼리도 시스템의 절반이야

많은 팀이 더 좋은 임베딩과 청킹처럼 문서 쪽만 최적화하고 쿼리는 잊어. 하지만 쿼리도 임베딩 모델이 인코딩하는 문자열이므로 짧고 모호하면 좋은 벡터가 나오기 어려워. 비교적 저렴한 두 기법만으로도 검색 품질을 예상보다 크게 바꿀 수 있어.

다중 쿼리 확장

LLM에 사용자 쿼리를 3–5가지 표현으로 다시 쓰게 해. 각 표현을 임베딩해 검색하고 RRF로 순위를 결합해. LLM 호출 한 번이 더 들지만, 짧거나 모호한 쿼리에서 재현율을 의미 있게 높일 수 있어.

HyDE(Hypothetical Document Embeddings)

질문 자체를 임베딩하는 대신 LLM에 그 질문에 대한 가상의 답을 쓰게 한 뒤, 그 답을 임베딩해 검색해. 답과 실제 문서는 어휘와 구조를 공유하지만 질문은 그렇지 않은 경우가 많아서 작동해. 쿼리는 짧고 문서는 길 때 특히 강해.

Code

다중 쿼리 확장·python
def expand_query(query: str, n: int = 4) -> list[str]:
    prompt = (
        f'Rewrite this query in {n} different ways that might appear in a knowledge base. '
        f'Output one rewrite per line, no numbering.\n\nQuery: {query}'
    )
    response = llm.complete(prompt)
    return [line.strip() for line in response.splitlines() if line.strip()][:n]

rewrites = expand_query('how do I cancel my plan')
rankings = [vector_search(r, k=20) for r in [query] + rewrites]
final = reciprocal_rank_fusion([[r['id'] for r in ranking] for ranking in rankings])
HyDE·python
def hyde(query: str) -> str:
    prompt = (
        f'Write a 3-sentence factual answer to this question, even if you have to invent details. '
        f'Style it like a knowledge-base article.\n\nQuestion: {query}'
    )
    return llm.complete(prompt)

hypothetical = hyde('how do I cancel my plan')
results = vector_search(hypothetical, k=10)   # 질문 아니라 가설적 답으로 검색

External links

Exercise

실제 사용자의 짧고 모호한 쿼리 열 개를 골라 각각 다중 쿼리 재작성 세 개와 HyDE 답 하나를 만들어. 원래 쿼리, 다중 쿼리와 RRF, HyDE의 상위 세 결과를 비교하고 어떤 쿼리에서 어떤 기법이 유리한지 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.