AI課金してますか、気づけばいろんなAIサブスクに契約して月の支払いが馬鹿にならなくなってきた今日この頃です。
そんなとき数ヶ月ぶりにローカルLLMを触ったところ、かなり進化していたので筆を執りました。
ローカルLLMなら使い放題
「それが動くPCが高いんだろ」と言われてしまえば終わりですが、手元で動かせてしまえば気分はフリーです。と言うわけで数ヶ月ぶりにローカルで動くLLMに視点を向けたのですがなかなか優秀になっていたので記事にしようと思いました。
コンピューターに求められる性能
Qwen3(235B)やDeepSeek R1(685B)のような良く優秀と言われるLLMは非常に規模が大きく、Qwen3のモデルサイズはQ4_K_M量子化で142.65GB、DeepSeek R1はQ4_K_M量子化で404.43GBあります。
これをメモリにロードした上で、更にユーザー入力が乗ります。とても個人で持てるコンピューターでは無理ゲーです。(CPUでも動きますが、現実的な速度で動かしたければGPU...つまりVRAMです)
と言うわけで、現実的に個人が動かせる物は小規模なLLMになります。
小規模なLLMはMicrosoftが公開しているPhi-4やコード補完用のモデルではBigCodeのStarCoderが小さいモデルとしてはわかりやすいかと思います。
また、蒸留モデルとしてはDeepSeek R1の蒸留モデルが記憶に新しいかと思います。
これらのモデルはPhi-4のQ4_K_M量子化で10GB程度と、ゲーミングPCのような多少高性能なコンピューターで動作させることが可能で、個人でも動作させやすいとLLMになっています。
当記事ではこっちのモデルを扱います。
たぶんこのへんから本題
エージェントの時代
最近ではAIにおいてエージェントが当たり前となってきました。
開発の視点ではClaude CodeやCline、OpenHandsなどがメジャーなエージェントツールになると思います。これらのツールはユーザーの入力をタスクに分け、目的を達成するまでLLMを何度も呼び出します。
必然的にLLMにとっては複雑な作業となり、複数のツールをLLMが使いながらユーザーの指示を達成しようとします。
当然何度もLLMを呼び出すのでクラウド上のAIを使ったことがある場合、課金額に驚いた人も少なくないでしょう。
小規模なLLMとエージェント
もともと小規模なLLMは複雑な作業を苦手としていました。そもそも賢くないですし、チャットですら支離滅裂だったりするのに、複雑な作業なんてとても扱えないと思っていました。
ふと調べたところコーディングエージェント向けにチューニングされたLLMが出ていることに気がつきました。devstralとKimi-Devです。
それぞれが公開しているベンチマークがこちらです。
引用元: https://mistral.ai/news/devstral
引用元: https://github.com/MoonshotAI/Kimi-Dev
これを見たときに思いました。「おおう…マジ??」
動かしてみた
ローカル動かしてみました。おおう…CLIで動くオセロゲーム作れてしまった…
動く、動くぞ…プロンプトは「CLIで動くオセロゲームを作って」です。
普段インフラ屋さんをしているので、PHPが動くWebサーバーを作成するためのAnsible Playbookも作って貰いました。
完成したPlaybookはこちらです。
---
- name: Setup HTTPD with PHP-FPM on AlmaLinux 9
hosts: all
become: yes
tasks:
- name: Install httpd and php packages
dnf:
name:
- httpd
- php
- php-fpm
state: present
- name: Start and enable httpd service
systemd:
name: httpd
state: started
enabled: yes
- name: Start and enable php-fpm service
systemd:
name: php-fpm
state: started
enabled: yes
- name: Configure httpd to use php-fpm
copy:
dest: /etc/httpd/conf.d/php.conf
content: |
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
- name: Create info.php file for testing
copy:
dest: /var/www/html/info.php
content: |
<?php
phpinfo();
?>
- name: Restart httpd service to apply changes
systemd:
name: httpd
state: restarted
- name: Ensure firewall allows HTTP traffic
firewalld:
service: http
permanent: yes
state: enabled
- name: Reload firewall to apply changes
command: firewall-cmd --reload
Playbookを走らせてみた1ところ、こちらも動作しました。
思ってたより動くぞ!!
驚きました、ローカルLLMなかなかやるではありませんか。
確かにClaude CodeやGemini CLIに比べれば劣りますが、手元のPCでこれが動くとは驚きです。
メモリの消費も20GBくらい2。MacBook Proで動かしていますが、速度も速いです。
動かせる環境があれば是非試してみて欲しいです。ローカルで完結してしまうことに感動しました。
クラウド上のAIサービスが使いづらい環境でもAIによる生産性向上を導入出来るかもしれない。そんな感動を覚えました。
以下、セットアップのメモです。
システムの構成
当記事では、以下の構成でLLMを動作させています
ハードウェア
- MacBook Pro
- Apple M4 Max(推論速度は落ちますがM2などでも動きます。)
- RAM 128GB(実際に利用したのはOS含めて24GB程度です。)
ソフトウェア
- AI Agent
- OpenHands CLI(OpenHands version: 0.51.1)
- LLM基盤
- LM Studio(0.3.20 build 4)
- LM Studio MLX v0.21.0
- LM Studio(0.3.20 build 4)
- LLM
- mistralai/devstral-small-2507(Q4_K_M)
セットアップ
それぞれのセットアップについては先人が書いてくださってるので、個人的にすごくハマった部分について記載します。
OpenHandsのAPIエンドポイントの指定について
初期セットアップや、/Settings
で Basic や Advanced を選択していく設定だとLM Studioに向ける設定が出来ないようです。openaiなどを選択して適当に設定を行い、 ~/.openhands/settings.json
を直接編集するのが楽かと思います。3
{
"language": "ja",
"agent": "CodeActAgent",
"max_iterations": null,
"security_analyzer": "",
"confirmation_mode": true,
"llm_model": "lm_studio/mistralai/devstral-small-2507",
"llm_api_key": "lmstudio",
"llm_base_url": "http://127.0.0.1:1234/v1",
"remote_runtime_resource_factor": null,
"secrets_store": {
"provider_tokens": {}
},
"enable_default_condenser": true,
"enable_sound_notifications": false,
"enable_proactive_conversation_starters": true,
"user_consents_to_analytics": false,
"sandbox_base_container_image": null,
"sandbox_runtime_container_image": null,
"mcp_config": null,
"search_api_key": "",
"sandbox_api_key": null,
"max_budget_per_task": null,
"email": null,
"email_verified": null
}
個人的にハマってしまったのは"llm_model"
の設定です。
LM Studioではmistralai/devstral-small-2507
と表示されますが、頭のlm_studio/
はLiteLLMのプロバイダーの設定として扱われます。LM Studioを利用する際はlm_studio/
かopenai/
と指定すると動作します。
本記事では触れませんでしたがKimi-Devの場合はlm_studio/kimi-dev-72b-dwq
と指定すると動作します。devstralの指定がやや特殊なようです。
"llm_api_key"
は、慣例的にlmstudio
と指定します。
出典・引用
- OpenHands CLI: https://docs.all-hands.dev/usage/how-to/cli-mode
- LM Studio Qwen3: https://lmstudio.ai/models/qwen/qwen3-235b-a22b-2507
- LM Studio Phi4: https://lmstudio.ai/models/microsoft/phi-4
- devstral: https://mistral.ai/news/devstral
- Kimi-Dev: https://github.com/MoonshotAI/Kimi-Dev