モデル概要
モデル特徴
モデル能力
使用事例
language:
- en
- fr
- de
- es
- pt
- it
- ja
- ko
- ru
- zh
- ar
- fa
- id
- ms
- ne
- pl
- ro
- sr
- sv
- tr
- uk
- vi
- hi
- bn license: apache-2.0 inference: false base_model:
- mistralai/Devstral-Small-2505 pipeline_tag: text2text-generation tags:
- unsloth
[!NOTE]
llama.cpp
でシステムプロンプトを有効にするには--jinja
を使用してください
オプションのビジョンサポートを強化したDevstral
Devstralを正しく実行する方法 - ガイドを読む
Unsloth Dynamic 2.0は優れた精度を達成し、他の主要な量子化手法を凌駕します
✨ UnslothでDevstralを実行&ファインチューニング!
- 無料でMistral v0.3 (7B)をファインチューニング: Colabノートブック
- Devstralサポートに関するブログ: docs.unsloth.ai/basics/devstral
- その他のノートブック: docs.unsloth.ai/get-started/unsloth-notebooks
mistralai/Devstrall-Small-2505のモデルカード
DevstralはMistral AIとAll Hands AIの協力で構築されたソフトウェアエンジニアリングタスク向けのエージェント型LLMです。Devstralはコードベースの探索、複数ファイルの編集、ソフトウェアエンジニアリングエージェントの駆動において優れた能力を発揮します。このモデルはSWE-benchで驚異的なパフォーマンスを達成し、ベンチマーク結果ではオープンソースモデルとして第1位の位置を占めています。
Mistral-Small-3.1からファインチューニングされており、128kトークンまでの長いコンテキストウィンドウを備えています。コーディングエージェントとして、Devstralはテキスト専用であり、Mistral-Small-3.1
からのファインチューニング前にビジョンエンコーダーは削除されました。
専門的な能力(拡張コンテキスト、ドメイン固有知識など)を必要とする企業向けに、Mistral AIがコミュニティに提供するものを超えた商用モデルをリリース予定です。
Devstralについて詳しくはブログ記事をご覧ください。
主な特徴:
- エージェント型コーディング: ソフトウェアエンジニアリングエージェントに最適
- 軽量: 240億パラメータのコンパクトサイズで、RTX 4090単体や32GB RAMのMacで動作可能
- Apache 2.0ライセンス: 商用・非商用問わず使用・改変可能なオープンライセンス
- コンテキストウィンドウ: 128kトークン
- トークナイザー: 131k語彙サイズのTekkenトークナイザーを使用
ベンチマーク結果
SWE-Bench
DevstralはSWE-Bench Verifiedで46.8%のスコアを達成し、従来のオープンソースSoTAを6%上回りました。
モデル | スキャフォールド | SWE-Bench Verified (%) |
---|---|---|
Devstral | OpenHandsスキャフォールド | 46.8 |
GPT-4.1-mini | OpenAIスキャフォールド | 23.6 |
Claude 3.5 Haiku | Anthropicスキャフォールド | 40.6 |
SWE-smith-LM 32B | SWE-agentスキャフォールド | 40.2 |
同じテストスキャフォールド(All Hands AI🙌提供のOpenHands)で評価すると、DevstralはDeepseek-V3-0324やQwen3 232B-A22Bなどのはるかに大規模なモデルを凌駕します。
使用方法
OpenHandsスキャフォールドと共にDevstralを使用することを推奨します。API経由またはローカルで実行できます。
API
Mistralアカウント作成とAPIキー取得手順に従ってください。
その後、以下のコマンドでOpenHands Dockerコンテナを起動:
export MISTRAL_API_KEY=<MY_KEY>
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik
mkdir -p ~/.openhands-state && echo '{"language":"en","agent":"CodeActAgent","max_iterations":null,"security_analyzer":null,"confirmation_mode":false,"llm_model":"mistral/devstral-small-2505","llm_api_key":"'$MISTRAL_API_KEY'","remote_runtime_resource_factor":null,"github_token":null,"enable_default_condenser":true}' > ~/.openhands-state/settings.json
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.39
ローカル推論
LMStudioなどのプロバイダーを使用してモデルをローカルで実行可能。
OpenHands起動:
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.38
サーバーはhttp://0.0.0.0:3000で起動します。ブラウザで開き、左バーのプラス記号をクリックしてエージェントとの新しい会話を開始できます。
以下のライブラリでもデプロイ可能:
OpenHands(推奨)
Devstral-Small-2505サーバー起動
vLLMやOllamaなどのOpenAI互換サーバーを起動後、OpenHandsでDevstral-Small-2505
を使用可能。
vLLMサーバー起動例:
vllm serve mistralai/Devstral-Small-2505 --tokenizer_mode mistral --config_format mistral --load_format mistral --tool-call-parser mistral --enable-auto-tool-choice --tensor-parallel-size 2
サーバーアドレス形式: http://<サーバーURL>:8000/v1
OpenHands起動
インストール手順に従ってください。
Dockerイメージ使用が簡単:
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.38
OpenHands UIはhttp://localhost:3000
でアクセス可能。
サーバー接続
OpenHands UIでサーバーに接続。詳細モードを使用して起動したサーバーに接続:
入力フィールド:
- カスタムモデル:
openai/mistralai/Devstral-Small-2505
- ベースURL:
http://<サーバーURL>:8000/v1
- APIキー:
token
(サーバー起動時に使用したトークンがあれば)
Devstral搭載OpenHands使用
新規会話を開始してOpenHands内でDevstral Smallを使用可能。To-Doリストアプリを構築してみましょう。
To-Doリストアプリ
- 以下のプロンプトでDevstralにアプリ生成を依頼:
以下の要件でTo-Doリストアプリを構築:
- FastAPIとReactを使用
- 1ページアプリで以下を実装:
- タスク追加機能
- タスク削除機能
- タスク完了マーク機能
- タスクリスト表示機能
- SQLiteデータベースにタスクを保存
- 結果確認
エージェントがアプリを構築し、生成されたコードを確認可能。
自動で行われない場合、Devstralにアプリデプロイを依頼するか手動で実施し、フロントURLにアクセス。
- 反復改善
最初の結果を得たら、改善を依頼可能。例えば、生成されたアプリではタスクをクリックして完了マークできますが、チェックボックスを追加するとUXが向上します。タスク編集機能やステータスによるフィルタリング機能の追加も可能。
Devstral SmallとOpenHandsでの開発をお楽しみください!
LMStudio(量子化モデル推奨)
HuggingFaceから重みをダウンロード:
pip install -U "huggingface_hub[cli]"
huggingface-cli download \
"mistralai/Devstral-Small-2505_gguf" \
--include "devstralQ4_K_M.gguf" \
--local-dir "mistralai/Devstral-Small-2505_gguf/"
LMStudioでモデルをローカル実行:
- LM Studioをダウンロード・インストール
lms cli ~/.lmstudio/bin/lms bootstrap
をインストール- モデルチェックポイントをダウンロードしたディレクトリで
lms import devstralQ4_K_M.ggu
を実行 - LMStudioアプリを開き、開発者タブでモデルを選択して起動。設定でローカルネットワーク公開を有効化
- 右タブにAPI識別子(devstralq4_k_m)とAPIアドレスが表示されるのでメモ
OpenHands起動:
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.38
詳細設定で以下を入力:
- カスタムモデル: mistral/devstralq4_k_m
- ベースURL: LM Studioから取得したAPIアドレス
- APIキー: dummy 変更を保存
vLLM(推奨)
本モデルにはvLLMライブラリの使用を推奨します。
インストール
vLLM >= 0.8.5
をインストール:
pip install vllm --upgrade
これによりmistral_common >= 1.5.4
も自動インストールされます。
確認:
python -c "import mistral_common; print(mistral_common.__version__)"
Dockerイメージも利用可能。
サーバー
- サーバー起動:
vllm serve mistralai/Devstral-Small-2505 --tokenizer_mode mistral --config_format mistral --load_format mistral --tool-call-parser mistral --enable-auto-tool-choice --tensor-parallel-size 2
- クライアントからアクセス例:
import requests
import json
from huggingface_hub import hf_hub_download
url = "http://<サーバーURL>:8000/v1/chat/completions"
headers = {"Content-Type": "application/json", "Authorization": "Bearer token"}
model = "mistralai/Devstral-Small-2505"
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()
return system_prompt
SYSTEM_PROMPT = load_system_prompt(model, "SYSTEM_PROMPT.txt")
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Pythonでフィボナッチ数を計算する関数を書いてください",
},
],
},
]
data = {"model": model, "messages": messages, "temperature": 0.15}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json()["choices"][0]["message"]["content"])
出力例
もちろんです!フィボナッチ数列は各数が前2つの数の和となる数列で、通常0と1から始まります。以下にPythonでの実装例を示します:
反復的アプローチ
ループを使用してフィボナッチ数を計算します。
def fibonacci(n):
if n <= 0:
return "正の整数を入力してください"
elif n == 1:
return 0
elif n == 2:
return 1
a, b = 0, 1
for _ in range(2, n):
a, b = b, a + b
return b
# 使用例:
print(fibonacci(10)) # 出力: 34
再帰的アプローチ
再帰を使用しますが、大きなnでは効率が悪くなります。
def fibonacci_recursive(n):
if n <= 0:
return "正の整数を入力してください"
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
# 使用例:
print(fibonacci_recursive(10)) # 出力: 34
### メモ化アプローチ 計算済みの値を保存して効率化します。
def fibonacci_memo(n, memo={}):
if n <= 0:
return "正の整数を入力してください"
elif n == 1:
return 0
elif n == 2:
return 1
elif n in memo:
return memo[n]
memo[n] = fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo)
return memo[n]
# 使用例:
print(fibonacci_memo(10)) # 出力: 34
### 動的計画法アプローチ 配列を使用してnまでのフィボナッチ数を保存します。
def fibonacci_dp(n):
if n <= 0:
return "正の整数を入力してください"
elif n == 1:
return 0
elif n == 2:
return 1
fib = [0, 1] + [0] * (n - 2)
for i in range(2, n):
fib[i] = fib[i - 1] + fib[i - 2]
return fib[n - 1]
# 使用例:
print(fibonacci_dp(10)) # 出力: 34
必要に応じて適切なアプローチを選択してください。反復的アプローチと動的計画法アプローチは大きなn値に対して効率的です。
Mistral-inference
Devstralを手軽に試すにはmistral-inferenceがおすすめです。
インストール
mistral_inference >= 1.6.0をインストール:
pip install mistral_inference --upgrade
ダウンロード
from huggingface_hub import snapshot_download
from pathlib import Path
mistral_models_path = Path.home().joinpath('mistral_models', 'Devstral')
mistral_models_path.mkdir(parents=True, exist_ok=True)
snapshot_download(repo_id="mistralai/Devstral-Small-2505", allow_patterns=["params.json", "consolidated.safetensors", "tekken.json"], local_dir=mistral_models_path)
Python
以下のコマンドで実行可能:
mistral-chat $HOME/mistral_models/Devstral --instruct --max_tokens 300
"Pythonでユニークで効率的なフィボナッチ計算関数を書いてください"とプロンプトすると、以下のような出力が得られます:
出力例
もちろんです!計算済みの値を保存して効率を上げるメモ化を使用したPython関数をご紹介します:
def fibonacci(n, memo=None):
if memo is None:
memo = {}
if n in memo:
return memo[n]
if n <= 1:
return n
memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
return memo[n]
# 使用例:
n = 10
print(f"位置{n}のフィボナッチ数は{fibonacci(n)}です")
説明:
- 基本ケース: nが0または1の場合、nを返します(フィボナッチ数列は0,1から始まります)
- メモ化: 計算済みのフィボナッチ数を辞書memoに保存
- 再帰ケース: fibonacci(n - 1)とfibonacci(n - 2)の結果を加算
この方法は再帰計算の重複を防ぎ、大きなn値に対しても効率的です。
Ollama
Ollama CLIでDevstralを実行:
ollama run devstral
Transformers
最適な使用にはmistral-common >= 1.5.5
のインストールが必要:
pip install mistral-common --upgrade
トークナイザーとモデルをロードして生成:
import torch
from mistral_common.protocol.instruct.messages import (
SystemMessage, UserMessage
)
from mistral_common.protocol.instruct.request import ChatCompletionRequest
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer
from mistral_common.tokens.tokenizers.tekken import SpecialTokenPolicy
from huggingface_hub import hf_hub_download
from transformers import AutoModelForCausalLM
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()
return system_prompt
model_id = "mistralai/Devstral-Small-2505"
tekken_file = hf_hub_download(repo_id=model_id, filename="tekken.json")
SYSTEM_PROMPT = load_system_prompt(model_id, "SYSTEM_PROMPT.txt")
tokenizer = MistralTokenizer.from_file(tekken_file)
model = AutoModelForCausalLM.from_pretrained(model_id)
tokenized = tokenizer.encode_chat_completion(
ChatCompletionRequest(
messages=[
SystemMessage(content=SYSTEM_PROMPT),
UserMessage(content="Pythonでフィボナッチ数を計算する関数を書いてください"),
],
)
)
output = model.generate(
input_ids=torch.tensor([tokenized.tokens]),
max_new_tokens=1000,
)[0]
decoded_output = tokenizer.decode(output[len(tokenized.tokens):])
print(decoded_output)



