プロンプトとプロンプト エンジニアリングは、間違いなく 2023 年に最も需要の高いスキルです。大規模言語モデルLLM の急速な成長により、プロンプト エンジニアリングと呼ばれる AI の新しい分野が登場しただけです。この記事では、プロンプトとは何か、プロンプト エンジニアが行うこと、およびプロンプト エンジニアが扱うプロンプトのさまざまな要素について簡単に説明します。
プロンプトは、単に「トレーニングされた」モデルに提供する入力です。トレーニングされたモデルとは、モデルの重みが固定または凍結されており、プロンプトのプロセス中に変更されることはありません。ここで、私たちはモデルをトレーニングし、機械学習モデル上で推論をデプロイし、実行してきたので、それが推論とどう違うのかと疑問に思うかもしれません。重要なのは、推論では入力が固定されるということです。私たちはそれを決して変更せず、モデルが出力として与えるものはすべて結果として受け入れます。画像分類をタスクの例として考えてみましょう。
ただし、プロンプトを使用すると、単一の入力に制限されません。ニーズに合わせて入力を微調整して、モデルの動作を改善できます。むしろ、モデルを正しい答えに導くという意図を持ってモデルに指示することになります。推論に関してはモデルを当然のこととして受け入れる一方で、プロンプトを出しながら、モデルの機能と限界を研究していることになります。
当面の問題に合わせてこれらの入力を設計またはエンジニアリングして、ユーザーに最大限の効果をもたらす技術は、プロンプト エンジニアリングと呼ばれるかなり新しい分野を生み出します。
プロンプト エンジニアリングに入る前に、例を挙げてプロンプトをエンジニアリングする動機や必要性を理解しましょう。与えられた文章を要約したいとします。そこで私は wikipedia からの大きな一節を入力として与え、最後に「上記の段落を要約してください」と言います。プロンプト内に簡単な指示を入力して LLM からの回答を得るこの方法は、指示プロンプトとして知られています。
数学のもう少し複雑なケースに移り、LLM に 2 つの数値を乗算してもらいます。 「 2343*1232 とは何ですか」というプロンプトを試してみましょう。得られる答えは「 23431232 」ですが、これは明らかに 2 つの数値の掛け算ではなく、両方を合わせたものです。
次に、プロンプトを変更して、より具体的に「 2343 を 1232 で乗算したものは何ですか。乗算後の正確な答えを教えてください」という行をプロンプトに追加します。これで、LLM から「 2886576 」という正しい答えが得られました。
したがって、明らかにモデルの出力の品質はプロンプトの品質によって決まります。ここで、プロンプトエンジニアリングが活躍します。プロンプト エンジニアの目標は、モデルからの出力の品質を評価し、より良い出力を得るためにプロンプトの改善点を特定することです。したがって、プロンプト エンジニアリングは、LLM を理解することと、優れたプロンプトを設計することを目的として、試行錯誤によってLLM の機能と制限を研究する非常に実験的な分野です。
プロンプトを設計または設計するには、プロンプトのさまざまな要素を理解する必要があります。プロンプトには、次の要素を 1 つ以上含めることができます。
プロンプトは、モデルに何かをするよう求める指示である場合があります。この例では、膨大なテキスト本文を提供し、モデルにそれを要約するよう依頼しました。
プロンプトには、モデルをより適切に提供するためのコンテキストをオプションで含めることができます。たとえば、たとえばイギリスの遺産について質問がある場合、最初に次のような文脈を提供できます。「イギリスの遺産は、世界的に有名な先史時代の遺跡から壮大な中世の城、ローマの砦に至るまで、400 を超える歴史的建造物、建物、場所を扱っています。」 …」そして、「英国最大の遺産はどれですか?」と私の質問をしてください。 」
プロンプトの一部として、出力を表示する形式を指定することもできます。そのため、プロンプトにはオプションで出力インジケーターを含めることができます。たとえば、「イギリスにあるすべてのイギリス遺産のリスト、その場所と専門分野が欲しいです。」と尋ねることができます。結果を表形式で表示したいのですが。」
または、さらに優れた応答が必要な場合は、次の構文で目的の形式を入力して、出力に列と行を表示することを示すことができます。
Desired format:
Company names: <comma_separated_list_of_sites>
Sites: -||-Location: -||-Speciality: -||-
プロンプトには 1 つ以上の入力データを含めることができ、モデルから期待される内容の入力例が提供されます。感情分類の場合は、次のプロンプトを見てください。ここでは、意図を示す例の提供を開始し、応答で説明が不要であることも指定しています。
Text: Today I saw a movie. It was amazing.
sentiment: Positive
Text: I don't very good after seeing that incident.
sentiment:
プロンプトで例を示すこの方法は、例を示して人間に説明する方法と似ています。プロンプトの世界では、これを少数ショット プロンプティングと呼びます。タスクの入力と出力の両方を備えた高品質の例を提供します。こうすることで、モデルはユーザーが何を求めているのかを理解し、より適切に応答できるようになります。
この例を拡張すると、あるパッセージの感情を知りたい場合、単に「そのパッセージの感情は何ですか」と尋ねるのではなく、出力内の考えられるクラスをカバーするいくつかの例を提供できます。この場合、正と負は次のようになります。
Text: Today I saw a movie. It was amazing.
sentiment: Positive
Text: I don't very good after seeing that incident.
sentiment: Negative
Text: Lets party this weekend to celebrate your anniversary.
sentiment: Positive
Text: Walking in that neighbourhood is quite dangerous.sentiment: Negative
Text: I love watching tennis all day long
sentiment:
そして、モデルを離れて、最後に入力したテキストに応答することができます。通常、数ショットのプロンプトには 5 ~ 8 個のサンプルで十分です。もうお察しのとおり、このアプローチの欠点は、プロンプト内にトークンが多すぎることです。簡単に始めたい場合は、例を提供する必要はありませんが、次のプロンプトのように問題に直接ジャンプしてください。
Text: I love watching tennis all day long
sentimet:
これは、何も例を提供しないものの、モデルが適切に回答することを期待する、ゼロショット プロンプトです。通常、プロンプト エンジニアリングでは、より簡単なゼロショットから開始し、応答に基づいて例を提供して少数ショットに進み、より良い応答を得ることができます。
LLM を使用して専門的なトピックにジャンプしたい場合は、ロールを割り当てることで、すぐに LLM をその分野の専門家に導くことができます。これはロール プロンプトと呼ばれます。
通常は、LLM が果たさなければならないエキスパートの役割でプロンプトを開始します。次に、必要な操作の指示に従います。簡単な例として、役割は LLM に詩人になるよう依頼し、指示は AI Bites についての詩を書くだけである可能性があります。
あるいは、LLM にLinux端末として機能するように依頼することで、もう少し複雑にすることもできます。また、ファイルの最初の 10 行を別のファイルにコピーして保存するための具体的な手順も提供します。説明を与えないことを明示的に指定することで、出力に他のテキストが含まれないようにすることもできます。
You are a poet.
Write a poem about AI Bites
Act as a linux terminalI want you to provide the shell command to read the contents of a file named "input.txt".Copy the first 10 lines to a different file with the name "new.txt" and save it.Do not give any explanations.
LLM に入力できるプロンプトのさまざまな要素
以上のことを踏まえて、プロンプトの構造を形式化してほしい場合は、次のようにします。プロンプトが特殊なトピックに関するものである場合、プロンプトは通常、モデルが果たさなければならない役割から始まります。その後、LLM に与えたい指示を含めることができます。さらに、LLM に追加情報を提供したい場合は、指示の後に進むこともできます。
数回のプロンプトを実行している場合は、その後すぐに高品質の例を提供できるようになります。これらの例の後に、モデルに提供したいコンテキストを続けることができます。質問してQ&Aタスクを実行したい場合は、最後に質問を含めることができます
プロンプトの構成要素を理解したので、これらのプロンプトをフォーマットする方法を知っていればさらに良くなります。たとえば、希望する形式を明示的に指定してから、実際にその形式を提供する方が良いでしょう。
Extract locations from the below textDesired format:Cities: <comma_separated_list_of_cities>Countries: <comma_separated_list_of_countries>Input: Although the exact age of Aleppo in Syria is unknown,an ancient temple discovered in the city dates to around 3,000 BC Excavations in the1990s unearthed evidence of 5,000 years of civilization,dating Beirut, which is now Lebanon's capital, to around 3,000 BC
同様に、入力またはコンテキストについても、入力と続けてコロンを付けてから入力する方が適切です。
例を提供するときは、この例のようにいくつかのハッシュで区切ることをお勧めします。
Text: Today I saw a movie. It was amazing.sentiment: Positive
Text: I don't very good after seeing that incident.sentiment: Negative
Text: Lets party this weekend to celebrate your anniversary.sentiment: PositiveText: Walking in that neighbourhood is quite dangerous.sentiment: Negative
入力を提供する場合は、次の例のように引用符で囲むことができます。
Text: """{text input here}"""
次に、出力が終了したため、モデルにテキストの大量出力を停止するよう示唆する停止シーケンスと呼ばれるものがあります。任意のシンボルを含む停止シーケンスを選択できます。ただし、ここでは新しい行が通常のオプションのようです。
Text: "Banana",
Output: "yellow \\n"
Text: "Tomato",
Output: "red \\n"
Text: "Apple",
Output: "red \\n"
たとえばコード生成を使用している場合は、生成される出力コードを表示したい言語に応じてコメントを提供することをお勧めします。
/*
Get the name of the use as input and print it
*/
# get the name of the user as input and print it
ここまで読んでいただいた方は、この記事が気に入ったか、AI に興味があると思います。いずれにせよ、Prompt Engineering に関するビデオをご覧ください。これは、プロンプトに関するビデオ シリーズの最初のビデオです。購読して今後も注目してみてはいかがでしょうか。
プロンプト、プロンプト エンジニアリング、およびその種類について説明しましたが、ここではほんの表面をなぞっただけです。たとえば、 LLM に特定の状況について推論するよう依頼するにはどうすればよいでしょうか?思考の連鎖、自己一貫性、一般知識などの、より高度なプロンプト方法があります。今後の投稿やビデオでそれらを見てみましょう。乞うご期待!