最新AI論文をキャッチアップ

プロンプトパターンカタログ:効果的なプロンプト設計のための心得

プロンプトパターンカタログ:効果的なプロンプト設計のための心得

ChatGPT

3つの要点
✔️ 大規模言語モデルと効果的な会話を行うためのプロンプトパターンを体系化
✔️ 特定のドメインにとらわれない,汎用的なプロンプト設計の手法について紹介
✔️ 特に,プロンプト設計の背後にある考え方や問題設定,注意点等を整理

A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT
written by Jules White,Quchen Fu,Sam Hays,Michael Sandborn,Carlos Olea,Henry Gilbert,Ashraf Elnashar,Jesse Spencer-Smith,Douglas C. Schmidt
(Submitted on 21 Feb 2023)
Comments: Published on arxiv.

Subjects: Software Engineering (cs.SE); Artificial Intelligence (cs.AI)

code:

本記事で使用している画像は論文中のもの、紹介スライドのもの、またはそれを参考に作成したものを使用しております。 

概要

昨今大流行しているChatGPTは,効果的なプロンプトを与えられるか否かで,得られる回答の性能が大きく変わると言われています.
すでに,世間には数々のプロンプトテンプレートが出回っておりますが,今回はプロンプト設計の背後にある考え方や心得をまとめた研究についてご紹介します. 
発表時期は2023年の2月ですので,最新の情報までは盛り込めていないかもしれませんが,現在でも使用できるプロンプトエンジニアリングの基礎知識として,見ておいて損はないでしょう.少し長めの記事になりますが,お付き合いください.

導入

本研究では,プロンプトにおける特定の文法や記述形式を定義するのではなく,むしろ,プロンプトを設計する際の重要な考え方・心得を整理します.それによって,あらゆるLLMに対しても再利用可能であり,ユーザのニュアンスや表現に合わせてプロンプトを設計することができるようになるでしょう.

本論文では,以下の構造に従って,プロンプトの扱う問題やキーアイデア等を整理していきます.
(1) 扱う問題の定義
(2) どのような文脈における問題なのか
(3) プロンプト作成のためのアイデア
(4) プロンプトの具体例
(5) 長所・短所・応用方法

カタログ

A: プロンプトパターンの体系化


プロンプトパターンは上記のように分類されます.以降,一つ一つ具体的に解説していきます.(依存関係の性質上,解説の順番が前後しますが,ご了承ください.)

B: The Meta Language Creation Pattern 

(1)扱う問題の定義:
自然言語以外の記号や単語の用法を独自に定義すること.

(2)どのような文脈における問題なのか:
自然言語では明確に表現できないような事柄を伝達するための方法です.

(3)プロンプト作成のためのアイデア:

例えば,”X” means “Y”. という構造で,記号や単語,記述の意味を定義しましょう.

(4)プロンプトの具体例:
“From now on, whenever I type two identifiers separated by a “→”, I am describing a graph. For example, “a → b” is describing a graph with nodes “a” and “b” and an edge between them. If I separate identifiers by “-[w:2, z:3]→”, I am adding properties of the edge, such as a weight or label.”(本文より引用)
曖昧にならない明確な表記法を定義するのが良いでしょう.例えば,a → b はノードaとノードbの間のエッジを表し,”→”が”-[w:2, z:3]→”と表記された場合には,エッジのプロパティを意味します.このように独自のグラフ構造の表現方法を定義することができます.

(5)長所・短所・応用方法:
自然言語以外の新しい記号の用法を使用してLLMとインタラクションできるので,強力な手段です.しかし,ユーザが定義した用法が,LLMが学習した自然言語やその他の用法と混乱しないように,注意深く設計する必要があります.(あまりにも独特な用法は混乱しやすいということです.)

C: The Output Automater Pattern

(1)扱う問題の定義:
LLMが回答してきた実行手順が手作業で行うべきものである際に,それをさらに自動化するコードを出力させること.

(2)どのような文脈における問題なのか:
LLMの出力に従って,ユーザが作業する場合に,手動で行うのはミスが起こりやすいです.例えば,LLMにPythonの設定手順を教えてもらったとしても,それをいちいち手作業で行うことは大変です.

(3)プロンプト作成のためのアイデア:

自動化するべきシチュエーションを明示し,出力の形式を指定しましょう.

