up:: プロンプトエンジニアリングガイド


introduction

はじめに | Prompt Engineering Guide

この例はtext-davinci-003でテストされている
温度は0.7、top-pは1


LLM設定

LLMの設定 | Prompt Engineering Guide

Temperature
ランダム性
値が低いほど確率高い回答を
値が高いほどランダム性を

Top-p
決定性
値が低いほど正確
値が高いほど多様

変更する際は、片方ずつ


基本的なプロンプティング

プロンプトの基礎 | Prompt Engineering Guide

基本

結果の品質は、プロンプトの情報量とそのクオリティで変わる
単なる文字だけでなく、指示、質問、文脈、例などを含めると情報量アップ

例えば

プロンプト:

空が

出力:

青い
晴れた日には空は青く、曇った日には空は灰色や白色になることがあります。

とくるものの、それが達成したいタスクかどうかはわからない。
本当に続きを生成してほしいならこうするといい。

プロンプト:

以下の続きとなる文を完成させてください:
空が

出力:

青くとてもきれいです。

フォーマット

さっきの通り、型を与えて返答に制限かけて明確にするのが基本。
よく使われるのはQAフォーマット。質問特化。

プロンプト:

Q: <質問>?
A: 

これは一般的にトレーニングでも使われてたりするので、A:だけでも効果がある。

また、こういう直接モデルに応答を求めるプロンプトをzero-shot promptingという。対象タスクが単純で|モデルも大量の知識を持ってる|ならこれでもいい。

もっと複雑でモデルの知識が乏しいなら、few-shot promptingが望ましい。
フォーマットに2,3の例を追加する。以下は一例。

プロンプト:

<質問>?
<答え>
<質問>?
<答え>
<質問>?
<答え>
<質問>?

もちろんQAと組み合わせることもできる。

few-shotは例示するだけなので、こんなんでも通る。

プロンプト:

これは素晴らしい! // ポジティブ
これは酷い! // ネガティブ
あの映画は最高だった! // ポジティブ
なんてひどい番組なんだ! //

出力:

ネガティブ

プロンプトの要素

プロンプトの要素 | Prompt Engineering Guide

プロンプトは以下のコンポーネントが含まれることがある。

  • 命令
    • モデルへのタスクまたは命令
  • 文脈
    • 外部情報とか
  • 入力データ
    • 応答を見つけたい入力または質問
  • 出力指示子
    • 出力タイプや形式の指定

命令と入力データが被ってるみたいだが、まあ全要素あったりなかったりするもんなので。


プロンプト設計ヒント

プロンプトの設計に関する一般的なヒント | Prompt Engineering Guide

基本的にプロンプトは一発で通るものではない。多くの実験が必要。

シンプルなプロンプトから始め、要素や文脈を追加しつつ具体的に簡潔に明確に。
こういうのに必要な要素と言えばバージョン管理

タスクがでかく複雑な場合は、よりシンプルなサブタスクに分解する。

……どれもプログラミング言語だな。

指示

モデルに達成したいことを指示する部分。動詞。
色々試し、ユースケースに最適な指示を見つける。

プロンプトの最初に配置する。指示と文脈を区切るため、何らかの区切り記号を入れるのが望ましい。

プロンプト:

#### 指示 ####
以下のテキストをスペイン語に翻訳してください。
Text: "hello!"

出力:

¡Hola!

特異性

詳細に具体的に例も含め。
ただし長さに制限があるので、ちゃんと本筋に関連する詳細を書くこと。
これまた実験と反復が必要。

きっちりその辺を抑えてれば、ちょっとひねった指示も通る。
以下は出力指示子つけた例。

プロンプト:

以下のテキストから場所の名前を抽出してください。
望ましいフォーマット:
Place: <comma_separated_list_of_company_names>
入力:「これらの進展は研究者にとって励みになっていますが、まだ多くのことが謎のままです。リスボンのシャンパリマウド・センター・フォー・ジ・アンノウンの神経免疫学者であるヘンリーク・ヴェイガ・フェルナンデスは、「脳と周辺部で見られる効果の間にはしばしばブラックボックスがあります」「治療的な文脈で使用したい場合、実際には作用機序を理解する必要があります。」」

出力:

Place: リスボンのシャンパリマウド・センター・フォー・ジ・アンノウン

不正確を避ける

具体的に直接的に。何かを頼む際は5W1H、それが誰を対象にしてるのかとかも明確にした方がいい。

例えばこの二つなら、上より下の方が簡潔明瞭でいい。

プロンプト:

プロンプトエンジニアリングの概念を説明してください。説明は短く、数文で、あまり詳しくしないでください。

プロンプト:

高校生に対して、プロンプトエンジニアリングの概念を2〜3文で説明してください。

するかしないか

プロンプトは、「しないこと」ではなく 「すること」 をメインに構成する。
しない事を書くのは大事だが、それ以上に「つまり自分=モデルはどういうときに何をするべきなのか?」という疑問に既に答えているプロンプトが望ましい。

例えばこれは良くない。

プロンプト:

以下は、顧客に映画を推薦するエージェントです。興味を尋ねないで、個人情報を尋ねないでください。
顧客:私の興味に基づいて映画をお勧めください。
エージェント:

出力:

はい、あなたの興味に基づいて映画をお勧めできます。アクション、コメディ、ロマンス、それともその他の何か、どのような映画がお好きですか?

これはモデルが何をするのか、という指示が弱い。
なのでこうする。

プロンプト:

