プロンプト Active Prompting
軽量モデルへ代表的なプロンプト手法を実際のコードで試しモデルの反応を確認します
記事作成日:2025-12-05, 著者: Hi6
このガイドはなぜ必要か?
現代のLLM(大規模言語モデル)は、正しく誘導されて初めて複雑な推論タスクを解決できます。以下に示す手法は、信頼性・説明可能性・高性能システム構築の「標準的ケア」として確立されています。それぞれが、モデルへの指示量や内部で考えるか外部ツールと対話するかという点で異なります。
影響力が大きい6つの手法を深掘り:
Active Prompting とは?
概要 LLM に対して、プロンプトを動的に更新・拡張しながら応答を得る手法。
-
「質問→回答→再質問」のインタラクティブなループで、必要情報を追加・修正。
-
主に 不確実性が高い問題や 外部知識を逐次取得したいケース(検索結果を組み込みながら答える)に使われる。
-
主なメリット
- 対話型探索:回答が曖昧だったときに追加情報を要求。
- 柔軟性:タスクの途中でプロンプトを変更でき、ユーザーとの協調的な学習が可能。
- 精度向上:必要に応じて細かい指示やデータを挿入しながら最終回答へ到達。
2️⃣ 基本構造(テンプレート)
Task: [タスクの簡潔な説明]
あなたは役立つアシスタントです。
アクティブプロンプティングのパターンに従ってください。:
1. 必要に応じて説明を求めます(明確化)。
2. 新しい情報で質問を更新します。
3. 再度質問するか、答えられるまで続けます。
Example 1:
Input: フランスの首都は?
Answer: フランスの首都はパリです。
Final Answer: フランスの首都はパリです。
Now solve:
Input: [ユーザーが入力する問題]
Clarify:が必要なら、追加情報を求める質問。Update Prompt:で新しい情報や指示を挿入。- ループ:回答できるまで「Clarify → Update Prompt」→「Answer」を繰り返す。
3️⃣ 実装手順
| ステップ | 方法 |
|---|---|
| 1. タスク定義 | Task: で何を求めるか明示。 |
| 2. Active Prompting パターン宣言 | 「You are a helpful assistant…」でインタラクティブループを宣言。 |
| 3. 初期プロンプト作成 | Input を含む最初の質問を送信。 |
| 4. ループ実装 |
- Python: 1 回の
ChatCompletion呼び出しで回答取得。 - 必要に応じて「Clarify」や「Update Prompt」を追加して再度呼び出し。 | | 5. 終了条件 | 「Final Answer」が返ってきたらループ終了。 |
4️⃣ 実際の実装例(Python + Ollama)
import ollama
def active_prompting(prompt, max_rounds=5):
"""
Active Prompting パターンを Ollama で実装。
"""
sys_prompt = '''
あなたは役立つアシスタントです。
アクティブプロンプティングのパターンに従ってください。:
1. 必要に応じて説明を求めます(明確化)。
2. 新しい情報で質問を更新します。
3. 再度質問するか、答えられるまで続けます。
Example 1:
Input: フランスの首都は?
Answer: フランスの首都はパリです。
Final Answer: フランスの首都はパリです。
'''
messages = [
{"role": "system", "content": sys_prompt},
{"role": "user", "content": prompt}
]
for round_ in range(max_rounds):
client = ollama.Client(host="http://127.0.0.1:11434")
response = client.chat(
model="qwen3-vl:8b",
messages=messages
)
reply = response["message"]["content"].strip()
print(f"Round {round_+1}:\n{reply}\n")
# ── Final Answer を検出 ───────────────────────
if "Final Answer:" in reply:
return reply.replace("Final Answer:", "").strip()
# ── さらに情報が必要か確認 ───────────────────────
messages.append({"role": "assistant", "content": reply})
clarifying = input("さらに推論が必要ですか? (y/n): ")
if clarifying.lower() != 'y':
break
return None
prompt = """
Task: 与えられた数式を因数分解してください。
Now solve:
Input: x^3+12*x^2+48*x+64
"""
active_prompting(prompt)
出力結果:
Round 1:
与えられた数式 $x^3 + 12x^2 + 48x + 64$ を因数分解する必要があります。
この数式は、3乗の展開公式を適用する形になっている可能性があります。
具体的には、$(x + a)^3 = x^3 + 3a x^2 + 3a^2 x + a^3$ の形を確認します。
- $x^2$ の係数: $3a = 12$ → $a = 4$
- $x$ の係数: $3a^2 = 3 \times 4^2 = 48$(一致)
- 定数項: $a^3 = 4^3 = 64$(一致)
したがって、この数式は $(x + 4)^3$ と因数分解できます。
Final Answer: $x^3 + 12x^2 + 48x + 64 = (x + 4)^3$
5️⃣ Active Prompting のメリット
| メリット | 説明 |
|---|---|
| 対話的に情報を追加 | ユーザーやモデルが必要と感じた情報を逐次取り込む。 |
| 精度向上 | 不確実性の高い質問でも、途中で詳細を補足できるため誤答率低減。 |
| 柔軟なタスク適応 | タスクの途中で指示や制約が変わったときに即座にプロンプト更新。 |
| ユーザー体験向上 | ユーザーが「質問を追加」できるので、より協調的な対話が可能。 |
6️⃣ Active Prompting のデメリット
| デメリット | 説明 |
|---|---|
| 実装複雑 | ループ制御・プロンプト更新ロジックを自前で書く必要。 |
| 応答時間増大 | 各ラウンドで API 呼び出しが発生するため、全体の遅延が長くなる。 |
| 無限ループリスク | 「Clarify」や「Update Prompt」を適切に設計しないと、終わらない対話になる可能性。 |
7️⃣ ベストプラクティス
- クリアな終了条件を設定
Final Answer:が返ってきたら必ずループを抜ける。
- 質問の粒度を調整
- 「何が足りないか」だけでなく、「具体的にどこを確認したいか」を尋ねると効率良い。
- プロンプト更新は簡潔に
- 追加情報は「Additional Info: …」のようにまとめ、元の質問と重複しないようにする。
- ユーザー入力を安全に扱う
- 外部から受け取ったデータは必ずバリデーションし、不正な文字列が混入しないように注意。
- ログ保存
- すべてのラウンド(質問・回答)を記録して、後で解析できるようにする。
🎯 まとめ
- Active Prompting は「インタラクティブにプロンプトを更新しながら応答」を得る手法。
- 上記テンプレートは全て日本語で書かれており、実装時にもそのままコピーして使用できます。
- ユーザーやモデルが追加情報を求めた際に、リアルタイムでプロンプトを拡張できるので、複雑なタスクや不確定要素の多い質問に最適です。
ぜひこの構造をベースに、対話型アプリケーションやサポートシステムで Active Prompting を試してみてください! 🚀