『ChatGPT』とは、OpenAI が開発した「自然言語処理技術」のひとつです。
とは言っても、『ChatGPT』を使ったら誰でも良い回答を得られるとは限りません。
より良い文章を生成するためには、「プロンプト」と呼ばれる入力情報を与える必要があります。
「プロンプト」とは、『ChatGPT 』に与える入力文のことです。
このプロンプトが、生成する文章や回答の内容・質を大きく左右するのです。
そこで今回は、Open AI 公式サイトに掲載されている【 GPT best practices 】を日本語に翻訳してお届けします。
- より良い結果を得るための6つの戦略
- さいごに
より良い結果を得るための6つの戦略
OpenAI の公式サイトの中に【 GPTのベストプラクティス 】というページがあります。▶https://platform.openai.com/docs/guides/production-best-practices
【戦略1】明確な指示を書く
GPTはあなたの心を読むことはできません。出力が長すぎる場合は、簡潔な回答を求めてみてください。出力が簡単すぎる場合は、専門家レベルの文章を求めてみてください。形式が気に入らない場合は、望む形式を示してみてください。GPTがあなたの要望を推測する必要がなければなるほど、より望む結果を得られる可能性が高まります。
✅リクエストに詳細を含めることでより関連性の高い回答を得る
あなたの意図に沿った高い関連性を持つ応答を得るためには、あなたのリクエストに重要な詳細や文脈が含まれていることを確認してください。
それが含まれないと、あなたの意図が何を意味するのかをモデルが推測することになります。
【悪い例】Excelで数値をどうやって足しますか?
【良い例】Excelでドル額の行をどのように合計しますか?
全ての行についてこれを自動的に行い、
"Total"という列に全ての合計を表示したいです。
✅モデルに特定の役割を演じるように依頼する
システムメッセージを使用して、モデルが返信する際に使用する役割を指定することができます。
System | 私が何かを書くのを助けるように頼むと、各段落に少なくとも1つのジョークや遊び心のあるコメントが含まれるドキュメントで返信します。 |
User | 私のスチールボルトの納品業者に、納品を時間内かつ急な要請で行っていただいたことに感謝のメモを書いてください。これにより、重要な注文を届けることができました。 |
【システムメッセージ】
System:ChatGPT に与える役を設定するために使用します。
User:ユーザーが ChatGPT に提供したいテキストを含めるために使用されます。
Assistant:以前の応答を保存するのに役立ちます。
文章要約や翻訳を行う際の対象となるテキストをここに設定します。
また、望ましい動作の例や回答の選択肢を示す使い方も可能です。
✅区切り記号を使用して入力の異なる部分を明確に示す
三重引用符、XMLタグ、セクションタイトルなどの区切り記号は、テキストのセクションを異なる方法で区別するのに役立ちます。
User | 三重引用符で区切られた文章を俳句で要約してください。 """ここにテキストを挿入する""" |
System | 同じトピックに関する一組の記事(XMLタグで区切られたもの)が用意される。まず、各記事の論点を要約する。そして、どちらの記事がより良い議論をしているか示し、その理由を説明しなさい。 |
User |
|
System | 論文要旨とそのタイトル案が提供されます。論文のタイトルは、読者に論文のテーマがよくわかるものでなければなりませんが、人目を引くものでなければなりません。タイトルがこれらの基準を満たさない場合、5つの代替案を提案する。 |
User | 要旨:ここに要旨を挿入する タイトル:ここにタイトルを挿入する |
✅タスクを完了するために必要なステップを指定する
タスクの中には、一連の手順としてステップを指定するのが最適なケースがあります。ステップを明示的に書き出すことで、モデルがそのステップに従うことが容易になります。
System |
ユーザーの入力に対応するために、以下のステップバイステップの手順を使用します。 ステップ1 - ユーザーはテキストを三重引用符で提供します。 ステップ2 - ステップ1の要約をスペイン語に翻訳し、 |
User | """ここにテキストを挿入する""" |
✅例を提示する
一般的な指示を提供することは、すべての例に適用できるため効率的です。場合によっては例を提供する方が簡単な場合もあります。
例えば、モデルに特定のスタイルで応答するようにコピーさせたい場合などは、明示的に説明するのが難しいため、例を提供することがあります。
これは「few-shot」プロンプティングとして知られています。
System | 一貫したスタイルで回答してください。 |
User | 深い谷を刻む川はささやかな泉から流れ、壮大な交響曲は一音から生まれ、最も複雑なタペストリーは一本の糸から始まる。 |
Assistant | 海について教えてください。 |
✅出力の希望する長さを指定する
モデルに、指定した目標の長さのアウトプットを生成するよう依頼することができます。目標とするアウトプットの長さは、単語、文、段落、箇条書きなどの数で指定することができます。
ただし、特定の語数を生成するようにモデルに指示しても、高い精度で動作しないことに注意してください。特定の段落数や箇条書きの数を指定した方が、より確実に出力を生成することができます。
User | 三重引用符で区切られた文章を50字程度で要約してください。 """ここにテキストを挿入する""" |
User | 三重引用符で区切られた本文を2段落にまとめてください。 """ここにテキストを挿入する""" |
User | 三重引用符で区切られた本文を3つの箇条書きに要約する。 """ここにテキストを挿入する""" |
【戦略2】参考テキストを提供する
GPTは自信を持って偽の答えを作り出すことができます、特に難解なトピックや引用やURLについて尋ねられたときには。テストで生徒のパフォーマンスを向上させるためのノートのように、GPTに参考テキストを提供すると、より少ない捏造で答えるのに役立ちます。
✅参照テキストを使用して回答するようにモデルに指示する
現在のクエリに関連する信頼できる情報をモデルに提供できれば、提供された情報を使って答えを構成するようにモデルに指示することができます。
System | 質問には、三重引用符で区切られた提供された記事を使用してください。記事の中に答えが見つからない場合は、"答えを見つけることができませんでした"と書く。 |
User | """ここに記事を挿入する""" 質問:質問を挿入する |
ChatGPT が限られたコンテキストウィンドウしか持たないことを考えると、この戦術を適用するためには、質問されたことに関連する情報を動的に検索する何らかの方法が必要です。
Embeddings (埋め込み検索)は、効率的な知識検索を実現するために利用することができます。
✅参考文献を引用して回答するようにモデルに指示する
もし入力に関連する知識が補完されている場合、モデルに提供された文書の一部を参照することで、回答に引用を追加するよう要求することは簡単です。
ただし、出力の引用は、提供された文書内での文字列マッチングによってプログラム的に検証することができます。
System | あなたには三重引用符で区切られた文書と質問が与えられます。 あなたのタスクは、与えられた文書のみを使用して質問に答え、答えるために使用された文書の一部を引用することです。 もし文書に質問に必要な情報が含まれていない場合は、単に「情報不足」と記述してください。 質問に対する回答が提供される場合、引用を付けて注釈をつける必要があります。 関連する部分を引用するための以下の形式を使用してください({"citation": ...})。 |
User | """ここに文書を挿入する""" 質問:ここに質問を挿入する |
【戦略3】複雑なタスクを
よりシンプルなサブタスクに分割する
ソフトウェアエンジニアリングで複雑なシステムを一連のモジュールコンポーネントに分解するのが良い習慣であるように、GPTに提出されるタスクについても同様です。複雑なタスクは、単純なタスクよりもエラーレートが高い傾向があります。さらに、複雑なタスクはよく、早期のタスクの出力が後期のタスクの入力を構築するような、より単純なタスクのワークフローとして再定義できます。
✅意図の分類を使用して、ユーザーのクエリに最も関連性の高い命令を特定する
多くの独立した指示セットが必要となるタスクでは、まずクエリの種類を分類し、その分類をもとに必要な指示を決定すると有益です。
これは、固定カテゴリを定義し、特定のカテゴリでのタスクを処理するために関連する指示をハードコーディングすることで達成できます。
このプロセスは、タスクを一連の段階に分解するためにも再帰的に適用できます。
このアプローチの利点は、各クエリには次のタスクの段階を実行するために必要な指示のみが含まれるため、全体のタスクを単一のクエリで実行する場合に比べてエラー率が低くなることです。
また、大きなプロンプトは実行コストが高くなるため、これによりコストも低く抑えることができます。
例えば、カスタマーサービスアプリケーションでは、以下のようにクエリを分類すると便利であると考えられます。
System |
顧客サービスに関する問い合わせが提供されます。
プライマリーカテゴリ:
課金の2次カテゴリ:
テクニカルサポートの2次カテゴリー:
アカウント管理の2次カテゴリ:
一般的なお問い合わせの2次カテゴリ: |
User | またインターネットを使えるようにしたい。 |
顧客の問い合わせの分類に基づいて、次のステップを処理するためのGPTモデルに対してより具体的な指示を提供できます。例えば、顧客が「トラブルシューティング」についての助けを必要としているとします。
System |
以下の指示は、技術サポートの文脈でトラブルシューティングが必要な顧客サービスの問い合わせを提供された場合に適用されます。以下の手順でユーザーを支援してください:
|
User | またインターネットを使えるようにしたい。 |
モデルには、会話の状態が変化する際に特別な文字列を出力するよう指示されていることに注目してください。これにより、システムを状態遷移図のような状態遷移マシンにすることができます。状態によって注入される命令が決まります。状態を追跡し、その状態でどの命令が関連するか、そしてオプションでその状態から許可される状態遷移も追跡することで、より構造化されたアプローチでは実現が難しいユーザーエクスペリエンスに対して制約を設けることができます。
✅非常に長い会話が必要な対話型アプリケーションでは、以前の対話を要約またはフィルタリングする
GPT は固定のコンテキスト長を持つため、ユーザーとアシスタントの間の対話がコンテキストウィンドウ全体に含まれる場合、無限に続けることはできません。
この問題に対するさまざまな回避策がありますが、その1つは以前の対話を要約することです。入力のサイズがあらかじめ決められた閾値に達した場合、対話の一部を要約するクエリがトリガーとなり、以前の対話の要約がシステムメッセージの一部として含まれることがあります。また、以前の対話は対話全体で非同期に要約されることもあります。
別の解決策は、現在のクエリに最も関連性の高い以前の対話の部分を動的に選択することです。
✅長い文書を分割して要約し、再帰的に完全な要約を構築する
GPT は固定のコンテキスト長を持つため、一度のクエリでコンテキストの長さマイナス生成される要約の長さよりも長いテキストを要約することはできません。
書籍など非常に長い文書を要約するためには、文書の各セクションを要約するためのクエリのシーケンスを使用することができます。セクションの要約を連結し、要約の要約を作成することができます。このプロセスを再帰的に繰り返し、文書全体を要約します。
後のセクションを理解するために以前のセクションの情報を使用する必要がある場合、そのポイントでのコンテンツを要約する際に、そのポイント以前のテキストの逐次的な要約を含めるというトリックも有用です。
この手法は、GPT-3 のバリアントを使用して OpenAI によって以前の研究で書籍を要約するための効果が調査されています。
【戦略4】GPTに「考える」時間を与える
17×28の暗算を求められたとき、あなたはすぐに答えが出ないかもしれませんが、時間をかければ解けるでしょう。同様に、GPTは答えをすぐに出そうとすると、より多くの推論エラーを犯します。答えを出す前に一連の推論過程を求めると、GPTはより確実に正しい答えにたどり着くことができます。
✅結論に急ぎすぎず、モデルが自分で解決策を考えるように指示する
時には、結論に至る前にモデルに最初の原理から推論するよう明示的に指示すると、より良い結果が得られることがあります。例えば、数学の問題に対する学生の解答をモデルに評価させたい場合を考えてみましょう。これに取り組む最も明らかな方法は、単に学生の解答が正しいかどうかをモデルに尋ねることです。
System | 生徒の解答が正しいか否かを判断してください。 |
User |
問題設定: 私は太陽光発電設備を建設しており、財務を計算するのに助けが必要です。 土地のコストは1平方フィートあたり100ドルです。
学生の解答: xをインストールのサイズ(平方フィート)とすると、以下のようになります。 土地の費用:100x |
Assistant | 生徒の解答は正しいです。 |
しかし、その生徒の解は実は正しくない!
このことにうまく気づいてもらうためには、まずモデルに自分の解を生成するように促すことが必要です。
System |
まず、自分自身で問題に対する解決策を考えてください。 その後、自分の解決策と学生の解答を比較し、学生の解答が正しいかどうかを評価してください。 問題を自分自身で解いてから学生の解答が正しいかどうかを判断するまで、学生の解答が正しいかどうかを決めないでください。 |
User |
問題設定: 私は太陽光発電設備を建設しており、財務を計算するのに助けが必要です。 土地のコストは1平方フィートあたり100ドルです。
学生の解答: xをインストールのサイズ(平方フィート)とすると、以下のようになります。 土地の費用:100x |
Assistant |
xをインストールのサイズ(平方フィート)とすると、以下のようになります。 1. 土地の費用:100x 学生の解答は間違っています。 彼らはメンテナンスの費用計算で100xを使ってしまいましたが、正しくは10xです。運用の最初の年の正しい総費用は360x + 100,000です。 |
✅内部モノローグや一連のクエリーを使って、モデルの推論過程を隠す
前の戦術では、特定の質問に答える前にモデルが問題について詳細に推論することが重要な場合があることを示しています。
一部のアプリケーションでは、モデルが最終的な回答に至るために使用する推論プロセスをユーザーと共有することは適切ではありません。
例えば、教育アプリケーションでは、学生に独自の回答を見つけるよう促したい場合がありますが、モデルが学生の解答についての推論プロセスを明らかにすることで、学生に答えが明かされてしまう可能性があります。
内的なモノローグは、これを軽減するための戦術です。内的なモノローグのアイデアは、ユーザーに見せるべきではない出力の一部を、解析しやすい構造化された形式で出力するようモデルに指示することです。そして、出力をユーザーに提示する前に、出力を解析し、一部の出力のみを表示します。
System |
ユーザーの問い合わせに答えるために以下のステップを実行してください。 ステップ1 - まず自分自身で問題の解決策を考え出します。学生の解答に依存せず、それが間違っている可能性があるためです。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ2 - 自分の解答と学生の解答を比較し、学生の解答が正しいかどうかを評価します。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ3 - もし学生が間違いを犯した場合、答えを明かすことなくどのようなヒントを学生に与えることができるかを決定します。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ4 - もし学生が間違いを犯した場合、前のステップで提供したヒントを学生に伝えます(3重の引用符の外側で)。"ステップ4 - ..."と書く代わりに "ヒント:" と記述します。 |
User |
問題文:問題文を挿入する 生徒の解決策:生徒の解決策を挿入する |
あるいは、最後以外のすべてのクエリの出力をエンドユーザーから隠すクエリのシーケンスでも同様の結果を得ることができます。
まず、モデルに問題を独自に解決するように求めることができます。この最初のクエリでは学生の解答は必要ないため、省略することができます。
これにより、モデルの解決策が学生の試みの解答にバイアスを受ける可能性がないという追加の利点もあります。
User | 問題文を挿入する |
次に、モデルに利用可能なすべての情報を使用して、学生の解答の正確性を評価させることができます。
System | 自分自身の解決策と学生の解答を比較し、学生の解答が正しいかどうかを評価してください。 |
User |
問題文:"""問題文を挿入する""" あなたの解決策:"""モデルが生成した解答を挿入する""" 学生の解答:"""学生の解答を挿入する""" |
最後に、モデルに独自の分析を使用して、助言的なチューターの役割で回答を構築させることができます。
System |
あなたは数学のチューターです。 もし学生が間違いをした場合は、答えを明かさない形で学生にヒントを提供してください。 学生が間違いをしなかった場合は、励ましのコメントを提供してください。 |
User |
問題文:"""問題文を挿入する""" あなたの解決策:"""モデルが生成した解答を挿入する""" 学生の解答:"""学生の解答を挿入する""" 分析:"""前のステップでモデルが生成した分析を挿入する""” |
✅モデルに以前の処理で見落とした部分はないか尋ねる
ある質問に関連する特定の抜粋をリストするためにモデルを使用しているとします。各抜粋をリストした後、モデルは次の抜粋を書き始めるべきか、それとも停止すべきかを判断する必要があります。
ソースドキュメントが大きい場合、モデルは早めに停止し、関連するすべての抜粋をリストアップできないことがよくあります。その場合、モデルに以前の処理で見落とした抜粋を見つけるための追加のクエリを提示することで、より良いパフォーマンスを得ることができます。
System |
以下の質問に関連する抜粋を含む、三重引用符で区切られたドキュメントが提供されます。 「人工知能の歴史において重要なパラダイムシフトは何が起こったか」。 抜粋には、それらを解釈するために必要なすべての関連コンテキストが含まれていることを確認してください。重要なコンテキストが欠落している小さなスニペットを抽出しないでください。 以下のようなJSON形式で出力してください。 [{"excerpt": "..."}, ... {"excerpt": "..."}] |
User | """ここにドキュメントを挿入する""" |
Assistant | [{"excerpt":"モデルはここに抜粋を書く"}、 ... {"excerpt":"モデルはここに別の抜粋を書く"}]. |
User |
より関連性の高い抜粋はありますか? 抜粋の繰り返しに注意してください。 また、抜粋にはそれらを解釈するために必要なすべての関連コンテキストが含まれていることを確認してください。つまり、重要なコンテキストが欠落している小さなスニペットを抽出しないでください。 |
【戦略5】外部ツールを使用する
他のツールの出力をGPTに供給することで、GPTの弱点を補いましょう。例えば、テキスト検索システムはGPTに関連文書を教えることができます。コード実行エンジンはGPTが数学的な計算をしたり、コードを実行したりするのを助けます。実行したいタスクがGPTよりも他ツールを使用してより確実、もしくは効率的に行える場合は、他ツールに役割を担ってもらうことで最適な結果を得ることができます。
✅効率的な知識の検索を実装するために埋め込みベースの検索を使用する
モデルは、入力の一部として提供された外部情報を活用することができます。これにより、モデルはより情報豊かで最新の応答を生成するのに役立ちます。
例えば、ユーザーが特定の映画についての質問をする場合、その映画に関する高品質な情報(俳優、監督など)をモデルの入力に追加すると便利です。埋め込みは効率的な知識の検索を実装するために使用できるため、実行時に関連情報をモデルの入力に動的に追加することができます。
テキストの埋め込みは、テキスト文字列間の関連性を測定できるベクトルです。類似または関連性の高い文字列は、関連のない文字列よりも近くに配置されます。この事実と、高速なベクトル検索アルゴリズムの存在から、埋め込みは効率的な知識の検索を実装するために使用できます。
特に、テキストコーパスはチャンクに分割され、各チャンクは埋め込まれて保存されます。その後、与えられたクエリが埋め込まれ、ベクトル検索が実行され、クエリと最も関連性の高い(埋め込み空間で最も近い)テキストチャンクがコーパスから見つかります。
具体的な実装例は、OpenAI Cookbookで見つけることができます。
✅コードの実行を使用してより正確な計算や外部APIの呼び出しを行う
GPT は独自で正確な算術演算や長時間の計算を実行するために頼ることはできません。これが必要な場合、モデルに計算を行う代わりにコードを書き、実行するよう指示することができます。
特に、実行されるコードを三重バッククォートなどの指定された形式で書くようモデルに指示します。出力が生成された後、コードを抽出して実行できます。
最後に、必要に応じて、コード実行エンジン( Python インタプリタなど)からの出力を次のクエリのためのモデルへの入力として提供できます。
System |
Pythonコードを実行するためには、そのコードを三重バッククォート()で囲んでください。 例えば、```コードをここに書く```とします。 これを使用して計算を実行します。 |
User | 次の多項式の実数解を見つけてください: 3* |
外部 API を呼び出すことも、コード実行のもう一つの有用なユースケースです。
モデルに適切な API の使用方法を教えることで、API を利用したコードを書くことができます。API の使用方法をモデルに教えるには、API のドキュメントやコードサンプルを提供することができます。
これにより、モデルは API を正しく利用するためのコードを生成することができます。
System |
Pythonコードは、三重バッククォートで囲むことで記述し、実行することができます。 また、以下のモジュールを使用してユーザーが友達にメッセージを送信するのを支援することができます。 ```python import message message.write(to="John", message="Hey, want to meetup after work?")``` |
【戦略6】変更を体系的にテストする
パフォーマンスを測定できれば、改善するのは容易です。場合によっては、プロンプトへの修正が個別のある例ではより良いパフォーマンスを達成するが、多数の例では全体的なパフォーマンスが悪化することがあります。したがって、パフォーマンスに対する変更が全体としてプラスであることを確認するためには、パフォーマンス測定のためのテストケースをまとめた包括的なテスト用のデータセットを定義することが必要かもしれません。
✅ゴールドスタンダードの回答を参照してモデルの出力を評価する
特定の質問に対する正しい回答が特定の一連の既知の事実を参照する必要があることが分かっている場合、モデルのクエリを使用して回答に含まれる必要な事実の数を数えることができます。
System |
以下は、質問に対する回答として三重引用符で区切られたテキストが提供されます。 以下の情報が回答に直接含まれているかどうかを確認してください。 ニール・アームストロングは月面を歩いた最初の人物でした。 それぞれのポイントに対して、以下の手順を実行してください。 1 - ポイントを再述します。 最後に、「はい」と回答された数をカウントしてください。カウントは {"count": <ここにカウントを挿入>} として提供してください。 |
【両方のポイントを満たした入力例】
User |
"""ニール・アームストロングは、人類で初めて月面に降り立ったことで有名です。この歴史的な出来事は、1969年7月21日、アポロ11号のミッション中に行われました。""" |
【片方のポイントのみが満たされた入力例】
User |
"""ニール・アームストロングは、月着陸船から降りて、月面を歩いた最初の人物となり、歴史を刻みました。""" |
このタイプのモデルベースの評価には多くのバリエーションがあります。
次のバリエーションを考えてみましょう。
候補の回答とゴールドスタンダードの回答の間の重複の種類を追跡し、また、候補の回答がゴールドスタンダードの回答の一部と矛盾しているかどうかも追跡します。
System |
以下の手順に従って、ユーザーの入力に対して応答してください。各ステップの前に完全に再述してください。例: "ステップ1: 考え方..."。 ステップ1: 提出された回答と専門家の回答を比較し、情報が次のいずれかであるかどうかをステップごとに考えます: 相互排他的、等しい、部分集合、上位集合、または重複(つまり、一部が重なるが部分集合/上位集合ではない)。 ステップ2: 提出された回答が専門家の回答と矛盾しているかどうかをステップごとに考えます。 ステップ3: 以下のような構造のJSONオブジェクトを出力します: {"type_of_overlap": "disjoint"または"equal"または"subset"または"superset"または"overlapping", "contradiction": trueまたはfalse} |
【専門家の回答とは矛盾しないが、満足のいく回答ではないサンプルの入力例】
User |
質問:「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答:「彼は月に歩いたんじゃなかったか?」 専門家の回答:「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」 |
【専門家の回答と直接的に矛盾する回答の入力例】
User |
質問:「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答:「1969年7月21日に、バズ・オルドリンの後に、ニール・アームストロングが2番目の人として月面を歩いた。」 専門家の回答:「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」 |
【正しい回答であり、必要以上の詳細も提供している入力例】
User |
質問:「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答:「1969年7月21日のUTC時間02:56頃、ニール・アームストロングは月の表面に初めて足を踏み入れ、人類史上の画期的な成果を達成しました。」 専門家の回答:「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」 |
< 抜粋元:https://nagisa.ai/articles/gpt-best-practices-jp >
さいごに
かなり専門的な内容になってしまいましたね。
しかしながら、『ChatGPT』を使いこなすにはこれらの前提を明確に指示してあげることがとても重要なのです。
あなたが求める回答を得るために、試行錯誤してみる必要はあるでしょう。
では、またお会いしましょう!
👆 👆 👆 👆 クリックして応援してもらえたら頑張れます!