LLM Application/LangChain

LangChain – Advanced RAG, Post-Retrieval, Reranker

carrotweb 2026. 7. 30. 19:47
728x90
반응형

Reranker (리랭커)

벡터 스토어에서 검색된 문서(청크)가 사용자의 의도를 정확히 반영하지 못하거나 대화의 맥락을 놓칠 수 있기 때문에 사용자 질문과 관련이 높은 문서(청크)로 순위를 재정렬합니다. (프롬프트가 길어지면 중간에 위치한 중요한 정보를 LLM이 제대로 반영하지 못하는 ‘Lost in the Middle’ 현상이 발생할 위험이 있습니다. - https://arxiv.org/pdf/2307.03172)

 

 

  1. Retriever (검색) : 벡터 스토어에서 질문과 관련성(유사도 계산) 있는 문서(청크)들을 빠르게 추출합니다.
  2. Reranker (순위 재정렬) : 문서(청크)들을 분석(의미적 분석)하여 순위를 조정합니다.
  3. Compression (압축) : 전체 문서(청크)를 LLM에 전달하면 비용이 많이 드는 문제점을 해결하기 위해서 압축합니다.

장점

정확도 증가 : 질문과 검색된 문서(청크)를 의미적 관계로 분석하여 더 적합한 문서(청크)로 재정렬하여 더 정확한 결과를 제공합니다.

 

단점

처리 시간 증가 : 복잡한 연산으로 처리 시간이 길어집니다.

 

 

Reranking – Cross Encoder Reranker

Bi-Encoder (단일 인코더) vs Cross Encoder (교차 인코더)

 

Bi-Encoder 방식은 질의와 문서를 각각 독립적으로 임베딩한 후, 두 임베딩 벡터 간의 유사도를 통해 문서를 평가하는 방식입니다.

Cross-Encoder는 모든 질의-문서 쌍을 개별적으로 모델이 계산해야 평가하는 방식입니다. (처리 속도가 느립니다.)

Bi-Encoder 기반의 벡터 검색이 추출한 후보 문서(상위 K개 이하)를 대상으로 2차적으로 리랭킹할 때 사용됩니다.

 

Cross Encoder Reranker

교차 인코더 모델을 구현한 Hugging Face 모델(예: BAAI/bge-reranker-base)를 사용하여 리트리버에서 리랭커를 구현하는 방법을 보여줍니다.

SagemakerEndpointCrossEncoder를 사용하면 Sagemaker에 로드된 HuggingFace 모델을 사용할 수 있습니다.

 

 

Reranking하기

 

BAAI/bge-reranker-base (https://huggingface.co/BAAI/bge-reranker-base)

bge-m3 모델(BAAI(Beijing Academy of Artificial Intelligence)에서 개발한 최신 임베딩 모델)를 기반으로 한 리랭커 모델입니다.

 

BAAI/bge-reranker-v2-m3 (https://huggingface.co/BAAI/bge-reranker-v2-m3)

bge-m3 모델(BAAI(Beijing Academy of Artificial Intelligence)에서 개발한 최신 임베딩 모델)를 기반으로 한 다국어 리랭커 모델입니다.

 

1. project3에 QnA3.ipynb 파일에 크로스 인코더 테스트 코드를 추가합니다.

[Code]
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
 
# Reranker
reranker = HuggingFaceCrossEncoder(
    model_name='BAAI/bge-reranker-v2-m3',
    model_kwargs = {'device': 'cpu'}
)

[Code]
text1 = "중학생의 수학 기초학력 미달률은?"
text2 = "중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며"
text3 = "수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황"

similar_score_1 = reranker.score([text1, text2])
similar_score_2 = reranker.score([text1, text3])
print(similar_score_1, similar_score_2)

 

2. 크로스 인코더 테스트 코드를 실행합니다.

 

3. project3에 QnA3.ipynb 파일에 검색 결과 순위 재정렬 코드를 추가합니다.

[Code]
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker

compressor = CrossEncoderReranker(model=reranker, top_n=3)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

question = "중학생의 수학 기초학력 미달률은?"

compressed_docs = compression_retriever.invoke(question)
print(compressed_docs)

 

4. 검색 결과 순위 재정렬 코드를 실행합니다.

 

검색 결과 순서 재정렬 결과입니다.

[BAAI/bge-reranker-base를 사용할 경우]

[Document(id='fb8315b4-483c-4763-b361-af94b8e80ce0', metadata={'source': 'data/test.txt'}, page_content='교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학'), Document(id='6dcbfe08-1013-45d4-8d20-fcdbaae62393', metadata={'source': 'data/test.txt'}, page_content='8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다.'), Document(id='241efdba-09b4-4e44-a74b-bcbd645eeb1e', metadata={'source': 'data/test.txt'}, page_content='테크빌교육 체더스, 기초학력 부진 해결을 위한 코스웨어 기획전 진행')]


[BAAI/bge-reranker-v2-m3를 사용할 경우]

[Document(id='fb8315b4-483c-4763-b361-af94b8e80ce0', metadata={'source': 'data/test.txt'}, page_content='교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학'), Document(id='6dcbfe08-1013-45d4-8d20-fcdbaae62393', metadata={'source': 'data/test.txt'}, page_content='8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다.'), Document(id='2790ef3b-dab5-4a0e-8595-c054b6cdce53', metadata={'source': 'data/test.txt'}, page_content='이번 기획전에서는 AI 수학 학습 플랫폼 ‘매쓰홀릭 T’, AI 영어 학습 솔루션 ‘원아워’, 국어 문해력 학습 프로그램 ‘리드포스쿨’ 등 기초 학력 향상에 특화된 에듀테크')]

 

 

한국어 Reranker 사용하기

 

Dongjin-kr/ko-reranker (https://huggingface.co/Dongjin-kr/ko-reranker)

 

1. project3에 QnA3.ipynb 파일에 검색 결과 순위 재정렬 코드를 추가합니다.

[Code]
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder

# 교차 인코더 리랭커
cross_encoder_model = HuggingFaceCrossEncoder(model_name="Dongjin-kr/ko-reranker")

compressor = CrossEncoderReranker(model=cross_encoder_model, top_n=3)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

question = "중학생의 수학 기초학력 미달률은?"

compressed_docs = compression_retriever.invoke(question)

print(compressed_docs)

 

2. 검색 결과 순위 재정렬 코드를 실행합니다.

 

검색 결과 순서 재정렬 결과입니다.

[Document(id='fb8315b4-483c-4763-b361-af94b8e80ce0', metadata={'source': 'data/test.txt'}, page_content='교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학'), Document(id='6dcbfe08-1013-45d4-8d20-fcdbaae62393', metadata={'source': 'data/test.txt'}, page_content='8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다.'), Document(id='2790ef3b-dab5-4a0e-8595-c054b6cdce53', metadata={'source': 'data/test.txt'}, page_content='이번 기획전에서는 AI 수학 학습 플랫폼 ‘매쓰홀릭 T’, AI 영어 학습 솔루션 ‘원아워’, 국어 문해력 학습 프로그램 ‘리드포스쿨’ 등 기초 학력 향상에 특화된 에듀테크')]

 

 

크로스 인코더의 스코어로 사용하여 순서 재정렬하기

1. project3에 QnA3.ipynb 파일에 크로스 인코더의 스코어로 사용하여 리랭커 코드를 추가합니다.

[Code]
question = "중학생의 수학 기초학력 미달률은?"

# 스코어
idx = 0
for text in result_texts:
    similar_score = reranker.score([question, text.page_content])
    text.metadata['score'] = similar_score
    if similar_score < 0.5:
        del result_texts[idx]
    #print(idx, text.metadata['score'], text.page_content)
    idx += 1

# 재정렬 (내림차순)
sorted_result_texts = sorted(result_texts, key=lambda item: item.metadata['score'], reverse=True)

for text in sorted_result_texts:
    print(text.metadata['score'], text.page_content)

 

2. 크로스 인코더의 스코어로 사용하여 리랭커 코드를 실행합니다.

 

 

FlashRank Reranker

FlashRank(프랭크 랭크)는 기존 검색과 리트리벌 파이프라인에 순위 재정렬(Reranking) 기능을 추가하는 초경량 & 초고속 파이썬 라이브러리입니다.

SoTA(State-of-the-Art) 크로스 인코더를 기반으로 합니다.

 

1. project3에 QnA3.ipynb 파일에 검색 결과 순위 재정렬 코드를 추가합니다.

[Markdown]
검색 결과 재순위(Re-ranking)

[Code]
%pip install flashrank

[Code]
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank

# 플래시 링크
compressor = FlashrankRerank(model="ms-marco-MultiBERT-L-12", top_n=3)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

question = "중학생의 수학 기초학력 미달률은?"

compressed_docs = compression_retriever.invoke(question)

print(compressed_docs)

 

2. 첫번째 [Code]를 실행하여 flashrank를 설치합니다.

설치 후 비로 실행하면 오류가 발생합니다. VSCode를 재시작해야 합니다.

 

3. 검색 결과 순위 재정렬 코드를 실행합니다.

 

검색 결과 순서 재정렬 결과입니다.

[Document(metadata={'id': 3, 'relevance_score': np.float32(0.9995719), 'source': 'data/test.txt'}, page_content='기초 학력 향상에 특화된 에듀테크 솔루션을 특별 할인가로 제공한다.'), Document(metadata={'id': 4, 'relevance_score': np.float32(0.99949664), 'source': 'data/test.txt'}, page_content='이번 기획전에서는 AI 수학 학습 플랫폼 ‘매쓰홀릭 T’, AI 영어 학습 솔루션 ‘원아워’, 국어 문해력 학습 프로그램 ‘리드포스쿨’ 등 기초 학력 향상에 특화된 에듀테크'), Document(metadata={'id': 2, 'relevance_score': np.float32(0.9993681), 'source': 'data/test.txt'}, page_content='테크빌교육 체더스, 기초학력 부진 해결을 위한 코스웨어 기획전 진행')]

 

하지만 하위 순위가 더 적합합니다.

[Document(metadata={'id': 0, 'relevance_score': np.float32(0.99928063), 'source': 'data/test.txt'}, page_content='교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학'), Document(metadata={'id': 1, 'relevance_score': np.float32(0.9986457), 'source': 'data/test.txt'}, page_content='8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다.')]

 

검색 결과에 대한 순서 재정렬이 항상 적합하지 않을 수 있습니다.

모델에 따라 다르니 모델 테스트를 통해 사용하시길 바랍니다.

728x90
반응형