RaspberryPi5で構築する「自分だけのAI」:ollamaとDify

RaspberryPi5にNVMe SSDを装着すると、これまでのRaspberryPiでは体験できなかったパワフルな処理性能が得られます。このパワーを活かして、ローカル環境で動作するAIシステムを構築してみましょう。ローカルAIを使えば外部ネットワークと接続せず、機密情報を含むやり取りにも適しています。

今回は、Meta社がオープンソースで提供しているAIプラットフォーム「Ollama」をRaspberryPi で動かします。

はじめに 注意書き

RaspberryPi 5 は GPU を詰んでいません。
そのため、ここで作る環境は非常に実験的なものです。

しかし、自分に合っているかどうかを確認もせずに、高価なGPUへの投資や環境構築をするのにはためらいも出てきます。
RaspberryPi5 は、安価でかつ最低限の設備で ローカルAI の環境を構築できます。
ローカルで動作する「自分だけの生成AI」を、最初に楽しむには十分だと思います。

なぜローカルAIを作るのか?

なぜローカルの環境で生成AIを動かしていくのか?
現在ではホスティングしている生成AIなどは多くあり、わざわざ自前でハードウェアを準備しOSからエンジンをインストールして、生成AIを使用するメリットはなさそうに感じます。

しかし、実際ビジネスで運用することを考えるとローカルAIという環境は非常に便利に使える方法です。

クラウドの商業AI における悲劇

クラウドのAI(ChatGPTやGeminiなど)は、費用を払うことで用意された環境で簡単に手早く生成AIを利用することができます。

これはクラウドの商業AIの大きなメリットです。
しかし、同時にクラウドのAIサービスならではの問題も発生します。

  • クラウドのAIの悲劇 : 揺らぎやすいクラウドAI
    クラウドの商業AIではサービス提供者の事情によって結果が変わる
  • クラウドのAIの悲劇 : 無法地帯で機密を叫ぶ
    扱うデータの機密性を保ちにくい
  • クラウドのAIの悲劇 : 幻影(ハルシネーション)との戦い
    幻覚(ハルシネーション)の混入の可能性が大きい
  • クラウドのAIの悲劇 : バージョンアップとの戦い
    提供業者の稼動状態に依存しチューニングが安定しない。使っていた生成AIがサービス停止になるキケンもある

これはホビー目的の個人でも当てはまることが多く、そのため今回は RaspberryPi5 でローカルAIを構築することにしました。

ローカルAIとして構築するのは、 Meta社がオープンソースで公開している Ollama を使用します。

ollama
Ollamaは、Llama 3.2やMistralなどの最新の大規模言語モデル(LLM)を簡単に導入・カスタマイズできるプラットフォームです。macOS、Linux、Windowsで利用でき、初心者から上級者までがLLMを活用できる柔軟な環境を提供しています。さらに、GPUだけでなく、CPUとメモリのみでも動作可能です。

RaspberryPi 5 ローカルAI : ollama

以下の手順でRaspberryPi5上にOllamaをセットアップし、実際にモデルを動かしてみましょう。

1. ディレクトリ作成と構成ファイルの準備

まず、必要なディレクトリを作成し、docker-compose.yamlを設定します。

docker-compose.yaml の内容は以下の通りです。

2. Ollamaの起動

docker-compose.yaml を作成したら、次の docker compose コマンドで ollama を起動します。

ollama で色々な操作をしますので、ollama に接続するシェルスクリプトを作っておきます。

スクリプトに実行権限を付与します。

ollama が起動したら、ollama の シェル( bash )に接続して利用していきます。

3. Llama 3.2 3Bモデルの導入と使用

今の ollama は、基本のシステムが動いているだけで、AI(LLM)がありません。
今回は 小型で軽量な Llama 3.2 3B を使用してみます。

LLMを使用するには、 ollama run llama3.2 で Llama3.2 をダウンロードして実行します。
LLMは、大きなイメージですので 回線の速度によって時間がかかります。

Llama3.2 3B のロードが終わったら、プロンプトが表示されますので、質問を記述してみます。

予定の無い週末に有意義に過ごす方法を提案してください。

