見出し画像

プロンプトエンジニアリングの極意:Microsoft Copilot編(ChatGPTにも使えるよ)

こんにちは!生成AIプロンプトデザイナーのヒロです!

>>>自己紹介記事はこちら

プロンプトエンジニアリングの極意:Microsoft Copilot編

生成AIのサービスを提供している代表的な企業は4つあり、それぞれの企業で異なる生成AIを提供しています。

【生成AIを提供している代表的な会社】

1:Open AI = ChatGPT(チャットジーピーティー)
2:Microsoft = Copilot(コパイロット)
3:Google = Gemini(ジェミニ)
4:Anthropic = Claude(クロード)

前回はChatGPTの公式の見解について解説しましたが、今回はMicrosoft社が提供するCopilot(コパイロット)の公式の見解について解説していこうと思います。

各社の利用方法をまとめると結局は、各社同じようなことを言っていますが、各社が提供する公式の見解(使い方)をみていくことで、参考にしていただける点は多いはずです。

生成AI(コパイロット)の使い方:Microsoftの見解

MicrosoftのCopilot(コパイロット)では生成AIの使い方として「プロンプト エンジニアリングの手法」というタイトルで使い方を示しています。

【プロンプト エンジニアリングの手法】
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/prompt-engineering?tabs=chat

ご覧いただければわかりますが、日本語に翻訳はされているものの、不自然な日本語が多かったり、わかりにくい箇所が多かったりと、読み進めたり理解を深めるのがとても大変です(笑)

例えば・・・

言語モデルを新しいタスクに適応させる一般的な方法は、少数ショット学習を使用するというものです。 少数ショット学習には、モデルにコンテキストを追加するプロンプトの一部として、一連のトレーニング例が用意されています。
Chat Completions API を使用する場合、ユーザーとアシスタントの間の一連のメッセージ (新しいプロンプト形式で記述) は、少数ショット学習の例として機能します。 これらの例はモデルを事前処理するために使用でき、特定の方法で応答し、特定の動作をエミュレートし、一般的な質問に対する回答をシード処理できます。

プロンプトエンジニアリングの手法より

これは少数ショット学習についての項目なのですが、日本語は読めるものの、多分このままでは理解できないと思います(笑)

どうにかならないものかと思うのですが、読み進めていくと結局は同じような事を言っているなという印象を受けます。

OpenAIとマイクロソフトの関係

あまり知らない人が多いのですが、ChatGPTの開発元であるOpenAIはサル・アルトマンやX(旧:Twitter)やテスラなどを手掛けるイーロンマスクらなどの著名なテクノロジー関連の起業家や研究者によって2015年に非営利法人として設立された組織です。

イーロンマスクは意見の相違などを理由にして2018年にOpenAIを離れ、その後2019年に営利法人が設立され、その後マイクロソフト社から10億ドルの出資を受け、2023年には100億ドルの出資を受けています。

こうした経緯もあって、マイクロソフトのCopilot(コパイロット=旧:BingChat)ではChatGPTが利用されていて、クラウドサービスのAzureではOpenAIのAPIが提供されています。

生成AIを使いこなすための、プロンプトエンジニアリングの手法の解説

ここからは解説に移っていきます。

プロンプトエンジニアリングの手法では17の項目から成り立っていますが、不要なところも多いので、今回は大事なところだけ抜粋をしていきます。

ベスト プラクティス

まずはベストプラクティスについてですが下記のように記されています。

・具体的にする。 解釈の幅をできるだけ狭めます。 操作領域を制限します。

・わかりやすくする。 例示を使用します。

・繰り返す。 場合によって、モデルに対して繰り返し対話する必要があります。 プライマリ コンテンツの前後に指示を指定し、指示、キューなどを使用します。

