段階的に情報を洗練するAIチャットプロンプトの実装方法

<a href="https://it.blogmura.com/ranking/in?p_cid=11119283" target="_blank"><img src="https://b.blogmura.com/it/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログへ" /></a><br />
# はじめに
この記事では、ユーザーからの質問に対して段階的に情報を洗練し、最終的な回答を導くAIチャットプロンプトの実装方法について紹介します。具体的には、大阪府の行政サービスに関する質問を取り上げ、そのプロセスを詳しく説明します。

# AIチャットプロンプトとは
AIチャットプロンプトとは、ユーザーから入力された質問や要求に対して適切な回答やアクションを提供するためのガイドラインやテンプレートです。これによって、より正確で有用な応答が可能になります。

# 段階的な情報洗練の必要性
一度にすべての情報を提供することは難しい場合があります。例えば、大阪府の行政サービスについて質問された場合、一度で全ての詳細情報（担当サービス、区分、具体的なサービス名など）を提供することは難しいです。そこで段階的なアプローチが有効です。

## 具体例：大阪府の行政サービスに関する質問
### ステップ1：初回プロンプトとクエリキーワード生成

### ステップ1: 初回プロンプト
最初に、ユーザーからの質問を受け取り、それに基づいてクエリキーワードを生成します。

**ユーザー入力（最初の入力）:**
「大阪府の行政サービスに関する質問」

```
ユーザーからの質問: 「大阪府の行政サービスに関する質問」

以下のフォーマットでクエリキーワードを生成してください。
フォーマット:
担当サービス: [担当サービス名]
区分: [区分名]

回答例:
担当サービス: 福祉
区分: 高齢者支援
```

**AI回答例:**
```
担当サービス: 福祉
区分: 高齢者支援
```

### ステップ2: クエリキーワードを指示として再入力
次に、生成されたクエリキーワードを基に、さらに詳細な情報を引っ張ってきます。

**ユーザー入力（AI回答を指示として再入力）:**
「担当サービス: 福祉 区分: 高齢者支援」

**AIプロンプト（参考情報を引っ張ってくる）:**
```
クエリキーワード:
担当サービス: 福祉
区分: 高齢者支援

以下のフォーマットで詳細情報を提供してください。
フォーマット:
サービス名: [具体的なサービス名]
提供場所: [提供場所]
連絡先情報: [連絡先]

回答例:
サービス名: 高齢者向け福祉相談センター
提供場所: 大阪市北区
連絡先情報: 06-1234-5678
```

**AI回答例（詳細情報）**
```
サービス名: 高齢者向け福祉相談センター
提供場所: 大阪市北区
連絡先情報: 06-1234-5678
```

### ステップ3（オプション）:
さらに詳細な情報が必要であれば、再度指示として入力し、追加の参考情報を引っ張ってくることができます。

**ユーザー入力（再度指示として再入力）:** 
「サービス名：高齢者向け福祉相談センター」

**AIプロンプト（追加詳細情報）:** 
```
クエリキーワード：
サービス名：高齢者向け福祉相談センター

以下のフォーマットで追加詳細情報を提供してください。
フォーマット：
利用条件：[利用条件]
申請方法：[申請方法]

回答例：
利用条件：大阪府在住の65歳以上の方
申請方法：電話またはオンライン申請フォームから申し込み

```

**AI回答例（追加詳細情報）:** 
```
利用条件：大阪府在住の65歳以上の方
申請方法：電話またはオンライン申請フォームから申し込み
```

このような形で、段階的に質問内容を洗練し、最終的な回答まで導くことができます。各ステップで生成された回答は次のステップへの指示として使用されるため、一貫したプロセスで詳細な情報が得られます。

### 記事の追加セクション

#### Retrieve Argument Generation（RAG）による指示プロンプトの選択

RAGは、ユーザーからの質問に基づいて適切な指示プロンプトを選択するための技術です。以下に、具体的なロジックと例を示します。

##### ステップ1: ユーザーからの質問受け取り

**ユーザー入力:**
「大阪府の行政サービスに関する質問」

##### ステップ2: データソースの準備

まず、3つのデータソース（プロンプトテンプレート）を準備します。

**データソース1: 福祉関連サービス**
```markdown
ユーザーからの質問：「{user_question}」

以下のフォーマットでクエリキーワードを生成してください。
フォーマット:
担当サービス: 福祉
区分: [区分名]

回答例:
担当サービス: 福祉
区分: 高齢者支援
```

**データソース2: 教育関連サービス**
```markdown
ユーザーからの質問：「{user_question}」

以下のフォーマットでクエリキーワードを生成してください。
フォーマット:
担当サービス: 教育
区分: [区分名]

回答例:
担当サービス: 教育
区分: 学校支援
```

**データソース3: 医療関連サービス**
```markdown
ユーザーからの質問：「{user_question}」

以下のフォーマットでクエリキーワードを生成してください。
フォーマット:
担当サービス: 医療
区分: [区分名]

回答例:
担当サービス: 医療
区分: 緊急医療支援
```

### RAGの概要
Retrieve Argument Generation（RAG）は、ユーザーからの質問に対して関連する情報を取得し、その情報を基に適切なプロンプトを生成する手法です。RAGでは、まず関連するデータを取得し、そのデータに基づいて指示プロンプトを選択します。

