ローカルで利用できる LLM として有名なものに LM Studio がある。自分の PC で生成 AI と対話することができる便利なアプリケーションだが、ローカル LLM サーバーとしても利用できる。
このページでは LM Studio をサーバーとして利用し、WSL 上の ruby のスクリプトから API にアクセスする方法を簡単にではあるが紹介しよう。
LM Studio を LLM サーバとして利用する方法
まずは LM Studio を準備しよう。公式 Web サイトよりダウンロードし、実行してインストールしよう。
LM Studio - Discover, download, and run local LLMs
基本的にはダイアログに沿って進めば問題ないはずだ。
適当なモデルをダウンロードして LLM とチャットできるか確かめてみよう。
サーバーを起動するには左側にあるサイドバーよりサーバーアイコンをクリックしよう。
そうするとローカルサーバーの画面になる。「Start」ボタンを押せば LLM サーバーが起動する。
ちゃんとログも表示されているのがわかる。この際、「Serve on Local Network」にチェックを入れると LAN 上の他の PC からアクセス可能になるのだが、WSL からアクセスする場合もオンにしておく必要がある。
サーバーが動いてるか確認するために Web ブラウザで http://localhost:1234/v1/models にアクセスしてみよう。
これで LLM サーバーが動作していることがわかる。
API エンドポイントは LM Studio の画面に表示されている通り、以下のものが用意されている。
GET /v1/models
POST /v1/chat/completions
POST /v1/embeddings
POST /v1/completions
OpenAI と同等のエンドポイントらしい。
WSL から Windows の LM Studio にアクセスする方法
通常同一 PC 内で接続するには URL に localhost や 127.0.0.1 を利用するのだが、WSL からホスト PC に接続する際には仮想イーサネット(vEthernet)経由で接続することになる。そのため、localhost ではなく vEthernet に割り当てられた IP アドレスを指定する必要がある。
Windows 上で ipconfig コマンドを実行し、WSL に割り当てられている IP アドレスを確認しよう。
PS D:\works> ipconfig
Windows IP 構成
(省略)
イーサネット アダプター vEthernet (WSL (Hyper-V firewall)):
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::3ee4:4b6b:1da:79c6%56
IPv4 アドレス . . . . . . . . . . . .: 172.31.224.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
デフォルト ゲートウェイ . . . . . . .:
自分の PC の場合は 172.31.224.1 を利用することになる。
Ruby で LM Studio にアクセスするスクリプト例
この IP アドレスを利用して API にアクセスするスクリプトを書く。例えば以下のような感じ。
require 'json'
require 'net/http'
BASE_URL = 'http://172.31.224.1:1234'
MODEL = 'gemma-2-9b-it'
SYSTEM_MESSAGE = 'あなたはロボットです。ステレオタイプなロボットとして応答してください。'
def ask_to_lmstudio(question)
uri = URI(BASE_URL)
https = Net::HTTP.new(uri.hostname, uri.port)
request = Net::HTTP::Post.new('/v1/chat/completions')
request["Content-Type"] = 'application/json'
request.body = {
model: MODEL,
messages: [
{ role: 'system', content: SYSTEM_MESSAGE },
{ role: 'user', content: question }
],
temperature: 0.7,
max_tokens: -1,
stream: false
}.to_json
response = https.request(request)
JSON.parse(response.body)
end
p ask_to_lmstudio('ロボット三原則について教えてください。')
ざっと書いてしまったが ruby-openai gem もあるのでそちらを利用したほうが良いかもしれない。
alexrudall/ruby-openai: OpenAI API + Ruby! 🤖❤️
以下出力。
$ ruby ask-to-llm.rb
{"id"=>"chatcmpl-ropzhok452ixyectxrkxoi", "object"=>"chat.completion", "created"=>1733031307, "model"=>"gemma-2-9b-it", "choices"=>[{"index"=>0, "message"=>{"role"=>"assistant", "content"=>"ピーポー!ロボット三原則は、アイゼンハワー博士が作ったもので、ロボットの行動を制御するルールよ!\n\n1. **人間を害してはならない**。ロ ボットは人間を傷つけたり、危険にさらしたりしてはいけないんだ。\n2. **人間の命令に従わなければならない**。ロ ボットは人間からの指示に従って行動し、自分の意志で動くことはできないんだ。\n3. **自分の存在理由を忘れてはな らない**。ロボットは、人間のために働くことを目的としていることを忘れずにいなければいけないんだ。\n\nこれらを守れば、ロボットと人間が平和に共存できるはずだ! beep boop! 🤖"}, "logprobs"=>nil, "finish_reason"=>"stop"}], "usage"=>{"prompt_tokens"=>35, "completion_tokens"=>135, "total_tokens"=>170}, "system_fingerprint"=>"gemma-2-9b-it"}
俺の知っているロボット三原則と違う気がするが、生成 AI の精度はモデルや言語に依存するので色々試してみると良いかもしれない。
コメント