接收一个查询和一组文档作为输入,并通过选择文档中的文本片段来返回提取的答案。
模块 extractive
ExtractiveReader
定位并从文档中提取给定查询的答案。
ExtractiveReader 组件执行提取式问答。它独立地为每个可能的答案片段分配一个分数。这解决了其他实现中存在的常见问题,即通过独立地规范化每个文档的答案来使跨文档的比较更加困难。
示例用法
from haystack import Document
from haystack.components.readers import ExtractiveReader
docs = [
Document(content="Python is a popular programming language"),
Document(content="python ist eine beliebte Programmiersprache"),
]
reader = ExtractiveReader()
reader.warm_up()
question = "What is a popular programming language?"
result = reader.run(query=question, documents=docs)
assert "Python" in result["answers"][0].data
ExtractiveReader.__init__
def __init__(model: Union[Path, str] = "deepset/roberta-base-squad2-distilled",
device: Optional[ComponentDevice] = None,
token: Optional[Secret] = Secret.from_env_var(
["HF_API_TOKEN", "HF_TOKEN"], strict=False),
top_k: int = 20,
score_threshold: Optional[float] = None,
max_seq_length: int = 384,
stride: int = 128,
max_batch_size: Optional[int] = None,
answers_per_seq: Optional[int] = None,
no_answer: bool = True,
calibration_factor: float = 0.1,
overlap_threshold: Optional[float] = 0.01,
model_kwargs: Optional[dict[str, Any]] = None) -> None
创建 ExtractiveReader 的实例。
参数:
model:一个 Hugging Face transformers 问题回答模型。可以是包含模型文件的文件夹路径,也可以是 Hugging Face hub 的标识符。device: 加载模型的设备。如果None,默认设备会自动选择。token:用于从 Hugging Face 下载私有模型的 API 令牌。top_k:每个查询返回的答案数量。即使设置了 score_threshold,也需要此参数。如果将 no_answer 设置为 True(默认值),则会额外返回一个没有文本的答案。score_threshold:仅返回概率分数高于此阈值的答案。max_seq_length:最大令牌数。如果序列超过此长度,则会将其拆分。stride:当序列因超过 max_seq_length 而被拆分时,重叠的令牌数。max_batch_size:一次馈送到模型中的最大样本数。answers_per_seq:每个序列要考虑的答案候选数量。当一个文档由于 max_seq_length 被拆分成多个序列时,这很重要。no_answer:是否返回一个额外的no answer,其文本为空,得分表示其他 top_k 答案不正确的概率。calibration_factor:用于校准概率的因子。overlap_threshold:如果设置此参数,将删除重叠大于给定阈值的重复答案。例如,对于答案“in the river in Maine”和“the river”,我们将删除其中一个答案,因为第二个答案与第一个答案有 100%(1.0)的重叠。但是,对于答案“the river in”和“in Maine”,最大重叠百分比仅为 25%,因此如果此变量设置为 0.24 或更低,则这两个答案都可以保留。如果提供 None,则保留所有答案。model_kwargs:传递给AutoModelForQuestionAnswering.from_pretrained的其他关键字参数,用于加载中指定的模型model。有关可以传递的 kwargs 的详细信息,请参阅模型的文档。
ExtractiveReader.to_dict
def to_dict() -> dict[str, Any]
将组件序列化为字典。
返回值:
包含序列化数据的字典。
ExtractiveReader.from_dict
@classmethod
def from_dict(cls, data: dict[str, Any]) -> "ExtractiveReader"
从字典反序列化组件。
参数:
data: 要反序列化的字典。
返回值:
反序列化后的组件。
ExtractiveReader.warm_up
def warm_up()
Initializes the component.
ExtractiveReader.deduplicate_by_overlap
def deduplicate_by_overlap(
answers: list[ExtractedAnswer],
overlap_threshold: Optional[float]) -> list[ExtractedAnswer]
去除重叠的提取答案。
根据答案跨度的重叠程度,去除同一文档中重叠的提取答案。
参数:
answers:要去除重复的答案列表。overlap_threshold:如果设置此参数,将删除重叠大于给定阈值的重复答案。例如,对于答案“in the river in Maine”和“the river”,我们将删除其中一个答案,因为第二个答案与第一个答案有 100%(1.0)的重叠。但是,对于答案“the river in”和“in Maine”,最大重叠百分比仅为 25%,因此如果此变量设置为 0.24 或更低,则这两个答案都可以保留。如果提供 None,则保留所有答案。
返回值:
去重后的答案列表。
ExtractiveReader.run
@component.output_types(answers=list[ExtractedAnswer])
def run(query: str,
documents: list[Document],
top_k: Optional[int] = None,
score_threshold: Optional[float] = None,
max_seq_length: Optional[int] = None,
stride: Optional[int] = None,
max_batch_size: Optional[int] = None,
answers_per_seq: Optional[int] = None,
no_answer: Optional[bool] = None,
overlap_threshold: Optional[float] = None)
使用给定的查询,定位并从给定的文档中提取答案。
参数:
query: 查询字符串。documents:要在其中搜索查询答案的文档列表。top_k:要返回的最大答案数量。如果将 no_answer 设置为 True(默认值),则会额外返回一个答案。score_threshold:仅返回分数高于此阈值的答案。max_seq_length:最大令牌数。如果序列超过此长度,则会将其拆分。stride:当序列因超过 max_seq_length 而被拆分时,重叠的令牌数。max_batch_size:一次馈送到模型中的最大样本数。answers_per_seq:每个序列要考虑的答案候选数量。当一个文档由于 max_seq_length 被拆分成多个序列时,这很重要。no_answer:是否返回无答案分数。overlap_threshold:如果设置此参数,将删除重叠大于给定阈值的重复答案。例如,对于答案“in the river in Maine”和“the river”,我们将删除其中一个答案,因为第二个答案与第一个答案有 100%(1.0)的重叠。但是,对于答案“the river in”和“in Maine”,最大重叠百分比仅为 25%,因此如果此变量设置为 0.24 或更低,则这两个答案都可以保留。如果提供 None,则保留所有答案。
引发:
RuntimeError:如果组件在调用 'warm_up()' 之前没有预热。
返回值:
按(降序)答案分数排序的答案列表。
