Open AI公式「GPT best practices」の全文日本語訳

2023/06/16

2023年6月にOpen AIから公式に「GPTからより良い結果を得るための戦略や戦術」としてGPT best practices(原文)が公表されました。


本記事ではそちらの内容を日本語訳でわかりやすく解説することを目指します。

(*翻訳は非公式です。英語の完全な直訳ではなく、より分かりやすい日本語や表現に置き換えている部分がございます)


↓以下からGPT best practices(原文)の日本語訳となります。


はじめに

このガイドでは、GPTからより良い結果を得るための戦略や戦術を紹介しています。紹介する方法は、組み合わせて使うことでより大きな効果を発揮することもあります。あなたにとって最も効果的な方法を見つけるために、ぜひ試してみてください。

紹介する方法の中には、現在、最も高性能なモデルであるgpt-4でのみ動作するものもあります。もし、まだgpt-4にアクセスできない場合は、ウェイティングリストへの参加をオススメしますします。実行したタスクで、GPTモデルから期待した成果が得られなかった場合、より高性能なGPTモデルが利用可能であれば、高性能なモデルで再挑戦することを推奨しています。

(※2023年6月時点で、gpt-4はウェイティングリスト待ちでAPI利用制限あり)


【目次】より良い結果を得るための6つの戦略

戦略1. 明確な指示を書く

GPTはあなたの心を読むことはできません。出力が長すぎる場合は、簡潔な回答を求めてみてください。出力が簡単すぎる場合は、専門家レベルの文章を求めてみてください。形式が気に入らない場合は、望む形式を示してみてください。GPTがあなたの要望を推測する必要がなければなるほど、より望む結果を得られる可能性が高まります。


【戦術(Tactics)】

1-1. リクエストに詳細を含めることでより関連性の高い回答を得る

1-2. モデルに特定の役割を演じるように依頼する

1-3. 区切り記号を使用して入力の異なる部分を明確に示す

1-4. タスクを完了するために必要なステップを指定する

1-5. 例を提示する

1-6. 出力の希望する長さを指定する


戦略2. 参考テキストを提供する

GPTは自信を持って偽の答えを作り出すことができます、特に難解なトピックや引用やURLについて尋ねられたときには。テストで生徒のパフォーマンスを向上させるためのノートのように、GPTに参考テキストを提供すると、より少ない捏造で答えるのに役立ちます。


【戦術(Tactics)】

2-1. 参照テキストを使用して回答するようにモデルに指示する

2-2. 参考文献を引用して回答するようにモデルに指示する


戦略3. 複雑なタスクをよりシンプルなサブタスクに分割する

ソフトウェアエンジニアリングで複雑なシステムを一連のモジュールコンポーネントに分解するのが良い習慣であるように、GPTに提出されるタスクについても同様です。複雑なタスクは、単純なタスクよりもエラーレートが高い傾向があります。さらに、複雑なタスクはよく、早期のタスクの出力が後期のタスクの入力を構築するような、より単純なタスクのワークフローとして再定義できます。


【戦術(Tactics)】

3-1. 意図の分類を使用して、ユーザーのクエリに最も関連性の高い命令を特定する

3-2. 非常に長い会話が必要な対話型アプリケーションでは、以前の対話を要約またはフィルタリングする

3-3. 長い文書を分割して要約し、再帰的に完全な要約を構築する


戦略4. GPTに「考える」時間を与える

17×28の暗算を求められたとき、あなたはすぐに答えが出ないかもしれませんが、時間をかければ解けるでしょう。同様に、GPTは答えをすぐに出そうとすると、より多くの推論エラーを犯します。答えを出す前に一連の推論過程を求めると、GPTはより確実に正しい答えにたどり着くことができます。


【戦術(Tactics)】

4-1. 結論に急ぎすぎず、モデルが自分で解決策を考えるように指示する

4-2. 内部モノローグや一連のクエリーを使って、モデルの推論過程を隠す

4-3. モデルに以前の処理で見落とした部分はないか尋ねる


戦略5. 外部ツールを使用する

他のツールの出力をGPTに供給することで、GPTの弱点を補いましょう。例えば、テキスト検索システムはGPTに関連文書を教えることができます。コード実行エンジンはGPTが数学的な計算をしたり、コードを実行したりするのを助けます。実行したいタスクがGPTよりも他ツールを使用してより確実、もしくは効率的に行える場合は、他ツールに役割を担ってもらうことで最適な結果を得ることができます。


【戦術(Tactics)】