### 具体例

#### ユーザー質問
- **ユーザー入力:** 「大阪府の行政サービスに関する質問」

#### ステップ1: データの取得
まず、RAGシステムは以下の3つのデータソースから関連情報を取得します。

1. **データソースA:** 大阪府の福祉サービスに関する情報
2. **データソースB:** 大阪府の教育サービスに関する情報
3. **データソースC:** 大阪府の交通サービスに関する情報

#### ステップ2: データ評価と選択
次に、取得したデータを評価し、どのプロンプトが最も適切かを判断します。この評価は、以下の基準で行われます。

- **関連性:** ユーザー質問と各データソースがどれだけ関連しているか。
- **具体性:** 各データがどれだけ具体的な情報を提供できるか。
- **ユーザー意図:** ユーザーが求めている情報（福祉、教育、交通など）を推測。

#### ステップ3: プロンプト選択
評価結果に基づいて、最も関連性が高いプロンプトが選択されます。たとえば、

- **評価結果:**
  - データソースA（福祉）: 高い関連性
  - データソースB（教育）: 中程度の関連性
  - データソースC（交通）: 低い関連性

この場合、システムは**データソースA**（福祉サービス）に基づく指示プロンプトを選択します。

#### ステップ4: 指示プロンプト生成
選ばれたデータソースAから指示プロンプトが生成されます。

**生成された指示プロンプト例:**
```
クエリキーワード:
担当サービス: 福祉
区分: 高齢者支援

以下のフォーマットで詳細情報を提供してください。
フォーマット:
サービス名: [具体的なサービス名]
提供場所: [提供場所]
連絡先情報: [連絡先]

回答例:
サービス名: 高齢者向け福祉相談センター
提供場所: 大阪市北区
連絡先情報: 06-1234-5678
```

### 結論
このようにして、ユーザーからの質問「大阪府の行政サービスに関する質問」をトリガーとしてRAGシステムが適切な指示プロンプトを選択できるロジックが構築されます。これによって、ユーザーは求めている具体的な情報へとスムーズにアクセスできるようになります。


### サザエさんのストーリーで説明するRAG

#### シナリオ

サザエさんが家族のために大阪府の行政サービスについて調べようとしています。しかし、サザエさんは一度にすべての情報を集めるのは難しいと感じています。そこで、カツオが段階的に情報を集める方法を提案します。

#### 登場人物と役割

1. **サザエさん**: 家族のために行政サービスについて調べたいが、どこから始めればいいかわからない。
2. **カツオ**: サザエさんに段階的な情報収集方法を提案し、具体的な手順を説明する。
3. **波平**: 高齢者支援サービスについて知りたい。

#### ストーリー

##### サザエさんの悩み
サザエさんは家族全員のために大阪府の行政サービスについて調べたいと思っています。しかし、一度にすべての情報を集めるのは難しいと感じています。

**サザエさん:** 「波平お父さんが高齢者支援サービスについて知りたいって言ってたけど、一度に全部調べるのは大変だわ。」

##### カツオの提案
カツオが段階的な情報収集方法を提案します。

**カツオ:** 「お姉ちゃん、一度に全部調べる必要はないよ。まずは大まかなカテゴリで情報を集めて、それから具体的な情報を探すようにすればいいんだ。」

##### ステップ1: 大まかなカテゴリで情報収集
まず、サザエさんは大まかなカテゴリで波平が知りたい高齢者支援サービスについて調べます。

**カツオ:** 「まずは『高齢者支援』っていうカテゴリで探してみよう。」

**サザエさん:** 「なるほど、それなら簡単そうね。」

##### ステップ2: 具体的なクエリキーワード生成
次に、カツオが具体的なクエリキーワード生成方法を説明します。

**カツオ:** 「次に、『高齢者支援』というカテゴリから具体的なクエリキーワードを生成しよう。例えば、『地域高齢者サポート』とかね。」

##### ステップ3: 詳細情報取得
最後に、生成されたクエリキーワードを使って詳細な情報を取得します。

**カツオ:** 「そして、そのクエリキーワードで詳細な情報を探すんだ。例えば、『地域高齢者サポートセンター』とか『連絡先』とかね。」

##### 結果
最終的に、サザエさんは段階的なプロセスで必要な情報を効率よく集めることができました。

**波平:** 「ありがとう、サザエ。これで地域高齢者支援センターについて詳しく知ることができたよ。」

### まとめ

このストーリーでは、以下の理由から段階的な情報収集が重要であることがわかります：

1. **効率性:** 一度にすべての情報を集めることは難しいため、大まかなカテゴリから始めて徐々に詳細化することで効率よく情報収集できる。
2. **正確性:** 大まかなカテゴリから始めることで、関連性の高い正確な情報が得られる。
3. **ユーザー体験向上:** 段階的なプロセスによってユーザー（この場合はサザエさん）が混乱せずスムーズに必要な情報へアクセスできる。

### カツオの役割

- **ガイド役:** カツオは段階的なプロセスによって効率よく正確な情報収集方法をガイドする役割。
- **教育役:** サザエさんや読者（視聴者）に対して、このプロセスがどれだけ有用か教育する役割。

このようにして説明すると、高齢者にもわかりやすく伝わりやすいと思います。