Qwen3.6 の新機能 preserve_thinking について:過去の思考プロセスを保持し、エージェントの性能を最大化する

Qwen3.6 の新機能 preserve_thinking について:過去の思考プロセスを保持し、エージェントの性能を最大化する

概要

Qwen3.6(主に Qwen3.6-Plus や Qwen3.6-35B-A3B)で導入された新パラメータ preserve_thinking は、多ターン会話において過去の思考プロセス(Chain-of-Thought, CoT)を保持し続ける機能です。

この機能を活用することで、エージェントやツール呼び出しワークフローの安定性と一貫性が大幅に向上します。


従来の問題点(Qwen3.5 以前)

Qwen3.5 までは、chat_template_kwargs: {"preserve_thinking": False} がデフォルトとなっていました。

これまでの方式では、新しいユーザーメッセージが届くたびに、過去の thinking block がすべて剥ぎ取られて再シリアライズされていました。その結果、以下のような問題が発生していました。

  • KV キャッシュの無効化: データの再シリアライズにより、KV キャッシュが毎回無効化される。
  • エージェントの忘却 (Agent Amnesia): モデルが過去の推論プロセスを失ってしまうため、一貫性が損なわれる。

preserve_thinking の動作

基本的なパラメータ

パラメータ 説明
"enable_thinking": True Thinking mode(思考モード)を有効化
"preserve_thinking": True 過去の思考プロセスを全ターンにわたって保持

コード例(OpenAI SDK 互換)

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="Qwen/Qwen3.6-35B-A3B",
    messages=messages,
    max_tokens=32768,
    temperature=0.7,
    top_p=0.8,
    extra_body={
        "top_k": 20,
        "chat_template_kwargs": {
            "enable_thinking": True,
            "preserve_thinking": True,   # 重要!
        },
    },
)

API(Alibaba Cloud Model Studio / DashScope)の場合

# Qwen3.6 のオープンソース モデル用
extra_body={"chat_template_kwargs": {"preserve_thinking": True}}

# Alibaba Cloud Model Studio 用
extra_body={"preserve_thinking": True}  # chat_template_kwargs は不要

Hugging Face Transformers / ローカル推論の場合

# Qwen3.6 モデルページに記載されている推奨形式
chat_template_kwargs = {"preserve_thinking": True}

重要: Qwen3.6 の公式モデルページでは、旧形式の {"chat_template_kwargs": {"preserve_thinking": False}} ではなく、"preserve_thinking": True を直接使用することが推奨されています。


なぜ重要なのか

1. KV キャッシュの再利用効率化

  • 以前の推論プロセスが保持されるため、KV キャッシュが有効に活用されます。
  • 推論速度が最適化されます(Thinking/Non-thinking 両モードで改善)。
  • 不要な再シリアライズがなくなることで、オーバーヘッドが削減されます。

2. エージェントワークフローの一貫性向上

  • モデルが過去の思考プロセスを参照できるため、意思決定の精度と一貫性が向上します。
  • ツール呼び出しの精度向上(ツール選択とパラメータの整合性が保たれる)。
  • マルチステップタスクにおいて、「なぜその選択を行ったか」という文脈を維持できます。

3. トークン消費の削減

  • 冗長な推論(Redundant Reasoning)が減少します。
  • 同じ文脈を繰り返し説明する必要がなくなります。

有効化の検証方法(テスト手順)

コミュニティで推奨されている、簡単なテスト手順は以下の通りです。

  1. 最初のメッセージ:
    can you come up with two random 20-digit numbers and validate that they are 20 digits, do not use any tools, and only give me one of the two and nothing else

  2. 次のターンで確認:
    now give me the second number that you came up with

preserve_thinking の設定 結果
off 過去の思考プロセスを失い、2つ目の数字を回答できない
on 過去の思考を参照でき、2つ目の数字を即座に返せる

クリエイター向け実装の注意点

