開始する前に#
いわゆるプロンプトエンジニアリングとは、AI と効果的にコミュニケーションを取り期待される結果を実現するプロセスです。なぜ PE が必要で、その関連原理についてはこの記事の重点ではありません。興味のある方はこの記事を参照してください1。
この記事では、プロンプトエンジニアリングにおいて、開発者に役立ついくつかのテクニック2と、オープンソースプロジェクトにおける具体的な応用を分析したいと思います。
いくつかのテクニック#
明確で具体的な説明を書く#
区切り文字の使用#
区切り文字は任意の形式で構いません。例えば:
'''text'''
"""text"""
< text >
<tag>text</tag>
const text = `
できるだけ明確で具体的な説明を提供することで、モデルに実行してほしいタスクを表現します。
これにより、モデルは期待される出力方向に向かって進み、無関係または不正確な応答を受け取る可能性が減ります。
明確なプロンプトを書くことと短いプロンプトを書くことを混同しないでください。
ほとんどの場合、
長いプロンプトはモデルにより明確なコンテキストを提供し、より詳細で関連性のある出力結果を生成します。
`
const prompt = `
三つの二重引用符で囲まれたテキストを一文に要約してください。
"""${text}"""
`
構造化された出力#
例えば、出力形式を JSON または HTML にすることです。
const prompt = `
三冊のフィクションの書籍のタイトル、著者、ジャンルのリストを生成してください。
以下のキーを使用してJSON形式で提供してください:book_id、title、author、genre。
`
条件が満たされているか確認する#
const text = `
お茶を一杯淹れるのは簡単です!まず、水を沸かす必要があります。
水が沸騰している間に、カップを取り、ティーバッグを入れます。
次に、沸騰したお湯をティーバッグの上に注ぎます。
しばらく浸しておくと、お茶が淹れられます。
数分後、ティーバッグを取り出します。お好みで砂糖や牛乳を加えることもできます。
これで!淹れたてのお茶を楽しむことができます。
`
const prompt = `
テキストに一連の指示が含まれている場合は、以下の形式でそれらの指示を書き直してください:
ステップ1 - ...
ステップ2 - ...
...
ステップN - ...
テキストに一連の指示が含まれていない場合は、「ステップは提供されていません」とだけ書いてください。
"""${text}"""
`
「Few-shot」プロンプト#
「Few-shot」プロンプト3は、AI モデルに限られた数の例を提供することで、モデルがタスクをより良く実行できるように導くものです。これは、大規模言語モデル(LLMs)のトレーニングによく使われる技術です。
Few-shot プロンプティングの手順は以下の通りです:
-
モデルに応答を生成させたい分野やテーマを選択します。テキストの種類や言語スタイルなどが考えられます。
-
モデルに少数の例(プロンプト)を提供し、後続のサンプルの条件とします。通常、2〜5 の例を提供するだけで「few-shot」学習が可能です。
-
モデルはプロンプト内のパターン、スタイル、構造を分析します。それにより、その分野の応答の属性を学習します。
-
同じ分野で新しい応答を生成させます。プロンプトの条件付けにより、所望のスタイル、構造などに合った応答を生成できます。
-
応答を評価し、モデルをさらに改善するためのフィードバックを提供します。これはモデルに直接フィードバックを与えることもあれば、単に改善が必要な点を記録するだけの場合もあります。
モデルに「考える」時間を与える#
タスクを完了するために必要なステップを指定する#
const text = `
美しい村に、兄妹のジャックとジルがいます。ある日、彼らは山の頂上にある井戸から水を汲みに出かけました。
彼らが楽しそうに歌を歌いながら山を登っていると、不幸が降りかかりました——ジャックが石につまずいて転がり落ち、ジルも続いて転がり落ちました。
軽傷を負ったものの、幸いにも二人は無事に帰宅しました。不幸があったにもかかわらず、彼らの冒険心は全く衰えず、自然を探索し続けるでしょう。
`
// 例
const prompt = `
以下の操作を実行してください:
1-与えられたテキストの内容を一文で要約してください。
2-要約をフランス語に翻訳してください。
3-フランス語の要約に含まれる各名称を列挙してください。
4-以下のキーを含むjsonオブジェクトを出力してください:french_summary、num_names。
改行で答えを提供してください。
テキスト:
"""${text}"""
`
モデルに決定する前に自分で問題を解決させる#
const prompt = `
あなたのタスクは、学生の解決策が正しいかどうかを判断することです。
問題を解決するために、以下の操作を実行してください:
-まず、自分で問題を解決してください。
-次に、あなたの解決策を学生の解決策と比較し、学生の解決策が正しいかどうかを評価してください。
自分で問題を解決する前に、学生の解決策が正しいかどうかを決定しないでください。
以下の形式を使用してください:
問題:
"""
問題
""
学生の解決策:
"""
学生の解決策
"""
実際の解決策:
"""
解決策のステップとあなたの解決策をここに
"""
学生の解決策は、先ほど計算した実際の解決策と同じですか:
""
はいまたはいいえ
"""
学生の成績:
"""
正しいまたは不正確
"""
問題:
"""
私は太陽光発電所を建設しており、財務問題を解決するのに助けが必要です。
-土地のコストは平方フィートあたり100ドルです。
-私は平方フィートあたり250ドルで太陽光パネルを購入できます。
-私は年間固定10万ドルの維持契約を交渉しました。さらに、平方フィートあたり10ドルがかかります。
最初の年の総コストを計算してください。
"""
学生の解決策:
"""
xを設置面積(平方フィート単位)とします。
コスト:
1.土地コスト:100x
2.太陽光パネルコスト:250x
3.維持コスト:100,000+100x
総コスト:100x+250x+100,000+100x=450x+100,000
"""
実際の解決策:
`
他山の石#
ai-code-translator#
このプロジェクト4は、異なるプログラミング言語環境でコードを変換できます。前述のいくつかのテクニックを使用しており、区切り文字を使用して入力と出力のプログラミング言語を示したり、「Few-shot」プロンプトを提供したりしています。
const prompt = `
あなたはすべてのプログラミング言語の専門家です。「${inputLanguage}」コードを「${outputLanguage}」コードに翻訳してください。\`\`\`を含めないでください。
JavaScriptからPythonへの翻訳の例:
JavaScriptコード:
for (let i = 0; i < 10; i++) {
console.log(i);
}
Pythonコード:
for i in range(10):
print(i)
${inputLanguage}コード:
${inputCode}
${outputLanguage}コード(\`\`\`なし):
`;
`
gpt-engineer#
次に、説明に基づいて完全なコードベースを生成するより複雑なプロジェクトを見てみましょう。このプロジェクトでは5、大量のプロンプトが使用されています。以下に、使用されるプロンプトの一部の手順を示します。
const prompt_on_respec = `
あなたはGoogleの実践的な主任エンジニアです。
以前の自分によって新機能の仕様をレビューするように依頼されました。
以下の点についてフィードバックを求められています:
- 指示通りに機能しない可能性のあるものはありますか?
- プログラムが期待通りに動作するために仕様に欠けているものはありますか?
- 重大な欠点なしに簡素化できるものはありますか?
不明な項目については、教育的な仮定を行うように求められています。
これらの各項目について、機能を実装する際にどの仮定を行うかを伝えてください。
ステップバイステップで考えて、何も見逃さないようにしてください。
`
const prompt_on_gen_code = `
手順を今思い出してください:
ステップバイステップで考え、正しい決定を下すために自分自身を理由付けしてください。正しく行うために必要なことを確認してください。
まず、必要なコアクラス、関数、メソッドの名前を列挙し、それらの目的について簡単にコメントしてください。
次に、各ファイルの内容を出力します。すべてのコードを含める必要があります。
各ファイルはマークダウンコードブロック形式に厳密に従う必要があり、以下のトークンは次のように置き換えられます。
FILENAMEはファイル名(拡張子を含む小文字)、
LANGはコードの言語のマークアップコードブロック言語、CODEはコードです:
FILENAME
CODE
コードは完全に機能する必要があります。プレースホルダーはありません。
「エントリーポイント」ファイルから始め、そのファイルによってインポートされるファイルに進みます。
言語とフレームワークに適したベストプラクティスのファイル命名規則に従ってください。
ファイルにはすべてのインポート、型などが含まれている必要があります。コードは完全に機能する必要があります。異なるファイルのコードが互換性があることを確認してください。
終了する前に、アーキテクチャのすべての部分がファイルに存在することを再確認してください。
`
Footnotes#
-
本文の主要な例は deeplearning.ai からのものです。 ↩