原則一:明確で具体的な指示を書く#
できるだけ明確で具体的な指示を提供します。
戦略一:区切り文字を使用して、入力情報の異なる部分を分割します。
区切り文字は:```、""、<>、<tag>、<\tag > などの任意のマークアップ記号です。特定のテキスト部分を残りの部分から分けます。
プロンプトインジェクションを避ける:プロンプトインジェクションとは、ユーザーがプロンプトに特定の入力を追加することで、モデルに対して実行したい操作と矛盾する指示を与える可能性があることを指します。つまり、入力の中に他の指示が含まれていると、あなたの指示が上書きされることがあります。
例:
text = f"""
あなたはできるだけ明確で具体的な指示を提供するべきです。\
これはモデルを望ましい出力に導き、無関係または不正確な応答を受け取る可能性を減少させます。\
明確なプロンプトを書くことと短いプロンプトを書くことを混同しないでください。\
多くの場合、長いプロンプトはモデルにより多くの明確さとコンテキスト情報を提供し、より詳細で関連性のある出力をもたらします。
"""
# 要約するテキスト内容
prompt = f"""
三つのバッククォートで囲まれたテキストを一文に要約してください。
```{text}```
"""
出力は:
明確で具体的な指示を提供し、無関係または不正確な応答を避け、明確なプロンプトと短いプロンプトを混同せず、長いプロンプトはより多くの明確さとコンテキスト情報を提供し、より詳細で関連性のある出力をもたらすことができます。
戦略二:構造化された出力を要求する
JSON や HTML 形式のデータなど、構造化された出力を生成します。このような出力はコードによって解析しやすくなります。たとえば、Python では JSON データを便利に処理でき、辞書やリストに読み込むことができます。
例:
prompt = f"""
書名、著者、ジャンルを含む三冊の架空の書籍リストを生成し、\
以下のキーを含むJSON形式で提供してください:book_id、title、author、genre。
"""
出力:
{
"books": [
{
"book_id": 1,
"title": "風の影",
"author": "カルロス・ルイス・サフォン",
"genre": "ミステリー"
},
{
"book_id": 2,
"title": "風の名前",
"author": "パトリック・ロスファス",
"genre": "ファンタジー"
},
{
"book_id": 3,
"title": "銀河ヒッチハイカーガイド",
"author": "ダグラス・アダムズ",
"genre": "サイエンスフィクション"
}
]
}
戦略三:モデルに条件を満たしているか確認させる
モデルにタスクの仮定を最初に確認させ、満たされていない場合は指示を出して実行を停止させます。
潜在的な境界ケースを処理する方法をモデルに伝え、予期しないエラーや結果を避けます。
例:
prompt = f"""
あなたは三つの引用符で囲まれたテキストを受け取ります。\
もしそれが一連の指示を含む場合、次の形式でそれらの指示を書き直す必要があります:
第一歩 - ...
第二歩 - …
…
第N歩 - …
もしテキストに一連の指示が含まれていない場合は、「ステップは提供されていません」と直接書いてください。"
text_1 = f"""
お茶を淹れるのは簡単です。まず、水を沸かす必要があります。\
待っている間に、カップを取り、ティーバッグを入れます。\
水が十分に熱くなったら、それをティーバッグに注ぎます。\
しばらく待って、茶葉を浸します。数分後、ティーバッグを取り出します。\
お好みで、砂糖や牛乳を加えて味を調えます。\
これで、美味しいお茶を楽しむことができます。
"""
text1の出力:
第一歩 - 水を沸かします。
第二歩 - カップを取り、ティーバッグを入れます。
第三歩 - 沸騰した水をティーバッグに注ぎます。
第四歩 - 数分待って、茶葉を浸します。
第五歩 - ティーバッグを取り出します。
text_2 = f"""
今日は晴れた日で、鳥が歌っています。\
公園を散歩するのに素晴らしい日です。\
花が咲き、木の枝がそよ風に揺れています。\
人々はこの素晴らしい天気を楽しむために外に出て、ピクニックをしたり、ゲームをしたり、草の上でリラックスしています。\
これは屋外で過ごし、自然の美しさを楽しむのに完璧な日です。
"""
text2の出力:
ステップは提供されていません
戦略四:少数の例を提供する
モデルに実際のタスクを実行させる前に、成功したタスクの少数の例を提供します。
例:タスクはモデルに一貫したスタイルで質問に答えさせることであり、子供と祖父の間の対話の例を最初に与えます。
prompt = f"""
あなたのタスクは、一貫したスタイルで質問に答えることです。
<子供>: 私に忍耐を教えて。
<祖父>: 最も深い峡谷の川の源は目立たない泉から始まります;最も壮大な交響曲は単一の音符から始まります;最も複雑なタペストリーは孤独な糸から織り始められます。
<子供>: 私にしなやかさを教えて。
"""
出力:
<祖父>: しなやかさは木のようなものです。風や雨、日差しに耐えながら成長し、より強くなります。だから、挫折や困難に直面したときは、簡単に諦めず、続けて自分の能力と可能性を信じてください。最終的には、高い木になるでしょう。
原則二:モデルに考える時間を与える#
モデルが急いで結論を出そうとして推論エラーが発生した場合、質問を再設計して、最終的な答えを提供する前に一連の関連する推論を行うように要求します。
モデルに複雑すぎるタスクを与えると、短時間または少ない言葉で完了できず、不正確な推測を作り出すことがあります。この状況は人間にも当てはまり、計算する時間がない状態で複雑な数学の問題を解決させると、間違いを犯す可能性があります。したがって、モデルに問題を考えるためのより多くの時間を与えるように促すことができます。これは、そのタスクに対してより多くの計算リソースを費やすことを意味します。
戦略一:タスクを完了するために必要なステップを指定する
複雑なタスクを最初に与え、そのタスクを完了するための一連のステップを提供します。
例えば:
私たちはジャックとジルの物語を説明し、次の操作を実行する指示を与えます:まず、テキストを一文で要約します。次に、要約をフランス語に翻訳します。三番目に、フランス語の要約に各名前をリストします。四番目に、以下のキーを含む JSON オブジェクトを出力します:フランス語の要約と名前の数。
text = f"""
魅力的な村で、兄妹のジャックとジルは山の頂上の井戸から水を汲みに出かけます。\
彼らは楽しい歌を歌いながら登りますが、\
不幸が訪れます——ジャックが石につまずき、山から転がり落ち、ジルも続いて転がり落ちます。\
少し怪我をしましたが、彼らは温かい家に戻ります。\
このような事故があったにもかかわらず、彼らの冒険心は衰えず、楽しんで探索を続けます。
"""
prompt_1 = f"""
次の操作を実行してください:
1-三つのバッククォートで囲まれたテキストを一文で要約します。
2-要約をフランス語に翻訳します。
3-フランス語の要約に各人名をリストします。
4-以下のキーを含むJSONオブジェクトを出力します:French_summary、num_names。
あなたの答えを改行で区切ってください。
テキスト:
```{text}```
"""
# 出力を得る
1-兄妹が山の井戸から水を汲む際に事故が起きたが、冒険心は失われなかった。
2-村の魅力的な場所で、兄妹のジャックとジルが山の頂上の井戸から水を汲みに出かけます。不幸にも、ジャックが石につまずき、山から転がり落ち、ジルも続いて転がり落ちます。少し怪我をしましたが、彼らは無事に家に戻ります。事故にもかかわらず、彼らの冒険心は衰えず、楽しんで探索を続けます。
3-ジャック、ジル
4-{
"French_summary": "村の魅力的な場所で、兄妹のジャックとジルが山の頂上の井戸から水を汲みに出かけます。不幸にも、ジャックが石につまずき、山から転がり落ち、ジルも続いて転がり落ちます。少し怪我をしましたが、彼らは無事に家に戻ります。事故にもかかわらず、彼らの冒険心は衰えず、楽しんで探索を続けます。",
"num_names": 2
}
# 出力形式を指定する
prompt_2 = f"""
あなたのタスクは次の操作を実行することです:
1-<>で囲まれたテキストを一文で要約します。
2-要約を英語に翻訳します。
3-英語の要約に各人名をリストします。
4-以下のキーを含むJSONオブジェクトを出力します:English_summary、num_names。
以下の形式を使用してください:
テキスト:<要約するテキスト>
要約:<要約>
翻訳:<要約の翻訳>
名前:<英語の要約に含まれる名前のリスト>
出力JSON:<English_summaryとnum_namesを含むJSON>
テキスト:<{text}>
"""
# 出力を得る
要約:兄妹のジャックとジルは魅力的な村で冒険し、不幸にも怪我をして帰宅しますが、依然として冒険心を持っています。
翻訳:In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.
名前:ジャック、ジル
出力JSON:{"English_summary": "In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.", "num_names": 2}
戦略二:モデルに結論を出す前に自分の解法を見つけさせる
モデルに決定を下す前に自分の解法を推論させるように指導すると、より良い結果が得られます。
例:
prompt = f"""
学生の解決策が正しいかどうかを判断します。
問題:
私は太陽光発電所を建設しており、財務計算の助けが必要です。
土地の費用は平方フィートあたり100ドルです
私は平方フィートあたり250ドルで太陽光パネルを購入できます
私はメンテナンス契約を交渉済みで、毎年10万ドルの固定費用と平方フィートあたり10ドルの追加費用がかかります
平方フィート数の関数として、初年度の運営総費用はいくらですか。
学生の解決策:
xを発電所のサイズ(平方フィート単位)とします。
費用:
土地の費用:100x
太陽光パネルの費用:250x
メンテナンス費用:100,000ドル + 100x
総費用:100x + 250x + 100,000ドル + 100x = 450x + 100,000ドル
"""
モデルは解決策が正しいと答えます。実際には間違っています。
モデルに最初に自分の解法を見つけさせることでこの問題を解決できます。モデルに問題を解決させ、その解法と学生の解法を比較させて、学生の解法が正しいかどうかを判断させます。同時に、出力形式を指定します。明確なステップを提供することで、モデルに考える時間を与え、より正確な結果を得ることができます。
prompt = f"""
学生の解決策が正しいかどうかを判断してください。次の手順でこの問題を解決してください:
手順:
まず、自分で問題を解決します。
次に、自分の解決策と学生の解決策を比較し、学生の解決策が正しいかどうかを評価します。自分で問題を解決する前に、学生の解決策が正しいかどうかを決定しないでください。
以下の形式を使用してください:
問題:問題のテキスト
学生の解決策:学生の解決策のテキスト
実際の解決策と手順:実際の解決策と手順のテキスト
学生の解決策と実際の解決策は同じか:はいまたはいいえ
学生の成績:正しいまたは不正確
問題:
私は太陽光発電所を建設しており、財務計算の助けが必要です。
- 土地の費用は平方フィートあたり100ドルです
- 私は平方フィートあたり250ドルで太陽光パネルを購入できます
- 私はメンテナンス契約を交渉済みで、毎年10万ドルの固定費用と平方フィートあたり10ドルの追加費用がかかります
平方フィート数の関数として、初年度の運営総費用はいくらですか。
学生の解決策:
xを発電所のサイズ(平方フィート単位)とします。
費用:
1. 土地の費用:100x
2. 太陽光パネルの費用:250x
3. メンテナンス費用:100,000 + 100x
総費用:100x + 250x + 100,000 + 100x = 450x + 100,000
実際の解決策と手順:
"""
GPT-3.5出力:
正しい解決策と手順:
1. 土地の費用を計算します:100ドル/平方フィート * x平方フィート = 100xドル
2. 太陽光パネルの費用を計算します:250ドル/平方フィート * x平方フィート = 250xドル
3. メンテナンス費用を計算します:10万ドル + 10ドル/平方フィート * x平方フィート = 10万ドル + 10xドル
4. 総費用を計算します:100xドル + 250xドル + 10万ドル + 10xドル = 360x + 10万ドル
学生の解決策と実際の解決策は同じか:はい/いいえ(「はい」とも「いいえ」とも出力される可能性があります)
学生の成績:正しい/不正確(「正しい」とも「不正確」とも出力される可能性があります)
GPT-4は問題ありません
三、限界#
虚偽の知識:モデルは時折、見た目にはリアルで実際には作り話の知識を生成します。モデルがトレーニング中に大量の知識に接触した場合、彼は見た情報を完全に記憶していないため、自分の知識の境界をあまり理解していません。これは、彼が難解なテーマに関する質問に答えようとし、合理的に聞こえるが実際には正しくない答えを作り出す可能性があることを意味します。これらの作り話のアイデアを「幻覚」と呼びます。
モデルは非常にリアルに見える作り話の知識を出力することがあり、これは時には危険です。したがって、アプリケーションを構築する際には、上記で紹介したいくつかのテクニックを使用してこの状況を回避してください。幻覚を減らすための別の戦略は、モデルにテキスト内の関連する引用を見つけさせ、その引用を使用して質問に答えさせることです。このような出典文書を追跡する方法は、幻覚を減らすのに非常に役立ちます。