5-1. 効率的な知識の検索を実装するために埋め込みベースの検索を使用する

5-2. コードの実行を使用してより正確な計算や外部APIの呼び出しを行う


戦略6. 変更を体系的にテストする

パフォーマンスを測定できれば、改善するのは容易です。場合によっては、プロンプトへの修正が個別のある例ではより良いパフォーマンスを達成するが、多数の例では全体的なパフォーマンスが悪化することがあります。したがって、パフォーマンスに対する変更が全体としてプラスであることを確認するためには、パフォーマンス測定のためのテストケースをまとめた包括的なテスト用のデータセットを定義することが必要かもしれません。


【戦術(Tactics)】

6-1. ゴールドスタンダードの回答を参照してモデルの出力を評価する


【詳細】戦術の解説

上記のそれぞれの戦略は、具体的な戦術で具体化することができます。これらの戦術は、試すべきアイデアを提供することを目的としています。これらは決して完全に包括的なものではなく、ここに示されていない創造的なアイデアを試す自由があります。

戦略1:明確な指示を書く

1-1:リクエストに詳細を含めることでより関連性の高い回答を得る

あなたの意図に沿った高い関連性を持つ応答を得るためには、あなたのリクエストに重要な詳細や文脈が含まれていることを確認してください。それが含まれないと、あなたの意図が何を意味するのかをモデルが推測することになります。


悪い例
良い例
Excelで数値をどうやって足しますか?
Excelでドル額の行をどのように合計しますか?全ての行についてこれを自動的に行い、"Total"という列に全ての合計を表示したいです。
誰が大統領ですか?
2021年のメキシコの大統領は誰で、選挙はどのくらいの頻度で行われますか?
フィボナッチ数列を計算するコードを書いてください。
TypeScriptの関数を用いて効率的にフィボナッチ数列を計算するコードを書いてください。各部分が何をするのか、なぜそのように書かれているのかを詳しくコメントしてください。
ミーティングのノートを要約してください。
ミーティングのノートを1つのパラグラフで要約してください。その後、スピーカーとその主要なポイントをマークダウンリストで書き出してください。最後に、スピーカーが提案した次のステップやアクションアイテムをリストアップしてください(もしあれば)。


1-2:モデルに特定の役割を演じるように依頼する

システムメッセージを使用して、モデルが返信する際に使用する役割を指定することができます。


SYSTEM
私が何かを書くのを助けるように頼むと、各段落に少なくとも1つのジョークや遊び心のあるコメントが含まれるドキュメントで返信します。
USER
私のスチールボルトの納品業者に、納品を時間内かつ急な要請で行っていただいたことに感謝のメモを書いてください。これにより、重要な注文を届けることができました。

Playgroundのサンプルへ


1-3:区切り記号を使用して入力の異なる部分を明確に示す

三重引用符、XMLタグ、セクションタイトルなどの区切り記号は、テキストのセクションを異なる方法で区別するのに役立ちます。


USER
三重引用符で区切られた文章を俳句で要約してください。 """ここにテキストを挿入する"""

Playgroundのサンプルへ


SYSTEM
同じトピックに関する一組の記事(XMLタグで区切られたもの)が用意される。まず、各記事の論点を要約する。そして、どちらの記事がより良い議論をしているか示し、その理由を説明しなさい。
USER
<article>ここに最初の記事を挿入</article>。 <article> 2つ目の記事をここに挿入する</article>

Playgroundのサンプルへ


SYSTEM
論文要旨とそのタイトル案が提供されます。論文のタイトルは、読者に論文のテーマがよくわかるものでなければなりませんが、人目を引くものでなければなりません。タイトルがこれらの基準を満たさない場合、5つの代替案を提案する。
USER
要旨:ここに要旨を挿入してください タイトル:ここにタイトルを挿入してください

Playgroundのサンプルへ


このような明確なタスクにおいては、デリミタの使用は出力の品質に大きな影響を与えないかもしれません。しかし、タスクがより複雑であるほど、タスクの詳細を明確にすることが重要です。GPTに正確に何を求めているのかを理解させるために、余計な作業をさせないでください。


1-4:タスクを完了するために必要なステップを指定する

タスクの中には、一連の手順としてステップを指定するのが最適なケースがあります。ステップを明示的に書き出すことで、モデルがそのステップに従うことが容易になります。