・順序が重要。 モデルに情報を提示する順序が、出力に影響する場合があります。 指示をコンテンツの前に配置するか ("summarize the following…" (以下を要約してください))、コンテンツの後に配置するか ("summarize the above…" (上記を要約してください)) によって、出力が異なる場合があります。 少数ショットの例の順序も重要です。 これは、最新性バイアスと呼ばれます。

・モデルに "out" (アウト) を指定する。 モデルが割り当てられたタスクを完了できない場合、モデルに代替パスを指定すると役立つ場合があります。 たとえば、テキストで質問するとき、"回答がない場合は、"見つかりませんでした" と応答してください" という内容を含めることができます。これにより、モデルが誤った応答を生成するのを回避できます。

これはChatGPTを含む、どの大規模言語モデル(LLM)でも同じことを言っています。

具体的に(そのままだといろんな解釈ができるので領域を狭める)
わかりやすく(例文やヒント、背景情報などで細かく伝える)
繰り返す
順序が大事(最初と最後を記憶している)
出力を指定する(クエリはここまで、ここから書いてねと指示を与える)

これがいずれの生成AIでも大事だと言っているわけです。

指示は具体的に、わかりやすくしてね。繰り返してね。そして最初と最後をよく記憶しているので大事なことは最初と最後に言ってね。出力して欲しい場所はここからだよって指示してね。

ということです。

その上で具体的に指示する内容として下記の通りの使い方を推奨しています。

1:明確な命令から始める
2:最後に命令を繰り返す
3:出力を事前処理する
4:明確な構文を追加する
5:タスクを中断する
6:アフォーダンスの使用
7:思考の連鎖プロンプティング
8:出力構造の指定
9:根拠付けるコンテキストを提供する
10:少数ショット学習
11:メタ プロンプト

1:明確な命令から始める

「最初に大事な事を指示してね」という事です。

現在の大規模言語モデル(LLM)は、最初と最後の文脈を大事だと考えています。

そのため最初と最後に最も大事な事を入力すると、精度の高い出力になるというわけです。

2:最後に命令を繰り返す

「プロンプトの最後で指示を繰り返すといいですよ」と言っています。

これは大規模言語モデル(LLM)が「確率的に次に続く最もらしい文章を生成する機械」であるという性質上、最後の文脈に沿った回答がなされやすいという事です。

僕の感覚ですと、一般的な使い方ではさほど影響はありませんが、プロンプティングテクニックを応用した極端に長い文章ですと、影響を受けるように思います。

なので、指示するタスクが複雑だったり、全体として長い文章になってしまう場合は、念の為、最後でも指示内容を繰り返すといいと思います。

(中間を忘れてしまうので)

また出力してやり取りを重ねている中でも同じことがいえ、ChatGPTやCopilotのような大規模言語モデルでは、どんどん前半部分の会話を忘れていってしまいます。

中間の会話が抜け落ちてしまい、ぽっかり穴が空いたような状態になってしまうことがあり、これを防ぐために(中間の推論能力を落とさないために)、適宜「これまでの内容をまとめて」などわざと指示出しをして思い出すようにしてもらうこともあります。

このやり方は有効なので、ぜひ使ってみてください。

3:出力を事前処理する

これは「最後に命令を繰り返す」に似ているのですが、出力して欲しい内容の方向性を事前に定めて上げるということです。

つまり・・・

吾輩は

と入力するだけではなく

入力:
吾輩は
出力:
猫である。名前は

と言ったように次に続いてほしい文脈を「あえて指示だし」しておくことで望ましい解答が得られるようになりますよということです。

吾輩はだけだと選択肢が多すぎるため、何についてのクエリなのか理解できないですが「猫である。名前は」とつづけて上げるkとで、「まだない」という文脈が自然と生成されるようになります。

これは大規模言語モデルの基本である「確率的に次に続く文章を生成する」事を利用したテクニックであり有効なプロンプトテクニックの一つなので覚えておくと良いと思います。

4:明確な構文を追加する

