見出し画像

N番煎じですがローカルLLM(ollama)とRAG(Dify)を試してみた

桑名市スマートシティ推進課です。
最近、AI関係の記事を全く書いていないため、最近試したことを書こうと思います。

1.巷ではローカルLLMが流行っている

横須賀市さんが、記事でローカルLLMを試してみた記事がありました。二番煎じ、いや、もうどれだけ煎じられてるかわからないため、N番煎じですが、当市も乗っかって、同じようにやってみようと思います。

ちなみに、当市も横須賀市さんとは方向性が違いますが、メタバースも実証実験をしております!!

2.さらに、界隈ではDifyなるサービスが流行っている!

さらに、生成AI界隈では、Difyなるサービス(オープンソースのLLMアプリ開発プラットフォーム)が流行っている、らしい。
世界的ですもんね。このビッグウェーブ乗るしかない!

つまり・・・

自治体のネットワークは三層分離されていて、ほとんどの事務をインターネットではつながらない部分で行っているため、

  • RAGはしたいが、機微な情報を扱っていて、なかなかインターネット環境ではしづらい。

  • 基幹業務システムでもLLMが活用できれば、さらに業務の改善となるのでは?

  • ゆくゆくは、ハルシネーション対策をしたうえで、住民向けチャットボットを展開できるのでは?

といった課題感を日々感じています。そのための実験というわけです。


というわけで、

ローカルLLM+RAGを実験的に構築してみようと思います。

非エンジニア、ノンプログラマーに立ちはだかる大きな壁

しかし、そうはいっても、しがない公務員で非エンジニア・ノンプログラマーの私には大きな壁がたくさん立ちはだかります。


今回悩んだ点(壁)

  1. 横須賀市さんのレベルが高すぎる。

  2. ローカルLLM、はどれほどのものか?遅すぎたら使えない・・・

  3. DifyはDockerで構築したほうが楽そうだが、確かライセンスが・・・

    1. Docker Desktopが有料、無料で使うためにはWSL2 + Ubuntu + Dockerにする必要がある

  4. 非インターネット環境で構築するため、データを取ってこないといけない。

    1. オフラインでのWSL2環境設定

    2. WSL2でLinux~Windows間のファイルのやり取りは・・・できるはずだが・・・

    3. オフラインなのでgit cloneも使えない。

      1. Docker pullでイメージつくればいける?

  5. 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ライフを!