如果答案就在一段英文材料中,抽取式问答模型能返回一个原文片段及其起止位置。它适合从已提供的段落找地点、日期等信息;这篇教程用 DistilBERT 检查答案是否能回到原文,随后用有答案与无答案的问题区分“程序运行”和“回答可靠”。
先确认语言和任务
本例模型在英文 SQuAD v1.1 上微调。question 是问题,context 是你实际提供的英文正文。它不会自动搜索网站、读整个文件或为问题补充常识;先把需要的段落放入 context。这个检查点不适合直接当中文问答模型,也不能因为接口有 score 就将其视为经过校准的正确率。

示例面向有基础 Python 经验的读者,按 Transformers 4.57.1 接口编写。Windows 可用以下独立环境;macOS/Linux 用 python3 创建环境,并把后续解释器路径换为 .venv/bin/python。首次加载模型需要网络、磁盘和足够内存,CPU 可以执行但速度取决于机器。安装失败时先看 Python 版本与 pip 报错,不能把安装成功当成模型已跑通。
py -m venv .venv
.venv\Scripts\python -m pip install "torch>=2.6" "transformers==4.57.1" safetensors
运行一段有明确答案的材料
保存下面代码为 qa_demo.py,运行 .venv\Scripts\python qa_demo.py。人为构造的材料把地点写成 Berlin;问句只问地点,先用这个简单样本验证环境,再换真实段落。
from transformers import pipeline
qa = pipeline("question-answering",
model="distilbert/distilbert-base-cased-distilled-squad", device=-1)
context = ("The tutorial workshop will take place in Berlin on Friday. "
"Participants should bring a laptop. Registration closes on Tuesday.")
question = "Where will the workshop take place?"
result = qa(question=question, context=context, top_k=1)
start, end = int(result["start"]), int(result["end"])
assert 0 <= start < end <= len(context)
original_span = context[start:end]
assert original_span.strip() == result["answer"].strip()
print({"question": question, "answer": result["answer"],
"score": float(result["score"]), "start": start, "end": end,
"original_span": original_span})
按原文位置核对答案
核对输出中的 original_span 是否来自原材料,并检查地点答案是否为 Berlin。start 包含起点,end 不包含终点;不要在推理后删除空格、改换行或翻译 context,否则同一偏移无法定位原文。代码里的断言只证明范围和片段一致,不能证明模型选中了正确事实。
用无答案问题暴露失败边界
再把 question 改为 What is the registration fee?。材料没有费用,应由业务规则或人工标为“资料未说明”,而不是接受模型挑出的其他片段。本例采用 SQuAD v1.1 检查点,没有据此验证可靠拒答能力;启用 handle_impossible_answer 也不能让未针对无答案任务训练的模型自动变成可信拒答器。要上线先准备有答案、无答案、否定句、多个日期的人工样本分别验收。
长文和低分怎样处理
一次输入越长,定位错误的机会越多。先按文档结构提供相关段落并记录段落编号;长上下文会按 max_seq_len 划成窗口、按 doc_stride 保留重叠;应核对窗口参数和每个答案的原文位置。问题本身还受 max_question_len 限制,过长问题可能被截断,不能把它理解为没有长度限制的全文问答。低分可以触发复核,但拒答阈值应在你自己的标注样本上选定,本文不给出通用阈值。
本文已核对官方接口与模型资料,示例输入为人为构造;未在本文环境下载并实跑所列公开模型,未测速度或任务准确率。下面的检查方法由你在实际运行后执行,不能把演示代码当成质量评测结果。
官方资料与版本依据
- 英文抽取式问答的 question/context 输入和原文答案定位流程。
- 各任务 pipeline 参数、输出字段及单标签/多标签归一化语义。
- 英文 DistilBERT SQuAD v1.1 检查点、许可和抽取式使用范围。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31341.html