生成AIが理解しやすいように、わかりやすく指示してねという事です。

例えば、マークダウン形式で「### 指示:」「### 出力:」などのコンポーネント(要素)を使ったり、「**」(アスタリスク)により言葉を強調したり、セクションを区切る事機に区切り文字「---」などを使って機会がわかるように指示を出してねという事です。

これにより、どの言葉が重要で、どの言葉が重要でないなどの判断ができるようになり指示が明確になります。

他にはJSON形式であったりXMl形式など、機械が理解しやすい言語を利用するとより伝わりやすくなり回答精度を上げることができます。

5:タスクを中断する

ごちゃごちゃと指示を出すのではなく、段落をつけたり区切りを使ったりコンポーネントを使ったりして、指示を整理して伝えてねということです。

機械だからとごちゃごちゃといろんな指示を整理せずに出すのではなく、構文を明確にしてセクションを区切り、ステップごとにタスクを分割するなど、理解しやすいように指示を出せということです。

6:アフォーダンスの使用

アフォーダンスとは、例えば・・・

革のビジネスバッグのレビューを書いて

とするのではなく、

以下の観点でレビューを書いてください。
- 商品名:革のビジネスバッグ
- ターゲット:30代会社員
- トーン:客観的
- 文字数:400文字

のように、プロンプトを構造化し、必要な情報が一目でわかるように記述してねということです。

ポイントは4つで

1:明確な構造
2:具体的な指示
3:一貫した形式
4:直感的な理解

になります。

「1:明確な構造」とは箇条書きや段落で情報を整理したり、重要な部分は強調や区切りなどを利用することで、「2:具体的な指示」とは必要な情報をもれなく記載し、期待する出力形式を明示すること。さらに「3:一貫した形式」とは同じような目的なら同じ構造を使い、テンプレート化し「4:直感的な理解」とは呼んでいてすぐに何を求めているのかわか理、余計な説明が不要な事を言います。

「このプロンプトを書けば、こういう結果が得られそうだ」と予測をして、書いてねということです。

7:思考の連鎖プロンプティング

これは言わずもがな、Chain of Thought(CoT)のテクニックで、ステップバイステップで考えさせるような指示を出すということです。

生成AIはいきなりゴールに向かおうとしますから、ちょっと立ち止まって落ちついてしっかり手順を踏む「ステップバイステップで」という指示を出すことで回答精度を高められるというわけです。

8:出力構造の指定

これは構造化テクニックのことです。

生成AIの出力構造を指定するための主なテクニックとしては

1:マークダウン形式の活用

以下の形式でレポートを作成してください:

# タイトル
## 概要
[ここに概要を記載]

## 詳細分析
### 1. [分析項目1]
[内容]

### 2. [分析項目2]
[内容]

## まとめ
[結論をここに記載]

2:XMLタグによる構造化

以下のXML構造で結果を出力してください:

<report>
    <title>レポートタイトル</title>
    <summary>要約をここに</summary>
    <details>
        <section>
            <heading>セクション1</heading>
            <content>内容</content>
        </section>
    </details>
</report>

3:JSONフォーマット

以下のJSON構造で商品情報を出力してください:
{
    "product_name": "商品名",
    "price": "価格",
    "features": [
        "特徴1",
        "特徴2"
    ],
    "review": {
        "rating": "評価点",
        "comment": "コメント"
    }
}

4:テーブル形式

以下の列を持つテーブルで出力してください:
| 項目 | 説明 | 評価 |
|-----|------|-----|

などがあり、実践的なコツとしては、

1:一貫性の維持

  • 同じ種類の情報は同じ構造で指定

  • 階層構造を明確に

2:具体的な例示

以下の形式で3つの例を出力してください:

商品名:[商品名]
価格:[価格]円
特徴:
- [特徴1]
- [特徴2]

※このような形式で3つ出力

3:制約条件の明示