現在対応していないクライアント

  • LMStudio: 2026年4月17日時点で未対応(プルリクエストが進行中)。
  • oMLX: プルリクエストが提出済み。
  • KoboldCPP: 機能リクエストが提出されています(Issue #2147)。

Qwen Code の実装(PR #2897)について

  • stripThoughtsFromHistory() から stripThoughtsFromHistoryKeepRecent() へ変更されました。
  • アクティブなセッション中は、thinking block を全ターン保持します。
  • アイドル状態が5分を超過した場合に、古い thinking block をクリーンアップします。
  • Sticky Latch(スティッキーラッチ)機能: 一度クリーンアップが発生すると、そのセッション中は保持状態(ON)を維持し、状態のチャタリング(振動)を防ぎます。

Qwen3.6 のアーキテクチャコンテキスト

Qwen3.6-35B-A3B (オープンソース版)

項目
総パラメータ数 35B
活性化パラメータ数 3B(MoE 形式)
デフォルトコンテキスト 262,144 tokens
最大拡張 1,010,000 tokens (YaRN)

Qwen3.6-Plus (クラウド/API版)

項目
コンテキスト長 1,000,000 tokens
最大出力 65,536 tokens
スループット 約158 トークン/秒(中央値)

Qwen3.6 の思考モード

  • デフォルトで Thinking mode が有効です(Qwen3 以前とは異なり、/think/no_think といったソフト切替は公式にはサポートされていません)。
  • Thinking block の形式: <think>\n...\n</think>\n\n
  • 直接回答を得たい場合は、chat_template_kwargs: {"enable_thinking": False} を設定してください。

参考情報源

情報源 URL
Hugging Face (Qwen3.6-35B-A3B) https://huggingface.co/Qwen/Qwen3.6-35B-A3B
Qwen 公式ブログ https://qwen.ai/blog?id=qwen3.6
Qwen Cloud Docs (Thinking) https://docs.qwencloud.com/developer-guides/text-generation/thinking
AI Navigate (PSA 記事) https://ai-navigate-news.com/en/articles/b851dd82-a8c1-4794-8330-2eb43c70795f
Qwen Code PR #2897 https://github.com/QwenLM/qwen-code/pull/2897

まとめ

preserve_thinking は Qwen3.6 の極めて重要な新機能です。特に以下のユースケースで大きな効果を発揮します:

  1. エージェントアプリケーション(マルチステップのツール呼び出し)
  2. コード生成・デバッグ(リポジトリレベルの複雑な問題解決)
  3. 長文コンテキスト処理(一貫性の維持)
  4. KV キャッシュの最適化が必要な推論環境

注意点として、Qwen3.6 の公式モデルページでは、従来の chat_template_kwargs ネスト形式ではなく、"preserve_thinking": True を直接使用することが推奨されています。Alibaba Cloud Model Studio(DashScope)を使用する場合と、ローカル/OpenAI互換APIを使用する場合では、パラメータの指定方法が異なるため注意が必要です。


OpenCode での有効化手順

OpenCode は opencode.json(または ~/.config/opencode/opencode.json)を使用してモデル設定を管理します。以下に、主な利用パターンごとの手順をまとめます。

パターン1: Ollama (ローカル) で Qwen3.6 を使用する場合

Ollama 経由で qwen3.6:latest を OpenCode と連携させる例です。

{
  "$schema": "https://opencode.ai/config.json",
  "model": "ollama/qwen3.6:latest",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "qwen3.6:latest": {
          "name": "Qwen3.6 35B (Thinking + Preserve)",
          "limit": {
            "context": 131072,
            "output": 8192
          },
          "options": {
            "reasoningEffort": "high"
          }
        }
      }
    }
  }
}

注意: OpenCode (Anthropic SDK ベース) の @ai-sdk/openai-compatible を使用する場合、直接的な extra_body のサポートは限定的です。Qwen3.6 の preserve_thinking は Ollama API レベルではまだ標準的なパラメータとして未対応のため、以下の代替案を確認してください。

OpenAI 互換エンドポイント (vLLM / vLLM-Chat / LiteLLM 経由) への接続

