Flaps

プロンプト Self‑Ask

軽量モデルへ代表的なプロンプト手法を実際のコードで試しモデルの反応を確認します

記事作成日:2025-12-05, 著者: Hi6

このガイドはなぜ必要か?
現代のLLM(大規模言語モデル)は、正しく誘導されて初めて複雑な推論タスクを解決できます。以下に示す手法は、信頼性・説明可能性・高性能システム構築の「標準的ケア」として確立されています。それぞれが、モデルへの指示量や内部で考えるか外部ツールと対話するかという点で異なります。

影響力が大きい6つの手法を深掘り:


Self‑Ask とは?

概要 LLM が自分自身に質問を投げ、回答から必要な情報を得る手法。


2️⃣ 基本構造(テンプレート)

Task: [タスクの簡潔な説明]

You are a helpful assistant.  
Follow the Self‑Ask pattern:
1. Ask yourself what you need to know (Question).
2. Provide an answer to your own question (Answer).
3. Use that answer to proceed until you can answer the original problem.

Example 1:
Input: 7 + 5
Question: What is 7 plus 5?
Answer: 12
Final Answer: 12

Now solve:
Input: [ユーザーが入力する問題]

3️⃣ 実装手順

ステップ方法
1. タスク定義Task: で何を求めるか明示。
2. Self‑Ask パターン宣言「You are a helpful assistant…」で自己質問ループを宣言。
3. 自己質問の設計複雑な問題を「小さな質問」に分解。
4. ループ実装

4️⃣ 実際の実装例(Python + Ollama)

import ollama

def self_ask(prompt, max_steps=10):
    """
    Self‑Ask パターンを Ollama で実装。
    """
    sys_prompt ='''
Task: 入力された計算に答えてください。

あなたは役に立つアシスタントです.  
自問自答パターンに従ってください:
1. 知る必要があることを自分自身に問いかけてください(Question)。
2. あなた自身の質問に対する答えを入力してください (Answer)。
3. その答えを使用して、元の問題に答えられるまで先に進みます。

Example 1:
Input: (5 + 3) * 2
Question: 5 + 3 = ?
Answer: 8
Question:8 * 2 = ?
Answer: 16
Final Answer: 16
'''

    messages = [
        {"role": "system", "content": sys_prompt},
        {"role": "user",   "content": prompt}
    ]

    client = ollama.Client(host="http://127.0.0.1:11434")
    for step in range(max_steps):
        response = client.chat(
            model="qwen3-vl:8b",
            messages=messages
        )

        reply = response["message"]["content"].strip()
        print(f"Step {step+1}:\n{reply}\n")

        # ── Final Answer を検出 ───────────────────────
        if "Final Answer:" in reply:
            return reply.replace("Final Answer:", "").strip()

    return None

prompt = """
Now solve:
Input: ((12 * 7 + 2) / 2) + (3 ^ 2) - 5
"""
self_ask(prompt)

出力結果:

Step 1:
Question: 12 * 7 = ?
Answer: 84
Question: 84 + 2 = ?
Answer: 86
Question: 86 / 2 = ?
Answer: 43
Question: 3 ^ 2 = ?
Answer: 9
Question: 43 + 9 = ?
Answer: 52
Question: 52 - 5 = ?
Answer: 47
Final Answer: 47

5️⃣ Self‑Ask のメリット

メリット説明
外部呼び出し不要内部で完結するため、API コスト・遅延が発生しない。
推論過程の可視化Question → Answer が逐次記録されるので、どこで誤りが起きたか追跡可能。
柔軟性「質問」を自由に設計できるため、任意の問題分解が可能。
高速応答ネットワーク遅延がないので、短時間で回答。

6️⃣ Self‑Ask のデメリット

デメリット説明
実装が手間質問分解を人力で設計する必要がある。
誤りの連鎖自己質問で得た答えに誤りがあれば、次の推論も崩れる可能性。
長文・複雑問題ではステップ数増大ループ回数が多くなると実行時間が伸びる。

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

  1. 質問は具体的に
    • 「What is 12 × 7?」など、単純なサブクエリを作成。
  2. 結果のフォーマット統一
    • Answer: の直後に数値や文字列のみを返すようにする。
  3. ステップ上限を設定
    • max_steps を 5〜10 に抑えて、無限ループを防ぐ。
  4. 誤り検知
    • Answer: が期待値と合わない場合は「Question」自体を修正するように設計。
  5. ログ/デバッグ情報
    • すべての QuestionAnswer をファイルに保存し、後から解析できるように。

🎯 まとめ

ぜひこの構造をベースに、複雑な問題や多段階計算に Self‑Ask を適用してみてください! 🚀