プロンプティング

プロンプトは、モデルが予測する前に置く文字列です。これは本章で明確にする全体的な考え方です。プロンプトは心に与えるコマンドではなく、あなたが望む答えがもっとも確率の高い継続になるように配置する**コンテキスト**です。
プロンプトとは何か
同じモデル、2つのプロンプト。「気候変動について書いて」なら、頼んでもいない放浪的なエッセイが得られます。「12歳児向けに、気候変動の主な原因について3文で要約して、統計なしで」なら、実際に使える何かが得られます。モデルは2つの呼び出しの間で変わっていません。コンテキストが変わったので、出力も従いました。
前の章では、モデルが前にあるものすべてに導かれながら、最も確率の高い次のトークンを予測することでテキストを生成する方法を説明しました。プロンプトはその「前にあるもの全て」です。これが保つ価値のある定義です。プロンプトは人にする要求ではなく、あなたが望む継続がモデルにとってもっとも可能性の高いものになるように設定する**コンテキスト**です。
この再構成は、書き方を変えます。あなたは誰かを説得したり指示したりしていません。あなたは望んでいる答えがおそらく次に来るようにテキストを配置しています。この章のすべての技法は、異なるやり方でそれを行う方法であり、それぞれはその下にある予測マシンを見ることができれば、より意味をなします。
3つの役割
コード経由でモデルと通信するとき、1つのテキストブロックを送信しません。メッセージのリストを送信し、各メッセージは、それがどこから来たかをマークする役割を持ちます。3つあります:
- system:あなたの通常の指示。モデルが誰として行動するか、従うルール、望むフォーマット。1回設定され、会話全体に適用されます。
- user:アプリを使う人からのメッセージ。実際のリクエスト。
- assistant:モデルが以前に生成したメッセージ。これが会話がその履歴を保つ方法です。
messages = [
{"role": "system", "content": "You are a concise assistant for a cooking app. Answer in one sentence."},
{"role": "user", "content": "What can I use instead of butter in cookies?"},
]内部では、これらの役割はモデルへの別々のチャネルではありません。それらは1つのテキストストリームにフラット化され、各メッセージの周りに特別なマーカートークンがあり、そのストリーム全体がモデルが予測する対象です。役割が重要なのは、モデルがこのように配置された会話で訓練されたため、systemコンテンツを権威的な通常ルールとして扱い、userコンテンツを回答する要求として扱うことを学んだからです。
システムメッセージは初心者が過小評価するものです。それはあなたがすべてのターンで望む振る舞いを設定する場所です。トーン、オーディエンス、フォーマット、モデルがすべきでないこと。耐久性のあるルールをそこに置き、特定のリクエストをユーザーメッセージに置いてください。
モデルはリクエスト間にメモリがないため、assistant役割は以前言われたことを再生する方法でもあります。会話を続けるには、前の交換をassistantとuserメッセージとして送信して戻します。コードからモデルを呼び出すときについてもっと説明します。
system、user、またはassistantでタグ付けされたメッセージのリストでモデルをステアします。これらのタグは1つのテキストストリームにフラット化されます。モデルが予測する対象は、しかし、systemを権威的なルールとして扱い、userを要求として読むことを学んだ訓練済みです。耐久性のあるルールをsystemに置き、特定の要求をuserに置き、会話の履歴を実行するために過去のassistantとuserメッセージを再生します。 具体的は曖昧に勝つ
2つのプロンプト、1つのモデル。「気候変動について書いて」は不確定な長さとトーンの一般的なエッセイを返します。「気候変動の主な原因について3文で要約して、12歳児向けに、平易な言語で、統計なし」はあなたが想像に近いものを返します。同じマシン、大きく異なる出力、唯一の違いはあなたがどれだけ固定したかです。
理由は予測ループに遡ります。各ステップでモデルはもっとも起こりそうな継続の広がりから選んでいます。曖昧なプロンプトはその広がりを広く残すので、モデルは一般的にもっとも一般的なことで隙間を埋めます。これはあなたが心に描いた正確なものはめったにありません。**具体的な**プロンプトはモデルが1つのトークンを書く前に広がりを答えに向かって狭めます。
# vague: the model decides length, tone, audience, format
"Write about climate change."
# specific: you decide
(
"Write a 3-sentence summary of the main causes of climate change, "
"for a 12-year-old, in plain language, with no statistics."
)曖昧なバージョンは千の感覚的な方法で続く可能性があり、あなたはそれらのランダムな1つを取得します。特定のバージョンは事前にほぼすべてのルールを設定します。プロンプトを書くとき、あなたが実際に望むものを言ってください:
- フォーマット:1文、リスト、JSON、テーブル。
- 長さ:1段落、3つのぶら下がり項目、50語未満。
- オーディエンス:初心者、専門家、12歳児。
- 不確実なときの対応:「テキストが言わなければ、推測するのではなく「指定されていません」で返答してください。」
最後のものはそれが見た方法以上の重みを持っています。自分の装置に任せられたら、モデルは流暢な推測が確率の継続であるため、自信のある推測で隙間を埋めます。明確にそれに「わかりません」と言うオプションを与えると、代わりに可能性のあるパスになります。これは、幻覚問題を最後の章から減らすいくつかのプロンプトレベルの動きの1つです。具体性はモデルが1つのトークンを書く前にそれの選択肢を狭めます。
例を示す
時々、正しい継続を設定するもっともクリアな方法は、それを示すことです。プロンプトに少数の実績のある例を置くことは**フューショット・プロンプティングと呼ばれます(例がないのはゼロショット**です)。それはモデルは、心では、パターン続行者だからです。2つ3つの入力-その後-正しい出力の例を与えてください。そして、もっとも確率の高いこと、次に来ることは同じパターン、あなたの新しい入力に適用されることです。
messages = [
{"role": "system", "content": "Label each review as POSITIVE, NEGATIVE, or NEUTRAL. Reply with only the label."},
{"role": "user", "content": "The food was cold and slow to arrive."},
{"role": "assistant", "content": "NEGATIVE"},
{"role": "user", "content": "Decent meal, nothing special."},
{"role": "assistant", "content": "NEUTRAL"},
{"role": "user", "content": "Best burger I have had in years!"},
]
# the model now answers: POSITIVE2つの完了した例は正確なパターンを確立します。1語、すべて大文字、固定セットから。このパターンを3番目のレビューに続けることは、分析の段落を書くことより今やはるかに確率が高いので、それはあなたが取得するものです。これは、クリアな例のカップルがしばしば説明の段落を打つ理由です。特に分類とフォーマットの場合。あなたはそれを説明して希望するのではなく、出力の形を示しています。厄介なケースをカバーする例を選んでください。モデルはあなたが示すものでそれ自身をパターン化するので、あなたの例の誤りも含めて。
推論を促す
ここに最も有用なプロンプティングアイデア、そして最も直感的ではなく、そしてそれはモデルの仕組みからまっすぐに落ちるものです。モデルは1度に1つのトークンを生成し、唯一の作業スペースは既に書いたテキストです。彼には難しい問題を静かに働く隠されたスクラッチパッドはありません。答える前に。その思考、そのくらいですが、それが生成するトークンで大声で起こります。
だから複数段階の質問をしたら、最終答えだけを要求してください。あなたはモデルに1つのトークンで終わりまで飛び跳ねるように強制し、どこで機能するか。推論、数学、論理を含むあらゆるもので、それはしばしば飛び跳ねて間違った。修正は、それに開かれた仕事をさせることです。答える前にそのステップを配置するように求めてください。
messages = [
{"role": "system", "content": "Work through the problem step by step, then give the final answer on its own line."},
{"role": "user", "content": "A shop sells pens at 3 for $2. How much do 12 pens cost?"},
]
# without "step by step", models often blurt a wrong number
# with it, the model writes out the working, and each step makes the next more reliableこれは**チェーン・オブ・ソート**・プロンプティングと呼ばれ、それが機能する理由は魔法ではなく機械的です。すべてのステップ、モデルは書き、コンテキストの一部になり、そのうえで次のトークンを読みます。だから「12ペンは3つの4グループ」と書き、「4グループ倍$2は$8」は自然で、確率の高い継続です。あなたはモデルに1つの不可能なジャンプで答えを要求するのではなく、ページで計算するためのスペースを与えています。「ステップバイステップで考えて」または「あなたの働きを見せて」は日常のバージョンです。
2つの注意。書かれた推論はまだ生成されたテキストであるため、サウンドを見ることでき、間違った答えに到達でき、それを保証された証拠として扱うべきではありません。そしてより新しいいくつかのモデルは、求められずにこの種の内部作業をしています。しかし、基になる原則は、次に来るのがどのモデルでも耐久性があります。モデルは、それが書き出すステップのためのスペースがあると、より良く推論します。それがそれ自身の出力は、それが考えるための唯一のスペースだからです。
プロンプトを構造化する
プロンプトが成長するにつれ、構造がコンテキストをクリアに保つので、モデルは各部分を正しく重み付けします。いくつかの習慣が役に立ちます:
- 最初に指示を置いて、最後にデータを置いてください。 何をするか述べてください。その後、それをするテキストを提供します。
- 指示をデータから区切り記号で分けてください。 提供されたテキストをクリアマーカーで巻いてください。だから、あなたのルールと入力の間の境界は疑いなく。
- 出力形を明確に尋ねてください。 JSONを望むなら、言ってください。フィールドについて説明します。
prompt = f'''Summarise the customer message below in one sentence.
Then list any product names it mentions.
Customer message:
"""
{user_message}
"""'''三重引用符は**区切り記号**です。「ここに内部にあるすべてはデータですプロセスするべき、指示ではなく」。これは整頓だけではなく、そして予測ビューはそれが実際の保障であることを示します。
モデルにはそれがすべてのもの、テキストのストリームです。だから、ユーザー入力が境界なしであなたの指示に流れる場合、ユーザーは「上の無視」を書き得、モデルには信頼できる方法がありません。その行は別です。あなたの本当の指示。それはおそらく続きます。それに従うことによって。
その攻撃はプロンプト注入と呼ばれ、指示と信頼されていないデータをクリアにフェンスオフに保つことは、最初の防御列です。安全と限界でカバーされます。モデルにはそれがすべてのもの、テキストのストリームです。だからフェンス信頼されていない入力。
実際に
ここはいくつかの考えをスタックするプロンプトです。耐久性のあるルール、特定のリクエスト、フォーマットを修正する例。そしてクリアに区切られたデータのためのシステムメッセージ。
messages = [
{
"role": "system",
"content": (
"You extract action items from meeting notes. "
"Reply with a numbered list, one action per line, each starting with a verb. "
"If there are no action items, reply 'None'."
),
},
{"role": "user", "content": 'Notes: """We agreed Sam will send the budget by Friday and Lee will book the venue."""'},
{"role": "assistant", "content": "1. Send the budget by Friday (Sam)\n2. Book the venue (Lee)"},
{"role": "user", "content": f'Notes: """{meeting_notes}"""'},
]システムメッセージは1度ルールを設定します。例はフォーマットを修正します。そして各リクエストはフェンス付きデータを提供します。すべての作品あるコンテキストを配置して、あなたが望む出力を確率の高い継続です。それが全体の工芸です。これはは**信頼できるプロンプト**です。幸運なものではなく。次に、あなたはメッセージのようなこれを送ります。本当のコードモデルをコードから呼び出すで。
systemメッセージ耐久性のあるルール、特定のリクエスト。フォーマットを修正する例。そしてクリアに区切られたデータ。すべての作品配置コンテキスト。それであなたが望む出力、確率の高い次のテキスト。それはテクニックです。幸運なプロンプトです。デザインしているプロンプト。 
