はじめに: LLM とのコミュニケーション術
Il 迅速なエンジニアリング 効果的なリクエストを作成する方法を研究する学問 大規模な言語モデルまで。それは神秘的な芸術ではありません。体系的でテスト可能な一連のテクニックです。 再現可能であり、出力の品質を大幅に向上させることができます。
一般的なプロンプトと適切に設計されたプロンプトの違いは、 平凡な反応とプロフェッショナルな結果。この記事では最も効果的なテクニックについて説明します。 基本レベルから思考連鎖や ReAct などの高度なパターンまで。
この記事で学べること
- 基本的なテクニック: ゼロショット、フューズショット、ワンショット
- 複雑な推論のための思考連鎖 (CoT) と思考ツリー (ToT)
- 動作を制御するためのシステム プロンプトとペルソナ インジェクション
- 構造化された出力: JSON、テーブル、および特定の形式を取得します。
- 推論とアクションを統合する ReAct パターン
- 迅速なバージョン管理と A/B テスト戦略
基本: ゼロショット、ワンショット、フューショット
プロンプトエンジニアリングにおける最も基本的な違いは、 esempi 実際のリクエストの前にモデルに提供されます。
ゼロショット: 例なし
Nel ゼロショットプロンプト、モデルにタスクの実行を直接依頼します。 何の例も示さずに。これは、モデルが次のような単純で明確に定義されたタスクにうまく機能します。 トレーニング中にすでにパターンを学習しています。
# Zero-shot: richiesta diretta senza esempi
from anthropic import Anthropic
client = Anthropic()
# Zero-shot classification
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=50,
messages=[{
"role": "user",
"content": "Classifica il sentimento di questa recensione come POSITIVO, NEGATIVO o NEUTRO:\n\n'Il prodotto e arrivato in anticipo e funziona perfettamente. Consigliatissimo!'"
}]
)
print(response.content[0].text) # POSITIVO
少数のショット: ガイドとしての例
Il 数回のプロンプト リクエストの前に 2 ~ 5 個の入出力例が提供されます。 これにより、具体的な例を通じてモデルに望ましいパターンを「教え」、改善が図られます。 出力の一貫性と精度が大幅に向上します。
# Few-shot: fornire esempi prima della richiesta
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
messages=[{
"role": "user",
"content": """Estrai le entità dal testo nel formato ENTITA: TIPO.
Esempio 1:
Testo: "Mario Rossi lavora a Roma per Acme Corp"
Output:
- Mario Rossi: PERSONA
- Roma: LUOGO
- Acme Corp: ORGANIZZAZIONE
Esempio 2:
Testo: "Il 15 gennaio Apple ha presentato il nuovo iPhone a San Francisco"
Output:
- 15 gennaio: DATA
- Apple: ORGANIZZAZIONE
- iPhone: PRODOTTO
- San Francisco: LUOGO
Testo: "Luca Bianchi partecipera alla conferenza Google I/O 2026 a Mountain View"
Output:"""
}]
)
print(response.content[0].text)
思考の連鎖: 段階的な推論
Il 思考連鎖 (CoT) プロンプトエンジニアリングの最も強力なテクニックの 1 つです。 モデルに直接答えを求めるのではなく、「段階的に考える」よう促します。 推論のプロセスを説明します。これによりパフォーマンスが大幅に向上します 論理、数学、または多段階の推論を必要とするタスクに。
# Chain-of-Thought: ragionamento esplicito
# SENZA CoT - risposta spesso errata su problemi complessi
response_no_cot = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=200,
messages=[{
"role": "user",
"content": "Un negozio vende mele a 2 euro al kg. Se compro 3.5 kg e pago con una banconota da 20 euro, quanto resto ricevo? E se applico uno sconto del 10%?"
}]
)
# CON CoT - ragionamento passo dopo passo
response_cot = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": """Un negozio vende mele a 2 euro al kg. Se compro 3.5 kg e pago con una banconota da 20 euro, quanto resto ricevo? E se applico uno sconto del 10%?
Ragiona passo dopo passo prima di dare la risposta finale."""
}]
)
print(response_cot.content[0].text)
# Il modello esplicitera:
# 1. Costo base: 3.5 * 2 = 7 EUR
# 2. Resto senza sconto: 20 - 7 = 13 EUR
# 3. Sconto 10%: 7 * 0.10 = 0.70 EUR
# 4. Costo con sconto: 7 - 0.70 = 6.30 EUR
# 5. Resto con sconto: 20 - 6.30 = 13.70 EUR
思考の連鎖をいつ使用するか
CoT は、複数ステップの数学的問題、論理分析に特に効果的です。 複数の前提条件、バランスをとるための複数の基準による意思決定、コードのデバッグ フローを追跡する必要がある場合、および中間推論が必要なタスク そして最終的な答えと同じくらい重要です。
システムプロンプトとペルソナインジェクション
Il システムプロンプト モデルの動作を事前条件付ける特別なメッセージ 会話全体に。これは、役割、トーン、制限を定義する最も効果的な方法です および希望の出力形式。
# System prompt: definire ruolo e comportamento
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
system="""Sei un esperto senior di architettura software con 20 anni di esperienza.
REGOLE:
1. Rispondi sempre in modo conciso e pratico
2. Usa esempi di codice Python quando utile
3. Evidenzia trade-off e considerazioni di performance
4. Se una domanda e ambigua, chiedi chiarimenti
5. Non inventare librerie o API inesistenti
FORMATO OUTPUT:
- Risposta breve (2-3 frasi)
- Pro e Contro (se applicabile)
- Esempio di codice (se rilevante)
- Riferimenti a pattern noti""",
messages=[{
"role": "user",
"content": "Dovrei usare un monolite o microservizi per una startup con 3 sviluppatori?"
}]
)
print(response.content[0].text)
人への注射
La 人注射 およびシステム プロンプトをモデルに割り当てるバリアント 特定のアイデンティティ。それはロールプレイングではありません。知識とスタイルを活性化するテクニックです モデル内の特定のコミュニケーション要素。
- 「あなたはシニア PostgreSQL DBA です」: クエリの最適化、インデックス、EXPLAIN ANALYZE に関する特定の知識を有効にします。
- 「あなたはコードレビューを行う技術リーダーです」: 保守性、命名、SOLID 原則に重点を置く
- 「あなたはB2Bランディングページのコピーライターです」: プロフェッショナルなトーン、コンバージョン重視、効果的な CTA
構造化された出力: JSON、テーブル、および特定の形式
プロンプト エンジニアリングの最も実用的なアプリケーションの 1 つは、構造化された形式で出力を取得することです。 コードから簡単に解析できます。
import json
# Richiedere output JSON strutturato
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": """Analizza questa descrizione di un bug e restituisci un JSON con questa struttura esatta:
{
"severity": "critical|high|medium|low",
"component": "stringa",
"steps_to_reproduce": ["step1", "step2"],
"expected_behavior": "stringa",
"actual_behavior": "stringa",
"suggested_fix": "stringa"
}
Bug report: "Quando clicco su 'Salva' nel form di profilo con un'immagine maggiore di 5MB, la pagina va in crash con errore 500. Dovrebbe mostrare un messaggio di errore sulla dimensione massima."
Rispondi SOLO con il JSON, senza testo aggiuntivo."""
}]
)
# Parsing sicuro del JSON
try:
bug_data = json.loads(response.content[0].text)
print(f"Severita: {bug_data['severity']}")
print(f"Componente: {bug_data['component']}")
except json.JSONDecodeError:
print("Errore nel parsing JSON")
ReAct パターン: 推論 + アクション
反応する (Reason + Act) と、パターンがフェーズを交互に繰り返す高度なパターン 推論フェーズとアクションフェーズ。モデルは何をすべきかを考え、アクションを実行します(呼び出しなど) ツール)、結果を観察し、タスクが完了するまでこのサイクルを繰り返します。
# Simulazione del pattern ReAct
react_prompt = """Sei un assistente che risolve problemi usando il pattern ReAct.
Per ogni step, usa il formato:
Thought: [ragionamento su cosa fare]
Action: [azione da eseguire]
Observation: [risultato dell'azione]
... (ripeti fino alla soluzione)
Final Answer: [risposta finale]
Strumenti disponibili:
- search(query): cerca informazioni
- calculate(expression): calcola espressioni matematiche
- lookup(database, key): cerca in un database
Domanda: Qual è il costo totale se compro 15 licenze software a 49.99 EUR ciascuna con IVA al 22%?"""
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{"role": "user", "content": react_prompt}]
)
print(response.content[0].text)
# Il modello produrra:
# Thought: Devo calcolare il costo base e poi aggiungere l'IVA
# Action: calculate(15 * 49.99)
# Observation: 749.85
# Thought: Ora devo aggiungere l'IVA al 22%
# Action: calculate(749.85 * 1.22)
# Observation: 914.817
# Final Answer: Il costo totale e 914.82 EUR (749.85 + 164.97 IVA)
高度な最適化手法
基本的なテクニックに加えて、出力の品質を最大化するための高度な戦略があります。
区切り文字と構造
使用 区切り文字 プロンプトのさまざまな部分を明確に区切ると、 曖昧さがなくなり、モデルの理解が深まります。
- 三重引用符 (
""") 分析するテキストを囲みます - XML タグ (
<context>,<instructions>) セクションを構造化する - ハッシュマーカー (
###) 論理セクションを区切る - 複数ステップの命令に対する明示的な番号付け
否定的なプロンプト
何を指定するか ない 何をするかは、何をするかを指定するのと同じくらい重要です。 否定的な命令は、モデルが望ましくない一般的なパターンを回避するのに役立ちます。
- 「「もちろんです!」で始めないでください。または「もちろん!」
- 「文脈の中にないデータや統計をでっち上げてはいけない」
- 「回答の中で同じ質問を繰り返さないでください」
- 「答えがわからないなら、そう言ってください。でっち上げないでください。」
自己一貫性
のテクニック 自己一貫性 同じものに対して複数の応答を生成することで構成されます。 プロンプト (温度 > 0) を表示し、最も頻繁に発生する応答、またはモデルに基づいた応答を選択します。 収束します。これは、正解が定義されているタスクに特に役立ちます。
即時エンジニアリングチェックリスト
- 明確なシステム プロンプトを使用して役割を定義します
- 特定のタスクまたはカスタム形式に数ショットを使用する
- 複雑な推論のために CoT を有効にする (「ステップバイステップで推論する」)
- 希望の出力形式 (JSON、リスト、テーブル) を指定します。
- 区切り文字を使用してコンテキスト、ステートメント、入力を区切ります。
- 望ましくないパターンを避けるために否定的な指示を含める
- さまざまな温度でテストして最適なバランスを見つけます
- プロンプトをバージョン管理し、A/B テストでパフォーマンスを追跡する
迅速なバージョン管理とテスト
運用環境では、プロンプトは次のとおりです。 コード。バージョン管理、テスト、監視する必要がある 他のソフトウェアコンポーネントと同様に。プロンプトに対する一見無害な変更は、 モデルの動作を大幅に変更します。
# Sistema semplice di prompt versioning e testing
from dataclasses import dataclass
from typing import Callable
@dataclass
class PromptVersion:
version: str
system_prompt: str
template: str
evaluator: Callable[[str], float]
# Definisci versioni del prompt
v1 = PromptVersion(
version="1.0",
system_prompt="Sei un assistente utile.",
template="Riassumi questo testo: {text}",
evaluator=lambda output: len(output.split()) / 100 # brevita
)
v2 = PromptVersion(
version="2.0",
system_prompt="Sei un editor esperto. Produci riassunti concisi e informativi.",
template="""Riassumi il seguente testo in massimo 3 bullet point.
Ogni punto deve contenere un'informazione chiave con dati specifici.
Testo:
\"\"\"{text}\"\"\"
Formato output:
- [punto 1]
- [punto 2]
- [punto 3]""",
evaluator=lambda output: len(output.split()) / 50 # brevita più stretta
)
# A/B test
def test_prompt(version: PromptVersion, test_texts: list) -> float:
scores = []
for text in test_texts:
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=300,
system=version.system_prompt,
messages=[{"role": "user", "content": version.template.replace("{text}", text)}]
)
score = version.evaluator(response.content[0].text)
scores.append(score)
return sum(scores) / len(scores)
結論
迅速なエンジニアリングは静的なスキルではありません。モデルと理解とともに進化します。 彼らの能力の。この記事で紹介されているテクニック - ゼロショット、フューショット、CoT、 システム プロンプト、構造化された出力、ReAct - 対話のための完全なツールキットを形成します。 どの LLM でも効果的に使用できます。
重要な点は、プロンプトをコードとして扱うことです。プロンプトをバージョン化し、テストし、反復します。 適切に設計されたプロンプトにより、多くの場合、微調整の必要がなくなります。 時間とコストを大幅に節約できます。
次の記事では、 微調整: エンジニアリングプロンプトが表示されたとき これでは十分ではなく、次のような効率的な手法を使用して、モデル自体をデータに適応させる必要があります。 LoRA、QLoRA、PEFT。







