TopPSampler
TopPSampler
TopPSampler 는 **핵 샘플링(nucleus sampling)**을 사용해 문서를 필터링하는 컴포넌트예요. 고정된 개수를 고르는 대신, 문서 목록에서 누적 확률이 가장 높은 일정 비율에 초점을 맞춰 가장 관련 있는 문서를 골라요.
출처: 문서
본문
개요 (Overview)
Top-P(핵) 샘플링은 문서의 누적 확률을 기준으로 부분 집합을 식별하고 선택하는 방법이에요. 고정된 문서 수를 고르는 대신, 문서 목록 내에서 가장 높은 누적 확률의 지정 비율에 초점을 맞춰요. 쉽게 말하면 TopPSampler 는 주어진 질의에 대한 유사도를 바탕으로 가장 관련 있는 문서를 효율적으로 선택하는 방법을 제공해요.
TopPSampler 의 실용적 목표는 합계가 top_p 값보다 큰 점수를 갖는 문서 목록을 반환하는 것이에요. 예를 들어 top_p 를 높게 설정하면 더 많은 문서가 반환되어 더 다양한 출력이 나올 수 있어요. 값은 보통 0과 1 사이로 설정해요. 기본적으로 컴포넌트는 문서의 score 필드를 사용해 유사도 점수를 봐요.
컴포넌트의 run() 메서드는 이미 점수를 가진 문서 집합을 받아 그 점수의 누적 확률을 기준으로 필터링해요. 스스로 점수를 계산하지 않으므로, 점수를 계산하는 컴포넌트(예: Ranker) 뒤에 배치하세요.
사용법 (Usage)
단독으로 쓰기
from haystack import Document
from haystack.components.samplers import TopPSampler
sampler = TopPSampler(top_p=0.99, score_field="similarity_score")
docs = [
Document(content="Berlin", meta={"similarity_score": -10.6}),
Document(content="Belgrade", meta={"similarity_score": -8.9}),
Document(content="Sarajevo", meta={"similarity_score": -4.6}),
]
output = sampler.run(documents=docs)
docs = output["documents"]
print(docs)
파이프라인에서 쓰기
TopPSampler 를 어떻게 쓰고 어떤 컴포넌트와 짝을 이루는지 이해하려면 다음 예시를 살펴보세요.
이 페이지의 예시는 sentence-transformers-haystack 와 serperdev-haystack 패키지의 Sentence Transformers 랭커와 SerperDev 웹 검색 컴포넌트를 사용해요. 예시를 실행하려면 설치하세요:
pip install sentence-transformers-haystack serperdev-haystack
# import necessary dependencies
from haystack import Pipeline
from haystack.components.builders import ChatPromptBuilder
from haystack.components.fetchers import LinkContentFetcher
from haystack.components.converters import HTMLToDocument
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.preprocessors import DocumentSplitter
from haystack_integrations.components.rankers.sentence_transformers import (
SentenceTransformersSimilarityRanker,
)
from haystack.components.routers.file_type_router import FileTypeRouter
from haystack.components.samplers import TopPSampler
from haystack_integrations.components.websearch.serperdev import SerperDevWebSearch
from haystack.utils import Secret
from haystack.dataclasses import ChatMessage
# initialize the components
web_search = SerperDevWebSearch(api_key=Secret.from_token(""), top_k=10)
lcf = LinkContentFetcher()
html_converter = HTMLToDocument()
router = FileTypeRouter(["text/html", "application/pdf", "application/octet-stream"])
# ChatPromptBuilder uses a different template format with ChatMessage
template = [
ChatMessage.from_user(
"Given these paragraphs below: \n {% for doc in documents %}{{ doc.content }}{% endfor %}\n\nAnswer the question: {{ query }}"
),
]
# set required_variables to avoid warnings in multi-branch pipelines
prompt_builder = ChatPromptBuilder(
template=template,
required_variables=["documents", "query"],
)
# The Ranker plays an important role, as it will assign the scores to the top 10 found documents based on our query. We will need these scores to work with the TopPSampler.
similarity_ranker = SentenceTransformersSimilarityRanker(top_k=10)
splitter = DocumentSplitter()
# We are setting the top_p parameter to 0.95. This will help identify the most relevant documents to our query.
top_p_sampler = TopPSampler(top_p=0.95)
llm = OpenAIChatGenerator(api_key=Secret.from_token(""))
# create the pipeline and add the components to it
pipe = Pipeline()
pipe.add_component("search", web_search)
pipe.add_component("fetcher", lcf)
pipe.add_component("router", router)
pipe.add_component("converter", html_converter)
pipe.add_component("splitter", splitter)
pipe.add_component("ranker", similarity_ranker)
pipe.add_component("sampler", top_p_sampler)
pipe.add_component("prompt_builder", prompt_builder)
pipe.add_component("llm", llm)
# Arrange pipeline components in the order you need them. If a component has more than one inputs or outputs, indicate which input you want to connect to which output using the format ("component_name.output_name", "component_name, input_name").
pipe.connect("search.links", "fetcher.urls")
pipe.connect("fetcher.streams", "router.sources")
pipe.connect("router.text/html", "converter.sources")
pipe.connect("converter.documents", "splitter.documents")
pipe.connect("splitter.documents", "ranker.documents")
pipe.connect("ranker.documents", "sampler.documents")
pipe.connect("sampler.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "llm.messages")
# run the pipeline
question = "Why are cats afraid of cucumbers?"
query_dict = {"query": question}
result = pipe.run(
data={"search": query_dict, "prompt_builder": query_dict, "ranker": query_dict},
)
print(result)
더 알아보기 (Learn more)
- Ranker — 점수를 할당해 주는 랭커 컴포넌트
- Samplers API 참조
- GitHub 소스