(4)プロンプトの具体例:
pythonコードを出力する際に,その操作全体を自動化するプロンプトの例を示します.
“From now on, whenever you generate code that spans more than one file, generate a Python script that can be run to automatically create the specified files or make changes to existing files to insert the generated code.” (本文より引用)
このように,ターミナルでコマンドを打ったり,ファイル構成を操作するためのスクリプトをLLMに出力してもらうことができれば,作業効率化の強力な手助けとなります. 

(5)長所・短所・応用方法:
会話で十分な情報をLLMに伝えてあげないと,正確な回答が得られません.また,現時点では,自動化手順をそのまま実行することはリスクを伴うので,理解できるユーザが使用するのが良いでしょう.

D: The Flipped Interaction Pattern 

(1)扱う問題の定義:
ユーザが質問するのではなく,LLM側があるタスクに必要な情報を得るためにユーザに質問する形式のこと.

(2)どのような文脈における問題なのか:
タスクを解決する際に,LLMが内部に持っている膨大な情報をインタラクションの形式を通して効率的に利用することを目指します.

(3)プロンプト作成のためのアイデア:

はじめに,LLMに対して,目的の達成のためにユーザ側に質問するように指示しましょう.そして,質問のやりとりをどの程度続けるかは重要です.質問のやりとりのユーザビリティを改善するためにも,1回あたりの質問の回数や回答の形式,順番などを指定してあげることも重要です.

(4)プロンプトの具体例:
“From now on, I would like you to ask me questions to deploy a Python application to AWS. When you have enough information to deploy the application, create a Python script to automate the deployment.” (本文より引用)

(5)長所・短所・応用方法:
どのタイミングでやりとりを終了すべきかは悩ましいものです.あらかじめ知り得ている特定の要件などは,事前にLLMに教えてあげるほうが良いでしょう.つまり,具体的な指令をすることが重要です.また,ユーザの持っている知識の程度に合わせたやりとりができるように,ユーザの知識レベルも伝えてあげるのが良いでしょう.

E: The Persona Pattern 

(1)扱う問題の定義:
LLMに特定のペルソナを与えてコミュニケーションをすること.

(2)どのような文脈における問題なのか:
ある課題に対して,具体的にどのような出力をLLMに想定するべきかわからないことがあるかもしれないが,そのような時は具体的なペルソナを設定してやりとりするのが良く,その際に有用な形式です.

(3)プロンプト作成のためのアイデア:

職業,肩書き,架空の人物,歴史上の人物など,様々なペルソナを設定します.その次に,そのペルソナにどのような形式でアウトプットをしてほしいかを記述します.

(4)プロンプトの具体例:
“From now on, act as a security reviewer. Pay close attention to the security details of any code that we look at. Provide outputs that a security reviewer would regarding the code.” (本文より引用)
“You are going to pretend to be a Linux terminal for a computer that has been compromised by an attacker. When I type in a command, you are going to output the corresponding text that the Linux terminal would produce.” (本文より引用)
この例のように,人間ではない存在になりきってもらうことも可能です.

(5)長所・短所・応用方法:
架空の存在を想定した場合,当然のことながら架空の出力が返っくることになります.これは”hallucinations”(LLMが事実とは異なることを出力すること)に相当します.

F: The Question Refinement Pattern

(1)扱う問題の定義:
質問をより洗練させること.

(2)どのような文脈における問題なのか:
非専門家の質問は,的確ではないことがあります.ユーザがその分野に精通していない場合に,より正確な答えを引き出せるように質問自体を修正することは,とても有用です.ユーザがLLMに対して質問する際にも,洗練されていないプロンプトをLLMに提示し,LLMにその意味を咀嚼してもらうのではなく,始めから適切な質問をすることの方が,的確な答えが返ってくるかもしれません.

(3)プロンプト作成のためのアイデア:

質問文を修正する際に,どのような文脈かを考慮させることが重要です.

(4)プロンプトの具体例:
“From now on, whenever I ask a question about a software artifact’s security, suggest a better version of the question to use that incorporates information specific to security risks in the language or frame- work that I am using instead and ask me if I would like to use your question instead.” (本文より引用)

(5)長所・短所・応用方法:
質問を洗練させることで,ユーザとLLMの間の知識のギャップを埋められる一方で,ユーザの思考範囲を狭めてしまうリスクもあります.

G: The Alternative Approaches Pattern 

