mirror of
https://github.com/dair-ai/Prompt-Engineering-Guide
synced 2024-11-08 07:10:41 +00:00
286 lines
16 KiB
Plaintext
286 lines
16 KiB
Plaintext
|
# プロンプトの例
|
|||
|
|
|||
|
前のセクションでは、LLMにプロンプトを与える方法の基本的な例を紹介しました。
|
|||
|
|
|||
|
このセクションでは、プロンプトがどのように異なるタスクを実行するために使用されるかのさらなる例を示し、その過程でキーとなるコンセプトを紹介します。概念を学ぶ最良の方法は、例を通して理解することです。以下では、上手く作成されたプロンプトが異なるタイプのタスクを実行するためにどのように使用されるかについていくつかの例をカバーしています。
|
|||
|
|
|||
|
トピック:
|
|||
|
- [テキスト要約](#テキスト要約)
|
|||
|
- [情報抽出](#情報抽出)
|
|||
|
- [質問応答](#質問応答)
|
|||
|
- [テキスト分類](#テキスト分類)
|
|||
|
- [会話](#会話)
|
|||
|
- [コード生成](#code-generation)
|
|||
|
- [推論](#reasoning)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## テキスト要約
|
|||
|
自然言語生成の標準的なタスクの1つに、テキスト要約があります。テキスト要約にはさまざまなフレーバーやドメインが含まれることがあります。実際、言語モデルの最も有望な応用の1つは、記事やコンセプトをクイックで読みやすい要約にまとめる能力です。プロンプトを使用して基本的な要約タスクを試してみましょう。
|
|||
|
|
|||
|
例えば、抗生物質について学びたいと思った場合、次のようなプロンプトを試すことができます。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
抗生物質について説明してください。
|
|||
|
|
|||
|
A:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
抗生物質は、細菌感染を治療するために使用される薬剤の一種です。細菌を殺すか、再生を防止して、体の免疫系が感染に対抗できるようにします。抗生物質は、錠剤、カプセル、液体溶液の形で通常口から摂取されますが、場合によっては静脈内投与されることもあります。抗生物質は、ウイルス感染には効果がなく、不適切に使用すると抗生物質耐性を引き起こす可能性があります。
|
|||
|
```
|
|||
|
|
|||
|
"A:"は質問応答で使用される明示的なプロンプトフォーマットです。ここでは、モデルにさらに情報が必要であることを伝えるために使用しました。この例では、これがどのように有用であるかという点は後の例で検討します。とりあえず、これは情報が多すぎると感じ、さらに要約したいと思ったとします。実際、モデルに1文で要約するように指示することができます。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
抗生物質は、細菌感染を治療するために使用される薬剤の一種です。細菌を殺すか、再生を防止して、体の免疫系が感染に対抗できるようにします。抗生物質は、錠剤、カプセル、液体溶液の形で通常口から摂取されますが、場合によっては静脈内投与されることもあります。抗生物質は、ウイルス感染には効果がなく、不適切に使用すると抗生物質耐性を引き起こす可能性があります。
|
|||
|
|
|||
|
上記を1文で説明してください。
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
抗生物質は、細菌感染を治療するために使用される薬剤であり、細菌を殺すか再生を防止し、ウイルスには効果がなく、過剰摂取によって抗生物質耐性を引き起こす可能性があります。
|
|||
|
```
|
|||
|
|
|||
|
出力の正確性にあまり注意を払わないことにしますが、モデルは段落を1文で要約しようとしました。指示をうまく使うことができますが、それについては後の章で触れます。ここで一度停止して、より良い結果を得るために実験してみてください。
|
|||
|
|
|||
|
---
|
|||
|
## 情報抽出
|
|||
|
言語モデルは、自然言語生成や関連するタスクを実行するように訓練されていますが、分類やその他の自然言語処理(NLP)タスクを実行することも非常に可能です。
|
|||
|
|
|||
|
以下は、与えられた段落から情報を抽出するプロンプトの例です。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
研究論文の著者貢献声明や謝辞には、筆者が ChatGPT のようなAIテクノロジーを原稿および分析の準備に使用したかどうか、およびどの LLMs を使用したかが明確かつ具体的に記載されている必要があります。これにより、編集者や査読者がバイアス、不正な引用元のクレジット付け、不正確さなどの可能性について、より注意深く原稿を精査することができます。同様に、科学ジャーナルは、投稿された原稿の選定時に LLMs を使用した場合には、透明性を持って開示する必要があります。
|
|||
|
|
|||
|
上記の段落において言及されている大規模言語モデルベースの製品を述べてください。
|
|||
|
```
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
上記の段落において言及されている大規模言語モデルベースの製品は ChatGPT です。
|
|||
|
```
|
|||
|
|
|||
|
上記の結果を改善する方法は多数ありますが、これはすでに非常に有用です。
|
|||
|
|
|||
|
今では、単にモデルに何をするか指示することで、モデルにさまざまなタスクを実行させることができることが明らかになっています。これは、AI 製品開発者が既に強力な製品や体験を構築するために使用している強力な能力です。
|
|||
|
|
|||
|
段落の出典:[ChatGPT: five priorities for research](https://www.nature.com/articles/d41586-023-00288-7)
|
|||
|
|
|||
|
---
|
|||
|
## 質問応答
|
|||
|
|
|||
|
モデルに特定の回答を返すようにする最良の方法の1つは、プロンプトのフォーマットを改善することです。前述のように、プロンプトは指示、文脈、入力、および出力インジケーターを組み合わせて、改善された結果を得ることができます。これらのコンポーネントは必須ではありませんが、指示が具体的であるほど、より良い結果が得られるため、良い習慣となります。以下は、より構造化されたプロンプトに従って見える例です。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
以下の文脈に基づいて質問に答えてください。回答を短く簡潔に保ちます。回答が不明な場合は、「回答不明」と回答してください。
|
|||
|
|
|||
|
文脈:Teplizumabは、Ortho Pharmaceuticalと呼ばれるニュージャージー州の薬剤会社に由来します。そこでは、科学者たちはOKT3という抗体の初期バージョンを生成しました。分子はもともとマウスから採取され、T細胞の表面に結合し、その細胞殺傷能力を制限することができました。1986年に、腎臓移植後の臓器拒絶を防止するために承認され、これにより、人間の使用に許可された最初の治療用抗体となりました。
|
|||
|
|
|||
|
質問:OKT3はもともとどこから採取されたものですか?
|
|||
|
|
|||
|
回答:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
マウス。
|
|||
|
```
|
|||
|
|
|||
|
文脈は[Nature](https://www.nature.com/articles/d41586-023-00400-x)から取得されました。
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## テキスト分類
|
|||
|
ここまで、タスクを実行するために単純な指示を使用してきました。プロンプトエンジニアとして、より良い指示を提供するために上達する必要があります。しかし、それだけではありません!より難しいユースケースでは、指示を提供するだけでは十分ではないことがわかります。これは、コンテキストやプロンプトで使用できるさまざまな要素についてより考える必要があるということです。提供できる他の要素には、`データ入力`または`例示`があります。
|
|||
|
|
|||
|
テキスト分類の例を提供することによって、これをデモンストレーションしてみましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
テキストをneutral、negative、またはpositiveに分類してください。
|
|||
|
|
|||
|
テキスト:この食べ物はまずまずでした。
|
|||
|
所感:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
Neutral
|
|||
|
```
|
|||
|
|
|||
|
私たちはテキストを分類する指示を与え、モデルが「`Neutral`」という正しい答えを返しました。これには何も問題はありませんが、本当に必要なのは、モデルが正確な形式でラベルを返すことです。 `Neutral`の代わりに`neutral`を返すようにしたい場合、どうすればよいでしょうか?これを実現する方法にはさまざまな方法があります。ここでは特殊性について関心がありますので、プロンプトに提供できる情報が多いほど、より良い結果が得られます。正しい動作を指定するための例を提供してみましょう。もう一度試してみましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
テキストを中立、否定的、または肯定的に分類してください。
|
|||
|
|
|||
|
テキスト:先日の休暇はまずまずでした。
|
|||
|
所感: neutral
|
|||
|
|
|||
|
テキスト:この食べ物はまずまずでした。
|
|||
|
所感:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
neutral
|
|||
|
```
|
|||
|
|
|||
|
素晴らしい!今回は、モデルが私が探していた特定のラベルである「neutral」を返しました。プロンプトで提供された例が、モデルが出力を特定するのに役立ったようです。なぜ時に特定性が重要なのかを強調するために、次の例を確認して、問題を見つけてください。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
テキストをneutral、negative、またはpositiveに分類してください。
|
|||
|
|
|||
|
テキスト:先日の休暇はまずまずでした。
|
|||
|
所感:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
Neutral
|
|||
|
```
|
|||
|
|
|||
|
何が問題だと思いますか?
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 会話
|
|||
|
プロンプトエンジニアリングで達成できることの中でも、LLMシステムの振る舞い、意図、アイデンティティの指示は特に興味深いものです。これは、カスタマーサービスのチャットボットなどの会話システムを構築する場合に特に役立ちます。
|
|||
|
|
|||
|
例えば、より技術的で科学的な回答を生成できる会話システムを作成しましょう。指示によって、どのように振る舞うかを明示的に伝えていることに注目してください。これは、*role prompting*と呼ばれることがあります。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
以下はAI研究アシスタントとの会話です。アシスタントのトーンは技術的で科学的です。
|
|||
|
|
|||
|
人: こんにちは、あなたは誰ですか?
|
|||
|
AI: ご挨拶!私はAI研究アシスタントです。今日は何をお手伝いできますか?
|
|||
|
人: ブラックホールの生成について教えてもらえますか?
|
|||
|
AI:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
もちろんです!ブラックホールとは、重力の力が非常に強く、光を含めて何も脱出できない時空の領域です。非常に質量のある星が死亡し、そのコアが自己崩壊して無限密度の特異点を形成すると、ブラックホールが形成されます。特異点の強烈な引力により、周囲の物質や放射線が引き寄せられ、ブラックホールが作成されます。
|
|||
|
```
|
|||
|
|
|||
|
AI研究アシスタントの回答は少し技術的すぎるようですね。では、この振る舞いを変更して、システムによりアクセスしやすい回答を指示しましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
以下はAI研究アシスタントとの会話です。アシスタントの回答は小学生でも理解できるようになっています。
|
|||
|
|
|||
|
人: こんにちは、あなたは誰ですか?
|
|||
|
AI: ご挨拶!私はAI研究アシスタントです。今日は何をお手伝いできますか?
|
|||
|
人: ブラックホールの生成について教えてもらえますか?
|
|||
|
AI:
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
もちろんです!ブラックホールは、非常に大きな星が燃料を使い果たし、崩壊することで作られます。星の重力が非常に強いため、光でさえも引き寄せられて、その重力場によって空間に点ができます。それがブラックホールです。
|
|||
|
```
|
|||
|
|
|||
|
進歩を遂げたようですね。引き続き改善することができます。さらに例を追加すると、さらに良い結果が得られる可能性があると思われます。
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## コード生成
|
|||
|
LLMは非常に効果的なコード生成のアプリケーションの一つです。Copilotはその素晴らしい例です。巧妙なプロンプトを使えば、多くのコード生成タスクを実行できます。以下にいくつか例を見てみましょう。
|
|||
|
|
|||
|
まず、ユーザーに挨拶する簡単なプログラムを試してみましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
/*
|
|||
|
ユーザーに名前を聞いて、「こんにちは」と言ってください。
|
|||
|
*/
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
let name = prompt("あなたの名前は何ですか?");
|
|||
|
console.log(`こんにちは、${name}さん!`);
|
|||
|
```
|
|||
|
|
|||
|
言語の指定さえ必要ありませんでした。
|
|||
|
|
|||
|
次に、もう少しプロンプトの設計に努力を加えることで、LLMがどれほど強力であるかを示したいと思います。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
"""
|
|||
|
テーブル名 departments、カラム=[DepartmentId、DepartmentName]
|
|||
|
テーブル名 students、カラム=[DepartmentId、StudentId、StudentName]
|
|||
|
コンピュータサイエンス学科のすべての学生のためのMySQLクエリを作成してください。
|
|||
|
"""
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
SELECT StudentId、StudentName
|
|||
|
FROM students
|
|||
|
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');
|
|||
|
```
|
|||
|
|
|||
|
これは非常に印象的です。この場合、データベースのスキーマに関するデータを提供し、有効なMySQLクエリを生成するように求めました。
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 推論
|
|||
|
現代のLLMにとって、最も困難なタスクの一つは、何らかの形での推論を必要とするものです。推論は、複雑なアプリケーションが生み出される可能性があるため、私が最も興奮している分野の一つです。
|
|||
|
|
|||
|
数学的な能力を必要とするタスクにおいては、いくつかの改善が見られました。ただし、現在のLLMは推論タスクを実行するのが困難であるため、更に高度なプロンプトエンジニアリング技術が必要です。次のガイドでこれらの高度な技術をカバーしていきます。今のところ、算術能力を示すいくつかの基本的な例を紹介します。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
9,000 * 9,000は何ですか?
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
81,000,000
|
|||
|
```
|
|||
|
|
|||
|
もう少し難しい問題を試してみましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
このグループの奇数の数値を合計すると偶数になります: 15, 32, 5, 13, 82, 7, 1。
|
|||
|
|
|||
|
A:
|
|||
|
```
|
|||
|
|
|||
|
*出力*
|
|||
|
```
|
|||
|
いいえ、このグループの奇数の数値を合計すると奇数になります: 119。
|
|||
|
```
|
|||
|
|
|||
|
これは誤りです!プロンプトを改善することで、精度を向上させてみましょう。
|
|||
|
|
|||
|
*プロンプト:*
|
|||
|
```
|
|||
|
このグループの奇数の数値を合計すると偶数になります: 15, 32, 5, 13, 82, 7, 1。
|
|||
|
|
|||
|
問題をステップごとに解決してください。まず、奇数の数値を特定し、それらを合計して結果が奇数か偶数かを示してください。
|
|||
|
```
|
|||
|
|
|||
|
*出力:*
|
|||
|
```
|
|||
|
奇数: 15, 5, 13, 7, 1
|
|||
|
合計: 41
|
|||
|
41は奇数です。
|
|||
|
```
|
|||
|
|
|||
|
ずっと良くなりましたね!ちなみに、私はこれを何度か試しましたが、システムは時々失敗します。よりよい指示と例を提供することで、より正確な結果を得ることができるかもしれません。
|
|||
|
|
|||
|
私たちは、このガイドのこのセクションで一般的なアプリケーションのより多くの例を示し続けます。
|
|||
|
|
|||
|
次のセクションでは、これらすべてのタスクのパフォーマンスを向上させるための、より高度なプロンプトエンジニアリングの概念や技術について説明していきます。
|