TransformersExtractiveReader
TransformersExtractiveReader
쿼리와 문서 리스트를 바탕으로, 문서 텍스트 안에서 답을 찾아내 발췌(추출)해 주는 컴포넌트예요. 문서 안에서 답이 어디에 있는지 정확히 알고 싶은 추출형 QA 시스템에 사용해요.
파이프라인에서 가장 흔한 위치: 쿼리 파이프라인에서 Retriever처럼 문서 리스트를 반환하는 컴포넌트 다음
필수 init 변수: 없음
필수 run 변수: documents — 문서 리스트 / query — 쿼리 문자열
출력 변수: answers — ExtractedAnswer 객체 리스트
API 레퍼런스: Transformers
GitHub 링크: https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/transformers
패키지 이름: transformers-haystack
출처: 문서
본문
개요 (Overview)
TransformersExtractiveReader는 주어진 쿼리에 대한 답을 문서 텍스트에서 찾아내요. 문서 안에서 답이 정확히 어디에 위치하는지 알고 싶은 추출형 QA 시스템에서 쓰여요. 보통 앞에 Retriever를 붙여 함께 쓰지만, 문서를 가져오는 다른 컴포넌트와도 쓸 수 있어요.
Reader는 답에 확률(probability) 을 부여해요. 이 점수는 0에서 1까지이며, Reader가 반환한 결과가 쿼리와 얼마나 잘 맞는지를 나타내요. 확률이 1에 가까울수록 모델이 답의 관련성을 높게 확신한다는 뜻이에요. Reader는 확률 점수를 기준으로 답을 정렬하며, 더 높은 확률이 먼저 나와요. 선택적 top_k 파라미터로 Reader가 반환할 답의 개수를 제한할 수 있어요.
이 확률을 시스템의 품질 기준을 세우는 데 쓸 수 있어요. Reader의 confidence_score 파라미터로 답에 대한 최소 확률 임계값을 설정하면 돼요. 예를 들어 confidence_threshold를 0.7로 설정하면 확률이 0.7보다 높은 답만 반환돼요.
기본적으로 Reader는 문서 텍스트에서 쿼리에 대한 답을 찾지 못하는 시나리오를 포함해요(no_answer=True). 이 경우 텍스트가 없는 추가 ExtractedAnswer와, top_k 답 중 어느 것도 맞지 않을 확률을 함께 반환해요. 예를 들어 top_k=4면 시스템은 4개의 답과 추가로 빈 답 하나를 반환해요. 각 답에는 확률이 할당돼요. 빈 답의 확률이 0.5라면, 반환된 답 중 어느 것도 올바르지 않을 확률이 0.5라는 뜻이에요. 실제 top_k 답만 받으려면 컴포넌트를 초기화할 때 no_answer 파라미터를 False로 설정하면 돼요.
모델 (Models)
TransformersExtractiveReader와 함께 쓰길 권장하는 모델은 다음과 같아요:
| 모델 URL | 설명 | 언어 |
|---|---|---|
| deepset/roberta-base-squad2-distilled (기본) | 증류된(distilled) 모델로 비교적 빠르고 성능이 좋음 | 영어 |
| deepset/roberta-large-squad2 | 성능이 좋은 대형 모델. 증류 모델보다 느림 | 영어 |
| deepset/tinyroberta-squad2 | roberta-large-squad2의 증류 버전, 매우 빠름 | 영어 |
| deepset/xlm-roberta-base-squad2 | 속도와 성능이 좋은 기본형 다국어 모델 | 다국어 |
다른 질문 답변 모델도 Hugging Face에서 볼 수 있어요.
Hugging Face API 토큰 인증은 비공개 모델이나 gated 모델에 접근할 때만 필요해요. 토큰은 초기화할 때 token으로 넘기거나, HF_API_TOKEN 또는 HF_TOKEN 환경 변수로 설정할 수 있어요.
사용법 (Usage)
TransformersExtractiveReader를 쓰려면 transformers-haystack 패키지를 설치해요:
pip install transformers-haystack
단독으로 사용하기 (On its own)
아래는 파이프라인 밖에서 TransformersExtractiveReader를 쓰는 예시예요. Reader는 실행 시점에 쿼리와 문서를 받아요. 두 개의 답과, 텍스트가 없고 top_k 답이 틀릴 확률을 담은 추가 세 번째 답을 반환해야 해요.
from haystack import Document
from haystack_integrations.components.readers.transformers import (
TransformersExtractiveReader,
)
docs = [
Document(content="Paris is the capital of France."),
Document(content="Berlin is the capital of Germany."),
]
reader = TransformersExtractiveReader()
reader.run(query="What is the capital of France?", documents=docs, top_k=2)
파이프라인 안에서 사용하기 (In a pipeline)
아래는 키워드 검색(InMemoryBM25Retriever)으로 InMemoryDocumentStore에서 문서를 가져온 뒤, TransformersExtractiveReader로 상위 검색 문서들에서 쿼리에 대한 답을 추출하는 파이프라인 예시예요.
TransformersExtractiveReader의 top_k를 2로 설정하면, 텍스트가 없고 다른 top_k 답이 틀릴 확률을 담은 추가 세 번째 답도 함께 반환돼요.
from haystack import Document, Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack_integrations.components.readers.transformers import (
TransformersExtractiveReader,
)
docs = [
Document(content="Paris is the capital of France."),
Document(content="Berlin is the capital of Germany."),
Document(content="Rome is the capital of Italy."),
Document(content="Madrid is the capital of Spain."),
]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)
retriever = InMemoryBM25Retriever(document_store=document_store)
reader = TransformersExtractiveReader()
extractive_qa_pipeline = Pipeline()
extractive_qa_pipeline.add_component(instance=retriever, name="retriever")
extractive_qa_pipeline.add_component(instance=reader, name="reader")
extractive_qa_pipeline.connect("retriever.documents", "reader.documents")
query = "What is the capital of France?"
extractive_qa_pipeline.run(
data={
"retriever": {"query": query, "top_k": 3},
"reader": {"query": query, "top_k": 2},
},
)