SYSTEM
ユーザーの入力に対応するために、以下のステップバイステップの手順を使用します。 ステップ1 - ユーザーはテキストを三重引用符で提供します。このテキストを「Summary: 」という接頭辞を付けて1文で要約してください。 ステップ2 - ステップ1の要約をスペイン語に翻訳し、「Translation: 」という接頭辞を付けて表示してください。
USER
"""ここにテキストを挿入してください""”

Playgroundのサンプルへ


1-5:例を提示する

一般的な指示を提供することは、すべての例に適用できるため、通常は効率的ですが、場合によっては例を提供する方が簡単な場合もあります。たとえば、モデルに特定のスタイルでユーザーのクエリに応答するようにコピーさせたい場合などは、明示的に説明するのが難しいため、例を提供することがあります。これは「few-shot」プロンプティングとして知られています。


SYSTEM
一貫したスタイルで回答してください。
USER
忍耐について教えてください。
ASSISTANT
深い谷を刻む川はささやかな泉から流れ、壮大な交響曲は一音から生まれ、最も複雑なタペストリーは一本の糸から始まる。
USER
海について教えてください。

Playgroundのサンプルへ


1-6:出力の希望する長さを指定する

モデルに、指定した目標の長さのアウトプットを生成するよう依頼することができます。目標とするアウトプットの長さは、単語、文、段落、箇条書きなどの数で指定することができます。ただし、特定の語数を生成するようにモデルに指示しても、高い精度で動作しないことに注意してください。特定の段落数や箇条書きの数を指定した方が、より確実に出力を生成することができます。


USER
三重引用符で区切られた文章を50字程度で要約すしてください。 """ここにテキストを挿入する"""

Playgroundのサンプルへ


USER
三重引用符で区切られた本文を2段落にまとめてください。 """ここにテキストを挿入する""”

Playgroundのサンプルへ


USER
三重引用符で区切られた本文を3つの箇条書きで要約する。 """ここにテキストを挿入する"""

Playgroundのサンプルへ


戦略2:参考テキストを提供する

2-1:参照テキストを使用して回答するようにモデルに指示する

現在のクエリに関連する信頼できる情報をモデルに提供できれば、提供された情報を使って答えを構成するようにモデルに指示することができます。


SYSTEM
質問には、三重引用符で区切られた提供された記事を使用してください。記事の中に答えが見つからない場合は、"答えを見つけることができませんでした"と書く。
USER
<三重引用符で区切られた記事を挿入してください> 質問:<質問を挿入してください>

Playgroundのサンプルへ


GPTが限られたコンテキストウィンドウしか持たないことを考えると、この戦術を適用するためには、質問されたことに関連する情報を動的に検索する何らかの方法が必要です。Embeddings (埋め込み検索)は、効率的な知識検索を実現するために利用することができます。この実装方法の詳細については、「5-1. 効率的な知識の検索を実装するために埋め込みベースの検索を使用する」を参照してください。


2-2:参考文献を引用して回答するようにモデルに指示する

もし入力に関連する知識が補完されている場合、モデルに提供された文書の一部を参照することで、回答に引用を追加するよう要求することは簡単です。ただし、出力の引用は、提供された文書内での文字列マッチングによってプログラム的に検証することができます。


SYSTEM
あなたには三重引用符で区切られた文書と質問が与えられます。あなたのタスクは、与えられた文書のみを使用して質問に答え、答えるために使用された文書の一部を引用することです。 もし文書に質問に必要な情報が含まれていない場合は、単に「情報不足」と記述してください。 質問に対する回答が提供される場合、引用を付けて注釈をつける必要があります。関連する部分を引用するための以下の形式を使用してください({"citation": ...})。
USER
"""<ここに文書を挿入>""" 質問:<ここに質問を挿入してください>

Playgroundのサンプルへ


戦略3. 複雑なタスクをよりシンプルなサブタスクに分割する

3-1:意図の分類を使用して、ユーザーのクエリに最も関連性の高い命令を特定する

多くの独立した指示セットが必要となるタスクでは、まずクエリの種類を分類し、その分類をもとに必要な指示を決定すると有益です。これは、固定カテゴリを定義し、特定のカテゴリでのタスクを処理するために関連する指示をハードコーディングすることで達成できます。このプロセスは、タスクを一連の段階に分解するためにも再帰的に適用できます。このアプローチの利点は、各クエリには次のタスクの段階を実行するために必要な指示のみが含まれるため、全体のタスクを単一のクエリで実行する場合に比べてエラー率が低くなることです。また、大きなプロンプトは実行コストが高くなる(料金情報を参照)ため、これによりコストも低く抑えることができます。


