PyversityRanker
PyversityRanker
pyversity의 다양화(diversification) 알고리즘으로 관련성과 다양성의 균형을 맞춰 문서를 다시 순위 매기는 컴포넌트예요.
출처: 문서
본문
| 항목 | 내용 |
|---|---|
| 파이프라인에서 가장 흔한 위치 | 쿼리 파이프라인에서 return_embedding=True로 설정한 밀집 Retriever 다음 |
| 필수 init 변수 | 없음 |
| 필수 run 변수 | documents: 각각 score와 embedding이 설정된 문서 객체 목록 |
| 출력 변수 | documents: 문서 객체 목록 |
| API reference | Pyversity |
| GitHub 링크 | pyversity 통합 |
| 패키지 이름 | pyversity-haystack |
개요
PyversityRanker는 pyversity의 다양화 알고리즘으로 Documents를 다시 순위 매겨요. 유사도 기반 ranker와 달리 관련성과 다양성의 균형을 맞추므로, 단순히 가장 관련 있는 문서만이 아니라 중복을 피하는 다양한 선택을 반환해요.
문서에는 score와 embedding이 모두 채워져 있어야 해요. 그래서 return_embedding=True로 설정된 InMemoryEmbeddingRetriever 같은 밀집 리트리버 뒤에 자연스럽게 어울리죠. 둘 중 하나가 없는 문서는 경고와 함께 건너뛰어요.
주요 파라미터는 다음과 같아요.
strategy: 사용할 다양화 알고리즘. 기본값은Strategy.DPP(결정적 점 과정, Determinantal Point Process)예요.Strategy.MMR(최대 한계 관련성, Maximal Marginal Relevance)도 인기 있는 옵션이죠.diversity:[0, 1]사이의 float로 관련성-다양성 트레이드오프를 제어해요.0.0은 가장 관련 있는 문서를 유지하고,1.0은 관련성과 무관하게 다양성을 최대화해요. 기본값은0.5예요.top_k: 반환할 문서 수.None이면 모든 문서를 다양화된 순서로 반환해요.
설치
Haystack에서 이 통합을 사용하려면 패키지를 설치하세요:
pip install pyversity-haystack
사용법
단독으로 사용하기
이 예제는 PyversityRanker로 다섯 문서를 다시 순위 매겨요. 각 문서에 score와 embedding이 설정되어 있어야 하죠. MMR 전략과 0.7의 다양성으로 상위 3개 문서를 반환해요.
from haystack import Document
from pyversity import Strategy
from haystack_integrations.components.rankers.pyversity import PyversityRanker
documents = [
Document(
content="Paris is the capital of France.",
score=0.95,
embedding=[0.9, 0.1, 0.0, 0.0],
),
Document(
content="The Eiffel Tower is located in Paris.",
score=0.90,
embedding=[0.8, 0.2, 0.0, 0.0],
),
Document(
content="Berlin is the capital of Germany.",
score=0.85,
embedding=[0.0, 0.0, 0.9, 0.1],
),
Document(
content="The Brandenburg Gate is in Berlin.",
score=0.80,
embedding=[0.0, 0.0, 0.8, 0.2],
),
Document(
content="France borders Spain to the south.",
score=0.75,
embedding=[0.5, 0.5, 0.0, 0.0],
),
]
ranker = PyversityRanker(top_k=3, strategy=Strategy.MMR, diversity=0.7)
result = ranker.run(documents=documents)
for doc in result["documents"]:
print(f"{doc.score:.2f} {doc.content}")
파이프라인에서 사용하기
아래는 문서를 임베딩해 InMemoryDocumentStore에 저장하는 파이프라인 예시예요. InMemoryEmbeddingRetriever로 상위 6개 문서를 가져온 뒤, PyversityRanker로 다시 순위를 매겨 3개의 다양한 결과를 반환하죠.
리트리버를 return_embedding=True로 설정해야 문서에 ranker가 쓸 임베딩이 있다는 점을 기억하세요.
이 페이지의 예제는 sentence-transformers-haystack 패키지의 Sentence Transformers 임베더를 사용해요. 예제를 실행하려면 설치하세요:
pip install sentence-transformers-haystack
from haystack import Document, Pipeline
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersDocumentEmbedder,
SentenceTransformersTextEmbedder,
)
from haystack.components.retrievers import InMemoryEmbeddingRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from pyversity import Strategy
from haystack_integrations.components.rankers.pyversity import PyversityRanker
# Index documents
document_store = InMemoryDocumentStore()
raw_documents = [
Document(content="Paris is the capital of France."),
Document(content="The Eiffel Tower is located in Paris."),
Document(content="Berlin is the capital of Germany."),
Document(content="The Brandenburg Gate is in Berlin."),
Document(content="France borders Spain to the south."),
Document(content="The Louvre is the world's largest art museum and is in Paris."),
Document(content="Munich is the capital of Bavaria."),
Document(content="The Rhine river flows through Germany and France."),
]
doc_embedder = SentenceTransformersDocumentEmbedder()
documents_with_embeddings = doc_embedder.run(raw_documents)["documents"]
document_store.write_documents(documents_with_embeddings)
# Build pipeline
pipeline = Pipeline()
pipeline.add_component("text_embedder", SentenceTransformersTextEmbedder())
pipeline.add_component(
"retriever",
InMemoryEmbeddingRetriever(
document_store=document_store,
top_k=6,
return_embedding=True,
),
)
pipeline.add_component(
"ranker",
PyversityRanker(top_k=3, strategy=Strategy.MMR, diversity=0.7),
)
pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
pipeline.connect("retriever.documents", "ranker.documents")
# Run
result = pipeline.run(
{"text_embedder": {"text": "What are the famous landmarks in France?"}},
)
for doc in result["ranker"]["documents"]:
print(f"{doc.score:.4f} {doc.content}")
임베딩 필요:
PyversityRanker는 문서에score와embedding이 모두 설정되어 있어야 해요. 밀집 리트리버를 사용할 때는return_embedding=True를 전달하세요. 둘 중 하나가 없는 문서는 경고와 함께 건너뛰어요.