[開発者向け]Qwen3.8-27B徹底解説:27B級デンスモデルで画像・動画理解とエージェントタスクを両立する方法

目次

はじめに

 Hugging Faceで、AlibabaのQwenチームが新モデル「Qwen3.8-27B」を公開しました。Qwen3.5世代のアーキテクチャを土台に、画像・動画理解とエージェントタスクの能力を高めたデンスモデルです。本稿では特徴とベンチマーク結果に加え、API経由での実装手順を解説します。

参考記事

関連記事

あわせて読みたい
[開発者向け]AlibabaがQwen3.6-35B-A3Bをオープンウェイトで公開——エージェントコーディングと思考保... はじめに  AlibabaのQwenチームが2026年4月、コーディング能力を大幅に強化したマルチモーダルLLM「Qwen3.6-35B-A3B」をオープンウェイトで公開しました。2月リリース...
あわせて読みたい
[ニュース解説]GitHub星数14万超の自己進化型エージェント「Hermes」——NVIDIA RTXとQwen 3.6でローカ... はじめに  NVIDIAが2026年5月22日、Nous Researchが開発した自己進化型AIエージェント「Hermes Agent」と、NVIDIA製ハードウェアとの組み合わせについて公式ブログで解...

要点

  • Qwen3.8-27Bは27Bパラメータの高密度(デンス)モデルであり、Qwen3.5のアーキテクチャを基盤に構築されている
  • ネイティブな画像・動画理解機能を備え、思考モード(thinking mode)のオン/オフをリクエストごとに切り替えられる
  • コーディング、専門業務、リサーチ、長時間にわたるエージェントタスクで前世代のQwen3.6-27Bから大幅な性能向上を達成した
  • コンテキスト長はネイティブで262,144トークンであり、YaRNなどのRoPEスケーリング技術を用いることで最大100万トークンまで拡張可能である
  • SGLang、vLLM、TokenSpeedなど主要な推論フレームワークに対応しており、OpenAI互換のChat Completions API経由で利用できる

詳細解説

モデルの概要とアーキテクチャ

 Qwen ThemによればQwen3.8-27Bは、画像・動画を理解するビジョンエンコーダーを備えた因果言語モデル(Causal Language Model)です。パラメータ数は27B、隠れ層の次元は5,120、レイヤー数は64層で、コンテキスト長はネイティブで262,144トークン、拡張時は最大1,000,000トークンに対応するとされています。

 アーキテクチャの特徴として、Gated DeltaNet(線形アテンション)とGated Attention(通常の注意機構)を「3層のGated DeltaNet→FFNの後に1層のGated Attention→FFNを配置する」形で16回繰り返す構成が採用されています。線形アテンションは計算量が入力長に対してほぼ線形に増加するため長い文脈の処理を高速化しやすく、通常のアテンション層を一定間隔で挟むことで文脈全体を見渡す精度を補う設計だと考えられます。また、MTP(Multi-Token Prediction、複数トークンを同時に予測する学習手法)が採用されており、推論効率の向上に寄与しているとみられます。

ベンチマーク性能

 Qwenチームの発表によれば、Qwen3.8-27Bは前世代のQwen3.6-27Bと比較して複数のベンチマークで大きく性能が向上しています。エージェント型のターミナル操作を評価するTerminal-Bench 2.1では73.0(Qwen3.6-27Bは63.4)、ソフトウェア開発タスクを評価するQwenSWEBenchでは79.0(同49.3)を記録しました。マルチモーダル分野でも、コンピュータ操作を評価するOSWorld-Verifiedで84.3(同63.9)、ブラウザ操作を評価するWebArena-Verifiedで64.8(同48.8)と、いずれも前世代を上回っています。

 これらのベンチマークは、実際の開発環境やブラウザ操作を模した環境でモデルがどこまで自律的にタスクを完遂できるかを測る実践的な指標です。単純な一問一答形式のテストと異なり、複数ステップにわたる計画と修正が求められるため、スコアの向上はエージェント用途での実用性の高さを示していると考えられます。

