[開発者向け]Mistral Medium 3.5(128B)ローカル実装ガイド——推論・コーディング・ビジョンを1つのモデルで

目次

はじめに

 Mistralが2026年5月、指示追従・推論・コーディング・ビジョンをすべて統合した新フラッグシップモデル「Mistral Medium 3.5(128B)」をオープンウェイトで公開しました。本稿では、Hugging Faceのモデルページと公式ブログをもとに、モデルの概要・性能・および主要フレームワーク(vLLM・SGLang・Transformers)でのセットアップ方法を詳しく解説します。

参考記事

メイン記事:

関連情報:

関連記事

あわせて読みたい
[ニュース解説]MistralとNVIDIAが提携——オープンフロンティアモデルの共同開発へ はじめに  Mistral AIが2026年3月16日、NVIDIAが主導する「NVIDIA Nemotron Coalition」の創設メンバーとして参加することを発表しました。本稿では、この提携の内容と...

要点

  • Mistral Medium 3.5は指示追従・推論・コーディングを単一の128B denseモデルに統合したマルチモーダルモデルで、256kトークンのコンテキストウィンドウを持つ
  • SWE-Bench Verifiedで77.6%、τ³-Telecomで91.4%を記録し、前世代のDevstral 2を全コーディングベンチマークで上回る
  • 推論努力(reasoning effort)をリクエスト単位で none/high に設定でき、同一モデルで高速応答と深い推論を使い分けられる
  • 改変MITライセンスのオープンウェイトとして公開されており、4GPU以上の環境でのセルフホストが可能
  • vLLM・SGLang・Transformers・Ollamaなど主要フレームワークに対応しており、Axolotl・Unslothによるファインチューニングもサポートされている

詳細解説

モデルの概要と主な特徴

 Mistral Medium 3.5は、MistralがこれまでMistral Medium 3.1(指示追従)・Magistral(推論)・Devstral(コーディング)として個別に提供してきた機能を1つのモデルに統合した「初のフラッグシップ統合モデル」です。パラメータ数は128Bのdense(非sparse)構造で、256kトークンの長大なコンテキストウィンドウを備えています。

 テキストと画像を同時に入力できるマルチモーダル対応で、ビジョンエンコーダはさまざまな画像サイズ・アスペクト比を処理できるよう新規に訓練されています。大きな特徴の1つが、推論努力(reasoning effort) と呼ばれるパラメータをリクエストごとに変更できる点です。none に設定すれば即座に返答し、high に設定すればテスト時計算(test-time compute:推論時に追加の計算をかけて精度を上げる技術)を活用して複雑な問題を深く考察します。同じモデルを軽い会話から複雑なエージェント実行まで幅広く使える点は実用上の大きな利点だと思います。

 Mistralによれば、このモデルはLe Chat(MistralのチャットUI)とVibe CLI(コーディングエージェントCLI)の両方の新デフォルトモデルとして採用されています。

ベンチマーク性能

 Mistralの発表によれば、Mistral Medium 3.5はSWE-Bench Verifiedで 77.6% を記録しています。SWE-Bench Verifiedは、GitHubのオープンソースリポジトリにある実際のバグ修正タスクを使ってモデルのソフトウェアエンジニアリング能力を評価する標準的なベンチマークです。前世代のDevstral 2やQwen3.5 397B A17Bといった競合モデルを上回るとされています。

 エージェント能力を測定するτ³-Telecomベンチマークでは 91.4% を記録しており、複数ツールの呼び出しや構造化出力などのエージェント的タスクへの適性も高いことが示されています。

ライセンスについて

 Mistral Medium 3.5は改変MITライセンス(Modified MIT License)で公開されています。個人・企業を問わず商用・非商用利用が可能ですが、「大規模収益企業(large revenue companies)」については例外条項が設けられています。詳細はHugging Faceのリポジトリ内ライセンスファイルをご確認ください。