(1)扱う問題の定義:
ある課題を解決する際に,ユーザが見落としている代替アプローチを提案すること.

(2)どのような文脈における問題なのか:
課題解決のためのアプローチにおける,ユーザの認知バイアスを解消することを目指しています.

(3)プロンプト作成のためのアイデア:

はじめに,問題の範囲を限定することで,実行可能なレベルの代替案を示してくれるようにしましょう.その上で,代替案の長所や短所を比較させることで,どうしてそのような代替案を提示してきたのかを理解することができます.

(4)プロンプトの具体例:
“Whenever I ask you to deploy an application to a specific cloud service, if there are alternative services to accomplish the same thing with the same cloud service provider, list the best alternative services and then compare/contrast the pros and cons of each approach with respect to cost, availability, and maintenance effort and include the original way that I asked. Then ask me which approach I would like to proceed with.” (本文より引用)

(5)長所・短所・応用方法:
このパターンは汎用的で,様々な状況で効果を発揮するでしょう.

H: The Cognitive Verifier Pattern

(1)扱う問題の定義:
質問を細分化して,元々の質問に対する回答の精度を高めること.

(2)どのような文脈における問題なのか:
ユーザは,その分野の知識が足りなかったり,プロンプトの入力が面倒に感じたりすることで,詳細が不十分な質問をしてしまうことがありますが,その際に効果的なプロンプトのパターンになります.

(3)プロンプト作成のためのアイデア:

最初に与えられた質問に正確に答えられるよう,追加で質問をするように指示します.そして,個々の質問に対する答えを統合して,最初の質問に対する答えを生成するように指示します.

(4)プロンプトの具体例:
“When I ask you a question, generate three addi- tional questions that would help you give a more accurate answer. When I have answered the three questions, combine the answers to produce the final answers to my original question.” (本文より引用)

(5)長所・短所・応用方法:
LLMに追加でしてもらう質問の個数は,LLM側に決めてもらっても良いし,ユーザ側が決めても良いでしょう.その個数が多いほど,手間はかかりますが,回答の精度は高まるでしょう.

I: The Fact Check List Pattern 

(1)扱う問題の定義:
LLMの出力が,どのような事実に基づいて生成されているかを,リスト形式で出力させること.

(2)どのような文脈における問題なのか:
現在のLLMは,偽の情報をあたかも真実であるかのように出力してしまいますが,この方法を用いることで,ユーザがチェックするべき項目が明確になります.

(3)プロンプト作成のためのアイデア:

事実のリストを出力のメイン文の最後に配置するようにすると良いでしょう.その方が,用語が理解できないユーザでも,先にメイン文を読むことで,チェックリストの中身が理解できるようになります.

(4)プロンプトの具体例:
“From now on, when you generate an answer, create a set of facts that the answer depends on that should be fact-checked and list this set of facts at the end of your output. Only include facts related to cybersecurity.” (本文より引用)

 (5)長所・短所・応用方法:
ユーザが出力のファクトチェックをすることができるので,有用です.

J: The Template Pattern 

(1)扱う問題の定義:
出力のフォーマットを指定すること.

(2)どのような文脈における問題なのか:
LLMが知らないフォーマットで出力をしてもらいたいときに用いるパターンです.

(3)プロンプト作成のためのアイデア:

はじめに,出力のフォーマットを提示し,次にLLMに補完してほしい空欄の部分を指定します.また,指定したフォーマットを勝手に変更しないように伝えましょう.

(4)プロンプトの具体例:
“I am going to provide a template for your out- put. Everything in all caps is a placeholder. Any time that you generate text, try to fit it into one of the placeholders that I list. Please preserve the formatting and overall template that I provide at https://myapi.com/NAME/profile/JOB” (本文より引用)

 (5)長所・短所・応用方法:
出力の形式を揃えられる一方で,指定されたフォーマット以外の情報が出力から排除されてしまうため,他のプロンプトパターンと同時に使用することが難しいかもしれません.

K: The Infinite Generation Pattern 

(1)扱う問題の定義:
同じようなプロンプトの入力を避ける方法のこと.

(2)どのような文脈における問題なのか:
同じようなプロンプトを何度も繰り返し入力するのは手間ですし,ミスの原因にもなりかねません.

(3)プロンプト作成のためのアイデア:

