<< TOPへ
Question-to-Question Retrieval for Hallucination-Free Knowledge Access: An Approach for Wikipedia and Wikidata Question Answering
以下では、**大規模言語モデル(LLM)を用いて QA(Question & Answer)ペアを自動生成**するためのプロンプト例と、その際の**具体的な工夫・コンセプト・重要な点・コツ**を紹介します。あわせて、簡単なサンプルのQAや Wikidata を絡めたケースの応用例も示します。
---
## 1. QA作成プロンプトの例
### 1-1. Wikipedia等の文章からQAを作成するプロンプト例
以下のプロンプトは、日本語版Wikipediaや任意の解説文を入力として与え、そのテキストから「自然な質問」と「回答候補」となる箇所を生成するためのものです。
- **ポイント**: 「タイトル」「セクション名」「本文」というメタデータを渡すことで、モデルに文脈を理解させ、固有名詞や時系列を間違えにくくします。
```plaintext
あなたは優れた質問生成の専門家です。以下の入力テキストに基づいて、多くの人がインターネット検索で尋ねそうな質問を生成してください。その質問に対して本文から直接答えられる場合は、その答えがわかるような最小限の情報も併せて示してください。
【入力】
- 記事のタイトル: {{Article_Title}}
- セクションのタイトル: {{Section_Title}}
- 本文:
{{Section_Text}}
【ルール/要件】
1. 本文を読めば答えがわかる、事実ベースの質問を作ること。
2. 「誰が」「何を」「いつ」「どこで」「なぜ/どのように(How)」といったWH疑問文を中心にする。
3. 本文だけで答えられない内容や推測・意見・感想の質問は避ける。
4. 必要があればタイトルやセクション名を参照して、あいまいな表現を補足する(例:「彼」を「バラク・オバマ」に言い換える 等)。
5. 答えはできるだけ簡潔に。本文を丸ごと抜き出すのではなく、最小限にとどめる。
6. 1つの質問は1文でシンプルに終わらせる。
7. 出来る限り複数(5〜10問ほど)の質問をリストアップする。
【出力形式】
- 質問のリスト(箇条書き)
- それぞれの質問に対して本文中から取り出した答えや答えに相当する記述を示す
---
出力例(フォーマットのイメージ):
■質問1
Q: ○○はどこで生まれましたか?
A: 本文中の該当箇所: 「○○は△△で生まれた」
(または「A: △△」のように短くしても良い)
■質問2
Q: ○○が大統領に選ばれたのは何年ですか?
A: 〜〜年
…以下略
```
#### ● 簡単なサンプル
- **入力(例)**
- 記事タイトル: *バラク・オバマ (Barack Obama)*
- セクションタイトル: *Early Life and Education*
- 本文:
```
オバマはハワイ州ホノルルで生まれた。1983年にコロンビア大学を卒業し、その後シカゴでコミュニティ・オーガナイザーとして働いた。…
```
- **出力(イメージ)**
```
■質問1
Q: バラク・オバマはどこで生まれましたか?
A: ホノルル(ハワイ州)で生まれた
■質問2
Q: 彼は何年にコロンビア大学を卒業しましたか?
A: 1983年
■質問3
Q: 大学卒業後、どこでコミュニティ・オーガナイザーとして働いたのですか?
A: シカゴ
…
```
---
### 1-2. Wikidataの「主語-述語-目的語 (triple)」からQAを作成するプロンプト例
Wikidata のエンティティは「QID (主語) : PID (述語) : QIDまたは文字列(目的語)」という形式のトリプルで保持されています。これを自然言語の「誰が」「いつ」「どこ」という質問に変換する場合のプロンプト例です。
```plaintext
あなたは知識トリプルを自然言語の質問へ変換する専門家です。
以下の形式のトリプルを読み取り、それぞれについて適切なWH疑問文を生成してください。
【入力】
{{Subject}} : {{Predicate}} : {{Object}}
【ルール/要件】
1. Predicate(述語)が「founded by」であれば「誰が~を創設したのか?」のように変換する。
2. Predicateが時系列(Date)に関するものであれば「いつ~が…されたのか?」を使う。
3. なるべく日本語として自然でわかりやすい疑問文を作る。
4. 「文末は必ず「?」で終える」など形式上のルールを守る。
【出力形式】
- トリプルごとに1〜2問程度の質問を箇条書き
【追加例】
- “Apple : founded by : Steve Jobs” → 「アップルを創設したのは誰ですか?」
- “Eiffel Tower : located in : Paris” → 「エッフェル塔はどこにありますか?」
- “JavaScript : created by : Brendan Eich” → 「JavaScriptを作ったのは誰ですか?」
```
#### ● 簡単なサンプル
- **入力の例**
```
"Eiffel Tower : located in : Paris"
"JavaScript : created by : Brendan Eich"
```
- **出力のイメージ**
```
■Eiffel Tower : located in : Paris
- エッフェル塔はどこにありますか?
■JavaScript : created by : Brendan Eich
- JavaScriptを開発したのは誰ですか?
```
---
## 2. 作成されたQAの例
先述のプロンプトを使って得られる QA の具体例をいくつか示します。
1. **バラク・オバマ (Wikipediaの例)**
- Q: バラク・オバマはどこで生まれましたか?
A: ハワイ州ホノルル
- Q: 彼がコロンビア大学を卒業したのは何年ですか?
A: 1983年
- Q: 大学卒業後、どこでコミュニティ・オーガナイザーとして働きましたか?
A: シカゴ
2. **インド (Wikidataの例)**
- Q: インドはいつ独立しましたか?
A: 1947年8月15日
- Q: インドの首相を務めているのは誰ですか?
A: ナレンドラ・モディ(2014年~現在)
- Q: インドの首都はどこですか?
A: ニューデリー
3. **エッフェル塔 (Wikidataの例)**
- Q: エッフェル塔はどこにありますか?
A: パリ
4. **チェルノブイリ事故 (Wikipediaの例)**
- Q: チェルノブイリ事故で亡くなった人は何人ですか?
A: (該当箇所が本文にあればその具体数)
---
## 3. QA作成時の工夫・コンセプト・重要な点・コツ
### 3-1. 工夫・コンセプト
1. **「質問 to 質問」方式での高精度マッチング**
- 従来の「質問 to 段落」の類似度比較は構造の違いでスコアが低くなりがちですが、生成した「(潜在的に想定されうる)質問 to ユーザの質問」をベクトル類似度で比較すると、より高いスコアでマッチングされる傾向があります。
- 生成済みQAが膨大にあれば、ユーザ側の曖昧な問い合わせ(例:「長さ ナイル川」など)に対しても、ほぼ同義の事前生成された質問(例:「ナイル川の全長はどれくらいですか?」)と高スコアでマッチし、正確な該当本文を返すことができます。
2. **LLMによる質問生成を活用し、回答生成時の「幻覚(hallucination)」を防ぐ**
- 本番回答時にはLLMで新規文章を生成させず、「既に存在するWikipedia(もしくはWikidata)の該当テキストそのもの」を返却することで、誤った情報の生成を抑制できます。
3. **多彩な質問パターンを事前生成する**
- 多様なWH疑問(Who/What/Where/When/Why/How)や、数字・割合・人名・地名に関する多彩なバリエーションの質問を作っておくことで、ユーザの曖昧な問い合わせにも対応できます。
### 3-2. 重要な点
1. **テキストの分割単位(段落・節・文)の扱い**
- Wikipedia等は1記事が非常に長いので、適切な単位(パラグラフ、節等)ごとに切り分け、その単位ごとに質問を生成すると管理しやすいです。
2. **固有名詞・代名詞の置き換え・補足**
- 「彼」「彼女」「それ」といった代名詞を、質問生成時に明示的に固有名詞に置き換えると、モデルやユーザが誤解しにくくなります。
3. **否定形やYes/No質問は避ける**
- 「○○は△△ではないのですか?」のように、本文だけだと答えが一意ではないケースはできるだけ避けましょう。
4. **重複・類似質問の削減**
- 同じ意味合いの質問が繰り返し生成されるのを防ぐ工夫が必要です。LLMに「重複は避けてください」と明示するとよいでしょう。
### 3-3. コツ
1. **プロンプト内でモデルに役割・目標をはっきり与える**
- 「あなたは一流の問題作成者」「回答可能な質問のみ」などの指示を最初に書くことで、生成の質が安定しやすくなります。
2. **フォーマットやサンプルを事前に提示する**
- 出力形式の具体例を見せると、モデル出力がぶれにくいです。
3. **小分けにプロンプトを実行する(分割統治)**
- 非常に長い本文を一度に渡すと、LLMのコンテキスト上限を超える危険があります。数パラグラフごとに分割し、質問を生成するのが安全です。
4. **対象言語を明確に指定する**
- 日本語記事から日本語の質問を作る場合は、プロンプト内で「日本語で出力してください」と明確に指示しておきます。
5. **同じ文章で数回実行し、差分をマージ**
- 一度の生成では網羅性が欠ける場合があるため、複数回生成し、結果を統合する方法もあります。
---
## 4. まとめ
- **QAペア生成のプロンプト設計**では、事前に「タイトル」「セクション名」などの文脈を与え、**WH疑問中心**かつ**本文に依存した直接的な回答**を要求するよう指示すると効果的です。
- 質問を事前に大量生成しておくことで、ユーザからの問い合わせとの**ベクトル類似度を高速かつ高精度で計算**でき、**LLMによる回答生成自体を行わずとも正確な回答箇所を提示**できます。
- 本文(あるいはWikidataなどの構造化データ)そのものを直接返すアプローチは**ハルシネーションを抑える**上でも有用です。
これらのプロンプトを土台として、実際の開発状況や使用するLLMの特性に合わせて最適化を行ってみてください。以上が**QA生成プロンプト**とその**例・重要な工夫・ポイント**になります。