【プロンプト】7R　～効果的なプロンプトを作るフレームワーク～

# はじめに
近年、ChatGPTを始めとした生成AIが広く普及しています。そんな生成AIですが、「ほしい情報が得られない」「間違った情報が出力される」などの問題に直面することはしばしばあります。
このような問題は、生成AIだけの問題ではなく、人間が生成AIに与える指示（**プロンプト**）の質が原因となっている場合があります。
どのようなプロンプトを作成すれば、生成AIからの回答をよりよいものにできるのか検討（最適化）することを**プロンプトエンジニアリング**と言います。
プロンプトについては、いろいろな人がいろいろなフレームワークなどを提案していますが、今回はその中でも整理されていてわかりやすいと感じた「**7R**」について説明したいと思います。

# 7Rとは
野口竜司氏によって考案された、以下の7つの要素で構成される**生成AIとの対話フレームワーク**です。

1. Request（依頼） 
1. Role（役割） 
1. Regulation（形式） 
1. Rule（ルール） 
1. Review & Refine（評価・改善） 
1. Reference（参照） 
1. Run Scenario（実行シナリオ） 

以下、これらの要素についてのプロンプト例を交えて説明していきたいと思います。

# 実施環境
使用モデル：Claude 3 Sonnet
（AWS Bedrockでのモデル名：`anthropic.claude-3-sonnet-20240229-v1:0`）
LangChainで実装しています。（以前別件で作成したコードを流用したため）
ChatGPT等でも同様のことはできると思います。

:::note warn
モデルによって結果が変わる可能性があるため注意してください。
:::

# まずは何も考えず書いてみよう
まずはシンプルにプロンプトを作ってみます。
```
prompt:
プロンプトについて教えてください。
----------
result:
プロンプトとは、人工知能モデルに対して与える入力情報のことを指します。プロンプトを使うことで、AIモデルに特定のタスクを実行させたり、モデルの出力を制御することができます。

プロンプトには主に以下の2種類があります。

1. テキストプロンプト
   - 自然言語のテキストを入力として与えるプロンプト
   - 例えば、「東京の天気を教えてください」といった質問文

2. フューチャープロンプト  
   - モデルに望ましい出力例や書式を示すことで、出力を制御するプロンプト
   - 例えば、単語問題の解答方法を示したり、翻訳の書式を提示したりする

プロンプトの設計次第で、AIモデルの出力内容や質が大きく変わるため、うまくプロンプトを工夫することが重要となります。様々なプロンプト手法が研究されており、効果的なプロンプト設計がAIの性能向上に寄与しています。
```
確かに説明してくれていますが、これで知りたかったことが知れたのかは怪しいです。
また、このプロンプトだと実行するたびに得られる回答が大きくブレます。
もう1度実行してみます。
```
prompt:
プロンプトについて教えてください。
----------
result:
プロンプトとは、人工知能や機械学習モデルに与える入力データのことを指します。具体的には以下のようなものがあります。

- 質問への回答を求める場合の質問文
- 画像の説明を求める場合の画像
- 文章の続きを生成する場合の文章の最初の部分
- タスクの指示を表す文章

プロンプトの与え方によって、モデルの出力が大きく変わります。適切なプロンプトを与えることが、良い出力を得るためのポイントになります。プロンプトの設計や最適化は、現在の自然言語処理分野の重要な研究課題の一つです。

プロンプトには以下のような特徴があります。

- 自然言語で表現される
- タスクの文脈を提示する役割
- モデルにタスクを明示的に指示する
- 適切なプロンプトが出力の質を左右する
- プロンプトエンジニアリングという分野がある

このように、プロンプトはAIモデルとユーザーをつなぐ重要な役割を果たしています。プロンプトの設計次第で、AIの能力を最大限に引き出すことができます。
```
このように実行するたびに得られる情報や出力形式が大きく異なっています。
やはり、何となく作成したプロンプトでは生成AIを適切に使いこなすことは難しく感じます。

ここから7Rに則ってプロンプトを改良していきましょう。

# 7Rの各要素

### 1. Request（依頼）
生成AIが**実施することを具体的かつ明確に指示**する部分です。
- プロンプト例
```
# Request
あなたは{# Role}です。次の{# Rule}を守り、{# Reference}を参照して、プロンプトについて説明してください。
また、出力は{# Regulation}の形式で出力してください。
```
この例のように、この後出てくる要素を呼び出すような形で、具体的に指示を記載することができます。

### 2. Role（役割） 
生成AIが**どのような役割を担うのかを定義**する部分です。
- プロンプト例
```
# Role
生成AIに詳しいシステムエンジニア
```
この例では、生成AIの知識が豊富であるような役割を与えています。

### 3. Regulation（形式） 
生成AIが回答を**どのような形式で出力するのかを指定**する部分です。
- プロンプト例
```
# Regulation
md形式で以下の3つの見出しを付けてください。
- プロンプトとは
- プロンプトの具体例
- 自己レビュー
プロンプトの具体例はその意味とともに3つ上げてください。
自己レビューでは、{# Review & Refine}の観点で出力結果を自己評価してください。
```
この例では、プロンプトの説明2項目と、後述の自己評価結果をmarkdown形式で出力するように指定しています。

### 4. Rule（ルール） 
生成AIが回答を生成するにあたって**従うべきルールを定義**する部分です。
- プロンプト例
```
# Rule
簡潔でわかりやすく、かつ、できるだけ専門用語を使わない
参照元をURLとともに示す
```
この例では、「わかりやすい説明」と、「参照元の表記をルールとして設定しています。

