인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

정영수님의 프로필 이미지

작성한 질문수

RAG 마스터: 기초부터 고급기법까지 (feat. LangChain)

RAG 답변 평가 (정량적 지표) 4 - Rouge Metric 활용

작성

·

29

0

from langchain.retrievers.document_compressors import DocumentCompressorPipeline
from langchain_community.document_transformers import EmbeddingsRedundantFilter


# 중복 문서 제거
redundant_filter = EmbeddingsRedundantFilter(embeddings=embeddings_model)

# 쿼리와 관련성이 높은 문서만 필터링
relevant_filter = EmbeddingsFilter(embeddings=embeddings_model, similarity_threshold=0.5)

# Re-ranking
re_ranker = LLMListwiseRerank.from_llm(llm, top_n=2)

pipeline_compressor = DocumentCompressorPipeline(
    transformers=[redundant_filter, relevant_filter, re_ranker]
)

pipeline_compression_retriever = ContextualCompressionRetriever(
    base_compressor=pipeline_compressor, 
    base_retriever=chroma_db.as_retriever()
)

question = "테슬라 회장은 누구인가요?"

compressed_docs = pipeline_compression_retriever.invoke(question)

print(f"쿼리: {question}")
print("검색 결과:")
for doc in compressed_docs:
    print(f"- {doc.page_content} [출처: {doc.metadata['source']}]")
    print("-"*100)
    print()
`(4) DocumentCompressorPipeline`  

- 여러 압축기를 순차적으로 결합하는 방식
- BaseDocumentTransformers를 추가하여, 문서를 더 작은 조각으로 나누거나 중복 문서를 제거하는 등의 작업도 가능

여기에서 result = chain.invoke() 로 받아서 result의 데이터를 보면,

context = result['context'][i]
query_similarity_score = context.state['query_similarity_score']

이렇게 similarity_score 처럼 rerank score같은거 보고싶은데,

# 크로스 인코더를 사용하여 유사성 점수를 계산합니다.
sentence_pairs = [[query, prediction]]
similarity_scores = cross_encoder_model.predict(sentence_pairs)

이런식으로 계산을 해야하나요? 추출하고 싶은데 방법을 잘 모르겠습니다.

답변 1

0

판다스 스튜디오님의 프로필 이미지
판다스 스튜디오
지식공유자

안녕하세요. 판다스 스튜디오입니다.

LLMListwiseRerank를 사용하면, 관련성 기준으로 순위에 따라 정렬하는 방식으로 작동합니다. (아래 링크 참조)
https://inf.run/5eeJZ

이 코드를 기반으로 관련성(relevance)을 평가하는 reranker의 프롬프트를 수정해서, 관련성 점수를 함께 출력하고 이를 기준으로 정렬하도록 코드를 수정해서 적용해야 할 것 같습니다.

LLMListwiseRerank 클래스를 상속받아서, 커스텀 클래스를 만들면 될 것 같습니다.

감사합니다!