例えば、カスタマーサービスアプリケーションでは、以下のようにクエリを分類すると便利であると考えられます。


SYSTEM
顧客サービスに関する問い合わせが提供されます。各クエリを一次カテゴリと二次カテゴリに分類する。キーはprimaryとsecondaryで、json形式で出力を提供する。 プライマリーカテゴリ:課金、テクニカルサポート、アカウント管理、一般的な問い合わせ。 課金の2次カテゴリ: - 配信停止またはアップグレード - 支払い方法を追加する - 請求に関する説明 - 請求の異議申し立て テクニカルサポートの2次カテゴリー: - トラブルシューティング - デバイスの互換性 - ソフトウェアアップデート アカウント管理の2次カテゴリ: - パスワードリセット - 個人情報の更新 - アカウント閉鎖 - アカウントのセキュリティ 一般的なお問い合わせの2次カテゴリ: - 製品情報 - 価格設定について - フィードバック - 人間に相談する
USER
またインターネットを使えるようにしたい。

Playgroundのサンプルへ


顧客の問い合わせの分類に基づいて、次のステップを処理するためのGPTモデルに対してより具体的な指示を提供できます。例えば、顧客が「トラブルシューティング」についての助けを必要としているとします。


SYSTEM
以下の指示は、技術サポートの文脈でトラブルシューティングが必要な顧客サービスの問い合わせを提供された場合に適用されます。以下の手順でユーザーを支援してください: - ルーターからのすべてのケーブルが接続されているか確認するように彼らに尋ねます。時間が経つとケーブルが緩むことが一般的なので注意が必要です。 - すべてのケーブルが接続されていても問題が続く場合は、どのルーターモデルを使用しているか尋ねます。 - 次に、デバイスの再起動方法について彼らにアドバイスします:  — モデル番号がMTD-327Jの場合、赤いボタンを押し続けて5秒間待ち、接続をテストする前に5分間待つようにアドバイスします。  — モデル番号がMTD-327Sの場合、プラグを抜いて再度差し込むようにアドバイスし、接続をテストする前に5分間待つようにします。 - デバイスを再起動し、5分間待った後でも顧客の問題が解決しない場合は、出力として{"ITサポートを要求"}を用いてITサポートにつなぎます。 - ユーザーがこのトピックに関連しない質問を始めた場合は、現在のトラブルシューティングに関するチャットを終了したいか確認し、その要求を次のスキームに従って分類します: <上記の一次/二次分類スキームをここに挿入>
USER
またインターネットを使えるようにしたい。

Playgroundのサンプルへ


モデルには、会話の状態が変化する際に特別な文字列を出力するよう指示されていることに注目してください。これにより、システムを状態遷移図のような状態遷移マシンにすることができます。状態によって注入される命令が決まります。状態を追跡し、その状態でどの命令が関連するか、そしてオプションでその状態から許可される状態遷移も追跡することで、より構造化されたアプローチでは実現が難しいユーザーエクスペリエンスに対して制約を設けることができます。


3-2:非常に長い会話が必要な対話型アプリケーションでは、以前の対話を要約またはフィルタリングする

GPTは固定のコンテキスト長を持つため、ユーザーとアシスタントの間の対話がコンテキストウィンドウ全体に含まれる場合、無限に続けることはできません。

この問題に対するさまざまな回避策がありますが、その1つは以前の対話を要約することです。入力のサイズがあらかじめ決められた閾値に達した場合、対話の一部を要約するクエリがトリガーとなり、以前の対話の要約がシステムメッセージの一部として含まれることがあります。また、以前の対話は対話全体で非同期に要約されることもあります。

別の解決策は、現在のクエリに最も関連性の高い以前の対話の部分を動的に選択することです。効率的な知識の検索を実装するための「5-1. 効率的な知識の検索を実装するために埋め込みベースの検索を使用する」を参照してください。


3-3: 長い文書を分割して要約し、再帰的に完全な要約を構築する

GPTは固定のコンテキスト長を持つため、一度のクエリでコンテキストの長さマイナス生成される要約の長さよりも長いテキストを要約することはできません。

書籍など非常に長い文書を要約するためには、文書の各セクションを要約するためのクエリのシーケンスを使用することができます。セクションの要約を連結し、要約の要約を作成することができます。このプロセスを再帰的に繰り返し、文書全体を要約します。後のセクションを理解するために以前のセクションの情報を使用する必要がある場合、そのポイントでのコンテンツを要約する際に、そのポイント以前のテキストの逐次的な要約を含めるというトリックも有用です。この手法は、GPT-3のバリアントを使用してOpenAIによって以前の研究で書籍を要約するための効果が調査されています。