一般的な回答で面白みはありませんが、大きく間違った情報でもありません。
また、指定しなくても Llama3.2 3B が 日本語で 回答を返しているのを確認しました。

古いLLMやChatGPTもバージョンが古い記事には「日本語で回答」などをプロンプトに追加すると書いてあることがありますが、 Llama3.2 3Bでは、入力したプロンプトにしたがって言語を選択しているようです。

4. Google Gemma2の導入

次に、GoogleのオープンソースLLM「Gemma 2」の軽量版も追加します。

このまま ollama run gemma2:2b を実行すれば、ollamaのコンソールでチャットボットのように応答を試すことができます。
ここでは、Gemma2 のLLMをダウンロードしてきて使用する準備だけして、ollama をさらに便利に使う Dify の構築を進めます。

生成AI開発プラットフォーム : dify

Difyは、自然言語処理やAIアプリケーションの迅速な開発をサポートするオープンソースの開発プラットフォームです。主に大規模言語モデル(LLM)や生成AIの実装を効率化するための機能を提供し、開発者やビジネスユーザーが複雑なAIシステムを容易に構築・運用できるよう設計されています。

Difyは、生成AIやLLMを活用したアプリケーションを効率よく開発するための多機能なプラットフォームであり、AIを使ったビジネスやプロジェクトにおける開発コストや時間の削減に貢献します。

Difyを使えば、Ollamaの運用をさらに便利にすることができます。

1. Dify のセットアップ

Dify は、以下のコマンドで構築することができます。

コピーした .env を見てみると、Dify の詳しい設定ができます。
色々なオプションがありますが、今回は サンプルのまま動作させます。

Dify が起動したら http://[server_ip_address]/ (ポート80) にアクセスします。
最初にアクセスしたときには、アカウント作成の画面が表示されます。

この情報は、外部には送信されません。 ローカルのDifyのアカウント として使用します。

Dify setup

Dify の活用記事ではないので、Difyの設定方法やモデルの指定方法は割愛します。

2. Dify チャット・ボットのテストと公開

Dify に簡単な ChatBOT を設定して Gemma2 を設定して、 Llama3.2 3B と同じ質問をしてみます。

Gemma2 はカジュアルな回答で、絵文字まで使用しています。
Dify を使った ChatBot では、 「オーケストレーション」で回答に対する条件も設定 できますので、獲得したい回答の方式を細かく指定することもできます。

Dify で作成した チャット・ボット は、メニューの「公開する」から「アプリを実行」で Webアプリ としてスグに公開できます。

「アプリを実行」すると URLが開きチャット・ボットのアプリページが開きます。
良くある チャット・ボット のような画面で校正されていますので、同じ質問をしてみます。

これだけで、ローカルで動作する 生成AI のチャット・ボットを作ることができます。
当然、全て RaspberryPi5 にセットアップした ollama と Dify で実現しています。

公開の方法には、企業サイトでよくあるような「右下にチャットウィンドウ」をだす方法も用意されています。
このコードを、自分のWEBサイトなどに貼り付ければ、自分専用の情報をもったチャット・ボットを要することもできます。

Dify は、単純なチャット・ボットだけで無く、追加の知識ベース(RAG)と使ったり、外部のWebサイトやRestAPIと連携したワークフローやエージェントという動作を作ることもできます。

RaspberryPi5 で実現する ローカルAI の世界

RaspberryPi5でのOllamaとDifyのセットアップにより、生成AIをローカル環境で手軽に利用できる環境が整いました。
外部への通信を気にせず、自分だけのAI環境を楽しむことができます。

自分専用の生成AIや作業を楽にしてくれるロボットがRaspberryPi5で動作します。
RaspberryPi5 で作った環境で、高品質な 生成AI を使いたいときには、APIキーを入手して OpenAI GPT-4o など商業AIにリンクするのも良いでしょう。

私が使っているパーツ類は次の通りです。

追伸

ビジネス(本業というのかな)でも同じように ローカルAI を活用した、システムの自動化や生成AIを活用した業務改善なども実施しています。

ビジネスでの活用も検討してみたい。こんなことはできるのかと疑問の方は、問い合わせフォームからご連絡ください。

Translate »