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)が減少します。
- 同じ文脈を繰り返し説明する必要がなくなります。
有効化の検証方法(テスト手順)
コミュニティで推奨されている、簡単なテスト手順は以下の通りです。
-
最初のメッセージ:
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 -
次のターンで確認:
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 の極めて重要な新機能です。特に以下のユースケースで大きな効果を発揮します:
- エージェントアプリケーション(マルチステップのツール呼び出し)
- コード生成・デバッグ(リポジトリレベルの複雑な問題解決)
- 長文コンテキスト処理(一貫性の維持)
- 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 サーバー側でパラメータを制御する場合、クライアント側での注入が必要です。具体的には以下の方法があります:
- LiteLLM proxy を経由する場合:
config.yamlに追加 - 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
}
}
}'
重要な注意点と現状の制限
- OpenCode (Anomaly) のモデルオプションの仕組み
optionsフィールドは AI SDK プロバイダへ直接渡されますが、OpenAI 互換エンドポイント特有のパラメータ(extra_body,chat_template_kwargs)を直接注入する仕組みは、現時点では限定的です。-
Issue #17510 にて、ドキュメント改善の要望が出ています。
-
Qwen3 モデルの thinking パラメータ制御
- Qwen3/3.6 の思考プロセスはモデルアーキテクチャに深く組み込まれているため、API からの
think: falseやthinking: disabledでは完全に無効化できない場合があります (Issue #3755)。 -
代替策として
reasoningEffort: "none"を使用する事例もあります。 -
OpenCode と Qwen Code (CLI) の違い
- QwenLM/qwen-code は、OpenAI + qwen-oauth プロバイダ用に
extra_bodyを正式サポートしています (PR #1654)。 - opencode.ai (Anomaly) と Qwen Code は、それぞれ別のプロジェクトです。
- 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, クラウドベンダー記事等

コメント