こんにちは!生成AIを上手に使いこなしたいきーちゃんです。
今回の記事では、主にWeb上に公開されている以下の資料を参考にして、プロンプトデザインについて1から丁寧に学んでいこうと思います。
- 【社内研修】プロンプトデザイン事始め - Recruit
- Prompt Engineering Guide
- 「オンラインイベント 教員向けChatGPT講座 ~基礎から応用まで~」の資料 - 東京大学 吉田塁准教授
- 2023年度 デジタル庁・行政における生成AIの適切な利活用に向けた技術検証を実施しました - デジタル庁
- プロンプト エンジニアリングの概要 - Microsoft
- コーネル大学が発表した生成AIの精度を上げるプロンプトの原則26
プロンプトデザインとは?
そもそもタイトルにある「プロンプトデザイン」とは何でしょうか?
リクルートによる研修資料では、プロンプトデザインを以下のように定義しています。
言語モデル自体のパラメータ更新をなしに、多様かつ高品質な出力を得られるように言語モデルへの入力文(プロンプト)を設計することである。
つまり、ChatGPTをはじめとした言語モデルで提供されるサービスはそのまま利用して、求める内容をより高品質で多様なものとするためのプロンプトを考えましょう、ということですね。
言語モデルとは?
「言語モデル」とは、文章の並び方に確率を割り当てる確率モデルです。「より自然な文章の並び」に対して高い確率を割り当て、「文章として成立しない並び」には低い確率を割り当てることで、自然言語のテキストを理解して、ユーザーが求める結果を生成します。
「大規模言語モデル」(LLM)とは
「大規模言語モデル」は、言語モデルのうち「計算量」「データ量」「モデルパラメータ数」の3要素を大規模化したものを指します。
大規模言語モデル(Large Language Models、LLM)とは、非常に巨大なデータセットとディープラーニング技術を用いて構築された言語モデルです。ここでいう「大規模」とは、従来の自然言語モデルと比べ、後述する3つの要素「計算量」「データ量」「パラメータ数」を大幅に増やして構築されていることに由来します。大規模言語モデルは、人間に近い流暢な会話が可能であり、自然言語を用いたさまざまな処理を高精度で行えることから、世界中で注目を集めています。
参考:大規模言語モデル | 用語解説 | 野村総合研究所(NRI)
大量のテキストデータを学習することによって、次に来る単語を文脈に基づいて予測し、自然な文章の作成や要約、受け答えができるようになります。サービス発表直後から大きな話題となっているChatGPTもLLMによるAIモデルであり、文章の自動生成、質問応答、文章要約などのタスクに活用されています。
プロンプトとは?
そもそも「プロンプト」とは何でしょうか。プロンプトとは、言語モデルである「生成 AI に入力する入力文」のことです。シンプルなプロンプトで多くのことを達成できますが、得られる結果の品質は、「提供する情報の量」と「プロンプトの巧妙さ」によって変わってきます。
プロンプトには、生成AIに渡す指示や質問などの「情報」を含めることができ、コンテキスト、入力、例などのその他の詳細も含めることができます。これらの要素を使用して、生成AIにより効果的に指示を出し、結果の品質を向上させることができます。
プロンプトの要素例(文脈、タスク、入力データ、出力形式)
プロンプトを構成する要素には以下のようなものがあります。
- 【文脈】タスクに関連する背景情報
⇒何の授業なのか、具体的に何を教えるのかなど - 【タスク】実行させたい具体的な作業
⇒問いかけを作るのか、多肢選択問題を作るのかなど - 【入力データ】タスク遂行で参考になるデータ
⇒使う教材情報、ほしい出力の具体例など - 【出力形式】出力してほしい回答の形式
⇒表で出力、リストで出力、対話文で説明など
これらを必ず入れるべきというわけではありませんが、ある程度詳細に内容を言語モデルに伝えることで、より正確なアウトプットが得られる可能性があります。また、プロンプトに入力する内容は必ずしも文章である必要はありません。
プロンプトを書く時のポイント
プロンプトを書く時にはいくつかポイントがあります。
できる限り明確な指示を出す
生成AIは直感を持っていませんので、期待するアウトプットを明確に指定することが重要です。背景や状況、場面、文脈といったコンテキストを具体的に書くことで、より正確で意向に沿った内容が手に入ります。
例)曖昧な指示を避けて具体的に指示する
Bad: 候補をできる限り挙げてください。
Good: 候補を5つ挙げてください。
区切り文字を使用する
言語モデルへの指示で区切り文字(デリミタ)を使う場合、指示を明確に区切るために、特定の記号や単語を使うことができます。例えば、複数の質問や要求を一つのメッセージで送る際に、それぞれを区切るために「---」や「*」などを使用することがあります。これにより、各指示がどこで始まり、どこで終わるのかを容易に識別できるようになります。
プロンプトをフォーマットするときは、「###Instruction###」で始め、その後に「###Example###」または「###Example###」を続けます。または「###質問###」と入力します。その後、コンテンツを提示します。1つ以上の指示、例、質問、コンテキスト、入力データを区切るための改行。
このように、区切り文字を使うことで、何についての記事を作成すれば良いのか理解しやすくなります。具体的には以下のようにプロンプトを記載します。
##Instruction###
具体的な指示や要求を記載##Example###
具体例を記載###Question###
AIに質問する内容を記載
プロンプトに教育の知見を取り入れる
東京大学/吉田類准教授によると、プロンプトに教育の知見を取り入れる事で、生成AIから返される回答がより尖鋭化するとのこと。
実際のプロンプトへ「具体的なタスク」を入力する際、そこにBloomのタキソノミー(教育目標分類)における「評価」目標を達成するような課題を作ることによって、得られる回答がより尖った内容になるそうです。
具体的な文脈 × 具体的なタスク → 尖った回答
使えるプロンプトテクニック11選
Few Shot Learning
Few Shot Learningは、限られた数のサンプルから学習を行う機械学習の一種です。データセットが小さい場合に学習に支障をきたす問題に対処するために提案されました。「画像分類」や「感情分類」、「物体認識」などがあります。各クラスのラベル付けされた少数のサンプルのみを用いて学習します。
プロンプトに回答例を入れると性能が上がる具体例
例 )国の首都を答えて下さい
アメリカ: ワシントンD. C.
フランス: パリ
日本:
このように、Few Shot Learningは、限られた数のサンプルから効率的に学習を行うことを可能にする強力な手法であり、データが少ない状況でも有用なモデルを生成することができます。これは、特にデータが少ない、またはデータの収集が困難な領域での応用に有望です。
Chain of Thought (CoT) プロンプティング
Chain of Thought (CoT) プロンプティングは、大規模な言語モデルが複雑な推論タスクをより正確に解決するための手法で、中間の推論ステップを生成することを特徴としています。
通常のプロンプトが直接的な答えを期待するのに対し、CoTでは推論プロセスを一連の小さな相互接続されたステップに分割します。この手法により、モデルは全体的な推論タスクをより小さく、より焦点を絞ったステップに分割できます。これにより、モデルの一貫性を維持し、推論プロセスを見失う可能性を減らします。
具体的な例としては、数学の問題を解く際にCoTを使用することが考えられます。
例えば、「Aさんが5つのリンゴを持っていて、BさんがAさんのリンゴの3倍を持っている場合、メアリーは何個のリンゴを持っているか?」という問題を解く場合を考えます。CoTを使用すると、以下のような思考の連鎖によって問題を解くことになります。
1. Aさんは5つのリンゴを持っています。
2. BさんはAさんのリンゴの3倍を持っています。
3. Bさんが持っているリンゴの数を見つけるためには、Aさんのリンゴの数を3倍にする必要があります。
4. 5つのリンゴ × 3 = 15つのリンゴ
5. 従って、Bさんは15つのリンゴを持っています。
このように、CoTは中間の推論ステップを生成することで、言語モデルが複雑な推論タスクに効率的に取り組むことができます。これにより、モデルの出力の解釈可能性も向上します。この思考過程を含めることで、モデルの精度が向上します。前述のChain-of-thought (CoT) と Few Shot Learningを組み合わせることでさらなる精度向上が見込めます。
Zero-shot CoT プロンプティング
Zero-shot CoT プロンプティングは、CoTとは異なり、プロンプト内に推論ステップの例示なしで、段階的に推論させる方法です。この方法は日本国内のAI研究においてトップを走っている東京大学/松尾研究室に所属する小島武さんの論文が基になっています。
推論段階の例示をなしにするために、「段階的に考える」(step by step) のように誘導的な言葉を使い、プロンプトに「step by stepあるいはLet’s think step by step」と記載し、プロンプト自体に段階的に推論せよ、と明示をする方法になります。
Self-Consistency(自己整合性)
Self-Consistency(自己整合性)は、言語モデルへ入力されたデータをもとにして一貫性のある回答を生成する方法で、中間的な推論のプロセスが重要となるプロンプトエンジニアリングの進歩した技術の一つです。推論の問題を解く際に、思考過程をプロンプトに含めて、より正確な回答が生成できます。
具体的な例として、「私が6歳のとき、妹は私の半分の年齢でした。 今、私は70歳です。 妹は何歳ですか?」という問題をSelf-Consistencyで解くケースを考えます。プロンプトには以下のように内容を入力していきます。
1. 「私が6歳のとき、妹は私の半分の年齢でした。それから何年経ったか?」
2. 「それから何年経ったとき、私の妹は何歳になりますか?」
3. 「それでは、私が70歳のとき、妹は何歳ですか?」
すると言語モデルの回答は以下のようになり、正しく問題を解くことが出来ます。
- 私が6歳のとき、私の妹は私の半分の年齢であったため、彼女は3歳でした。
- 今、私が70歳であるため、彼女は70-3 = 67歳です。
- 回答は67歳です。
このように、各ステップで具体的な質問を投げかけ、それぞれの回答を元に次の質問を作成します。これにより、最終的な答えを導き出すことができます。このプロセスは、モデルがどのように答えを導き出したかを理解するのに役立ちます。
知識生成プロンプティング
知識生成プロンプティングは、事前に言語モデルに知識を与える手法で、知識として与える情報そのものをAIに生成させることが特徴です。事前に知識を与えることで、質問に対して正しい推論が出力されやすくなります。
この手法は以下の2つのステップに分けられます。
- 解かせたい問題に関する知識を、AIにプロンプトを渡すことで生成する。
- 生成された知識を使って解かせたい問題の推論を行わせる。
Tree of Thoughts (ToT)
Tree of Thoughts(思考の木、ToT)とは、言語モデルを用いて思考の流れや概念を、木構造の形で表現して整理するプロンプト作成の手法です。言語モデルが一度に複数の考えを追求できるようにする方法で、より複雑な問題を解決できるようになります。
Tree of Thoughts(思考の木、ToT)では、以下のステップで問題を木構造の形で整理します。
- 思考の木は、問題を解決するために必要な情報を入力として受け取ります
- 問題に関連する複数の思考を生成し、それらを木構造で表現します
- 生成された思考の木が問題解決に対して適切なステップを含んでいるか、またそのステップが正しい順序であるかを確認します
思考の流れを木構造の形で生成するため、いわゆる探索アルゴリズム(幅優先探索や深さ優先探索など)を用いた探索を行うことが出来るようになります。これによってAIは複数の解決策を同時に探求し、それぞれを評価して最も可能性の高い解決策を選びます。このプロセスは、人間が問題解決をするときに行う「試行錯誤」のプロセスと似ています。
Tree of Thoughtsを用いた具体的な問題解決手順
Tree of Thoughts(思考の木、ToT)を利用した問題解決方法について具体的なケースを見てみましょう。今回のケースでは、具体的に「自社製品の生産ラインを効率化すべく、業務フローの「見える化」を行う」という課題があるとします。その課題を解決するための流れをプロンプトの入力方法も交えて解説します。
1. 【案を出す】ユーザーは現在抱えている課題を言語モデルにプロンプトで伝え、それに対して複数の解決アイデアを提案させます。
- 「自社製品の生産ラインを効率化すべく、業務フローの「見える化」を行う」という課題に対して、具体的なアイデアを10個出してもらうといった具体的なプロンプトを入力します。
2. 【評価する】AIが提案した解決策に対して、その実現可能性や効果を評価します。
- 「今の回答を、改めてご自身で評価して下さい。評価の基準は、実際に中小企業の経営者が自社の業務フロー改善に取り入れるかどうか、納得できるかという視点も取り入れて下さい。評価には、実現できる可能性をパーセントで明記して下さい。」といった具体的なプロンプトを入力します。
3. 【深堀する】評価の結果、有望と思われる解決策について、さらに深く掘り下げて情報を得ます。
- 「今の回答から、実現可能性が高い上位3つのアイデアを選び、どのような成果が期待できるか掘り下げて、詳しく教えてください。」といった具体的なプロンプトを入力します。
4. 【順位付け】どの方法が一番良いのかを、AI自身に順位付けしてもらいます。
- 「今の分析結果とこれまでの内容を踏まえ、まとめてください。3つのアイデアに順位と、その説明を具体的に出力してください。」といった具体的なプロンプトを入力します。
このように、Tree of Thoughts (ToT)では、ユーザーはプロンプトで具体的な指示を出し、AIはそれに従って思考の木を生成します。これにより、より複雑な問題を効率的に解決することが可能となります。
自動プロンプトエンジニア(APE)
自動プロンプトエンジニア(APE)は、入力と出力のペアを与えることで、その入力から出力を得るためのプロンプトを自動で生成するフレームワークです。
APEでは、入力と出力のペアと、プロンプトのテンプレートを入力として与えることで、入力が与えられた時に正確に出力が得られるようにプロンプトテンプレートを最適化することができます。またAPEは、生成されたプロンプトの候補から最適なものを自動で選択します。
このAPEは、人間が設計した「Let’s think step by step.」(Kojima et al.,2022)よりも優れたZero-shot CoTプロンプトを発見しました。それがこの「Let's work this out in a step by step way to be sure we have the right answer.」(正しい答えを得るために、ステップバイステップで考えてみましょう。)というプロンプトです。
このプロンプトでは思考の連鎖を引き起こして、より正確性の高い結果をもたらし、いくつかのデータセットでIn-context LearningやChain-of-thoughtの性能を上げるような結果を出しています。このように、APEは、言語モデルの応答を最適化するための有効な手法となっています。
アクティブプロンプト
アクティブプロンプトとは、言語モデルにユーザーが入力した情報を解析し、自動的に次の適切な質問を生成する手法です。これは、文脈を考慮した自然な質問を生成させるときに使えます。
アクティブプロンプトでは、言語モデルが自身に対して適切なプロンプトを要求します。言語モデルは、タスクの要件や指示を明示的に要求し、それに基づいて応答を生成します。これにより言語モデルとの対話を通じて、より具体的な指示や要求を与えることができます。このため、アクティブプロンプトはユーザーと直接対話するタスクなどで利用価値が高いでしょう。
方向性刺激プロンプティング
方向性刺激(Directional Stimulus)プロンプティングは、言語モデルの出力結果を特定の方向へ導くためのプロンプト手法です。これは、文脈を考慮した自然な質問を生成させるときに使えます。
プロンプトに「方向性刺激」と呼ばれる短いテキストでAIが理解しやすい文法でやってほしい処理をプロンプトに記述することで、狙った結果を得られやすくなります。特に要約生成のタスクにおいて有効であるとされています。
例えば、「この文章を要約して」と言うだけではなく、「この文章を要約して、その中にこのキーワードを含めて」と指示することが出来るため、より具体的な結果を生成ことができます。
ReAct
ReActは「Reasoning(推論)」と「Acting(行動)」を組み合わせた造語で、言語モデル(LLM)を使用して思考(推論)と行動を同時に行うための新しいフレームワークです。ReActは、言語モデルで「推論」(行動理由の推論)と「行動」(理由に従って行動)を相乗作用させる、シンプルで効果的な手法です。
ReActのフレームワークでは以下のステップで処理が行われます。
1. タスクへの出力を生成するために必要な行動(Act)とその理由(Reason)を思考する。
2. この思考をもとに行動し、得られた結果から、再度次に必要な行動とその理由を思考する。
3. 思考を繰り返し、「最終的な答え」が生成できた時点で終了する。
ReActと比較される手法にはCoT(Chain of Thought)がありますが、CoTは「無関係なテキストを生成する」ことが問題点で、ReActは「前に行った思考や行動を繰り返してしまう」ケースがありそれが誤りにつながるとされています。
マルチモーダルCoTプロンプティング
マルチモーダルCoTプロンプティングは、大規模な言語モデルが複雑な推論を行うためにChain of Thought(CoT)プロンプティングを活用する手法です。CoTプロンプティングは、中間的な推論ステップを介して複雑な推論能力を可能にします。
マルチモーダルCoTは、言語(テキスト)と視覚(画像)の両方のモダリティを組み合わせて、論理的根拠生成と回答推論を分離する2段階のフレームワークに組み込んでいます。また、マルチモーダルCoTは、幻覚(言語モデルがデタラメな内容をいうこと)を緩和し、収束速度を向上させる利点があります。
具体的な実装としては、Cantorというフレームワークがあります。Cantorは、視覚的なコンテキストと論理的な推論を効果的に統合することで、視覚的な推論タスクを解決するための感覚的な決定アーキテクチャを特徴としています。これにより、マルチモーダルCoTの概念を具体的に実現することが可能です。
生成AIを活用する際の注意点
Prompt Injectionと対策
ChatGPT等の言語モデルを扱う上で注意しなければいけないことの1つにPrompt Injectionがあります。
Prompt InjectionとはAIチャットボットへの特異な攻撃手法で、ユーザーが悪意あるプロンプト(コードやコマンド、悪意ある質問など)を言語モデルに与えることで、言語モデルが不適切な回答や意図しない情報の開示を行ってしまう状況を指します。
対話型AIのサービスのほとんどにこのリスクがあり、意図しない回答によって、企業のブランドイメージを悪化させたり、保有する機密事項や、本来は公開するべきでないデータなどを、AIチャットボット自ら回答し、漏洩させたりする可能性があります。
対話型AIサービスをアプリケーションに組み込む際には以下のような工夫を行うことが重要です。
実際にChatGPTのような言語モデルを用いたチャットボットをアプリケーション等に組み込む場合は、ユーザーと言語モデルとの入出力を直接行わせないような工夫が重要です。例えば、言語モデルが想定外の挙動を取らないようにユーザー入力をルールベースで整形することや、言語モデルの出力を固定フォーマット(JSON形式など)で出力させてその一部分のみをユーザーに表示し、仮にPrompt Injectionによって言語モデルの出力が指定したフォーマットで返ってこなかった場合は、エラー文を返す等の処理などPrompt Injectionを想定して言語モデルとユーザー間のやり取りを直接行わせず、入出力を整形する工夫を行うことが重要です。
ただ、Prompt Injectionによる攻撃に対して事前に対策を講じても、それを回避するジェイルブレイク(脱獄)的な方法が次々と発見され、根本的な解決は困難を極めています。現時点ではPrompt Injectionの脆弱性に対処するための確実な方法は見つかっていません。このためAIセキュリティー研究者にとって大きな懸念事項になっています。適切な理解と対策により、AIシステムの安全性と信頼性を高めていくしかありません。
その他の注意点
プロンプトや対話の仕方によって出力が変わる
抽象度の高い指示出しに対しては、平均的な回答を返すため、できるだけ文脈に沿った具体的な指示を出す必要があります。また、言語モデルの種類やバージョンの違いによってもできることが異なることに注意しましょう。プロンプトは改善するものと認識し、思い通りの出力にならなくても、具体例やデータなどを使って、自分がほしい出力のイメージを伝えてみると良いでしょう。
デタラメを言うことがある(幻覚: Hallucination)
言語モデルから出力される結果には、理路整然とした文章の中にデタラメが入る場合があるため、注意が必要です。引用元を求めても架空の論文が実際に存在するかのように結果に表示されたりします。このため、専門知識を持つ、1次情報にあたる、情報の信頼性を検討することが重要です。
個人情報・機密情報の入力は基本しない
組織が環境をキチンと整備していたら必ずしもそうではないですが、個人情報、機密情報については、大抵の場合は入力しない方が良いです。言語モデル側に入力情報が学習データとして利用され、学習されたデータが他ユーザーとの対話の中で流出してしまう可能性があります。データ利用ポリシーや利用規約などを確認の上、対処することが肝要です。
著作権侵害について注意すべきは「学習時」と「生成時」
「学習時」は、著作権法第30条の4より、比較的緩く、2024年3月21日「生成AI、データ学習は知財規制の対象外 政府検討会 - 日本経済新聞」によると、「AIによる学習段階は原則として規制の対象外」だと考えられると一致したとのこと。「生成時」は、著作権侵害になる可能性もあるが、議論の対象である模様です。著作物に対して、生成されたものに関する「類似性」「依拠性」がポイントで、
「依拠性」が場合によって認められる可能性があるようです。(プロンプトに他者の著作物を入力した上で類似の出力を出す場合など)
バイアス・毒性があることを認識する
ChatGPTは抑えるように学習されており、軽減されている可能性がある (Zhuo et al. 2023)そうですが、大規模言語モデルはバイアスや毒性 (toxicity) を有しているため、使う場面によって配慮する必要があります。
- バイアス:性別、人種、宗教などに関する偏見や先入観
- 毒性:有害・攻撃的なコンテンツを生成する能力