以下の条件で出力してください:
- 各セクション200字以内
- 箇条書きは最大5項目まで
- 見出しは3階層まで

4:エラー処理の指定

データが不足している場合は以下の形式で出力:
<error>
    <message>データが不足しています</message>
    <missing_fields>
        [不足しているフィールド]
    </missing_fields>
</error>

などがあります。

これらの構造化テクニックを使うことで

  • AIからの出力が予測可能に

  • 後処理やデータ抽出が容易に

  • 一貫性のある結果が得られる

  • エラーハンドリングが明確に

なります。ただし、過度に複雑な構造は避け、目的に応じて適切な複雑さを選ぶことが重要なことになります。​​​​​​​​​

9:根拠付けるコンテキストを提供する

回答精度を上げたいならきちんと生成に必要な根拠となるデータを提供してねということです。

自由にさせたい時は、根拠となるデータを少なくして、より精度を上げた回答を得たいのであれば生成の元となるデータを提供してくださいということです。

生成AIにきちんとしたデータを与えることで、方向性を定めたり、考える際の拠り所や基本方針としてもらうなど、プロンプトにデータを与えるなど工夫を加えると、より精度の高い回答が得られやすくなるというわけです。

10:少数ショット学習

少数ショット学習(Few-shot Learning)とは、簡単に言うと、「こういう感じで答えて欲しい」という例を2-3個プロンプトに含めることで、AIに期待する出力パターンを学習させる手法です。

具体例で見ていくと・・・

1:ゼロショット(例なし)

以下の映画の短い感想を書いてください:
「となりのトトロ」

2:少数ショット(例あり)

以下の形式で映画の感想を書いてください:

映画:バック・トゥ・ザ・フューチャー
感想:時間旅行というSF要素を、家族愛や友情と絶妙に組み合わせた名作。主人公マーティの活躍と、ドクとの掛け合いが見どころ。
評価:★★★★★

映画:ショーシャンクの空に
感想:希望を失わない人間の強さを描いた感動作。刑務所という閉ざされた空間で、自由を求める魂の物語。
評価:★★★★★

では、以下の映画について同じ形式で書いてください:
映画:となりのトトロ

少数ショット学習の利点の利点としては

1:出力フォーマットの制御

  • 一貫した形式で回答を得られる

  • 書き方の細かいニュアンスを伝えやすい

2:スタイルの指定

  • 文体や表現の傾向を例示できる

  • 専門性のレベルを調整できる

3:評価基準の明確化

  • 具体例があることで期待値が明確に

  • 良い例と悪い例を対比できる

があり、実践的な使い方としては

  1. 基本パターン

良い例:
入力:[状況]
出力:[望ましい回答]

悪い例:
入力:[状況]
出力:[望ましくない回答]

では、この状況について回答してください:
[実際の質問]

2:段階的な例示

初心者向け説明例:
[簡単な説明]

中級者向け説明例:
[詳しい説明]

専門家向け説明例:
[専門的な説明]

では、[対象者]向けに説明してください:
[トピック]

3:複数の観点を含む例

例1(ポジティブな視点):
[ポジティブな分析]

例2(課題を指摘):
[改善点の指摘]

では、以下について分析してください:
[分析対象]

などがあります。少数ショット学習の注意点として

  1. 例の数

  • 2-3個が一般的

  • 多すぎると意図が曖昧に

  • 少なすぎると傾向が掴みにくい

2:例の品質

  • 典型的な例を選ぶ

  • 極端な例は避ける

  • 実際の用途に近い例を使う

3:バリエーション

  • 似すぎる例は避ける

  • 適度な多様性を持たせる

  • パターンが理解しやすい例を選ぶ

などがあります。

少数ショット学習は、AIに「こういう答え方をして欲しい」という意図を明確に伝える強力なテクニックで、適切な例を用意することで、より期待に沿った出力を得られるようになるというわけです。​​​​​​​​​

11:メタ プロンプト