前提条件・環境構成

 以下の手順で推論を行うには、次の環境が必要です。

  1. Python 3.10以上
  2. pip(パイパイプ、Pythonのパッケージ管理ツール)または uv(より高速な代替ツール)
  3. GPU搭載サーバー(128Bモデルは最低でもVRAM合計320GB程度を推奨。Mistralは4GPU以上でのセルフホストを想定しています)

バージョン確認コマンド:

# PythonとPipのバージョンを確認するコマンドです
python --version
pip --version

注意: 128Bモデルはコンシューマー向けの1〜2枚構成のGPUマシンでの実行は現実的ではありません。クラウドGPUインスタンス(AWS/GCP/Azure等のH100・A100インスタンス)の利用を検討してください。


vLLMでのインストール・サーブ(推奨)

 vLLM(ブイエルエルエム)は、LLM(大規模言語モデル)の高速・本番向け推論に特化したPythonライブラリです。Mistralは本方式を最も推奨しています。

1. vLLMのインストール

 以下のコマンドでvLLMのナイトリー(最新開発版)をインストールします。

# vLLMの最新ナイトリー版をインストールするコマンドです
# -U オプションで既存のvLLMがあれば最新版に上書き更新します
# --torch-backend=auto でGPUバックエンド(CUDA/ROCm等)を自動検出します
# --extra-index-url でvLLMの専用ビルドURLを追加指定します

uv pip install -U vllm \
   --torch-backend=auto \
   --extra-index-url https://wheels.vllm.ai/nightly

# インストール後、依存パッケージのバージョンを確認します。
# mistral_common のバージョンを確認します(1.11.1以上が必要です)

python -c "import mistral_common; print(mistral_common.__version__)"

# transformers のバージョンを確認します(5.4.0以上が必要です)

python -c "import transformers; print(transformers.__version__)"

注意: Transformersのconfigには c4be198 コミット以前のバージョンに長コンテキスト性能を低下させる不具合が報告されています。vLLMのナイトリーインストールにより自動で最新の mistral_common >= 1.11.1 と transformers >= 5.4.0 が入りますが、もし既存の環境では手動で確認してください。Dockerイメージを使う場合は docker pull vllm/vllm-openai:nightly も利用可能です。

2. モデルのサーブ(サーバー起動)

# vLLMサーバーを起動するコマンドです
# mistralai/Mistral-Medium-3.5-128B: Hugging FaceのモデルIDを指定します
# --tensor-parallel-size 8: 8枚のGPUにモデルを分散します(GPU枚数に応じて変更してください)
# --tool-call-parser mistral: Mistral形式のツール呼び出しを有効にします
# --enable-auto-tool-choice: モデルが自動でツールを選択できるようにします
# --reasoning-parser mistral: 推論トレースの解析を有効にします
# --max_num_batched_tokens 16384: バッチ処理の最大トークン数を指定します
# --max_num_seqs 128: 同時処理する最大シーケンス数です
# --gpu_memory_utilization 0.8: GPUメモリの80%を使用します
vllm serve mistralai/Mistral-Medium-3.5-128B --tensor-parallel-size 8 \
  --tool-call-parser mistral --enable-auto-tool-choice --reasoning-parser mistral \
  --max_num_batched_tokens 16384 --max_num_seqs 128 \
  --gpu_memory_utilization 0.8

注意: –tensor-parallel-size はご利用のGPU枚数に合わせて変更してください。


3. サーバーへのアクセス(Pythonクライアント)

 vLLMサーバーはOpenAI互換のAPIを提供するため、Pythonの openai ライブラリでアクセスできます。openai ライブラリはもともとOpenAI社のAPIクライアントですが、vLLMのOpenAI互換エンドポイントにも対応しています。

指示追従(Instruction Following)

 以下は、vLLMサーバーにテキスト指示を送り、応答を受け取る最小構成のサンプルコードです(参考記事のサンプルをもとにしています)。

# 必要なライブラリをインポートします
from datetime import datetime, timedelta  # 日付処理用のモジュール
from openai import OpenAI               # OpenAI互換クライアントライブラリ
from huggingface_hub import hf_hub_download  # Hugging Faceからファイルを取得する関数