前提条件・環境構成

 Qwen3.8-27Bを利用するには、以下の環境が必要です。

  1. Python 3.8以上(バージョン確認は python --version で行います)
  2. OpenAI Python SDK(OpenAI互換のAPIエンドポイントを通じてモデルにアクセスするために使用します)
  3. 推論エンドポイント(自前でSGLang/vLLM/TokenSpeedを構築するか、Qwen Cloudのようなホスティングサービスを利用します)

 注意: Qwen3.8-27Bは27Bパラメータのモデルであるため、ローカルのGPU環境で動かす場合は相応のVRAMが必要です。個人利用では、まずQwen CloudのようなAPIサービスを試すのが手軽だと思います。

インストール・セットアップ

 まず、OpenAI Python SDKをインストールします。

# OpenAI SDKを最新版にアップグレードしてインストールします
pip install -U openai

 次に、利用する推論エンドポイントのURLとAPIキーを環境変数に設定します。

# 使用する推論サーバーやQwen CloudのベースURLを設定します
export OPENAI_BASE_URL='your-base-url'

# 認証用のAPIキーを設定します
export OPENAI_API_KEY='your-api-key'

 自前でモデルをホスティングする場合は、SGLang、vLLM、TokenSpeedのいずれかの推論フレームワークを利用できます。Qwenチームの発表では、それぞれに専用のレシピが公開されているとのことです。

実装例・コードサンプル

 以下は、テキストのみを送信して応答を受け取る最小構成の実装です。ストリーミング形式で思考過程(reasoning)と最終回答を分けて表示しています。

from openai import OpenAI

# 環境変数(OPENAI_BASE_URL, OPENAI_API_KEY)から設定を読み込みます
client = OpenAI()

# ユーザーからのメッセージを定義します
messages = [{"role": "user", "content": "Write a Python function to merge two sorted linked lists."}]

completion = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B",
    messages=messages,
    extra_body={
        "chat_template_kwargs": {
            "enable_thinking": True,   # デフォルトで思考モードON
            "preserve_thinking": True, # デフォルトで思考内容を保持
        },
    },
    reasoning_effort="xhigh",  # デフォルトはxhigh。xhigh/medium/lowから選択
    stream=True,
    stream_options={"include_usage": True},
)

reasoning_content = ""
answer_content = ""
is_answering = False
print("\n" + "=" * 20 + "Reasoning" + "=" * 20 + "\n")

for chunk in completion:
    if not chunk.choices:
        # usage情報のみのチャンクはここで表示します
        print("\nUsage:")
        print(chunk.usage)
        continue

    delta = chunk.choices[0].delta

    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)
        reasoning_content += delta.reasoning_content
    elif hasattr(delta, "reasoning") and delta.reasoning is not None:
        if not is_answering:
            print(delta.reasoning, end="", flush=True)
        reasoning_content += delta.reasoning

    if hasattr(delta, "content") and delta.content:
        if not is_answering:
            # 思考部分が終わり、最終回答が始まったことを示します
            print("\n" + "=" * 20 + "Answer" + "=" * 20 + "\n")
            is_answering = True
        print(delta.content, end="", flush=True)
        answer_content += delta.content

# 次のターンに向けて、思考内容も含めた応答履歴を追加します
messages.append({
    "role": "assistant",
    "content": answer_content,
    "reasoning_content": reasoning_content,
    "reasoning": reasoning_content,
})

 reasoning_effort には xhigh / medium / low の3段階があり、複雑なタスクほど高い値が推奨されます。ただし参考記事のサンプルコードをもとにしているため、実際の出力形式は利用する推論フレームワークによって多少異なる場合があります。

 画像を入力する場合は、以下のように image_url を含むメッセージを渡します。

from openai import OpenAI

client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                # 解析対象の画像URLを指定します
                "type": "image_url",
                "image_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/CI_Demo/mathv-1327.jpg"
                }
            },
            {
                # 画像に対する質問文をテキストで指定します
                "type": "text",
                "text": "The centres of the four illustrated circles are in the corners of the square. The two big circles touch each other and also the two little circles. With which factor do you have to multiply the radii of the little circles to obtain the radius of the big circles?"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B",
    messages=messages,
)
print("Chat response:", chat_response)

 動画を入力する場合は video_url を使います。

from openai import OpenAI

