53일차 자연어처리7 리랭킹,HyDE

차지예·2025년 8월 3일

생성AI

목록 보기
47/56
post-thumbnail

RAG 성능을 올리는 기술 정리


✅ 개요

RAG는 문서를 검색한 후, 검색된 문서들을 기반으로 LLM이 최종 응답을 생성하는 구조입니다.
이 구조의 성능을 개선하는 대표적 기법 3가지는 다음과 같습니다:

1. LLM 기반 리랭킹 (Re-ranking with LLM)
2. 크로스 인코더 기반 리랭킹
3. HyDE (Hypothetical Document Embedding)


🔹 1. LLM 기반의 리랭킹

📌 개념

임베딩 기반 검색은 의미 유사성만 고려하므로 정확도가 떨어질 수 있습니다.
→ LLM이 각 문서의 **의미적 관련성**을 판단하여 **정밀하게 재정렬**합니다.

🛠️ 작동 방식

# 벡터 검색
vector_results = vector_store.similarity_search(query, k=4)

# LLM을 통해 각 문서의 관련성 점수 계산
score = llm.invoke(prompt)  # prompt에는 질의 + 문서 포함

# 점수 기준으로 상위 2개 문서 선택
ranked_docs = sorted(scored_docs, key=lambda x: x[1], reverse=True)[:2]

⚠️ 유의사항

  • 문서 수 × 평가 횟수만큼 LLM 호출 → 비용 증가
  • 정확도는 유의미하게 향상됨

🔹 2. 크로스 인코더 기반 리랭킹

📌 개념

  • Bi-Encoder: 질문과 문서를 각각 임베딩 → 빠르지만 정확도 낮음
  • Cross-Encoder: 질문 + 문서를 한 쌍으로 넣어 정밀 평가 → 정확도 높음

🛠️ 구현 예시

# 기본 벡터 검색
basic_retriever = vector_store.as_retriever(search_kwargs={"k": 4})

# 크로스 인코더 모델
cross_encoder = HuggingFaceCrossEncoder("BAAI/bge-reranker-v2-m3")
reranker = CrossEncoderReranker(model=cross_encoder, top_n=2)

# 리랭킹이 포함된 검색기
rerank_retriever = ContextualCompressionRetriever(
    base_compressor=reranker,
    base_retriever=basic_retriever
)

✅ 특징

  • 질문과 문서 관계를 동시에 고려 → 의미적 이해 뛰어남
  • 문서 수 만큼 inference 발생 → 실시간 시스템엔 부적합할 수 있음

🔹 3. HyDE (Hypothetical Document Embedding)

📌 개념

질문을 바로 검색에 사용하지 않고,
질문에 대한 LLM의 가상 응답(문서)를 생성해 이를 검색 임베딩으로 사용

📈 장점

  • 질의 확장성: 단순한 질문도 LLM의 답변은 더 풍부한 문맥 제공
  • 검색 정확도 향상: 다양한 표현을 더 잘 검색

⚠️ 단점

  • LLM 호출 1회 추가
  • 프롬프트 설계와 LLM 품질에 따라 성능 차이 발생

🛠️ 예시 코드

# LLM을 통해 가상의 문서 생성
hypothetical_doc = llm.invoke(f"'{query}' 에 대한 설명 문서를 작성해줘")

# 해당 문서를 벡터화하여 검색
query_vector = embed_model.embed_query(hypothetical_doc)
results = vector_store.similarity_search_by_vector(query_vector)

📊 비교 요약

기법정확도속도LLM 호출
기본 RAG보통빠름1회
LLM 리랭킹높음느림문서 수 + 1회
크로스 인코더 리랭킹매우 높음느림문서 수만큼
HyDE높음중간1회 추가

✅ 결론

  • 빠른 속도가 중요하다면 → 기본 RAG
  • 정확한 결과가 필요하다면 → LLM 리랭킹 or 크로스 인코더
  • 질문이 모호하거나 짧을 경우 → HyDE가 유리

0개의 댓글