# vLLMのAPIエンドポイントを設定します
# vLLMはローカルで動くためAPIキーは任意の文字列("EMPTY")で構いません
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"  # vLLMサーバーのURL(デフォルトは8000番ポート)

# reasoning_effort="none"(通常応答)の場合の推奨温度
# 温度(temperature)は応答のランダム性を制御します。0に近いほど決定的な回答になります
TEMP = 0.1

# OpenAIクライアントをvLLMのURLで初期化します
client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

# サーバーで動作しているモデル一覧を取得し、最初のモデルIDを使います
models = client.models.list()
model = models.data[0].id
def load_system_prompt(repo_id: str, filename: str) -> str:
    """Hugging Faceからシステムプロンプトファイルをダウンロードして返す関数"""
    file_path = hf_hub_download(repo_id=repo_id, filename=filename)
    with open(file_path, "r") as file:
        system_prompt = file.read()
    today = datetime.today().strftime("%Y-%m-%d")
    yesterday = (datetime.today() - timedelta(days=1)).strftime("%Y-%m-%d")
    model_name = repo_id.split("/")[-1]
    # プロンプト内の{name}, {today}, {yesterday}プレースホルダーを実際の値に置換します
    return system_prompt.format(name=model_name, today=today, yesterday=yesterday)

# Hugging FaceのリポジトリからMistralのシステムプロンプトを読み込みます
SYSTEM_PROMPT = load_system_prompt(model, "SYSTEM_PROMPT.txt")
# モデルに送るメッセージを作成します(roleは "system" または "user" を指定します)
messages = [
    {"role": "system", "content": SYSTEM_PROMPT},  # モデルの振る舞いを設定するシステムプロンプト
    {
        "role": "user",
        "content": "Write me a sentence where every word starts with the next letter in the alphabet - start with 'a' and end with 'z'.",
    },
]

# モデルに推論リクエストを送ります
response = client.chat.completions.create(
    model=model,
    messages=messages,
    temperature=TEMP,
    reasoning_effort="none",  # 通常応答モード(高速)
)

# 応答テキストを表示します
assistant_message = response.choices[0].message.content
print(assistant_message)

注意: reasoning_effort=”high” を使う場合は TEMP = 0.7 に変更してください。reasoning_effort=”high” では内部でより多くの推論ステップを踏むため、0.1 などの低温では性能が低下する場合があります。


ツール呼び出し(Tool Call)

 以下は、Pythonの電卓ツールを定義してモデルに呼び出させるサンプルです。画像中の数式を読み取り、計算ツールで答えを出すという動作を確認できます(参考記事のサンプルをもとにしています)。

import json
from datetime import datetime, timedelta
from openai import OpenAI
from huggingface_hub import hf_hub_download

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
TEMP = 0.1

client = OpenAI(api_key=openai_api_key, base_url=openai_api_base)
models = client.models.list()
model = models.data[0].id

def load_system_prompt(repo_id: str, filename: str) -> str:
    file_path = hf_hub_download(repo_id=repo_id, filename=filename)
    with open(file_path, "r") as file:
        system_prompt = file.read()
    today = datetime.today().strftime("%Y-%m-%d")
    yesterday = (datetime.today() - timedelta(days=1)).strftime("%Y-%m-%d")
    model_name = repo_id.split("/")[-1]
    return system_prompt.format(name=model_name, today=today, yesterday=yesterday)

SYSTEM_PROMPT = load_system_prompt(model, "SYSTEM_PROMPT.txt")

# 数式が含まれた画像URL(インターネット上の画像を直接指定できます)
image_url = "https://math-coaching.com/img/fiche/46/expressions-mathematiques.jpg"

def my_calculator(expression: str) -> str:
    """文字列として渡された数式をPythonのeval()で評価して結果を返すツール"""
    return str(eval(expression))

# モデルが使えるツールを定義します(OpenAI function callingフォーマット)
# "function"キーに関数名・説明・パラメータを記述します
tools = [
    {
        "type": "function",
        "function": {
            "name": "my_calculator",
            "description": "A calculator that can evaluate a mathematical expression.",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "The mathematical expression to evaluate.",
                    },
                },
                "required": ["expression"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "rewrite",
            "description": "Rewrite a given text for improved clarity",
            "parameters": {
                "type": "object",
                "properties": {
                    "text": {
                        "type": "string",
                        "description": "The input text to rewrite",
                    }
                },
            },
        },
    },
]

messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "Thanks to your calculator, compute the results for the equations that involve numbers displayed in the image.",
            },
            {
                "type": "image_url",
                "image_url": {"url": image_url},  # 画像URLをモデルに渡します
            },
        ],
    },
]

# 第1ターン: モデルにツールを使うよう依頼します
response = client.chat.completions.create(
    model=model,
    messages=messages,
    temperature=TEMP,
    tools=tools,
    tool_choice="auto",  # モデルが自動でどのツールを使うかを選択します
    reasoning_effort="none",
)

# モデルが要求したツール呼び出しを取得します
tool_calls = response.choices[0].message.tool_calls

# ツールを実際に実行してresultsリストに結果を格納します
results = []
for tool_call in tool_calls:
    function_name = tool_call.function.name
    function_args = tool_call.function.arguments
    if function_name == "my_calculator":
        result = my_calculator(**json.loads(function_args))
        results.append(result)

# アシスタントのツール呼び出しをメッセージ履歴に追加します
messages.append({"role": "assistant", "tool_calls": tool_calls})
# ツール実行結果をroleを"tool"にしてメッセージ履歴に追加します
for tool_call, result in zip(tool_calls, results):
    messages.append(
        {
            "role": "tool",
            "tool_call_id": tool_call.id,
            "name": tool_call.function.name,
            "content": result,  # 実行結果を文字列で渡します
        }
    )

# 第2ターン: ツール実行結果を踏まえてモデルに最終回答を生成させます
response = client.chat.completions.create(
    model=model,
    messages=messages,
    temperature=TEMP,
    reasoning_effort="none",
)

print(response.choices[0].message.content)


ビジョン推論(Vision Reasoning)

 以下は、reasoning_effort=”high” を使ってモデルに画像を見ながら深く推論させるサンプルです(参考記事のサンプルをもとにしています)。

from datetime import datetime, timedelta
from openai import OpenAI
from huggingface_hub import hf_hub_download

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
TEMP = 0.7  # reasoning_effort="high" の場合は 0.7 を推奨します

client = OpenAI(api_key=openai_api_key, base_url=openai_api_base)
models = client.models.list()
model = models.data[0].id

def load_system_prompt(repo_id: str, filename: str) -> str:
    file_path = hf_hub_download(repo_id=repo_id, filename=filename)
    with open(file_path, "r") as file:
        system_prompt = file.read()
    today = datetime.today().strftime("%Y-%m-%d")
    yesterday = (datetime.today() - timedelta(days=1)).strftime("%Y-%m-%d")
    model_name = repo_id.split("/")[-1]
    return system_prompt.format(name=model_name, today=today, yesterday=yesterday)

SYSTEM_PROMPT = load_system_prompt(model, "SYSTEM_PROMPT.txt")
image_url = "https://static.wikia.nocookie.net/essentialsdocs/images/7/70/Battle.png/revision/latest?cb=20220523172438"

messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "What action do you think I should take in this situation? List all the possible actions and explain why you think they are good or bad.",
            },
            {"type": "image_url", "image_url": {"url": image_url}},  # 画像URLを渡します
        ],
    },
]

response = client.chat.completions.create(
    model=model,
    messages=messages,
    temperature=TEMP,
    reasoning_effort="high",  # 深い推論モード([THINK][/THINK]タグで推論トレースが入ります)
)

print(response.choices[0].message.content)

SGLangでのセットアップ

 SGLang(エスジーラング)は、vLLMと並ぶ高性能な推論フレームワークです。Mistral Medium 3.5はリリース初日(day-zero)からSGLangに対応しており、Dockerイメージでのセットアップを推奨しています。

1. インストール(Docker)

# H100/H200(Hopperアーキテクチャ、CUDA 12.9)向けのDockerイメージをダウンロードするコマンドです
docker pull lmsysorg/sglang:dev-mistral-medium-3.5

