작성
·
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 클래스를 상속받아서, 커스텀 클래스를 만들면 될 것 같습니다.
감사합니다!