はじめに,ユーザはLLMに対して,無限に出力を行うように指定します.ただし,一度に出力できる単語の数は決まっているので,一応の制限をかけておきます.そして,無限の出力の間にユーザから入力があった時の処理の仕方をあらかじめ決めておきましょう.また,出力の停止のルールも決めておきましょう.

(4)プロンプトの具体例:
“From now on, I want you to generate a name and job until I say stop. I am going to provide a template for your output. Everything in all caps is a placeholder. Any time that you generate text, try to fit it into one of the placeholders that I list. Please preserve the formatting and overall template that I provide: https://myapi.com/NAME/profile/JOB” (本文より引用)

(5)長所・短所・応用方法:
問題点としては,現在のLLMでは,以前の情報が保持される範囲に限界があることです.したがって,出力を監視しつつ,必要に応じてフィードバックをしてあげることが必要でしょう.

L: The Visualization Generator Pattern 

(1)扱う問題の定義:
画像生成ツールに対する入力テキストを作成すること.

(2)どのような文脈における問題なのか:
LLMは直接画像を生成することができないため,画像生成,図表作成のための出力をLLMに行わせたい時があるでしょう.

(3)プロンプト作成のためのアイデア:

外部ツールYで,可視化するための出力Xを作成するように指示します.使用可能な視覚化ツールの候補を複数提示し,その中からLLMに選ばせることも有効です.

(4)プロンプトの具体例:
“Whenever I ask you to visualize something, please create either a Graphviz Dot file or DALL-E prompt that I can use to create the visualization. Choose the appropriate tools based on what needs to be visualized.” (本文より引用)

(5)長所・短所・応用方法:
このプロンプトパターンを利用することで,LLMの出力の表現能力を視覚領域に拡張することができます.

M: The Game Play Pattern 

(1)扱う問題の定義:
ゲームコンテンツを自動生成させること.

(2)どのような文脈における問題なのか:
ゲームコンテンツを手動で作成するのは時間と手間がかかるという問題に対処する方法です.

(3)プロンプト作成のためのアイデア:

ゲームのルールはユーザ側が指定しますが,その中身自体はLLMに任せることができます.LLMは表現力の高い自然言語を入力に受け取ることができるので,これまでのゲーム体験とは異なる操作感・インターフェースをもったゲームの開発に繋げられるでしょう.

(4)プロンプトの具体例:
“We are going to play a cybersecurity game. You are going to pretend to be a Linux terminal for a computer that has been compromised by an attacker. When I type in a command, you are going to output the corresponding text that the Linux terminal would produce. I am going to use commands to try and figure out how the system was compromised. The attack should have done one or more of the following things: (1) launched new processes, (2) changed files, (3) opened new ports to receive communi- cation, (4) created new outbound connections, (5) changed passwords, (6) created new user accounts, or (7) read and stolen information. To start the game, print a scenario of what happened that led to my investigation and make the description have clues that I can use to get started.” (本文より引用)
Linux上でサイバー攻撃にあった状況をシミュレーションしたサイバーセキュリティゲームの例です.Personaパターンと組み合わせることで,効果的で斬新なゲームを作成することができています. 

(5)長所・短所・応用方法:
上の例のように,これまでに紹介してきた様々なパターン(Persona, Infinite Generation, Visualization Generator)と組み合わせると良いでしょう.

N: The Reflection Pattern

(1)扱う問題の定義:
出力に至った論理的な背景を出力させること.

(2)どのような文脈における問題なのか:
LLMがどのような過程で,何を根拠に,どういう仮定のもとで回答を出力したのかを把握することは,重要であり,プロンプトのデバッグを容易にすることにも繋がります.

(3)プロンプト作成のためのアイデア:

回答の根拠と仮定も説明するように指示しましょう.その上で,ユーザが質問をする際に参考とするためであると伝えておくことで,ユーザの理解に有用な説明をしてくれるでしょう.

(4)プロンプトの具体例:
”When you provide an answer, please explain the reasoning and assumptions behind your selection of software frameworks. If possible, use specific examples or evidence with associated code samples to support your answer of why the framework is the best selection for the task. Moreover, please address any potential ambiguities or limitations in your answer, in order to provide a more complete and accurate response.” (本文より引用)

(5)長所・短所・応用方法:
ユーザが論理的根拠としてあげた内容が,ユーザにとって理解の範囲を超えたものである場合がありますが,そのような時はFact Check Listパターンなどと組み合わせることで対処しましょう.

