Local LLMで開発体験を上げる
Table of Contents
昨今話題のLocal LLMを使って、AIサービスのAPI利用代を浮かそうという話
概要
今では当たり前となったAIチャットサービスの利用。 ChatGPT・Gemini・Claude・Copilot等、サービスは色々あるけど、APIでの利用はそのToken数に応じて従量課金されるので気軽には使えないというのが正直な感想。
ということで、近頃発達が目覚ましいLocal LLMをその代替として検討してみることにした。
事前にいくつかのオープンなライセンスのモデルを試して、日本語性能が一番高いと感じたLlama-3-ELYZA-JP-8B
を利用することにした。
Llama-3-ELYZA-JP-8B
は今年6月に東大・松尾研発の株式会社ELYZAがリリースしたモデルで、MetaのLlama3
をベースに日本語の追加学習を施したモデルだ。
どうやらこの80億パラメータのモデルはGPT-3.5 turbo
に匹敵する性能らしい。ChatGPTサービス開始直後はこのレベルのモデルがローカル環境で動かせるなどと想像だにしなかったので驚きだった。
手順
Ollamaのインストール
さっそくローカルで動かしていく。
事前にLlama-3-ELYZA-JP-8B
を4bit量子化したggufのバイナリをダウンロードしておく。
量子化bit数を小さくするほど性能劣化が激しくなるのでココはお使いのコンピュータの性能と要相談。

elyza/Llama-3-ELYZA-JP-8B-GGUF · Hugging Face
そして、Local LLMのインターフェースとなるツールollama
をDockerで導入する。
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --restart=always --name ollama ollama/ollama
Nvidia製のGPUを推論に利用する場合は、事前にコンテナからNvidia GPUを利用できるようにツールをインストールしておく。
# リポジトリ追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# experimentalなパッケージを利用
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
# パッケージリストの更新
sudo apt update
# toolのインストール
sudo apt install -y nvidia-container-toolkit
# コンテナランタイムの構成
sudo nvidia-ctk runtime configure --runtime=docker
# Dockerデーモンの再起動
sudo systemctl restart docker
参考:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
Open Web UIのインストール
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
ブラウザでlocalhost:3000
にアクセスすると、サインイン画面が出てくる。
初回は適当なアカウントを作成してログインすると、ChatGPT的なUIでモデルと対話できる。もっとも、まだモデルが存在しないのだが。
モデルの導入
Open Web UIの画面で「管理者パネル」→「設定」→「モデル」とクリックし、「実験的」の項目を表示させる。

先程ダウンロードしたモデルを選択・アップロードしてしばらく待てば、モデルの導入が完了する。
ユースケース
ブラウザから利用

この利用方法なら、無料でもっと強いモデルが使える商用サービスがあるのでは、と思うが、オープンなモデルの強みを活かしてRAG・ファインチューニング等を利用して特定の知識に対して特化させて使ってみるのはアリかなと思う。
neovimから利用
avante.nvimという、neovimからAIチャットを呼び出すクールなプラグインが存在するので、これのバックエンドをOllamaとして設定する。
"avante.nvim
autocmd! User avante.nvim
lua << EOF
require('avante_lib').load()
require('avante').setup({
provider = "ollama",
vendors = {
---@type AvanteProvider
ollama = {
["local"] = true,
endpoint = "127.0.0.1:11434/v1",
model = "Llama-3-ELYZA-JP-8B-q4_k_m.gguf:latest",
parse_curl_args = function(opts, code_opts)
return {
url = opts.endpoint .. "/chat/completions",
headers = {
["Accept"] = "application/json",
["Content-Type"] = "application/json",
},
body = {
model = opts.model,
messages = require("avante.providers").copilot.parse_message(code_opts), -- you can make your own message, but this is very advanced
max_tokens = 2048,
stream = true,
},
}
end,
parse_response_data = function(data_stream, event_state, opts)
require("avante.providers").openai.parse_response(data_stream, event_state, opts)
end,
},
},
mappings = {
--- @class AvanteConflictMappings
ask = "<leader>ua", -- ask
edit = "<leader>ue", -- edit
refresh = "<leader>ur", -- refresh
-- '/clear' to clear chat
},
hints = { enabled = false },
})
EOF
nmap <silent> <leader>uc <Plug>(AvanteChat)
Cでサンプルコードを出力させた例がこちら。

既存のコードをレビュー・リファクタリングさせる機能はいまいちだった。モデルとプロンプト、どちらにも原因はありそうだが、今後に期待。
その他おすすめのツール
地味に一番欲しかった機能が、commit messageの自動出力。
これを行うaicommit2というツールがあり、こちらはバックエンドとしてChatGPT等のサービスの他にOllamaを指定可能である。
aicommit2 config set OLLAMA.model=<your model>
試しにc++のコードの修正を行って、messageを出力させてみた。

複数モデルで動かして比較検討したりもできるらしい。
おわりに
なんだか不定期でollamaのプロセスがハングしていることもあるけれど、まだ発展途上の技術なので仕方ないのかなと思う。

Ollama stops generating output and fails to run models after a few minutes · Issue #2225 · ollama/ollama
何より、気軽に無料で実用レベルのAIを利用したサービスが使えるというのは、数年前のAI黎明期と比べると感動すら覚える。