client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                # 解析対象の動画URLを指定します
                "type": "video_url",
                "video_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/video/N1cdUjctpG8.mp4"
                }
            },
            {
                "type": "text",
                "text": "How many porcelain jars were discovered in the niches located in the primary chamber of the tomb?"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B",
    messages=messages,
)

# vLLMでは、extra_bodyでフレームサンプリングのfps等を調整できます(vLLM限定の機能です)
print("Chat response:", chat_response)

 思考過程を出力せず、直接回答だけを得たい場合は、enable_thinking を False に設定します(Instructモード)。

from openai import OpenAI

client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/RealWorld/RealWorld-04.png"
                }
            },
            {
                "type": "text",
                "text": "Where is this?"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B",
    messages=messages,
    temperature=0.7,
    top_p=0.8,
    presence_penalty=1.5,
    extra_body={
        "top_k": 20,
        # 思考モードをOFFにして、直接回答を得ます
        "chat_template_kwargs": {"enable_thinking": False},
    },
)
print("Chat response:", chat_response)

 注意: Qwen Cloud経由で利用する場合は、chat_template_kwargs でラップせず "enable_thinking": False を直接トップレベルに指定する必要があるとのことです。

 複数ターンの会話で過去の思考内容を保持したくない場合は、preserve_thinking を False に設定します。

from openai import OpenAI

client = OpenAI()
messages = [...]  # これまでの会話履歴を格納します

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B",
    messages=messages,
    extra_body={
        # 最新のユーザーメッセージ以外の思考内容を保持しない設定です
        "chat_template_kwargs": {"preserve_thinking": False},
    },
)
print("Chat response:", chat_response)

実行・動作確認

 実装後は、まず簡単なテキストプロンプトで応答が返ってくるかを確認するとよいと思います。ストリーミングを有効にしている場合、Reasoning セクションと Answer セクションが分かれて出力されるため、思考過程と最終回答を区別しやすくなっています。

 注意: reasoning_content と reasoning のどちらのフィールド名が使われるかは推論フレームワークによって異なるため、hasattr で両方をチェックする実装になっています。自前で構築したサーバーで動作しない場合は、レスポンスのフィールド名を確認することをおすすめします。

パラメータ・設定オプション

 Qwenチームは、モードに応じて以下のサンプリングパラメータを推奨しています。

  • 思考モード: temperature=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0
  • Instruct(非思考)モード: temperature=0.7, top_p=0.80, top_k=20, min_p=0.0, presence_penalty=1.5, repetition_penalty=1.0

 presence_penalty は0〜2の範囲で調整可能で、値を上げると同じ表現の繰り返しを抑制できますが、高すぎると言語が混在するなど性能がやや低下する場合があるとされています。

 長文コンテキストを扱う場合は、YaRN(RoPEスケーリングの一手法)を有効にすることで、ネイティブの262,144トークンを超えて最大1,000,000トークンまで拡張できます。設定ファイル(config.json)を直接書き換える方法は以下の通りです。

{
    "mrope_interleaved": true,
    "mrope_section": [11, 11, 10],
    "rope_type": "yarn",
    "rope_theta": 10000000,
    "partial_rotary_factor": 0.25,
    "factor": 4.0,
    "original_max_position_embeddings": 262144
}

 コマンドライン引数から設定することも可能です。vLLMの場合は以下のように指定します。

# 環境変数でモデルの最大長制限を解除してからvLLMを起動します
VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve ... --hf-overrides '{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}' --max-model-len 1000000

 注意: YaRNは静的なスケーリング手法であるため、常時有効にすると短いテキストでの性能がやや低下する可能性があります。長いコンテキストを扱う用途でのみ有効化することが推奨されています。また、factor の値は想定する最大コンテキスト長に応じて調整するとよく、例えば524,288トークン程度が上限であれば factor を2.0にするのが望ましいとされています。

まとめ

 Qwen3.8-27Bは、Qwen3.5の設計を継承し、画像・動画理解とエージェントタスクの能力を高めたデンスモデルです。前回のQwen3.6-35B-A3Bの公開からの進化がうかがえます。OpenAI互換APIで手軽に試せる点も注目したいと思います。


この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次