Ollamaに導入済みの大規模言語モデルを外部から利用する

## 目的

大規模言語モデルを高速なコンピュータにインストールし，それを外部から使用したいときがあります．その場合どうすればよいでしょうか？大規模言語モデルを簡単に使用できるollamaを使って簡単に実現できます．

## この記事の前提条件
- ollamaはLinuxを搭載したコンピュータにインストール済みです．
- ollamaを使用する外部のPCにはdockerが入っています．

## sshを使いollamaを外部から使用する

まず，sshでollamaをインストールしたコンピュータに入ります．
```
ssh ollamaをインストールしたコンピュータ
```
次にollamaを実行します．
```
ollama run llama3
```
そうすると，次のような対話モードになります．
```
>>>
```
次に質問をすれば，言語モデルから回答が得られます．
```
>>> Hello
Hi! It's nice to meet you. Is there something I can help you with, or would you like to chat?
```
sshを使えば簡単に外部からollamaを通じ大規模言語モデルと対話できます．

## Open WebUIを使う

sshから使用で実用上特に問題があるというわけではないですが，見た目がChatGPTなどと比べると残念です．そこで[Open WebUI](https://github.com/open-webui/open-webui)を使いブラウザ上から立地なUIで大規模言語モデルを使ってみましょう．

実は，ollamaをインストールすると，すでにURL経由でollamaが使用できるようになっています．試しに，次のコマンドを入力し，URLから使ってみましょう．
```
curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Hello"
}'
```
そうすると，次のような応答が帰ってきます．
```
{"model":"llama3","created_at":"2024-05-02T23:11:51.8265156Z","response":"Hi","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.844450959Z","response":"!","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.862502695Z","response":" It","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.880426394Z","response":"'s","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.89842678Z","response":" nice","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.916463448Z","response":" to","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.934346347Z","response":" meet","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.952291984Z","response":" you","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.970270752Z","response":".","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:51.98823013Z","response":" Is","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.006199438Z","response":" there","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.024187505Z","response":" something","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.041908945Z","response":" I","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.059686196Z","response":" can","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.077443716Z","response":" help","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.095214515Z","response":" you","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.112976446Z","response":" with","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.130739746Z","response":",","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.148507267Z","response":" or","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.166280726Z","response":" would","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.184134425Z","response":" you","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.201811777Z","response":" like","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.219736846Z","response":" to","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.237617744Z","response":" chat","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.255530892Z","response":"?","done":false}
{"model":"llama3","created_at":"2024-05-02T23:11:52.273711019Z","response":"","done":true,"context":[128006,882,128007,198,198,9906,128009,128006,78191,128007,198,198,13347,0,1102,596,6555,311,3449,499,13,2209,1070,2555,358,649,1520,499,449,11,477,1053,499,1093,311,6369,30,128009],"total_duration":3755725299,"load_duration":3176145514,"prompt_eval_count":11,"prompt_eval_duration":90838000,"eval_count":26,"eval_duration":446875000}
```
これは人間向けの出力ではありませんので読めたものではないですね．

次にOpen WebUIを使用の準備をしましょう．ollamaの初期の設定では，外部からwebapiが使用できないようになっています（安心ですね）．そこで，外部から使用できるようollamaのサーバーの設定します，と言いたいところですが，今回は，sshのポートフォワーディングを使ってollamaを外部から使います．先のweb apiで会話した例から，使用するポートは11434となっています．そこで，次のコマンドでlocalhostの11434ポートとollamaがインストールされたコンピュータの11434ポートが接続します．
```
ssh -fN -L 11434:localhost:11434 ollamaがインストールされたコンピュータ
```
これで，外部のPC（localhost）からollamaのwebapiが使えます．ちゃんと動作するかどうか確かめるために，外部のPC（localhost）から次のコマンドを入力し，ollamaを動かしてみましょう．
```
curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Hello"
}'
```
設定が反映されていれば，先と同じような回答が得られます．

### Open WebUIのインストール

次にOpen WebUIをインストールしましょう．これはdockerからの使用が推奨されています．次のコマンドで，dockerにOpen WebUIを入れることができます．
```
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
```
これでOpen WebUIがインストールされ，実行されました．ブラウザから次のURLを開いてみましょう．
```
http://localhost:3000
```
実行に成功していれば，次のような画面が表示されます．
![Screenshot 2024-05-03 at 10.39.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/aacf9026-17a9-7776-35a8-8c6425c81c7f.png)
Open WebUIを使うためには，この画面でアカウントを作る必要があります．このアカウントは，あくまでもdocer内のWebUIのみで有効なアカウントです．コンテナを消せば消えるアカウントなので適当に作りましょう．

### Open WebUIの設定

アカウントを作りSign inすると次のような画面になります．![Screenshot 2024-05-03 at 10.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/17ec7d70-5949-d805-fb96-2465162702f9.png)
次に，右上の歯車ボタンを押します．そうすると設定画面が開きます．さらに，設定画面でmodelsを選ぶと次のような画面になります．
![Screenshot 2024-05-03 at 10.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/b24e7bad-1cff-c437-d46a-ab6f8b3d34eb.png)
この画面で，更新マークを押しましょう．成功すると次のようなポップアップが出ます．
![Screenshot 2024-05-03 at 10.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/84ad12d2-ffee-3508-8760-17ce3bb6fbc3.png)
接続に成功したら，モデルの読み込みをします．設定画面のModelsをクリックしましょう．そうすると次のような画面になります．
![Screenshot 2024-05-03 at 10.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/fcd8aa59-c063-1dcc-b598-c466f290f016.png)
モデルの読み込みボタンを押すと，ollamaに入っているモデルが取得されます．モデルを読み込んだら，設定を終了しましょう．これで，モデルと対話できるようになります．

### Open WebUIの使用

最初の画面のSelect a modelをクリックし，対話相手のモデルを選びます．
![Screenshot 2024-05-03 at 11.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/0935b9cb-3c92-81cb-c12d-9b5947db8ab5.png)
次に，質問をしてみます．最初の画面の下の方に質問入力画面があります．今回はPythonでHello, world!を表示するプログラムを作ってもらいます．
![Screenshot 2024-05-03 at 11.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/352d704e-c9ae-7dce-337d-7b243e08ab90.png)
質問すると，図のようにモデルから回答が得られます．
![Screenshot 2024-05-03 at 11.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/4f244068-10ab-8e2e-a465-d2287d2953ed.png)
コードに色がついていますね．素晴らしい．まるでChatGPTのようです．

## 感想

これで，ollamaをインストールしたPCに接続できさえすれば，何処でも大規模言語モデルと対話できるようになりました．さらに，Open WebUIを使うと，有料の対話型人工知能と同じような見た目で，無料の大規模言語モデルと自分のPCで対話できます．すでに，用途によっては有料の対話型人工知能のサービスはいらないかもしれません．
また，RAGをすれば，社内用の対話型人工知能も簡単に構築できるでしょう．