Question Answering
質問応答(QA)システムは、自然言語の質問に対して直接回答します。抽出型、オープンドメイン型、生成型、ビジュアルQAを解説します。
質問応答(QA)は、自然言語で提示された質問に対し、ウェブページの一覧ではなく「オーストラリアの首都はどこですか?」に対する「キャンベラ」のような回答そのものを返す自然言語処理(NLP)のタスクです。QAシステムは質問を解釈し、文章、ドキュメントコレクション、データベース、またはモデル自身のパラメーターから回答に必要な情報を見つけ、回答を返すか作成します。検索エンジンの回答ボックス、バーチャルアシスタント、カスタマーサポートボット、社内文書に関する質問に答える大規模言語モデル(LLM)アシスタントはいずれもQAシステムです。
初期のシステムは、限られたデータベースに関する質問に回答していました。BASEBALL(1961年)はアメリカンリーグの1シーズンの試合に関する質問を処理し、LUNAR(1971年)はアポロ計画の月の岩石サンプルについて地質学者の質問に回答しました。オープンドメインQAのベンチマークは、1999年にTRECの質問応答トラックで始まりました。2011年2月にはIBM WatsonがJeopardy!の王者であるKen JenningsとBrad Rutterを破りました。Watsonは各問題に対して多数の回答候補を生成し、それぞれの根拠を数百のアルゴリズムで採点しました。
QAシステムの種類#
- 抽出型QA: 質問に回答する文章内の範囲を選択します。
- オープンドメインQA: 回答する前に、Wikipedia全体などの大規模なコレクションから関連する箇所を検索します。
- 検索拡張生成(RAG): 取得した箇所を条件としてLLMが回答を作成するため、複数の情報源から事実を組み合わせて引用できます。
- クローズドブックQA: ドキュメントを使わず、モデルの重みに保存された知識から回答するため、作り出された回答を検出しにくくなります。
- ナレッジグラフ QA: 質問を、エンティティと関係性のグラフまたはデータベースに対する構造化クエリに変換します。
- 視覚的質問応答(VQA): 画像や動画に関する質問に回答します。
抽出型QAとSQuAD#
2016年にPranav Rajpurkar氏らが公開したスタンフォード質問応答データセット(SQuAD)は、抽出型QAを標準的なベンチマークにしました。クラウドワーカーがWikipediaの記事について10万件を超える質問を作成し、各回答は記事内の一節になっています。ロジスティック回帰のベースラインはF1スコア51.0%を達成し、人間の86.8%を下回りました。スコアには完全一致と、予測回答と正解回答の間のトークンレベルのF1スコアが使われ、BERTは2018年にテストF1スコア93.2を達成しました。抽出型モデルは、各文章トークンが回答の開始位置または終了位置となる可能性をスコアリングします。
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」と「記事の一節」と回答します。文章には言語について何も書かれていませんが、モデルは3つ目の質問に「100,000」と回答します。これは、SQuAD 1.1で学習したモデルが必ず何らかの一節を返すためです。SQuAD 2.0(2018年)では、回答可能に見えるよう作成された、回答不能な質問が5万件以上追加されました。SQuAD 1.1でF1スコア86%を記録したシステムは、モデルが回答を控えるタイミングも判断する必要が生じたため、SQuAD 2.0では66%に低下しました。
オープンドメインQAとRAG#
オープンドメインシステムでは、数百万件の中から関連性の高い文章をいくつか見つけるリトリーバーと、その文章に基づいて回答するリーダーが処理を分担します。DrQA(2017年)はTF-IDFでWikipediaの記事を検索し、リカレントニューラルネットワークで記事を読み取りました。Dense Passage Retrieval(2020年)はTF-IDFをBERTの埋め込みとベクトル検索に置き換え、RAG(2020年)は検索した文章を回答文を生成するモデルに渡しました。リランカーは、リーダーに渡す前に検索結果の順序を並べ替えることがよくあります。RAGの著者らは、検索したテキストを条件として与えることで、検索を使わない同等のモデルよりも具体的で多様かつ事実に即した文章を生成できると示しました。また、引用された文章によって、読者は回答に含まれるハルシネーションを確認できます。
ビジュアル質問応答#
VQAでは、「バス停で何人が待っていますか?」のような質問と画像を入力し、コンピュータービジョンと言語理解を組み合わせるマルチモーダルAIが必要です。通常は視覚言語モデル(VLM)が使われます。Ultralytics Platform Agentsでは、LLMブロックが画像と上流のコンテキスト(YOLO26の検出結果など)をプロンプトとともに視覚言語モデルに送信します。そのため、シーンに関する質問には、検出器の結果をコンテキストとして回答できます。










