컴포넌트 (Components)
컴포넌트 (Components)
컴포넌트(Components)는 파이프라인(Pipeline)의 구성 요소(building blocks)입니다. 컴포넌트는 전처리(preprocessing), 검색(retrieving), 텍스트 요약(summarizing) 등의 작업을 수행하며, 쿼리를 파이프라인의 여러 분기(branch)로 라우팅합니다. 이 페이지는 Haystack에서 사용할 수 있는 모든 컴포넌트 유형에 대한 요약입니다.
컴포넌트들은 파이프라인을 통해 서로 연결되며, 서로 쉽게 교체할 수 있는 구성 요소처럼 동작합니다. 하나의 컴포넌트는 다른 컴포넌트의 선택된 출력을 입력으로 받을 수 있습니다. 또한 pipeline.run()을 호출할 때 컴포넌트에 입력을 직접 제공할 수도 있습니다.
단독 사용 또는 파이프라인 내 사용 (Stand-Alone or In a Pipeline)
컴포넌트를 파이프라인에 통합하여 특정 작업을 수행할 수 있습니다. 그러나 일부 컴포넌트는 파이프라인 밖에서 단독으로(stand-alone)도 사용할 수 있습니다. 예를 들어, DocumentWriter를 단독으로 실행하여 문서를 Document Store에 쓸 수 있습니다. 컴포넌트를 사용하는 방법과 파이프라인 밖에서 사용할 수 있는지 여부를 확인하려면 해당 컴포넌트 문서 페이지의 Usage 섹션을 확인하세요.
각 컴포넌트에는 run() 메서드가 있습니다. 컴포넌트를 파이프라인에 연결하고 Pipeline.run()을 호출하여 파이프라인을 실행하면, 각 컴포넌트의 run() 메서드가 순차적으로 호출됩니다.
입력과 출력 (Input and Output)
파이프라인에서 컴포넌트를 연결하려면, 컴포넌트가 받아들이는 입력(input)과 산출하는 출력(output)의 이름을 알아야 합니다. 한 컴포넌트의 출력은 그 다음 컴포넌트가 받아들이는 입력과 호환되어야 합니다. 예를 들어, 파이프라인에서 Retriever와 Ranker를 연결하려면, Retriever가 documents를 출력하고 Ranker가 documents를 입력으로 받아들인다는 것을 알아야 합니다.
필수 입력과 출력은 각 컴포넌트 문서 페이지 상단의 표에 나열되어 있어 빠르게 확인할 수 있습니다.
또한 컴포넌트의 run() 메서드의 코드에서도 이를 확인할 수 있습니다. 다음은 MetaFieldRanker의 입력과 출력 예시입니다.
# "documents"는 파이프라인에서 컴포넌트를 연결할 때 필요한 출력 이름입니다
@component.output_types(documents=list[Document])
# "documents"는 필수 입력이며, 선택적으로 top_k 매개변수도 지정할 수 있습니다
def run(self, documents: list[Document], top_k: int | None = None):
"""
선택된 메타 필드를 기준으로 Documents 목록을 정렬합니다.
:param documents: Documents 목록.
:param top_k: Ranker가 반환하기를 원하는 최대 Documents 수.
:return: 메타 필드 값으로 정렬된 Documents 목록.
"""
컴포넌트 워밍업 (Warming Up Components)
LLM이나 임베딩 모델처럼 많은 리소스를 사용하는 컴포넌트에는 필요한 리소스(예: 모델)를 메모리에 로드하는 warm_up() 메서드가 있습니다. 이 메서드는 컴포넌트가 처음 실행될 때 자동으로 호출되므로, warm_up()을 명시적으로 호출하지 않고도 컴포넌트를 직접 사용할 수 있습니다.
이 페이지의 예제들은 sentence-transformers-haystack 패키지로 이동된 Sentence Transformers 임베더를 사용합니다. 예제를 실행하려면 설치하세요.
pip install sentence-transformers-haystack
from haystack import Document
from haystack_integrations.components.embedders.sentence_transformers import (
SentenceTransformersDocumentEmbedder,
)
doc = Document(content="I love pizza!")
doc_embedder = SentenceTransformersDocumentEmbedder()
result = doc_embedder.run([doc]) # warm_up()
리소스가 로드되는 시점을 직접 제어하고 싶다면 warm_up()을 명시적으로 호출할 수도 있습니다.