# B200/B300(Blackwellアーキテクチャ、CUDA 13.0)向けのDockerイメージをダウンロードするコマンドです
docker pull lmsysorg/sglang:dev-cu13-mistral-medium-3.5

注意: Dockerがインストールされていない場合は SGLang公式インストールガイド を参照してください。transformers >= 5.4.0 が必要です。

2. モデルのサーブ

# SGLangサーバーを起動するコマンドです
# --tp 8: テンソル並列数(使用するGPU枚数)を指定します
# --tool-call-parser mistral: Mistral形式のツール呼び出しパーサーを指定します
# --reasoning-parser mistral: 推論トレースパーサーを指定します

python -m sglang.launch_server --model-path mistralai/Mistral-Medium-3.5-128B \
  --tp 8 --tool-call-parser mistral --reasoning-parser mistral

 詳細な設定・ベンチマーク・使用例については SGLangのクックブック(Mistral Medium 3.5向けページ) を参照してください。


Transformersでの推論

 Transformers(トランスフォーマーズ)はHugging Faceが開発する最も広く使われているLLM推論ライブラリです。

1. インストール

# Transformersライブラリをインストールするコマンドです
uv pip install transformers

2. 推論コード

 以下は、Transformersを使って画像入力付きの推論を行うサンプルです(参考記事のサンプルをもとにしています)。

import torch
from transformers import AutoProcessor, Mistral3ForConditionalGeneration

# 使用するモデルのHugging FaceリポジトリIDを指定します
model_id = "mistralai/Mistral-Medium-3.5-128B"

# AutoProcessorはテキストと画像の前処理を行うクラスです
processor = AutoProcessor.from_pretrained(model_id)

# モデルをロードします
# device_map="auto" でGPUが使える場合は自動的にGPUに配置されます
model = Mistral3ForConditionalGeneration.from_pretrained(
    model_id, device_map="auto"
)

image_url = "https://static.wikia.nocookie.net/essentialsdocs/images/7/70/Battle.png/revision/latest?cb=20220523172438"

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "What action do you think I should take in this situation? List all the possible actions and explain why you think they are good or bad.",
            },
            {"type": "image_url", "image_url": {"url": image_url}},
        ],
    },
]

# apply_chat_template でメッセージをモデル入力テンソルに変換します
# reasoning_effort="high" で深い推論モードを有効にします
inputs = processor.apply_chat_template(
    messages,
    return_tensors="pt",   # PyTorchテンソル形式で返します
    tokenize=True,
    return_dict=True,
    reasoning_effort="high"
)
inputs = inputs.to(model.device)  # モデルが配置されているデバイス(GPU)に転送します

# テキストを生成します(最大1024トークンまで生成します)
output = model.generate(
    **inputs,
    max_new_tokens=1024,  # 生成するトークンの最大数です
    do_sample=True,       # サンプリングを有効にします(Trueにしないとtemperatureが効きません)
    temperature=0.7,
)[0]

# skip_special_tokens=False にすると [THINK] [/THINK] タグで囲まれた推論トレースも確認できます
decoded_output = processor.decode(
    output[len(inputs["input_ids"][0]):],  # 入力部分を除いた生成部分だけをデコードします
    skip_special_tokens=False
)
print(decoded_output)

注意: 128Bモデルのロードには非常に大きなVRAMが必要です。device_map=”auto” を指定しても複数GPUが必要になる点に注意してください。また、Transformersのconfigの不具合により長コンテキストで性能が低下する問題がありましたが、最新版では修正済みです(コミット c4be198 以降)。GGUFファイルを使用している場合も同様に最新版の確認を推奨します。


Mistral Vibeとの連携

 Mistral Vibe(ミストラルバイブ)は、MistralAIが開発するコーディングエージェントCLI(コマンドラインインターフェース)ツールです。Mistral Medium 3.5がデフォルトモデルとして採用されており、今回からクラウド上での非同期エージェント実行にも対応しました。

インストール

# Mistral Vibeの最新版をインストールするコマンドです
uv pip install mistral-vibe --upgrade