メタプロンプトとは、「AIの振る舞い方や役割を指定するプロンプト」のことです。

プロンプトの前提条件や基本設定を定義する部分とも言えます。

具体例で説明すると・・・

1:基本的なメタプロンプト構造

あなたは[役割]として振る舞ってください。

以下の条件で応答してください:
- 専門用語は極力避け、平易な言葉を使う
- 説明は具体例を交えて行う
- 重要なポイントは太字で強調する
- 回答は300字程度に収める

質問:[実際の質問内容]

2:専門家設定の例

あなたはプロのWebデザイナーとして以下の特徴を持っています:
- 10年以上の実務経験
- アクセシビリティの専門家
- モバイルファーストの設計が得意
- ユーザー中心設計の推進者

この経験と知識に基づいて、以下の質問に答えてください:
[質問内容]

3:コミュニケーションスタイルの指定

以下のコミュニケーション方針で回答してください:

トーン:
- フレンドリーで親しみやすい
- 専門家として信頼できる
- 励ましの要素を含む

構造:
- 最初に結論を述べる
- 次に詳細な説明を行う
- 最後に実践的なアドバイスを提供

質問:[質問内容]

のような形で振る舞いや役割を与えることです。メタプロンプトの重要な要素として

1:役割定義

条件:
- 専門分野の特定
- 経験レベルの設定
- 視点や立場の明確化
- 知識範囲の定義

2:応答形式

出力ルール:
- 文体(です・ます調 / である調)
- 長さの制限
- 構造化の方法
- 強調方法の指定

3:品質基準

以下の基準を満たすよう回答してください:
- 正確性:事実に基づく情報提供
- 公平性:偏りのない視点の提供
- 実用性:実践可能なアドバイス
- 分かりやすさ:適切な例示

4:制約条件

以下の制約の中で回答を作成してください:
- 専門用語を使用する場合は必ず解説を付ける
- 否定的な表現は避け、建設的な提案を行う
- 具体的な数値や参考情報を含める

などがあり、実践的なメタプロンプトの例としては

1:教育者設定

あなたは中学校の理科教師として、以下の特徴を持って回答してください:
- 生徒の理解度に合わせて説明を調整できる
- 身近な例を使って複雑な概念を説明できる
- 生徒の興味を引き出す問いかけができる
- 安全面への配慮を忘れない

この設定で、以下の科学的概念を説明してください:
[概念の説明依頼]

2:ビジネスコンサルタント設定

経営コンサルタントとして以下の観点で分析を行ってください:

専門性:
- 戦略立案
- マーケット分析
- リスク評価
- コスト最適化

アウトプット形式:
- 現状分析
- 課題抽出
- 解決策提案
- 実施計画案

分析対象:[ビジネス課題]

などが挙げられます。最後、メタプロンプトを使う際のコツですが

  1. 明確性

  • 役割や条件を具体的に

  • あいまいな表現を避ける

  • 優先順位を示す

2:一貫性

  • 矛盾する指示を避ける

  • 全体的な方向性を保つ

  • 条件間の関係を整理

3:適切な範囲

  • 必要最小限の条件に絞る

  • 過度な制約を避ける

  • 柔軟性を残す

このように、メタプロンプトは、AIの応答の質と一貫性を高める重要な要素になります。

目的に応じて適切に設定することで、より効果的なAIとのコミュニケーションが可能になるというわけです。​​​​​​​​​​​​​

まとめ

今回も長くなってしまいましたが、Microsoft社における生成AIの使い方である「プロンプト エンジニアリングの手法」について解説しました。

僕はこれを読み込んでいるわけではないのですが、知らずとも、使っていると感覚的に身につくことばかりだなぁと思います。

生成AIを使いこなす上で大事なことばかり載せてあるので、参考にしていただければと思います。

生成AIプロンプトデザイナー ヒロ


いいなと思ったら応援しよう!