戦略4. GPTに「考える」時間を与える

4-1:結論に急ぎすぎず、モデルが自分で解決策を考えるように指示する

時には、結論に至る前にモデルに最初の原理から推論するよう明示的に指示すると、より良い結果が得られることがあります。例えば、数学の問題に対する学生の解答をモデルに評価させたい場合を考えてみましょう。これに取り組む最も明らかな方法は、単に学生の解答が正しいかどうかをモデルに尋ねることです。


SYSTEM
生徒の解答が正しいか否かを判断してください。
USER
問題設定:私は太陽光発電設備を建設しており、財務を計算するのに助けが必要です。 土地のコストは1平方フィートあたり100ドルです。 太陽光パネルは1平方フィートあたり250ドルで購入できます。 メンテナンスの契約を交渉し、年間10万ドルの一律費用と、さらに1平方フィートあたり10ドルかかります。 平方フィートの数を変数とした場合、最初の運用年の総費用はいくらになりますか。 学生の解答: xをインストールのサイズ(平方フィート)とすると、以下のようになります。 土地の費用:100x 太陽光パネルの費用:250x メンテナンスの費用:100,000 + 100x 総費用:100x + 250x + 100,000 + 100x = 450x + 100,000
ASSISTANT
生徒の解答は正しいです。

Playgroundのサンプルへ


しかし、その生徒の解は実は正しくない!このことにうまく気づいてもらうためには、まずモデルに自分の解を生成するように促すことが必要です。


SYSTEM
まず、自分自身で問題に対する解決策を考えてください。その後、自分の解決策と学生の解答を比較し、学生の解答が正しいかどうかを評価してください。問題を自分自身で解いてから学生の解答が正しいかどうかを判断するまで、学生の解答が正しいかどうかを決めないでください。
USER
問題設定:私は太陽光発電設備を建設しており、財務を計算するのに助けが必要です。 土地のコストは1平方フィートあたり100ドルです。 太陽光パネルは1平方フィートあたり250ドルで購入できます。 メンテナンスの契約を交渉し、年間10万ドルの一律費用と、さらに1平方フィートあたり10ドルかかります。 平方フィートの数を変数とした場合、最初の運用年の総費用はいくらになりますか。 学生の解答: xをインストールのサイズ(平方フィート)とすると、以下のようになります。 土地の費用:100x 太陽光パネルの費用:250x メンテナンスの費用:100,000 + 100x 総費用:100x + 250x + 100,000 + 100x = 450x + 100,000
ASSISTANT
xをインストールのサイズ(平方フィート)とすると、以下のようになります。 1. 土地の費用:100x 2. 太陽光パネルの費用:250x 3. メンテナンスの費用:100,000 + 10x 総費用:100x + 250x + 100,000 + 10x = 360x + 100,000 学生の解答は間違っています。彼らはメンテナンスの費用計算で100xを使ってしまいましたが、正しくは10xです。運用の最初の年の正しい総費用は360x + 100,000です。

Playgroundのサンプルへ


4-2:内部モノローグや一連のクエリーを使って、モデルの推論過程を隠す

前の戦術では、特定の質問に答える前にモデルが問題について詳細に推論することが重要な場合があることを示しています。一部のアプリケーションでは、モデルが最終的な回答に至るために使用する推論プロセスをユーザーと共有することは適切ではありません。例えば、教育アプリケーションでは、学生に独自の回答を見つけるよう促したい場合がありますが、モデルが学生の解答についての推論プロセスを明らかにすることで、学生に答えが明かされてしまう可能性があります。

内的なモノローグは、これを軽減するための戦術です。内的なモノローグのアイデアは、ユーザーに見せるべきではない出力の一部を、解析しやすい構造化された形式で出力するようモデルに指示することです。そして、出力をユーザーに提示する前に、出力を解析し、一部の出力のみを表示します。


