질의 재작성과 HyDE
검색 재현율 향상
질의 재작성과 HyDE은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
질의가 약한 고리인 이유
검색 품질은 질의에 의해 제한됩니다. 가공되지 않은 사용자 질의는 짧거나 모호하고, 대명사가 많거나, 문서와 다른 표현으로 작성되는 경우가 많습니다. 질의 변환은 검색 전에 질의를 다시 구성하여 재현율과 정밀도를 높입니다.
이는 단순한 RAG를 개선하는 가장 저렴하면서도 효과가 큰 방법 중 하나입니다. 질의를 개선하면 모든 후속 단계가 혜택을 얻습니다.
def transform_query(raw, history):
# Resolve references, expand, decompose, or hypothesize
# BEFORE embedding and retrieving.
return rewrite(raw, history)질의 재작성
가장 간단한 변환은 LLM이 사용자 질의를 더 명확하고 독립적이며 검색에 적합한 형태로 다시 작성하는 것입니다. 오타를 수정하고, 약어를 풀어 쓰며, 대화에서 불필요한 내용을 제거합니다.
이는 다중 턴 대화에서 특히 중요합니다. 최신 메시지는 문맥이 없으면 의미를 파악할 수 없기 때문입니다(두 번째 것은 어떠세요?).
def rewrite_query(raw):
prompt = (
'Rewrite the user question into a clear, standalone search '
'query optimized for document retrieval. Keep key entities.\n'
'Question: ' + raw
)
return llm(prompt, temperature=0).strip()대화 내용 압축
채팅 RAG에서는 대화와 새 발화를 하나의 독립적인 질문으로 condense하십시오. 이렇게 하지 않으면 대명사와 생략 표현 때문에 임베딩이 의미를 잃고 검색이 무너집니다.
이전 발화도 전달하여 재작성기가 ‘그것’, ‘저것’, ‘이전 것’을 검색기가 일치시킬 수 있는 명시적인 개체로 해석하도록 하십시오.
def condense(history, follow_up):
prompt = (
'Given the conversation, rewrite the follow-up as a standalone '
'question with all references resolved.\nConversation:\n' +
render(history) + '\nFollow-up: ' + follow_up
)
return llm(prompt, temperature=0).strip()질의 확장
확장은 동의어, 관련 용어 또는 다른 표현을 생성하여 어휘적·의미적 범위를 넓힙니다. 어휘 불일치에 대응하는 방법입니다. 문서에는 무효화한다고 쓰여 있지만 사용자는 취소한다고 말하는 경우를 예로 들 수 있습니다.
검색을 위해 확장한 다음 그 결과의 합집합으로 검색하십시오. 확장된 표현을 사용자에게 보여 주지는 마십시오. 지나치게 확장하면 주제에서 벗어난 결과가 포함될 수 있으므로 주의하십시오.
def expand(query, n=3):
prompt = (
'List ' + str(n) + ' alternative phrasings of this query using '
'synonyms and domain terms, one per line.\n' + query
)
variants = parse_lines(llm(prompt, temperature=0.5))
return [query] + variants다중 질의 검색
서로 다른 여러 재표현을 생성하고 각각에 대해 검색한 다음 결과 목록을 결합하십시오(역순위 융합). 표현 방식이 다르면 서로 다른 관련 청크가 드러나며, 융합은 각 결과의 장점을 합쳐 재현율을 안정화합니다.
이 방법은 추가 검색 호출을 감수하는 대신 특정 하나의 잘못된 표현에 대한 취약성을 줄입니다.
def multi_query(raw, n=4):
queries = expand(raw, n)
rankings = [dense_retrieve(q, 30) for q in queries]
fused = rrf(*rankings)
return dedup(fused)질의 분해
복잡한 다중 홉 질문은 분해하여 하위 질문별로 따로 검색한 다음 결과를 결합해야 합니다. ‘X를 인수한 회사의 CEO 중 누가 누구보다 나이가 많은가?’와 같은 질문은 한 번의 검색으로 답할 수 없습니다.
하위 질문별로 분해하고 검색한 다음, 생성기가 수집된 증거를 결합하게 하십시오.
def decompose_and_retrieve(question):
subs = parse_lines(llm(
'Break this into independent sub-questions, one per line.\n' +
question, temperature=0))
evidence = {s: rerank(s, dense_retrieve(s, 30))[:3] for s in subs}
return evidence # generator synthesizes the final answerHyDE: 핵심 아이디어
HyDE(가설 문서 임베딩, Gao 외, 2022)는 문제를 뒤집습니다. 짧은 질의를 임베딩하는 대신 LLM에 가상의 answer 문서를 생성하게 한 다음, 그 문서를 임베딩하여 이를 사용해 검색합니다.
가상의 문서는 실제 문서와 같은 표현 방식을 사용하므로, 그 임베딩이 실제 answer에 더 가까운 위치에 놓입니다. 이를 통해 질의와 문서 사이의 불일치를 해결합니다.
def hyde(query):
hypo = llm(
'Write a short passage that would answer this question, as if '
'from a reference document.\nQuestion: ' + query,
temperature=0.3)
return dense_retrieve_by_vector(embed(hypo), k=30) # embed the answerHyDE가 재현율을 높이는 이유
질문과 answer는 표현 방식이 다르지만, 질문과 가짜이면서 그럴듯한 answer는 실제 answer와 비슷하게 표현됩니다. HyDE는 LLM의 생성적 사전 지식을 활용해 이 간극을 메웁니다. 가상의 문서에 사실 오류가 있더라도 가능합니다.
가상의 문서가 정확한지는 크게 중요하지 않습니다. 임베딩 공간에서 실제 문서와 가까운 위치에 놓일 수 있도록 올바른 어휘와 구조만 갖추면 됩니다.
# Robustness: average several hypothetical docs to reduce variance
def hyde_avg(query, n=3):
vecs = [embed(llm(HYDE_PROMPT + query, temperature=0.5))
for _ in range(n)]
centroid = sum(vecs) / n
return dense_retrieve_by_vector(centroid, 30)HyDE의 장단점과 실패 방식
HyDE는 검색 전에 LLM 생성을 추가하므로 지연 시간과 비용이 증가합니다. 또한 주제에서 벗어난 가상 문서를 환각으로 만들어낼 수 있어, 모델이 잘 알지 못하는 틈새 질의나 분포 외 질의에서는 재현율을 떨어뜨릴 수 있습니다.
HyDE 벡터 검색을 원 질의 검색과 융합하여 완화하십시오. 그러면 잘못된 가상 문서 하나가 재현율을 완전히 무너뜨릴 수 없습니다.
def hyde_hybrid(query):
a = dense_retrieve_by_vector(embed(hyde_doc(query)), 30)
b = dense_retrieve(query, 30) # raw-query fallback
return dedup(rrf(a, b)) # robust to bad hypotheticals기법 선택과 결합
이러한 변환은 서로 보완적입니다. 채팅에는 대화 내용 압축을, 어휘 차이에는 확장/다중 질의를, 다중 홉 질문에는 분해를, 질문과 문서의 표현 방식이 다를 때는 HyDE를 사용하십시오. 많은 운영 시스템은 condense를 실행한 다음 HyDE를 적용하고, 원 질의와 결합한 후 재순위화합니다.
변환을 하나 추가할 때마다 LLM 호출 비용이 발생하므로, 항상 모두 실행하지 말고 질의 유형에 따라 적용 여부를 결정하십시오.
def route_transform(query, history, qtype):
q = condense(history, query) if history else query
if qtype == 'multi_hop': return decompose_and_retrieve(q)
if qtype == 'mismatch': return hyde_hybrid(q)
if qtype == 'vocab_gap': return multi_query(q)
return dense_retrieve(q, 30)변환 평가
각 변환을 누출이 없는 집합에서 원시 질의와 비교하여 검색 재현율@k의 향상 폭과 최종 답변 정확도로 측정하십시오. 추가된 지연 시간과 LLM 비용을 추적하여 비용 대비 효과가 있는 변환만 유지하십시오.
주의하십시오. 재현율은 높이지만 방해 항목을 추가하는 변환은 재순위 지정 및 압축과 함께 사용하지 않으면 답변 정확도를 낮출 수 있습니다.
def eval_transform(name, fn, eval_set):
return {
'recall@10': recall_at_k(eval_set, retriever=fn, k=10),
'answer_acc': answer_accuracy(eval_set, retriever=fn),
'extra_latency_ms': transform_latency(fn),
}빠른 확인
불완전한 가상 답변에도 불구하고 HyDE가 작동하는 이유를 생각해 보십시오.
복습
핵심 요점:
- 검색은 질의에 의해 제한되므로, 질의를 변환하는 것은 저렴하면서도 효과가 큰 RAG 개선 방법입니다.
- 재작성/응축은 대화 질의를 독립적으로 만들고, 확장과 다중 질의는 어휘 공백을 해결합니다.
- 분해는 하위 질문별로 검색하여 다단계 질문을 처리합니다.
- HyDE는 가상 답변을 임베딩하여 질문과 문서의 문체 불일치를 해소합니다. 가상 답변이 정확할 필요는 없습니다.
- 질의 유형별로 변환을 결합하고, 견고성을 위해 원시 질의와 융합하며, 재현율, 답변 정확도, 지연 시간 및 비용을 평가하십시오.
자주 묻는 질문
“질의 재작성과 HyDE” 강의는 무료인가요?
네 — “질의 재작성과 HyDE” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
“질의 재작성과 HyDE”에서 뭘 배우나요?
검색 재현율 향상 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“질의 재작성과 HyDE” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 단순한 RAG를 넘어서
- 검색된 청크 재순위화
- 컨텍스트 압축
- 질의 재작성과 HyDE