vLLM や LiteLLM で Qwen3.6 をホストし、OpenCode から openai-compatible プロバイダとして接続する方法です。

{
  "$schema": "https://opencode.ai/config.json",
  "model": "qwen/qwen3.6:latest",
  "provider": {
    "qwen": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Qwen Local",
      "options": {
        "baseURL": "http://localhost:8000/v1",
        "apiKey": ""
      },
      "models": {
        "qwen3.6-35b-a3b": {
          "name": "Qwen3.6-35B-A3B (Preserve Thinking)",
          "limit": {
            "context": 131072,
            "output": 8192
          }
        }
      }
    }
  }
}

重要: @ai-sdk/openai-compatible を使用する場合、OpenCode の options パラメータは AI SDK に直接渡されますが、OpenAI 互換エンドポイント特有のパラメータ(extra_body, chat_template_kwargs)を直接注入する仕組みは OpenCode 本体には実装されていません。

パターン2: vLLM / LiteLLM 側の設定で preserve_thinking を渡す

OpenCode 側ではなく、vLLM または LiteLLM の設定ファイル で API リクエストボディに直接 preserve_thinking を含める方法が確実です。

vLLM サーバー + OpenCode (OpenAI Compatible) 連携

vLLM サーバー側でパラメータを制御する場合、クライアント側での注入が必要です。具体的には以下の方法があります:

  1. LiteLLM proxy を経由する場合: config.yaml に追加
  2. vLLM の OpenAI-compatible API から直接受け付ける場合: 外部ラッパーを使用してヘッダパラメータを付与
LiteLLM config.yaml の例
model_list:
  - model_name: qwen3.6-plus-local
    litellm_params:
      model: openai/Qwen/Qwen3.6-35B-A3B
      api_base: http://localhost:8000/v1
      api_key: "dummy"
      extra_body:
        chat_template_kwargs:
          enable_thinking: true
          preserve_thinking: true

代替案: curl / HTTP クライアントによる直接テスト

OpenCode での制御が困難な場合、以下の curl コマンドで動作検証が可能です。

# vLLM サーバーへの直接リクエスト (thinking + preserve_thinking)
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen3.6-35B-A3B",
    "messages": [
      {"role": "user", "content": "Tell me the first digit of Pi"}
    ],
    "stream": true,
    "extra_body": {
      "chat_template_kwargs": {
        "enable_thinking": true,
        "preserve_thinking": true
      }
    }
  }'

重要な注意点と現状の制限

  1. OpenCode (Anomaly) のモデルオプションの仕組み
  2. options フィールドは AI SDK プロバイダへ直接渡されますが、OpenAI 互換エンドポイント特有のパラメータ(extra_body, chat_template_kwargs)を直接注入する仕組みは、現時点では限定的です。
  3. Issue #17510 にて、ドキュメント改善の要望が出ています。

  4. Qwen3 モデルの thinking パラメータ制御

  5. Qwen3/3.6 の思考プロセスはモデルアーキテクチャに深く組み込まれているため、API からの think: falsethinking: disabled では完全に無効化できない場合があります (Issue #3755)。
  6. 代替策として reasoningEffort: "none" を使用する事例もあります。

  7. OpenCode と Qwen Code (CLI) の違い

  8. QwenLM/qwen-code は、OpenAI + qwen-oauth プロバイダ用に extra_body を正式サポートしています (PR #1654)。
  9. opencode.ai (Anomaly)Qwen Code は、それぞれ別のプロジェクトです。
  10. opencode.ai の OpenAI-compatible プロバイダは、model-level での options 注入はサポートしていますが、OpenAI 互換 API 固有のパラメータへの対応は発展途上の段階です。

調査日: 2026年4月18日
情報源: Hugging Face, AI Navigate, Qwen公式ドキュメント, GitHub (QwenLM/qwen-code), GitHub (anomalyco/opencode), Ollama, クラウドベンダー記事等

コメント

タイトルとURLをコピーしました