Question Answering
问答 (QA) 系统会针对自然语言问题给出直接答案。涵盖抽取式、开放领域、生成式和视觉问答。
问答(QA)是自然语言处理(NLP)任务,目标是用答案本身回答以自然语言提出的问题,例如对“澳大利亚的首都是哪里?”回答“堪培拉”,而不是返回一组网页。QA 系统会理解问题,在段落、文档集合、数据库或自身参数中查找相关信息,然后返回或撰写答案。搜索引擎的答案框、虚拟助手、客户支持机器人,以及能够回答公司文档相关问题的大型语言模型(LLM)助手,都属于 QA 系统。
早期系统回答的是有关小型数据库的问题:BASEBALL(1961)能处理有关一个赛季美国联盟比赛的问题;LUNAR(1971)能回答地质学家有关阿波罗月球岩石样本的问题。TREC 问答赛道于 1999 年开始为开放领域 QA 提供基准测试。2011 年 2 月,IBM Watson 击败了《危险边缘!》冠军 Ken Jennings 和 Brad Rutter;它为每条线索生成大量候选答案,并使用数百种算法为每个答案的证据评分。
QA 系统的类型#
- 抽取式 QA:选取给定段落中能够回答问题的文本片段。
- 开放领域 QA:先在大型资料集合(例如整个 Wikipedia)中搜索相关段落,然后再作答。
- 检索增强生成(RAG):在检索到的段落基础上,由 LLM 撰写答案,因此答案可以综合多个来源的事实并引用这些来源。
- 闭卷 QA:根据模型权重中存储的知识作答,不使用任何文档,因此更难发现模型编造的答案。
- 知识图谱 QA:将问题转换为针对实体和关系图谱或数据库的结构化查询。
- 视觉问答(VQA):回答有关图像或视频的问题。
抽取式 QA 与 SQuAD#
斯坦福问答数据集(SQuAD)由 Pranav Rajpurkar 及其同事于 2016 年发布,使抽取式 QA 成为标准基准:众包标注人员围绕维基百科文章编写了超过 100,000 个问题,每个答案都是文章中的一个片段。逻辑回归基线的 F1 为 51.0%,而人类的 F1 为 86.8%。评分采用精确匹配,以及预测答案与参考答案之间基于 token 的 F1 分数;2018 年,BERT 的测试集 F1 达到 93.2。抽取式模型会为段落中的每个 token 评分,将其视为答案的可能起点或终点:
import torch
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
# DistilBERT fine-tuned on SQuAD v1.1 for extractive question answering
model_id = "distilbert/distilbert-base-cased-distilled-squad"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForQuestionAnswering.from_pretrained(model_id)
context = (
"SQuAD was released in 2016 by Pranav Rajpurkar and colleagues at Stanford University. "
"Crowdworkers wrote more than 100,000 questions about Wikipedia articles, and every answer is a span of the article."
)
for question in ["Who released SQuAD?", "Where do the answers come from?", "How many languages does SQuAD cover?"]:
inputs = tokenizer(question, context, return_tensors="pt", return_offsets_mapping=True)
offsets = inputs.pop("offset_mapping")[0]
with torch.no_grad():
outputs = model(**inputs)
# The answer is the context span between the highest-scoring start and end tokens
start, end = outputs.start_logits.argmax(), outputs.end_logits.argmax()
print(f"{question} -> {context[offsets[start][0] : offsets[end][1]]}")模型回答“Pranav Rajpurkar”和“文章中的一个片段”。段落没有提到语言,但模型对第三个问题回答“100,000”,因为在 SQuAD 1.1 上训练的模型总会返回某个片段。SQuAD 2.0(2018)新增了超过 50,000 个看似可回答、实际无法回答的问题;一个在 SQuAD 1.1 上 F1 达到 86% 的系统,在该版本上的 F1 降至 66%,因为模型现在必须判断何时应弃答。
开放域 QA 与 RAG#
开放域系统将工作拆分给检索器和阅读器:检索器从数百万个段落中找出少量相关内容,阅读器则根据这些内容作答。DrQA(2017)使用 TF-IDF 检索维基百科文章,并通过循环神经网络阅读文章;密集段落检索(2020)用 BERT 嵌入和向量搜索取代 TF-IDF;RAG(2020)则将检索到的段落交给生成器来撰写答案。阅读器查看段落前,重排序器通常会先重新排列检索结果。RAG 论文作者发现,与没有检索的同类模型相比,以检索文本为条件能让生成语言更具体、多样且符合事实;引用段落也让读者能够核查答案是否存在幻觉。
视觉问答#
VQA 接收一张图像和一个问题,例如“有多少人在车站等车?”,需要使用结合计算机视觉与语言理解的多模态 AI,通常由视觉语言模型(VLM)实现。在 Ultralytics Platform Agents 中,LLM 模块会将图像及其上游上下文(例如 YOLO26 检测结果)与提示词一起发送给视觉语言模型,因此,关于场景的问题会结合检测器的结果作答。










