N番煎じですがローカルLLM(ollama)とRAG(Dify)を試してみた
桑名市スマートシティ推進課です。
最近、AI関係の記事を全く書いていないため、最近試したことを書こうと思います。
1.巷ではローカルLLMが流行っている
横須賀市さんが、記事でローカルLLMを試してみた記事がありました。二番煎じ、いや、もうどれだけ煎じられてるかわからないため、N番煎じですが、当市も乗っかって、同じようにやってみようと思います。
ちなみに、当市も横須賀市さんとは方向性が違いますが、メタバースも実証実験をしております!!
2.さらに、界隈ではDifyなるサービスが流行っている!
さらに、生成AI界隈では、Difyなるサービス(オープンソースのLLMアプリ開発プラットフォーム)が流行っている、らしい。
世界的ですもんね。このビッグウェーブ乗るしかない!
つまり・・・
自治体のネットワークは三層分離されていて、ほとんどの事務をインターネットではつながらない部分で行っているため、
RAGはしたいが、機微な情報を扱っていて、なかなかインターネット環境ではしづらい。
基幹業務システムでもLLMが活用できれば、さらに業務の改善となるのでは?
ゆくゆくは、ハルシネーション対策をしたうえで、住民向けチャットボットを展開できるのでは?
といった課題感を日々感じています。そのための実験というわけです。
というわけで、
ローカルLLM+RAGを実験的に構築してみようと思います。
非エンジニア、ノンプログラマーに立ちはだかる大きな壁
しかし、そうはいっても、しがない公務員で非エンジニア・ノンプログラマーの私には大きな壁がたくさん立ちはだかります。
今回悩んだ点(壁)
横須賀市さんのレベルが高すぎる。
ローカルLLM、はどれほどのものか?遅すぎたら使えない・・・
DifyはDockerで構築したほうが楽そうだが、確かライセンスが・・・
Docker Desktopが有料、無料で使うためにはWSL2 + Ubuntu + Dockerにする必要がある
非インターネット環境で構築するため、データを取ってこないといけない。
オフラインでのWSL2環境設定
WSL2でLinux~Windows間のファイルのやり取りは・・・できるはずだが・・・
オフラインなのでgit cloneも使えない。
Docker pullでイメージつくればいける?
ollamaとDifyを連携するには?ネットワークは?
ほかにも、悩みはつきないが、あまり思い出せないため、この程度で・・・・
では手順です。
1.手順(ollama)
1.ollamaをインストール
方法は横須賀市さんの記事通りに。ちなみに、LM Studioも試してみましたが、当市のPCスペックが足りないせいか、動作がかなり遅かったため、今回は不採用。
2.モデル(LLMの本体データ)をダウンロード
Hugging Faceなどから量子化モデル(*.gguf)をダウンロードして任意の場所に置きます。
3.Ollamaに読み込むためのファイルを作成
コマンドプロンプトで、以下の例のように、Ollamaに読ませるファイルを作ります。ちなみに、スペックの低いノートパソコンの場合は、8Bにしないと、おそらく使い物にならない。
echo "FROM ./Llama-3-ELYZA-JP-8B-q8_0.gguf" > Modelfile
うまくいかなかったため、上記の記事を参照しました。
4.モデルを作って実行
コマンドプロンプトで以下のコマンドを打って、Ollama上でモデルを作成します。
ollama create elyza -f Modelfile
以下のコマンドで実行します。
ollama run elyza
2.手順(WSL2)
オフライン環境でどう構築すればいいか、調べると先人の知恵がでてきます。ありがたや。
見よう見まねで、構築します。ubuntuにします。
3.手順(Docker環境)
こちらも先人の知恵を最大限活用。ありがたや。
4.手順(Dify)
上記記事でイメージ化したコンテナを展開。その後コードをwslのターミナルで。
cd dify/docker
docker-compose up -d
Difyの管理画面にログイン。
この時、localhostであるが、IPは何なのか、悩んだ。
import socket
print(socket.gethostbyname(socket.gethostname()))
上記コマンドで、IPがわかる、らしい。わからないことは、すべてGoogleとChatGPTに聞いている。回答があるので、本当に良い時代になったと思う。
ollamaを読み込ませてみる
ここで、問題発生。
外部から呼び出せるように変更する。
同一ネットワーク内の他のPCからもアクセスできるようにする。
この際、ファイヤーウォールの設定から、「詳細設定」に進み「受信の規制」に新しい規則を作ってportを開ける必要がある、かもしれない。
完成
最後に、Difyで細かい設定をしていきます。
詳細は省略しますが、主にRAGを設定しました。
今回は、以下FAQをナレッジとしました。
以上のステップを経て、なんとかローカルLLM(ollama)+RAG(Dify)の環境を構築できました。
ここまでに、構想だけで数か月、実際に実行するのに、半日~1日かかりました。非エンジニアにはきつい。
結果
①Dify+ollamaの連携は成功した。
ワークフローなど一切なにもしていない、ただAPI連携しているだけの状態であれば、問題なく稼働しました。
オフライン環境で使えるのはとても有意義です。特に基幹業務システムでの活用に期待できそうです。
ちなみに、i5-8265U、メモリ4Gのノートパソコンでは1秒に3文字くらいの速度で、結果が表示されました。
②RAGは失敗
ベクトル検索+elyza(ローカル)だとまったく良い結果がでません。
インターネット環境に変えて、open aiのtext-embedding-3-smallやCohereのrerank-multilingual-v2.0などを使わないとよい結果が得られませんでした。
この点は、単にDifyの設定でなんとかならないのか、さらに研究したいと思います。
もしかして…
Embedding、Rerankモデルもオフライン、オンプレ導入すれば良いだけでは?
とも思いましたが、今回の実験はここまでとします。
結論・所感
ローカルLLM、特に小型モデルは有用。
そのうち業務システムに組み込まれるのでは?
例えば、文書管理システムなどに組み込み、決裁内容を要約してくれる、など
DifyのRAG、ワークフローは難しい。一朝一夕ではできない。研究が必要。
このようなツール・サービスがOSSとなっているのは大変ありがたい。サービスを検討するよい材料になる。
それでは、良きAIライフを!