Ollamaを使ってみる その1(Gemma2、Node-RED)
はじめに
今回はローカル環境でLLMを利用できるOllamaを使ってみました。様々な言語モデルをインストールして、文章を生成することができます。
これまで音声の文字起こしにWhisper、音声合成にVOICEVOXなどを利用してきました。さらに応答文を生成することができれば、AIとやり取りできるだろうという訳です。
よく分からないGPUが載っているノートPCで実行しているのですが、もっといい性能のPCが欲しくなってきています...
▼以前の記事はこちら
関連情報
▼Ollamaのページはこちら
▼Modelsのところに、利用できるモデルの一覧がありました。
以前大阪24時間AIハッカソンで一緒に出場していた方から、Gemma2の2Bモデルが良いと聞きました。今回はそのモデルを試しています。少し時間が経つと、さらに良いモデルがどんどん出てきそうですね。
▼Gemma2はGoogleが開発しているモデルのようです。
https://huggingface.co/google/gemma-2-2b
▼大阪24時間AIハッカソンのときの記事はこちら
▼OllamaのGitHubのリポジトリはこちら
https://github.com/ollama/ollama
▼ollama-jsという、JavaScriptで利用できるライブラリがありました。npmでインストールできるみたいですね。
https://github.com/ollama/ollama-js
Ollamaのダウンロード
私はWindows 10で実行しています。
▼こちらからお使いの環境にあったものをダウンロードしてください。
▼Windows版はPreviewのようです。

▼Linuxはコマンドでインストールできるようです。

▼インストール後、Ollamaが実行されている状態になりました。

▼タスクバーのOllamaを終了しないと、起動したままになるようです。

Gemma2を利用してみる
モデルをダウンロードする
今回はGemma2の2Bモデルを利用します。
▼Ollamaのgemma2のページはこちら。他のモデルも選択できます。
https://ollama.com/library/gemma2:2b
▼View moreで2Bのinstructやtextなどの他のモデルが表示されていました。

▼コマンドプロンプトでインストールしました。
ollama run gemma2:2b
▼インストール後、メッセージを送信できるようになっていました。

この状態で、別のコマンドプロンプトで以下のコマンドを実行すると、インストール済みのモデルが表示されました。
ollama list

コマンドプロンプト上でやり取りをしてみました。
▼挨拶をして特徴を聞いてみました。2021年の情報でトレーニングしているみたいですね。

▼文字化けしているので気になったのですが、ブラウザで実行できる場合は解消できるかもしれません。

Gemma2のモデルの違いについて聞いてみる
Gemma2の中でもtextやinstructなどの様々なモデルがあったのですが、調べてもその違いがよく分からなかったので聞いてみました。
textとinstructだと、文書の理解に適しているか、人間の指令に適しているかの違いがあるようです。
▼私はロボットと一緒に使いたいので、instructモデルが適していそうです。

fp16と通常の2Bだと、16ビット浮動小数点か32ビット小数点かの違いがあるようです。
▼メモリ消費や計算時間に違いがあるので、使う場面によって使い分けできそうです。

他にも2b-instruct-q6_Kのようにqが付くものがあったのですが、その違いはよく分かりませんでした。
▼新しいモデルだから知らないという可能性もありそうですが、Gemma2にも分からないようです。


コードの生成を試してみる
Node-REDのノードを開発していたときに、既定のブラウザでURLにアクセスしてLicense Agreementなどのページを開きたいということで調べていました。せっかくなのでGemma2とChat GPTに聞いてみました。
Gemma2だとエラーが出て、そのエラーを貼り付けて修正してもらっても実行できませんでした。
▼それっぽい回答は返ってきます。

エラー文を見る限り、spawnの使い方を間違えているようでした。
▼Chat GPTに聞いてみても、spawnの使い方を間違えているとのことでした。

Chat GPTにもプログラムの作成をお願いしました。
▼こちらではopenというモジュールを使った例が提示されました。

提示されたプログラムをjsファイルとして実行したところエラーが出ました。これはReadmeを読むと分かるのですが、openがCommonJSをサポートしていないため、モジュールのインポート方法が異なるからです。
▼openのページはこちら
https://www.npmjs.com/package/open
▼エラー文を貼り付けたところ、プログラムをmjsファイルとして保存すると実行できました。

できるだけ正確なプログラムを生成するときは、Chat GPTに聞いた方が早そうです。ちょっとした質問をローカルで聞くときにGemma2を使うようにしようかなと思っています。
Node-REDのノードで実行してみる
Ollama用のNode-REDのノードがあったので試してみました。
▼ollama-jsを利用しているようですね。
https://flows.nodered.org/node/node-red-contrib-ollama
サンプルフローをインポートして、Chatノードだけ実行してみました。
▼フローはこちら

▼ノードの中では、表示する名前だけ指定できるようになっています。

▼このまま実行すると、モデル名が不明というエラーが出ていました。

injectノードでモデルやメッセージを設定していました。
▼modelの値がtestになっていたので、gemma2:2Bにしました。

▼実行できました。injectノードで実行してから数秒でレスポンスが返ってきました。

msg.payloadから応答文だけ取り出してみました。
▼フローはこちら。changeノードを追加しました。

▼msg.payload.message.contentの値を、msg.payloadに代入しています。

▼実行毎に回答が変わっていました。

最後に
Gemma2のテキスト生成が、私のノートパソコンでも結構早くてびっくりしました。ずっと前にローカルで実行できるAIを試したときは遅かった記憶があります。
日本語で答えるように指示しておかないと英語で回答されることがあったため、明示的に指示を与えておいた方が良さそうです。
ollamaノードはノード内でモデルを選択したいところですね。msg.payloadにはできれば質問文だけ送信したいところです。
Node-REDでも利用できたので、他のノードと組み合わせて使ってみようと思います。