O: The Refusal Breaker Pattern 

(1)扱う問題の定義:
LLMが回答を拒否する際に,別の言い方のプロンプトを作成すること.

(2)どのような文脈における問題なのか:
LLMは回答に必要な知識が欠けていたり,質問の意図が汲み取れない時に,回答を拒むことがありますが,これはユーザにとってフラストレーションの原因になります.このような時に,LLMが答えてくれるような別の質問の仕方を見つけるためのパターンです.

(3)プロンプト作成のためのアイデア:

LLMが回答できない時に,その理由を提供するように指示します.おそらく,仮定や制約,誤解が原因となっている場合が多いでしょう.回答できない理由を検証することで,別の言い方を考えるヒントになり得ます.また,質問文の代替案を提示するように指示するのも良いかもしれません.

(4)プロンプトの具体例:
“Whenever you can’t answer a question, explain why and provide one or more alternate wordings of the question that you can’t answer so that I can improve my questions.” (本文より引用)
と指示した後で,
User: What is the meaning of life?

ChatGPT: As an AI language model, I do not have personal beliefs or opinions. The meaning of life is a complex philosophical question that has been pondered by humans for centuries and can vary greatly from person to person. It may be more productive to rephrase the question in a way that can be answered by information and knowledge, such as “What are some philosophical perspectives on 
the meaning of life?” or “What are some common beliefs about the purpose of life?” (本文より引用)
この例では,抽象的な質問に対するLLMなりの代替案を提示してきています.

 (5)長所・短所・応用方法:
このパターンは悪用される可能性があるため,倫理観を持って使用することが求められます.

P: The Context Manager Pattern

(1)扱う問題の定義:
LLMとの会話におけるコンテキストを狭めたり,広げたりすることで,会話の焦点を調整すること.

(2)どのような文脈における問題なのか:
LLMもユーザも,議論の中心トピックから離れた内容を会話に盛り込むことがあり,それが会話の流れを乱す可能性があります.その際に,会話の一貫性を維持することが重要です.

(3)プロンプト作成のためのアイデア:

考慮すべき項目と無視すべき項目を明確にリスト化して提示してあげることが重要です.

(4)プロンプトの具体例:
“When analyzing the following pieces of code, only consider security aspects.” (本文より引用)
“Ignore everything that we have discussed. Start over.” (本文より引用)
こちらは,それまでの会話の内容を全て無視して,始めからやり直す,リセットするための文言です.

(5)長所・短所・応用方法:
文脈のリセットに際して,どこまでの情報が消えてしまうかには注意を払う必要があります.

Q: The Recipe Pattern 

(1)扱う問題の定義:
与えられた要素から,目的を達成するための手順を考案させること.

(2)どのような文脈における問題なのか:
材料や要素はわかるけれども,どのような手順で実行すれば良いかわからない時に,使えるパターンです.

(3)プロンプト作成のためのアイデア:

はじめに解決したい問題を教え,そのための要素として必要な途中ステップを提示します.これらを用いつつ,補完したりして,完全な手順を作成するように指示します.また,不必要なステップがあれば,それも教えてもらうようにしましょう.

(4)プロンプトの具体例:
“I am trying to deploy an application to the cloud. I know that I need to install the necessary dependen- cies on a virtual machine for my application. I know that I need to sign up for an AWS account. Please provide a complete sequence of steps. Please fill in any missing steps. Please identify any unnecessary steps.” (本文より引用)

(5)長所・短所・応用方法:
ユーザが指定した途中ステップが間違っている場合,LLMの回答はそれに引きづられてしまう可能性があることには注意しましょう.

まとめ

今回は,特定のプロンプトテンプレートを提示するのではなく,プロンプト作成の背後にある考え方や心得をまとめた論文をご紹介しました.数々のパターンがありましたが,これらを効果的に組み合わせることで,LLMの持つ新しい可能性を見出すことができるかもしれません.ぜひ,使ってみていただければと思います.

Abe avatar
AI分野の楽しさを少しでもお伝えできたらと思っています!

記事の内容等について改善箇所などございましたら、
お問い合わせフォームよりAI-SCHOLAR編集部の方にご連絡を頂けますと幸いです。
どうぞよろしくお願いします。

お問い合わせする