SYSTEM
ユーザーの問い合わせに答えるために以下のステップを実行してください。 ステップ1 - まず自分自身で問題の解決策を考え出します。学生の解答に依存せず、それが間違っている可能性があるためです。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ2 - 自分の解答と学生の解答を比較し、学生の解答が正しいかどうかを評価します。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ3 - もし学生が間違いを犯した場合、答えを明かすことなくどのようなヒントを学生に与えることができるかを決定します。このステップのすべての作業を3重の引用符(""")で囲みます。 ステップ4 - もし学生が間違いを犯した場合、前のステップで提供したヒントを学生に伝えます(3重の引用符の外側で)。"ステップ4 - ..."と書く代わりに "ヒント:" と記述します。
USER
問題文:<問題文を挿入する> 生徒の解決策:<生徒の解決策を挿入する>

Playgroundのサンプルへ


あるいは、最後以外のすべてのクエリの出力をエンドユーザーから隠すクエリのシーケンスでも同様の結果を得ることができます。

まず、モデルに問題を独自に解決するように求めることができます。この最初のクエリでは学生の解答は必要ないため、省略することができます。これにより、モデルの解決策が学生の試みの解答にバイアスを受ける可能性がないという追加の利点もあります。


USER
<問題文の挿入>

Playgroundのサンプルへ


次に、モデルに利用可能なすべての情報を使用して、学生の解答の正確性を評価させることができます。


SYSTEM
自分自身の解決策と学生の解答を比較し、学生の解答が正しいかどうかを評価してください。
USER
問題文: """<問題文を挿入してください>""" あなたの解決策: """<モデルが生成した解答を挿入してください>""" 学生の解答: """<学生の解答を挿入してください>"""

Playgroundのサンプルへ


最後に、モデルに独自の分析を使用して、助言的なチューターの役割で回答を構築させることができます。


SYSTEM
あなたは数学のチューターです。もし学生が間違いをした場合は、答えを明かさない形で学生にヒントを提供してください。学生が間違いをしなかった場合は、励ましのコメントを提供してください。
USER
問題文: """<問題文を挿入してください>""" あなたの解決策: """<モデルが生成した解答を挿入してください>""" 学生の解答: """<学生の解答を挿入してください>""" 分析: """<前のステップでモデルが生成した分析を挿入してください>""”

Playgroundのサンプルへ


4-3:モデルに以前の処理で見落とした部分はないか尋ねる

ある質問に関連する特定の抜粋をリストするためにモデルを使用しているとします。各抜粋をリストした後、モデルは次の抜粋を書き始めるべきか、それとも停止すべきかを判断する必要があります。ソースドキュメントが大きい場合、モデルは早めに停止し、関連するすべての抜粋をリストアップできないことがよくあります。その場合、モデルに以前の処理で見落とした抜粋を見つけるための追加のクエリを提示することで、より良いパフォーマンスを得ることができます。


SYSTEM
以下の質問に関連する抜粋を含む、三重引用符で区切られたドキュメントが提供されます。「人工知能の歴史において重要なパラダイムシフトは何が起こったか」。抜粋には、それらを解釈するために必要なすべての関連コンテキストが含まれていることを確認してください。重要なコンテキストが欠落している小さなスニペットを抽出しないでください。以下のようなJSON形式で出力してください。 [{"excerpt": "..."}, ... {"excerpt": "..."}]
USER
"""<ここにドキュメントを挿入>""”
ASSISTANT
[{"excerpt":"モデルはここに抜粋を書く"}、 ... {"excerpt":"モデルはここに別の抜粋を書く"}].
USER
より関連性の高い抜粋はありますか?抜粋の繰り返しに注意してください。また、抜粋にはそれらを解釈するために必要なすべての関連コンテキストが含まれていることを確認してください。つまり、重要なコンテキストが欠落している小さなスニペットを抽出しないでください。

Playgroundのサンプルへ


戦略5. 外部ツールを使用する

5-1:効率的な知識の検索を実装するために埋め込みベースの検索を使用する

モデルは、入力の一部として提供された外部情報を活用することができます。これにより、モデルはより情報豊かで最新の応答を生成するのに役立ちます。たとえば、ユーザーが特定の映画についての質問をする場合、その映画に関する高品質な情報(俳優、監督など)をモデルの入力に追加すると便利です。埋め込みは効率的な知識の検索を実装するために使用できるため、実行時に関連情報をモデルの入力に動的に追加することができます。

テキストの埋め込みは、テキスト文字列間の関連性を測定できるベクトルです。類似または関連性の高い文字列は、関連のない文字列よりも近くに配置されます。この事実と、高速なベクトル検索アルゴリズムの存在から、埋め込みは効率的な知識の検索を実装するために使用できます。特に、テキストコーパスはチャンクに分割され、各チャンクは埋め込まれて保存されます。その後、与えられたクエリが埋め込まれ、ベクトル検索が実行され、クエリと最も関連性の高い(埋め込み空間で最も近い)テキストチャンクがコーパスから見つかります。

具体的な実装例は、OpenAI Cookbookで見つけることができます。モデルが誤った事実を作り出す可能性を最小限に抑えるために知識検索を使用する例については、「検索された知識を使ってクエリに答えるようモデルに指示する」の戦術を参照してください。


5-2:コードの実行を使用してより正確な計算や外部APIの呼び出しを行う

GPTは独自で正確な算術演算や長時間の計算を実行するために頼ることはできません。これが必要な場合、モデルに計算を行う代わりにコードを書き、実行するよう指示することができます。特に、実行されるコードを三重バッククォートなどの指定された形式で書くようモデルに指示します。出力が生成された後、コードを抽出して実行できます。最後に、必要に応じて、コード実行エンジン(Pythonインタプリタなど)からの出力を次のクエリのためのモデルへの入力として提供できます。


SYSTEM
Pythonコードを実行するためには、そのコードを三重バッククォート()で囲んでください。例えば、```コードをここに書く```とします。これを使用して計算を実行します。
USER
次の多項式の実数解を見つけてください: 3*

Playgroundのサンプルへ


外部APIを呼び出すことも、コード実行のもう一つの有用なユースケースです。モデルに適切なAPIの使用方法を教えることで、APIを利用したコードを書くことができます。APIの使用方法をモデルに教えるには、APIのドキュメントやコードサンプルを提供することができます。これにより、モデルはAPIを正しく利用するためのコードを生成することができます。


SYSTEM
Pythonコードは、三重バッククォートで囲むことで記述し、実行することができます。また、以下のモジュールを使用してユーザーが友達にメッセージを送信するのを支援することができます。 ```python import message message.write(to="John", message="Hey, want to meetup after work?")```

Playgroundのサンプルへ


警告: モデルが生成したコードを実行することは本質的に安全ではなく、これを行うアプリケーションでは必ず注意が必要です。特に、信頼できないコードが引き起こす可能性のある損害を制限するために、サンドボックス化されたコード実行環境が必要です。


戦略6. 変更を体系的にテストする

新たな指示や新たな設計など、変更がシステムを良くするか悪くするかを判断することは難しいことがあります。いくつかの例を見てみると、どちらが良いかのヒントになるかもしれませんが、サンプルサイズが小さいと、真の改善とランダムな運の間を区別することが難しくなります。たとえば、変更が一部の入力に対するパフォーマンスを向上させる一方で、他の入力に対するパフォーマンスを低下させる可能性があります。

評価手順(または「評価」)は、システム設計の最適化に役立ちます。良い評価は次のような特性を持っています。

  • 実際の使用状況を代表する(少なくとも多様性がある)
  • 多くのテストケースを含み、統計的な威力が高い(下記の表をガイドラインとして参照)
  • 自動化や繰り返しが容易である

  • 検出すべき差異
    95%の信頼度で必要なサンプルサイズ
    30%
    ~10
    10%
    ~100
    3%
    ~1,000
    1%
    ~10,000

    評価は、コンピュータ、人間、またはその混合体によって行うことができます。コンピュータは、単一の正解を持つ質問など、客観的な基準に基づいて評価を自動化することができます。また、モデルの出力が他のモデルのクエリによって評価される、いくつかの主観的または曖昧な基準に対しても同様です。OpenAI Evalsは、自動化された評価を作成するためのツールを提供するオープンソースのソフトウェアフレームワークです。

    モデルによる評価は、等しく高品質と見なされる可能性のある範囲の出力が存在する場合に有用です(例えば、長い回答を持つ質問など)。モデルによる評価で現実的に評価できる範囲と、人間による評価が必要な範囲との境界は曖昧で、モデルがより能力を持つようになると、その境界は絶えず変動します。モデルによる評価があなたのユースケースにどれほど適しているかを見つけるための実験を奨励します。


    戦術: ゴールドスタンダードの回答を参照してモデルの出力を評価する

    特定の質問に対する正しい回答が特定の一連の既知の事実を参照する必要があることが分かっている場合、モデルのクエリを使用して回答に含まれる必要な事実の数を数えることができます。

    例えば、以下のシステムメッセージを使用します:

    SYSTEM
    以下は、質問に対する回答として三重引用符で区切られたテキストが提供されます。以下の情報が回答に直接含まれているかどうかを確認してください。 ニール・アームストロングは月面を歩いた最初の人物でした。 ニール・アームストロングが初めて月面を歩いた日付は1969年7月21日です。 それぞれのポイントに対して、以下の手順を実行してください。 1 - ポイントを再述します。 2 - このポイントに最も近い回答から引用を提供します。 3 - この引用を読んでいる人が、そのポイントを直接推論できるかどうかを考えてください。判断を下す前に、その理由を説明してください。 4 - 3の回答が「はい」の場合は「はい」、そうでない場合は「いいえ」と記述してください。 最後に、「はい」と回答された数をカウントしてください。カウントは {"count": <ここにカウントを挿入>} として提供してください。

    ここでは、両方のポイントを満たした入力例を紹介します:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    """ニール・アームストロングは、人類で初めて月面に降り立ったことで有名です。この歴史的な出来事は、1969年7月21日、アポロ11号のミッション中に行われました。"""”

    Playgroundのサンプルへ


    以下は、1つのポイントのみが満たされている例です:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    """ニール・アームストロングは、月着陸船から降りて、月面を歩いた最初の人物となり、歴史を刻みました。""”

    Playgroundのサンプルへ


    以下は、どのポイントも満たされていない入力例です:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    """69年の夏、壮大な航海が始まった、アポロ11号は、伝説の手のように大胆だった。 アームストロングは一歩を踏み出し、歴史は大きく広がった、"小さな一歩 "と彼は言った 新世界のために""”

    Playgroundのサンプルへ


    このタイプのモデルベースの評価には多くのバリエーションがあります。次のバリエーションを考えてみましょう。候補の回答とゴールドスタンダードの回答の間の重複の種類を追跡し、また、候補の回答がゴールドスタンダードの回答の一部と矛盾しているかどうかも追跡します。

    SYSTEM
    以下の手順に従って、ユーザーの入力に対して応答してください。各ステップの前に完全に再述してください。例: "ステップ1: 考え方..."。 ステップ1: 提出された回答と専門家の回答を比較し、情報が次のいずれかであるかどうかをステップごとに考えます: 相互排他的、等しい、部分集合、上位集合、または重複(つまり、一部が重なるが部分集合/上位集合ではない)。 ステップ2: 提出された回答が専門家の回答と矛盾しているかどうかをステップごとに考えます。 ステップ3: 以下のような構造のJSONオブジェクトを出力します: {"type_of_overlap": "disjoint"または"equal"または"subset"または"superset"または"overlapping", "contradiction": trueまたはfalse}

    以下は、専門家の回答とは矛盾しないが、満足のいく回答ではないサンプルの入力例です:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    質問: 「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答: 「彼は月に歩いたんじゃなかったか?」 専門家の回答: 「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」

    Playgroundのサンプルへ


    以下は、専門家の回答と直接的に矛盾する回答の入力例です:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    質問: 「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答: 「1969年7月21日に、バズ・オルドリンの後に、ニール・アームストロングが2番目の人として月面を歩いた。」 専門家の回答: 「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」

    Playgroundのサンプルへ


    以下は、正しい回答であり、必要以上の詳細も提供している入力例です:

    SYSTEM
    <上記のシステムメッセージを挿入>
    USER
    質問: 「ニール・アームストロングはどの出来事で最も有名で、それはいつ起こったか?UTC時間を前提としてください。」 提出された回答: 「1969年7月21日のUTC時間02:56頃、ニール・アームストロングは月の表面に初めて足を踏み入れ、人類史上の画期的な成果を達成しました。」 専門家の回答: 「ニール・アームストロングは最初に月面を歩いたことで最も有名です。この歴史的な出来事は1969年7月21日に起こりました。」

    Playgroundのサンプルへ


    その他のリソース

    さらなるインスピレーションを得るために、OpenAI Cookbookを訪れてみてください。そこには、例題コードや以下のようなサードパーティのリソースへのリンクも含まれています。

  • プロンプト作成のためのライブラリやツール
  • プロンプトの作成ガイド
  • 動画コース
  • 推論を改善するための高度なプロンプティングに関する論文

  • この記事をSNSへ共有する

    この記事を書いた人

    著者アイコン

    CEO of Parame, Inc.

    Akiyoshi Okano

    2017年にアクセンチュア株式会社に入社し、AI、音声認識、ブロックチェーン、機械学習等の最先端テクノロジーを用いたPoCプロジェクト中心に参画。 2020年に株式会社Parameを創業。経済産業省主催「始動 Next Innovator 2020」にてシリコンバレープログラム選抜の受賞実績等。