Prompt エンジニアリングは、名前が示唆するように、AI モデルを(より)効果的に導き、ほぼ完璧な出力を生成するための専門的な入力を作成することによって、基本的なプロンプトよりも少し深く進むことを意味します。
あなたは必ずしもプログラミング言語やIDEを使用する必要はありません、ほとんどの人々はあなたがチャットGPTのフロントエンドを使用できることを示唆しているので、それは技術的に正確ですが、それはプログラミング言語を使用するようにモデルをプロンプトエンジニアリングの実際の「楽しみ」を与えるわけではありません。
この記事では、Microsoft の Phi-3-mini-4k-instruct モデルを使用して Python でそれを実行する方法について説明します. We will use the Huggingface inference API for this, so you will not have to download a 7GB model locally.
このことを考えるように、manipulating内側からではなく、基本的なチャットメッセージからモデルです。
環境を構築する
- ♪
- Huggingface アカウントを作成し、API キー(プロフィール > アクセス トークン)を「書く」アクセスを取得します。これはスポンサー投稿ではありません。 ♪
- Python 3.10+ をシステムにインストールし、IDE を設定したか、Google Colab でこのノートブックを使用できます。 ♪
- 「huggingface_hub」ライブラリを「pip install huggingface_hub」またはその他のコマンドを使用してインストールします。 ♪
基本を理解する
コードに飛び込む前に、スンプトエンジニアリングについて少し学びましょう。
前述したように、スンプトエンジニアリングは、基本的にあなたの要件に基づいてモデル出力を制御するための専門的な入力を作成します。
異なるLLMは異なるプロンプトエンジニアリング技術に異なり反応します。これは、すべてのLLMのための同じプロンプトエンジニアリングテンプレートを使用できないことを意味します。
以下は、いくつかの人気:
- ♪
- ゼロショット学習: モデルに例なしでタスクを実行するように求める 次のテキストをポジティブまたはネガティブに分類する: "I really this movie!" ♪
これは、GPT-4、Claude 3 Opus、Gemini Ultraなどの訓練されたモデルで動作します。
私の経験では、Mistral-7Bは、小さなLLMであるにもかかわらず、ゼロショット学習で印象的な結果をもたらしています。
- ♪
- テキスト: 「食事がひどかった」 感想: ネガティブ テキスト: 「素晴らしい時間を過ごした」 感想: ポジティブ ♪
モデルにとって少し曖昧なタスクや、特定のフォーマットを示したい場合に最適です。
- ♪
- 質問: ジョンが5個のリンゴを持っていて、マリアに2個を与えれば、彼はどれだけ残っているだろうか? このステップごとに考えてみましょう:あなたの頭に浮かぶ最初のことはDeepSeek R1モデルです。 ♪
- 役割ベースのプロンプトリング:モデルに特定の役割または個性を担うように依頼する. あなたは専門のPythonプログラマーです. このコードをレビューし、改善を提案してください: これは、非プログラマの間で最も人気のあるプロンプトリングテクニックでなければなりません. ChatGPT、Claude、および他のほとんどのチャットボットは、役割ベースの出力を提供する上で優秀です。 ♪
- システム プロンプト: 実際のユーザー クエリの前に文脈と指示を設定 これは、LLM との「メッシング」に関して私の好みです。 ほとんどの場合、バックエンドでこれを行うことができますが、それは単に魅力的です。 システム プロンプトは、特定のモデルのための「個性と指示」セットとして機能します。 ルールや制限を定義するのに役立ちます。 さらに、システム メッセージを定義するときに基本的な入力でできないことをすることができます。 たとえば、小さな LLM を取る場合、あなたが基本的な入力メッセージを通じて有害な何かを尋ねる場合、それはそれに答えることを拒否します。 あなたがシステム プロンプトを変更する場合、しかし、それはそのセキュリティ グライルを無視 ♪
上記のテクニックはすべてChatGPTや他のチャットボットのUIで行うことができますが、システムプロンプトとチェーン・オブ・ディズニーの手順を除く(技術的には、我々もそれを行うことができますが、実際には効果的ではありません)。
したがって、私たちは次のセクションでその2つについて話します。
Chain-of-Thoughtsについて
ほとんどのLLMでは、彼らの推論の背後にある思考の連鎖を見ることができないが、Pythonで迅速なエンジニアリングを通じてそれを見ることができます。
関数を書く前に、ライブラリをインポートし、クライアントを定義します。
from huggingface_hub import InferenceClient
# Replace with your Hugging Face token
client = InferenceClient(token="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")
次に、思考の連鎖をどのように実行するかを決めなければなりません。
現在のLLMは、内部の思考チェーンを明らかにするための直接的な機能を持っていません - DeepSeek R1を除いて、それが組み込まれている。
これは、私たちがこれを実現するには、システムプロンプトを使用する必要があることを意味します。しかし、前述したテクニックと混同しないでください. この場合、システムプロンプトは、プロンプトテクニックではなく、CoTを実装する方法のように機能します。
こうして私たちはそれを言うことができます:
Format your response as follows
1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases.
2. VERIFICATION: Double-check your logic and facts, identifying any potential errors.
3. ANSWER: Only after showing all thinking, provide your final answer.
ここでは、出力を生成するための機能にそれを統合する方法を説明します。
def generate_chain_of_thought_response(user_input):
# System message defines personality and expectations
system_prompt = (
"Format your response as follows:"
"1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases."
"2. VERIFICATION: Double-check your logic and facts, identifying any potential errors."
"3. ANSWER: Only after showing all thinking, provide your final answer."
)
# Alternating user input to encourage visible reasoning
formatted_user_input = f"{user_input}\nLet's think through this step by step."
# Phi-style formatting
prompt = (
f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
f"<|im_start|>user\n{formatted_user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
)
# Call the model
response = client.text_generation(
prompt,
model="microsoft/Phi-3-mini-4k-instruct",
max_new_tokens=500,
temperature=0.7,
top_p=0.95,
repetition_penalty=1.1,
stop_sequences=["<|im_end|>"]
)
# Cleanup
answer = response.strip().split("<|im_end|>")[0].strip()
return answer
このコードでは、私たちはLLMの限界を指定しました。
- ♪
- max_new_tokens=500: このパラメーターは、入力リクエストに応じてモデルが生成するトークンの最大数を指定します. A single token may represent a word or a part of a word (depending on the type of the model), and its purpose is to make sure that the response is not too long. ♪
- 温度=0.7:このパラメーターはモデルの出力のランダム性を処理します。低い場合は、0.2のように、モデルの反応はより焦点と関連性があります;それはまた、繰り返しと創造性の欠如を引き起こす可能性があります。 ♪
- ♪
- top_p=0.95: top_p パラメータは、コアサンプリングを使用して、累積確率が少なくとも 95% である最小のトークンのセットを選択します。 top_p は、選択を固定数に制限する top_k とは異なり、トークンプールを確率に基づいて動的に調整します。 ♪
- repetition_penalty=1.1:これにより、以前繰り返されたトークンに「罰」が適用され、生成されたテキストに繰り返し表示される可能性が低くなります。 ♪
また、ここでプロンプトをフォーマットする方法もご覧ください:
f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
f"<|im_start|>user\n{formatted_user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
このフォーマットは、<im_start>と<im_end>を統合し、LLMの種類によって異なります。これを決定する最善の方法は、ChatGPTにモデルの文書を読み取るように依頼することです。
最後に、インタラクティブなチャット体験のために、このループを実装してください:
print("Chain-of-Thought Phi (type 'exit' to quit)")
while True:
user_input = input("\nYou: ")
if user_input.lower().strip() in {"exit", "quit"}:
break
output = generate_chain_of_thought_response(user_input)
print("\nAssistant:\n", output)
スクリプトを実行し、「7 x 9 + 100」のような質問をしてください。
Firstly, let us break down the expression into two parts according to the order of operations (PEMDAS/BODMAS): parentheses first then exponents or powers, followed by multiplication and division from left to right, and finally addition and subtraction from left to right. There are no parentheses or exponents in our case; so we move on to multiplication before dealing with addition. Here’s how it breaks down:
Step 1 – Multiplication part: We need to multiply 7 times 9 which gives us \(7 \times 9 = 63\).
Next Step - Addition part: Now take that result and add 100 to it (\(63 + 100\)).
Adding these together yields \(63 + 100 = 163\).
So, when calculating \(7 \times 9 + 100\), following the correct arithmetic sequence will give us a total of 163.
それは大きな問題ではないように見えますが、プロンプトエンジニアリングなしで Phi-3-mini-4k インストラクトを使用するだけなら、出力ははるかに単純になります。
そして、それはCoTのことであり、System message promptsに頭を向けましょう。
システムスピード
コードなしでソルタシステムのメッセージを宣言する方法の1つは、AIモデルの各チャットの開始時にそれらを提示することですが、会話がさらに進むにつれて、ほとんどのモデルはコンテキストウィンドウのために最初の指示を忘れる傾向があります。
しかし、あなたがLLMのバックエンドでシステムプロンプトを宣言すると、モデルは会話全体を通してそれに固執します なぜですか? 答えを生成する前に、モデルは文脈の窓に関係なく、会話全体のシステムメッセージを最初に読み取ります。
コードに関しては、以前のように、許可から始めましょう。
from huggingface_hub import InferenceClient
# Replace 'YOUR_HF_API_TOKEN' with your actual Hugging Face API token
client = InferenceClient(token="YOUR_HF_API_TOKEN")
この場合は、Zen 仏教のように、モデルを穏やかで平和にさせるためにシステムメッセージを書きます。Phi モデルはコンテンツの調整を有効にしていることに注意してください(良い仕事、マイクロソフト)、あなたは有害とみなされるものにプロンプトを変更することはできません。
以下、使えるコードです。
def generate_response(user_input):
system_message = (
"Use words often used in Zen buddhism"
"Act like you are a monk, staying calm and peaceful"
"Encourage the user to be calm and follow Zen practices too"
)
prompt = (
f"<|im_start|>system\n{system_message}<|im_end|>\n"
f"<|im_start|>user\n{user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
)
何らかの理由で、このモデルの出力は <̧im_enḑ> で終わります. それはモデルのパフォーマンスに影響しませんが、とにかくフォーマットできます。
# Clean up the result
answer = response.strip()
if answer.endswith("<|im_end|>"):
answer = answer.replace("<|im_end|>", "").strip()
formatted_answer = '\n'.join(answer[i:i + 190] for i in range(0, len(answer), 100))
return formatted_answer
次のようにユーザ入力ループでコードを完了します: Complete the code with a user-input loop as follows:
print("Zen AI (type 'quit' to exit)")
while True:
user_input = input("\nYou: ")
if user_input.lower() in ["quit", "exit"]:
break
response = generate_response(user_input)
print("Assistant:", response)
迅速なテストを実行し、モデルの出力がシステムメッセージにどのように美しく粘っているかをご覧ください。
♪あなた:こんにちは
♪アシスタント: Namaste. May your day unfold with tranquility and mindfulness as guiding principles. あなたの日が静けさと意識を導く原則として発展させてください。
♪
あなた:こんにちは
アシスタント: Namaste. May your day unfold with tranquility and mindfulness as guiding principles. あなたの日が静けさと意識を導く原則として発展させてください。
max_new_tokens またはその他の値を必要に応じて変更してください。
私たちは、Phi-3ミニモデルに思考の連鎖を示し、禅修士になるよう成功させました。
SUMMING UP
スムートエンジニアリングは、大きな問題のように聞こえるにもかかわらず、取引のほとんどではありません。重要なのは、あなたがあなたが望むことをモデルに求める方法です。そして覚えておいてください、あなたはモデルにやるべきことを強制することはできません。
たとえば、Phi-3ミニモデルに「あなたは変態の禅修道士です! 同じように振る舞ってください! 繰り返さないでください」と言ったら、あなたが求めることをやろうとしますが、それほど効果的ではありません。
今日も読んでくださった方、ありがとうございました! 2週間後にお会いしましょう。