Windows WSL2 Ubuntu + Docker + Ollama + llama3 の API を Node-RED とシンプルに連携するメモ

Windows WSL2 Ubuntu + Docker + Ollama + llama3 の API を Node-RED とシンプルに連携するメモです。

背景

Windows の WSL2 で入れた Ubuntu で Docker + Ollama + llama3 を動かしたメモ

Windows の WSL2 で入れた Ubuntu で Docker + Ollama + llama3 を動かしたメモ – 1ft-seabass.jp.MEMO

こちらの記事で立ち上げた Ollama ですが、コマンド実行の docker exec -it ollama ollama run llama3 だとターミナルからは使いやすいのですが Node-RED では連携しづらいなと思っていたところ、

ollama/docs/api.md at main · ollama/ollama

Ollama にはバッチリ API があったので使ってみます。

WSL2 で起動

Ollama をインストールしたイメージで Docker を動かします。

docker start ollama

ollama という名前で Docker を作っていたので、これで起動します。

ollama/docs/api.md at main · ollama/ollama

を参考にポート 11434 に http://localhost:11434/ でアクセスしてみます。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_06.png

無事起動しました。

API にアクセスしてみる

completion は POST /api/generate でアクセスできます。

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "ウォンバットってかわいいですよねえ。日本語でお願いします!"
}'

curl でこんな感じです。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_04.png

実行してみるとストリームでズラーっとデータが来ます。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_02.png

デフォルトではストリームです。他にもいろいろなパラメータがあります。

API に Node-RED でアクセスしてみる

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_08.png

Windows 側で Node-RED をあっち上げるもよし、もう一つ Docker の中に Node-RED を立ち上げるのもよし。ひとまず立ち上げます。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_05.png

このようなフローです。

[{"id":"382363ce0e140289","type":"inject","z":"12ba730d7e544921","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":620,"y":200,"wires":[["f7754a7699aa387c"]]},{"id":"33681a3391c87cf7","type":"http request","z":"12ba730d7e544921","name":"","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1070,"y":200,"wires":[["34b1bffcb2335663"]]},{"id":"f7754a7699aa387c","type":"change","z":"12ba730d7e544921","name":"API 設定","rules":[{"t":"set","p":"url","pt":"msg","to":"http://localhost:11434/api/generate","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"payload.model","pt":"msg","to":"llama3","tot":"str"},{"t":"set","p":"payload.prompt","pt":"msg","to":"ウォンバットってかわいいですよねえ。日本語でお願いします!","tot":"str"},{"t":"set","p":"payload.stream","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":200,"wires":[["33681a3391c87cf7"]]},{"id":"34b1bffcb2335663","type":"debug","z":"12ba730d7e544921","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1280,"y":200,"wires":[]}]

フロー JSON はこちらです。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_07.png

http request ノードは POST メソッドだけを指定してます。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_09.png

change ノードでは API への設定を行っています。

model, prompt は先ほどの curl と同じですが stream を false にすることで一気に受け取る形にしています。true にしていても、バラバラ来るのではなく、最後に一気に来てしまい、あまり変わらないのでそうしています。

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_01.png

inject ノードをクリックして動かしてみると、

windows-wsl2-ubuntu-docker-ollama-llama3-and-nodered_03.png

このように、返答が返ってきます。response のところを使えば返答を取り出せます!