Flaps

プロンプト 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: [ユーザーが入力する問題]

3️⃣ 実装手順

ステップ方法
1. タスク定義Task: で何を求めるか明示。
2. Active Prompting パターン宣言「You are a helpful assistant…」でインタラクティブループを宣言。
3. 初期プロンプト作成Input を含む最初の質問を送信。
4. ループ実装

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 + 4)^3$ と因数分解できます。

Final Answer: $x^3 + 12x^2 + 48x + 64 = (x + 4)^3$


5️⃣ Active Prompting のメリット

メリット説明
対話的に情報を追加ユーザーやモデルが必要と感じた情報を逐次取り込む。
精度向上不確実性の高い質問でも、途中で詳細を補足できるため誤答率低減。
柔軟なタスク適応タスクの途中で指示や制約が変わったときに即座にプロンプト更新。
ユーザー体験向上ユーザーが「質問を追加」できるので、より協調的な対話が可能。

6️⃣ Active Prompting のデメリット

デメリット説明
実装複雑ループ制御・プロンプト更新ロジックを自前で書く必要。
応答時間増大各ラウンドで API 呼び出しが発生するため、全体の遅延が長くなる。
無限ループリスク「Clarify」や「Update Prompt」を適切に設計しないと、終わらない対話になる可能性。

7️⃣ ベストプラクティス

  1. クリアな終了条件を設定
    • Final Answer: が返ってきたら必ずループを抜ける。
  2. 質問の粒度を調整
    • 「何が足りないか」だけでなく、「具体的にどこを確認したいか」を尋ねると効率良い。
  3. プロンプト更新は簡潔に
    • 追加情報は「Additional Info: …」のようにまとめ、元の質問と重複しないようにする。
  4. ユーザー入力を安全に扱う
    • 外部から受け取ったデータは必ずバリデーションし、不正な文字列が混入しないように注意。
  5. ログ保存
    • すべてのラウンド(質問・回答)を記録して、後で解析できるようにする。

🎯 まとめ

ぜひこの構造をベースに、対話型アプリケーションやサポートシステムで Active Prompting を試してみてください! 🚀