昨今話題の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

We’re on a journey to advance and democratize artificial intelligence through open source and open science.

huggingface.co favicon image huggingface.co

そして、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として設定する。

.vimrc
"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

Hi, I'm running ollama on a Debian server and use the oterm as the interface. After some chats (just less than 10 normal questions) the ollama fails to respond anymore and running ollama run mixtra...

github.com favicon image github.com

何より、気軽に無料で実用レベルのAIを利用したサービスが使えるというのは、数年前のAI黎明期と比べると感動すら覚える。