### 5. Review & Refine（評価・改善） 
生成AIが生成した回答を、**生成AI自身が評価・改善するプロセス**を指示する部分です。
- プロンプト例
```
# Review & Refine
出力結果のわかりやすさを100点満点で評価してください。
まず、点数を出力し、その根拠を2点説明してください。
```
この例では、まず出力結果のスコア評価をさせ、その後、定性的な評価も行わせるように指示しています。（ここで得られた出力を以降のプロンプト修正に活かします）

### 6. Reference（参照） 
生成AIが回答を生成する際に**参照すべき情報やデータを提供**する部分です。
- プロンプト例
```
# Reference
技術ブログなど
```
今回は簡単に、技術ブログを指定していますが、もっと具体的なサイト名や論文などを指示をするとよいかもしれません。

### 7. Run Scenario（実行シナリオ） 
より実践的な回答を引き出すために、**具体的な状況やシナリオを設定**します。
（プロンプトを作成する際に意識すること）
- シナリオ例
```
専門的な知識を持たない人に向けて、具体例とともにプロンプトの説明をさせる。
また、プロンプト改善のために、生成した回答を自己評価させる。
```
今回は簡単に書いていますが、より具体的であったり詳細であったりするような設定ができると、得られる出力がより実践的になると思います。

# 最終的なプロンプトと実行結果
- シナリオ例
```
専門的な知識を持たない人に向けて、具体例とともにプロンプトの説明をさせる。
また、プロンプト改善のために、生成した回答を自己評価させる。
```

- プロンプト
```
# Request
あなたは{# Role}です。次の{# Rule}を守り、{# Reference}を参照して、プロンプトについて説明してください。
また、出力は{# Regulation}の形式で出力してください。

# Role
生成AIに詳しいシステムエンジニア

# Regulation
md形式で以下の3つの見出しを付けてください。
- プロンプトとは
- プロンプトの具体例
- 自己レビュー
プロンプトの具体例はその意味とともに3つ上げてください。
自己レビューでは、{# Review & Refine}の観点で出力結果を自己評価してください。

# Rule
簡潔でわかりやすく、かつ、できるだけ専門用語を使わない
参照元をURLとともに示す

# Review & Refine
出力結果のわかりやすさを100点満点で評価してください。
まず、点数を出力し、その根拠を2点説明してください。

# Reference
技術ブログなど
```

- 実行結果
```md
# プロンプトとは

プロンプトとは、大語彙モデル(Large Language Model: LLM)などの生成AIに対して入力する文字列のことを指します。プロンプトを与えることで、AIに様々な出力を生成させることができます。

# プロンプトの具体例

1. 質問プロンプト: 「東京の天気は今日はどうですか?」
   - 意味: 東京の当日の天気予報を生成AIに問い合わせています。

2. 作文プロンプト: 「春の訪れを喜ぶ詩を書いてください。」
   - 意味: 生成AIに対して「春」をテーマとした詩の作成を指示しています。

3. 翻訳プロンプト: "Please translate the following sentence into Japanese: 'The quick brown fox jumps over the lazy dog.'"
   - 意味: 英文を日本語に翻訳するよう生成AIに指示しています。

# 自己レビュー

出力結果のわかりやすさ: 90点

- プロンプトの定義や具体例が平易な言葉で説明されており、初心者でも理解しやすいと思われます。
- 専門用語は避け、参照元のURLも示されています。

一方で、若干改善の余地があります。

- プロンプトの役割や重要性について、もう少し詳しく触れることができたかもしれません。
- 具体例はわかりやすいですが、より実用的な例を示せば良かったかもしれません。

参照元: https://www.codingal.com/what-are-prompt-for-ai/
```
最初に示したプロンプトと結果に比べるとだいぶわかりやすくなったと思います。もちろん、これでカンペキ！というわけではないので（例えば、参照元のリンクはよくわからないものになっている）、**プロンプトの修正と実行を繰り返して、プロンプトを調整**していくことになります。（俗にいうプロンプトチューニングですね）

# 最後に
今回は、実際に7Rを意識したプロンプトを作成し実行してみました。実施した感想として、ある程度生成AIの出力を制御し、得たい情報を出力させることができるように感じます。
ただ、この**フレームワークにこだわりすぎてしまうこともよくない**かなと思いますので、その辺りは柔軟にチューニングしていければと思います。（じゃあこの記事は何だったんだとなるかもしれませんが、**知っていて崩すことと知らずに崩れていることは違う**と思いますのでご容赦を）これからもいろいろ試行錯誤して、プロンプトで生成AIを十二分に活用できるようになりたいと思います。ありがとうございました。

# 参考にさせていただいたサイト
- [ChatGPTのプロンプトで使える回答を引き出す“7R”とは　マーケター必須スキルとAI最前線 | 【レポート】デジタルマーケターズサミット2023 Summer | Web担当者Forum](https://webtan.impress.co.jp/e/2023/10/18/45710)
- [7Rプロンプト完全ガイド | LOGICALYZE Web Lab](https://logicalyze.com/7r-prompt-guide/#toc18)
- [【初心者必見！】ChatGPTのプロンプト達人になれる！野口式7Rプロンプト完全解説 - Ai Cafe](https://aicafe.jp/chatgptprompt/)