ローカルvLLMサーバーとの接続設定

 vLLMサーバーをローカルで運用する場合、設定ファイル ~/.vibe/config.toml を以下のように編集します。

# ~/.vibe/config.toml に以下の設定を追記・上書きします

# Vibe上での表示名と説明です
display_name = "Mistral Medium 3.5 (local vLLM)"
description = "Mistral Medium 3.5 mode using local vLLM"
safety = "neutral"

# 使用するモデルのエイリアスを指定します(アクティブなモデルが1つだけになるよう注意)
active_model = "mistral-medium-3.5"

# ローカルvLLMサーバーをプロバイダーとして設定します
[[providers]]
name = "vllm"
api_base = "http://<your-host-url>:8000/v1"  # <your-host-url> を実際のサーバーURLに変更してください
api_key_env_var = ""
backend = "generic"
api_style = "reasoning"

# モデルの詳細設定です
[[models]]
name = "mistralai/Mistral-Medium-3.5-128B"
provider = "vllm"
alias = "mistral-medium-3.5"   # active_model と一致させます
thinking = "high"
temperature = 0.7
auto_compact_threshold = 168000  # コンテキストが約168kトークンを超えると自動圧縮します

# Bashツールのタイムアウト設定(秒単位)です
[tools.bash]
default_timeout = 1200

注意: <your-host-url> を実際のサーバーホスト名またはIPアドレスに置き換えてください。設定後、vibe を再起動してから tab-shift で mistral-medium-3.5 モードに切り替えます。


その他の推論バックエンドとファインチューニング

 Mistral Medium 3.5は以下の方法でも利用できます。

  • llama.cpp: Unslothが提供するGGUF量子化版を利用可能(Unsloth GGUF
  • Ollama(オラマ): コマンド ollama run mistral-medium-3.5 で簡単に実行可能(Ollama公式)。Ollamaはモデルのダウンロード〜実行を1コマンドで完結できるツールです
  • LM Studio: GUI(グラフィカルユーザーインターフェース)でモデルを管理・実行できるツール。Mistral Medium 3.5への対応は2026年5月時点で作業中とされています

ファインチューニング(追加学習) を行う場合は以下のツールが対応しています。


Vibe Remote AgentsとWork modeについて

 Mistralブログによれば、今回の発表にはモデルリリース以外の機能拡張も含まれています。Mistral Vibeでは「リモートエージェント機能」が追加され、コーディングセッションをクラウド上で非同期実行できるようになりました。複数セッションを並列で走らせたり、進捗を確認しながら離席するといった使い方が可能になっています。GitHub・Linear・Jira・Sentryなど開発チームが既に使うシステムとの統合も提供されており、完了時には自動でプルリクエストを作成する機能もあります。

 Le Chat(MistralのチャットUI)では「Work mode」が追加されました。メール・カレンダー・ドキュメントなど複数ツールを横断した複雑なマルチステップタスクをエージェントが自律的に処理するモードです。

 API経由での利用は入力 $1.5/Mトークン、出力 $7.5/Mトークン と発表されています。また、昨年3月のMistralとNVIDIAの提携の流れを受けてか、NVIDIA build.comやNVIDIA NIMでも利用可能になっています。


高速化のためのEAGLEモデル

 vLLMまたはSGLangで高速推論を行う場合、Mistralが別途公開している EAGLEモデル の活用も検討できます。EAGLEは推測的デコーディング(speculative decoding:並列処理で生成速度を高速化する技術)を使った高速化手法で、mistralai/Mistral-Medium-3.5-128B-EAGLE としてHugging Faceで公開されています。

まとめ

 Mistral Medium 3.5は指示追従・推論・コーディング・ビジョンを1つの128Bモデルに統合しており、vLLM・SGLang・Transformers・Ollamaなど主要フレームワークを通じて幅広い環境でのセルフホストに対応しています。改変MITライセンスでのオープンウェイト公開という点も、実務での活用検討がしやすいモデルだと思います。今後のアップデートや対応フレームワークの拡充にも注目したいところです。

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

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