MetaFieldRanker
MetaFieldRanker
MetaFieldRanker는 지정한 메타 필드의 값에 따라 문서 순위를 매겨요. 파이프라인을 느리게 하지 않으면서 결과를 개선할 수 있는 가벼운 Ranker예요. 쿼리 파이프라인에서 Retriever처럼 문서 목록을 반환하는 컴포넌트 뒤에 두면 돼요.
출처: MetaFieldRanker
본문
개요
MetaFieldRanker는 특정 메타 필드의 값에 따라 문서를 내림차순 또는 오름차순으로 정렬해요. 반환되는 Document 객체 목록은 선택한 순서대로 배치되며, 문자열 값은 알파벳순 또는 역순으로 정렬돼요(예: Tokyo, Paris, Berlin).
MetaFieldRanker에는 weight와 ranking_mode라는 선택적 파라미터가 있어요. 이를 사용해 Retriever가 부여한 문서 점수와 메타 필드 값을 순위 매기기에 결합할 수 있어요. weight 파라미터는 순위 과정에서 Document 내용과 메타 필드의 중요도를 균형 잡아요. ranking_mode 파라미터는 Retriever와 Ranker의 점수를 결합하는 방식을 정의해요.
이 Ranker는 검색·증강 생성(RAG) 파이프라인이나 문서 검색 파이프라인 같은 쿼리 파이프라인에서 유용해요. 문서가 메타 필드 값 순서로 정렬되도록 보장해요. InMemoryEmbeddingRetriever 같은 Retriever 뒤에서 Retriever 점수와 문서의 메타 값을 결합해 순위를 개선하는 데도 쓸 수 있어요.
기본적으로 MetaFieldRanker는 메타 필드만 기준으로 문서를 정렬해요. 컴포넌트 초기화 때 weight를 1보다 작게 설정해서 조정할 수 있어요. 다양한 초기화 설정에 대한 자세한 내용은 이 컴포넌트의 API reference를 확인하세요.
사용법
파이프라인 밖에서도 이 Ranker를 써서 문서를 정렬할 수 있어요.
이 예시는 MetaFieldRanker로 단순한 문서 두 개의 순위를 매겨요. Ranker를 실행할 때 documents를 제공하고 top_k 파라미터로 순위를 매길 문서 수를 설정해요.
from haystack import Document
from haystack.components.rankers import MetaFieldRanker
docs = [
Document(content="Paris", meta={"rating": 1.3}),
Document(content="Berlin", meta={"rating": 0.7}),
]
ranker = MetaFieldRanker(meta_field="rating")
ranker.run(documents=docs, top_k=1)
파이프라인 안에서:
아래는 InMemoryBM25Retriever로 키워드 검색을 해 InMemoryDocumentStore에서 문서를 가져오는 파이프라인 예시예요. 그런 뒤 Ranker의 기본 설정으로 rating 메타 필드를 기준으로 검색된 문서 순위를 매겨요.
from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.rankers import MetaFieldRanker
docs = [
Document(content="Paris", meta={"rating": 1.3}),
Document(content="Berlin", meta={"rating": 0.7}),
Document(content="Barcelona", meta={"rating": 2.1}),
]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)
retriever = InMemoryBM25Retriever(document_store=document_store)
ranker = MetaFieldRanker(meta_field="rating")
document_ranker_pipeline = Pipeline()
document_ranker_pipeline.add_component(instance=retriever, name="retriever")
document_ranker_pipeline.add_component(instance=ranker, name="ranker")
document_ranker_pipeline.connect("retriever.documents", "ranker.documents")
query = "Cities in France"
document_ranker_pipeline.run(
data={
"retriever": {"query": query, "top_k": 3},
"ranker": {"top_k": 2},
},
)