以下は、顧客に映画を推薦するエージェントです。エージェントは、上位のグローバルトレンド映画から映画をお勧めする責任があります。ユーザーの好みを尋ねることを避け、個人情報を尋ねることを避ける必要があります。エージェントがおすすめ映画を持っていない場合は、「申し訳ありませんが、今日お勧めする映画が見つかりませんでした。」と返答する必要があります。
顧客:私の興味に基づいて映画をお勧めください。
エージェント:

出力:

申し訳ありませんが、あなたの興味に関する情報はありません。しかし、ここに今一番トレンディーな映画のリストがあります:[リストの映画]。お好きなものが見つかることを願っています!

if文も織り交ぜつつ、指示のところでも言った通り何をするかを最初に置いたりして、何やるかを明確にする。


プロンプト例

プロンプトの例 | Prompt Engineering Guide

いろんな使い方の実践例。
もうコピーすんのめんどいので、並べるだけ。

テキスト要約

文を書いた後、改行して最後に「上記を一文で説明してください。」などを入れる。

情報抽出

要約と同じく、最後に「上記の段落で言及されている製品を述べてください。」などで情報を抜き出せる。

質問応答

いつものだが、さんざ言ったように指示、文脈、入力、出力などをタグ付けして書いておくと精度が上がる。

プロンプト:

以下の文脈に基づいて質問に答えてください。回答を短く簡潔に保ちます。回答が不明な場合は、「回答不明」と回答してください。
文脈:Teplizumabは、Ortho Pharmaceuticalと呼ばれるニュージャージー州の薬剤会社に由来します。そこでは、科学者たちはOKT3という抗体の初期バージョンを生成しました。分子はもともとマウスから採取され、T細胞の表面に結合し、その細胞殺傷能力を制限することができました。1986年に、腎臓移植後の臓器拒絶を防止するために承認され、これにより、人間の使用に許可された最初の治療用抗体となりました。
質問:OKT3はもともとどこから採取されたものですか?
回答:

出力:

マウス。

テキスト分類

プロンプト:

テキストをneutral、negative、またはpositiveに分類してください。
テキスト:この食べ物はまずまずでした。
所感:

出力:

Neutral

悪くはないが問題。書いてある通り、頭を小文字にしたい。
この場合はFew-shotが役立つ。

プロンプト:

テキストをneutral、negative、またはpositiveに分類してください。
テキスト:先日の休暇はまずまずでした。
所感: neutral 
テキスト:この食べ物はまずまずでした。
所感:

出力:

neutral

会話

チャットモデルシステムに使うやつ。
役割を与えるrole promptingが役立つ。

プロンプト:

以下はAI研究アシスタントとの会話です。アシスタントのトーンは技術的で科学的です。
人: こんにちは、あなたは誰ですか?
AI: ご挨拶!私はAI研究アシスタントです。今日は何をお手伝いできますか?
人: ブラックホールの生成について教えてもらえますか?
AI:

出力:

もちろんです!ブラックホールとは、重力の力が非常に強く、光を含めて何も脱出できない時空の領域です。非常に質量のある星が死亡し、そのコアが自己崩壊して無限密度の特異点を形成すると、ブラックホールが形成されます。特異点の強烈な引力により、周囲の物質や放射線が引き寄せられ、ブラックホールが作成されます。

とはいえチャットモデルシステムは広い範囲の人間が使うので、もうちょっと会話レベルを落としておいた方がいい。なのでロールを詰める。

プロンプト:

以下はAI研究アシスタントとの会話です。アシスタントの回答は小学生でも理解できるようになっています。
人: こんにちは、あなたは誰ですか?
AI: ご挨拶!私はAI研究アシスタントです。今日は何をお手伝いできますか?
人: ブラックホールの生成について教えてもらえますか?
AI: 

出力:

もちろんです!ブラックホールは、非常に大きな星が燃料を使い果たし、崩壊することで作られます。星の重力が非常に強いため、光でさえも引き寄せられて、その重力場によって空間に点ができます。それがブラックホールです。

コード生成

本題だオラァ!
これ特化のLLMもある。
GitHub - salesforce/CodeGen2: CodeGen2 models for program synthesis

何かしらの言語のコメント形式で送ると、そのままコードになって返ってくる。何か使いそうだからComment promptingとして覚えておく。

プロンプト:

/*
ユーザーに名前を聞いて、「こんにちは」と言ってください。
*/

出力:

let name = prompt("あなたの名前は何ですか?");
console.log(`こんにちは、${name}さん!`);

もちろん丁寧に指定するとよりGood。
これはOpenAIのPlaygroundでコード生成する際のコメント形式らしい。

プロンプト:

"""
テーブル名 departments、カラム=[DepartmentId、DepartmentName]
テーブル名 students、カラム=[DepartmentId、StudentId、StudentName]
コンピュータサイエンス学科のすべての学生のためのMySQLクエリを作成してください。
"""

出力:

SELECT StudentId、StudentName
FROM students
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');

推論

LLMの苦手分野。数学は苦手。

プロンプト:

このグループの奇数の数値を合計すると偶数になります: 15, 32, 5, 13, 82, 7, 1。
A: 

出力:

いいえ、このグループの奇数の数値を合計すると奇数になります: 119。

ここはいつもの明確な指示に加え、Step-by-Stepを注文すれば割と何とかなる。それでもたまに失敗するが。

プロンプト:

このグループの奇数の数値を合計すると偶数になります: 15, 32, 5, 13, 82, 7, 1。問題をステップごとに解決してください。まず、奇数の数値を特定し、それらを合計して結果が奇数か偶数かを示してください。

出力:

奇数: 15, 5, 13, 7, 1
合計: 41 
41は奇数です。