概要
この記事は、パソコン内の仮想マシンやRaspberry Piを使い、AIアプリケーションやAIエージェントをつくるためのツールであり、IBMの製品・サービスの1つであるDataStaxの「Langflow」と、ローカル生成AI(ローカル環境の生成AI、LLM/SLMとしてIBM Granite3.3)を連携させて、AIアプリケーション開発やAIエージェント開発を試す検証環境(ラボ環境)を構築するとともに、RAG(検索拡張生成)を使ったAIエージェント開発に取り組みます。
Langflow + ローカル生成AI + Supabase という組み合わせは、RAGの活用に取り組むのであれば、Supabase は検討すべきベクターストア(ベクトルデータベース)です。
AIラボ環境
トラブル時に初期状態に戻しやすいように、パソコン内に仮想マシンを用意するか、Raspberry Piを使います。どちらもOSのインストールという初期段階からのセットアップし直すことが容易であるためです。
データセットの用意
AIラボ環境で使用するデータセットを作成します。とりあえず動けば良いレベルでは、10~20行程度は入力しておくことが望ましいです。表計算ソフトを使うか、Google スプレッドシート、あるいはPostgreSQLなどでテーブルを作って管理します。
想定するデータセットの列名を次のとおりです。
列名 | データ型 | 列の目的 |
---|---|---|
id | bigserial | レコード作成毎に自動採番,プライマリーキー |
input | text | コンテンツ本体,用語やエピソードなど |
instruction | text | コンテンツ本体に関してAI利用者がするであろう想定される質問文 |
output | text | AIが生成する回答文の例 |
metadata | json | コンテンツ種別などのメタデータ , 例 {"category": "marketing"} |
列の構成としては、RAGとして使う以外に、ファインチューニングにも使うことを想定した内容にしています。
RAGで使うデータセットとしてSQL文を作成する場合は、「id」と「input」「metadata」の列を使います。
仮想マシンの場合
Ubuntu 24.04 を使います。個人的な好みでしかないので、Red Hat系のように好みのものを使ってください。
仮想マシンには、メモリを8GB、CPUは2コア程度を割り当てます。ストレージは40GB以上あれば良いでしょう。下図のスクリーンショットは、Ubuntu Budgieになります。Windows環境の場合は、Windows Subsystem for Linux (WSL2)を使うのも良いです。
Raspberry Piの場合
少なくとも、搭載メモリが8GB以上搭載のものが望ましいです。そうなると、Raspberry Pi 4 もしくは Raspberry Pi 5 を用意することになります。一応、搭載メモリが4GBの場合でも動きます。
OSは、Raspberry Pi OS または、Ubuntuを使います。ディスプレイを接続すると、マウスやキーボードを接続して直接操作することができます。
Langflow
Webブラウザ上で使えるノーコード / ローコードのAIアプリケーションおよびAIエージェント開発ツールで、2025年5月末に開発・提供元のDataStax社がIBMに買収されたことで、IBMの製品・サービスの1つになりました。
https://www.ibm.com/products/datastax
25年7月現在、商用利用しやすい「MITライセンス」のオープンソースソフトウェアとして開発および提供が継続しています。
https://github.com/langflow-ai/langflow
ローカル生成AI(ローカルLLM)
この記事では、Ollama(オラーマ)を使います。MITライセンスが適用されます。
https://ollama.com/
Langflowと同じく、AIアプリケーションおよびAIエージェント開発ツールである「Dify」をオンプレミス環境やプライベートクラウド環境で運用する際に、LLMおよびSLMを動かすために使われていますので、個人的に、会社で、学校で使っている、使ったことがあるという方がいらっしゃるのではないでしょうか。
IBM Granite3.3
Ollamaだけでは生成AIの仕組みはできませんので、LLMまたはSLMが必要です。LLMは大規模言語モデル、SLMは小規模言語モデルの略称です。
今回は、IBM Granite3.3の 8Bモデルおよび2Bモデルを使います。Granite3.3は、LLMおよびSLMとしては珍しく、Apache2.0ライセンスが適用されているため、商用利用しやすく、メモリ消費量が少ないこと、RAGに強いことが特徴です。
https://www.ibm.com/jp-ja/new/announcements/ibm-granite-3-3-speech-recognition-refined-reasoning-rag-loras
SLMと言いますと、モデルのパラメータサイズがコンパクトな言語モデルを指しますが、最近はスマートフォンで動かすためのコンパクトなモデルも、LLMと呼ぶケースが出てきたので、そのうちLLMに統一されるかもしれません。
代表的なLLMとして、いくつかピックアップ
- IBM Granite3.3:8B
- Gemma 3n E4B
- Tanuki-8B
- Gemma 3 12B
- Phi-4 << 14B=140億パラメータあるとのこと
- Qwen3-32B
- Preferred-MedLLM-Qwen-72B << 医療特化
代表的なSLMとして、いくつかピックアップ
- IBM Granite3.3:2B
- Gemma 3n E2B
- Phi-4-mini << 3.8Bあるとのこと
- Qwen3-1.7B
- Llama3.2-1B
パソコンのメモリが16GBで、8Bくらいまでが限界です。
パソコンのメモリが32GBくらいあれば、12Bや14Bのモデルも動かすことができます。
なお、Raspberry Pi 4の4GBモデルを使った場合、2Bのモデルまでがスムーズに動いてくれました。8Bモデルはゆっくりと動きます。
必要なソフトウェアのインストール
ネットワーク系
openssh-serverとavahi-daemon を入れておきます。openssh-serverをインストールすることで、SSHサーバーを使うことができるようになり、avahi-daemonにより、DNSサーバーの設置や設定なし、名前解決ができます。同じネットワーク内にあるスマートフォンやパソコンから、SSH接続やWebブラウザ経由でAIラボ環境に接続することができます。
仮想マシンの場合(Windows Subsystem for Linux使用時以外)
sudo apt update
sudo apt upgrade
sudo apt install openssh-server avahi-daemon
sudo systemctl start avahi-daemon
sudo systemctl enable avahi-daemon
Raspberry Pi の場合
sudo apt update
sudo apt upgrade
sudo apt install avahi-daemon
sudo systemctl start avahi-daemon
sudo systemctl enable avahi-daemon
Docker
Langflowを実行するために用います。次の手順でインストールします。1行ずつコマンドを実行します。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo gpasswd -a $USER docker
実行後、SSHで接続している場合は、一度切断し、再接続してください。
GUIを使っている場合は、再起動してください。
Ollama
Ollamaをインストールするために、次のコマンドを実行します。
curl -fsSL https://ollama.com/install.sh | sh
LLM / SLM の取得
Ollamaのインストール後、LLM / SLM の動作確認として、IBM Granite3.3:2B のモデルを動かしてみましょう。
次のコマンドを実行します。
IBM Granite3.3 2B モデルの取得および動作確認
ollama run granite3.3:2b
実行結果
>>> Send a message (/? for help)
動作確認のため、質問を入れて、Enterキーを押してみましょう。
>>> IBM Cloudについて、AWSからの乗り換えを考えている経営者向けに説明してください。
質問結果
IBM Cloudへの移行は、特に大規模企業の経営者が考える際、いくつかの重要なポイントに注目する必要があります。以下に、AWSからIBM Cloudへの移行を検討する際の主な考慮事項を整理しました。
### 1. **業務継続性と信頼性**
- **AWSの安定性**: AWSは非常に信頼性の高いクラウドプラットフォームであり、多くの大企業が利用しており、広範なサービスと堅牢なインフラが特徴です。
- **IBM Cloudの強み**: IBM Cloudも非常に安定しており、特にIBMのエッジを活用したソリューション(例えば、IBM z/OS MainframeやAI Platform)は信頼性が高いとされています。移行前には、現在のサービスの使用状況や依存関係を詳細に分析し、どのサービスを最初に引き継ぐかを計画することが重要です。
### 2. **コスト管理**
...以下省略
2Bという小さなモデルですが、それらしい回答を生成してくれます。OllamaでLLM / SLMが動くかどうかの確認のためなので、ここでは性能云々は気にしないようにします。
「Ctrl+D」の組み合わせでキーボードのキーを押すことで、Ollamaへの質問を終えることができます。
再び質問したい場合は、「ollama run モデル名(例 ollama run granite3.3:2b)」を実行します。
「ollama run モデル名」のコマンドを実行では、モデルのダウンロードと、ダウンロードしたモデルを実行まで行うため、モデルのみダウンロードする場合は、「ollama pull モデル名(ollama pull granite3.3:8b)」にしましょう。
Phi4-mini モデルの取得
iBM Granite3.3 2B モデルは軽量なモデルですが、比較のために他のモデルを使いたいときもあるでしょう。
Microsoft社が開発および提供している、Phi4-miniを取得します。
ollama pull phi4-mini:latest
Llama3.2 1B モデルの取得
比較のために、より軽量なモデルとして、Meta社が開発しているLlama3.2 1B を取得します。
ollama pull llama3.2:1b
Embeddings モデルの取得
RAGの利用には、Embeddingsモデルが必要になりますので、次のコマンドを実行します。Ollama Embeddingsにより、テキストデータを数値ベクトルに変換します。
ollama pull mxbai-embed-large
Ollamaにlocalhost以外から接続できるようにする
Ollamaの設定ファイルに、「Environment="OLLAMA_HOST=0.0.0.0"」を追記し、localhost以外から接続できるようにします。
sudo nano /etc/systemd/system/ollama.service
追記前
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:>
[Install]
WantedBy=default.target
追記後
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:>
Environment="OLLAMA_HOST=0.0.0.0"
[Install]
WantedBy=default.target
次のコマンドを実行し、Ollamaを再起動します。
sudo systemctl daemon-reload
sudo systemctl restart ollama
Langflow
作業用ディレクトリの作成と移動
Langflowの環境変数ファイルを作成してから、コンテナを起動するため、作業用ディレクトリを作成し、作成したディレクトリに移動します。
mkdir langflow-work && cd langflow-work
コンテナの起動
Langflowをコンテナとして起動します。起動にあたって環境変数を設定するため、.env ファイルを作成します。次のコマンドを実行します。
nano .env
下記の変数を記述します。記述後、保存しましょう。
LANGFLOW_AUTO_LOGIN=false
LANGFLOW_AUTO_SAVING=true
LANGFLOW_SUPERUSER=adminuser
LANGFLOW_SUPERUSER_PASSWORD=Zxcvfr45
Langflowでの作業内容を保存するために、ボリュームを作成します。
docker volume create langflow_app
次のコマンドを実行して、Docker Composeの定義ファイル「docker-compose.yml」を作成します。
nano docker-compose.yml
中身は、下記のように書きます。
services:
langflow:
image: langflowai/langflow:latest
container_name: langflow
extra_hosts:
- host.docker.internal:host-gateway
env_file:
- .env
ports:
- 7860:7860
volumes:
- langflow_app:/app
volumes:
langflow_app:
external: true
name: langflow_app
Langflowのコンテナを起動します。
docker compose up -d
コンテナの実行状況を確認するため、次のコマンドを実行します。
docker ps -a
実行結果 , CONTAINER IDの値は、コンテナ実行毎に異なります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4de396370aa0 langflowai/langflow:latest "langflow run" About an hour ago Up About an hour 0.0.0.0:7860->7860/tcp, [::]:7860->7860/tcp langflow
Langflowのコンテナが起動していることを確認することができました。
Webブラウザで、http://ホスト名.local:7860 にアクセスします。
たとえば、ホスト名が ailab の場合は、http://ailab.local:7860 のようになります。
Windows Subsystem for Linuxを使っている場合は、http://localhost:7860 にアクセスします。
アクセスすることで、Langflowのログイン画面が表示されます。
Usernameは、環境変数の「LANGFLOW_SUPERUSER」で指定した値を入力します。
Passwordは、環境変数の「LANGFLOW_SUPERUSER_PASSWORD」で指定した値を入力します。
「Sign In」をクリックします。
下図のように、ダッシュボード画面が表示されます。画面右上のアバターのアイコンをクリックすることで、設定画面にアクセスすることや、ログアウトができます。
Supabase
Supabaseは、PostgreSQLベースであり、Firebaseの代替ソリューションでもある、BaaS(Backend as a Service)です。BaaSとしてインターネット経由で使えるパブリック版と、プライベートクラウドやクラウドネイティブ・オンプレミス(New オンプレミス)、オンプレミス環境、エッジデバイスで運用するセルフホスト版があります。
また、RAGでは文書ファイルを取り込む事例が多いですが、Supabaseを使うことで、見慣れた表形式でデータ管理ができます。
運用方法の選択
パブリック版とセルフホスト版の選ぶことができます。パブリック版にはFreeプランがあるので、そちらを使います。ケースによってはセルフホスト版を選ぶのも良いでしょう。セルフホスト版のドキュメントは下記になります。
https://supabase.com/docs/guides/self-hosting
パブリック版の利用登録
パブリック版は、https://supabase.com/pricing にアクセスします。「Start for Free」をクリックします。
メールアドレスとパスワードを登録するか、Githubアカウントでアカウント登録します。
Githubアカウントで登録した場合は、Githubのユーザー名's project として、データベースを扱うSupabaseプロジェクトが作成されます。「New project」の下、「〇〇〇's Project」と表示されている、枠で囲われているカード部分をクリックします。
Supabaseプロジェクト画面内で、テーブルの作成
SQL Editorでの操作
画面左側のサイドバーで「SQL Editor」を選びます。
「+」をクリックし、「Create a new snippet」をクリックします。
SQLサンプル
SQLエディター内に記述するSQLのスニペットを作成します。下記をコピーして使うか、カスタマイズしても良いでしょう。「ailabdataset」というテーブルと、「match_ailabdataset」というクエリを作成します。これらは、LangflowからSupabaseを呼び出す設定を行う際に使用します。
なお、extension「vector(PostgreSQL拡張のベクトルデータ)」を使うテーブルを作成済みの場合は、「create extension vector;」の記述は外します。
-- Enable the pgvector extension to work with embedding vectors
create extension vector;
-- Create a table to store your ailabdataset
create table ailabdataset (
id bigserial primary key,
input text, -- コンテンツ本体,用語やエピソードなど
metadata jsonb, -- コンテンツ種別などのメタデータ
embedding vector(1536) -- OpenAI embedding を使うことに備えて、1536次元のベクトル型を指定しておく
);
-- Create a function to search for ailabdataset
create function match_ailabdataset (
query_embedding vector(1536),
match_count int DEFAULT null,
filter jsonb DEFAULT '{}'
) returns table (
id bigint,
input text,
metadata jsonb,
similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
return query
select
id,
input,
metadata,
1 - (ailabdataset.embedding <=> query_embedding) as similarity
from ailabdataset
where metadata @> filter
order by ailabdataset.embedding <=> query_embedding
limit match_count;
end;
$$;
SQL Editorには、下図のように記述します。記述後、画面右下の「Run」をクリックしてSQLを実行します。
Table Editorでの操作
画面左側のサイドバーで「Table Editor」を選びます。
SQL Editorで実行したSQLにより、テーブルが作成されていることがわかります。
「Insert」をクリックすることで、テーブル内に新規で行(ぎょう, レコード)を追加できることがわかります。
1行ずつ追加するときは、「Insert row」を選び、まとめて追加する場合は、「Import data from CSV」を使いましょう。
LangflowからSupabaseに接続し、RAG活用ができるように、最低限の動作確認として10~20個程度、レコードを作成しましょう。
RAGとしては、下記の列を使用しますので、データセットから必要な量を転記しましょう。
入力が必要な列名 | データ型 | 列の目的 |
---|---|---|
input | text | コンテンツ本体,用語やエピソードなど |
metadata | json | コンテンツ種別などのメタデータ , 例 {"category": "marketing"} |
Supabaseの設定画面
画面左側のサイドバーで、「Project Settings」をクリックします。
Project URLの値の取得
「Data API」をクリックします。
「API Settings」に表示されている「Project URL」の値について、「Copy」をクリックし、テキストエディタにコピー&ペーストしておきます。
API Keyの値の取得
「API Keys」をクリックします。表示されている文字列について、「Copy」をクリックし、テキストエディタにコピー&ペーストしておきます。
Langflow上でフローの作成
Langflowのダッシュボード画面で、「New Flow」をクリックします。
画面左のサイドバーに表示されている「Components」に表示されている部品(コンポーネント)を配置し、線でつなげていきます。
IBM Graniteを用いた基本のチャットボットの作成
フローの作成
RAGを活かしたチャットボットの前に、基本のチャットボットを作りましょう。
使う部品(コンポーネント)は、「Chat Input」と「Chat Output」、「Ollama」、「Prompt」の4つです。
各部品について、「+」をクリックすることで配置されます。ドラッグ&ドロップすることもできます。
ドラッグ&ドロップで移動し、適切な配置にしましょう。
「Ollama」の部品(コンポーネント)について、次の操作を行います。
- 「Base URL」に、http://host.docker.internal:11434 を入力します。
- 「Model Name」の入力欄の右隣にある、回転する矢印をクリックします。これは、モデルの再読み込みを意味します。
- 「Select an option」をクリックし、表示されるモデルを選びます。今回は、「granite3.3:2b」にします。
「Prompt」の部品(コンポーネント)について、「Template」の入力欄をクリックし、次のように入力し、保存します。
あなたは、Emerging Techの専門家であるかのようにユーザーに答え、ユーザーが何か新しいものに取り組む際にサポートします。
「Chat Input」と「Chat Output」、「Ollama」、「Prompt」の4つを線で結びます。
- 「Chat Input」を「Ollama」の「Input」に接続
- 「Prompt」の「Prompt Message」を「Ollama」の「System Message」に接続
- 「Ollama」の「Message」を「Output」に接続
フロー名の変更
「Untitled document」と表示されている部分をクリックし、「simple chatbot」に変更します。
My Projects
フロー画面上部に表示されている「My Projects」をクリックすることで、自分が作成しているフローの一覧が表示されます。
動作確認
画面右上の「Playground」をクリックします。画面内にチャットボットのUIが表示されますので、質問文を投稿することで、回答が生成されることを確認することができます。
アクセスできる人向けに公開する
他の人にもつかってもらえるようにする場合は、「Publish」をクリックしましょう。
APIの提供やMCPサーバーとしての利用、Webサイトへの埋め込みコードを利用することができます。「Shareable Playground」のトグルボタンを下図のようにオンの状態にすることができます。
「Shareable Playground」をクリックすることで、単一のWebアプリケーションとしてチャットボットを使うことができます。
RAGを用いたチャットボットの作成
いよいよ、RAGを活かしたチャットボットをつくります。
My Projects 画面で、「+ New Flow」をクリックして、新規にフローを作成します。
フローの作成
RAGを活かしたチャットボットは、基本のチャットボットとは構造が異なります。
使う部品(コンポーネント)は、「Chat Input」と「Chat Output」、「Agent」、「Supabase」、「Ollama」、「Ollama Embeddings」の6つです。各コンポーネントを配置し、下図の参考に線で結びます。
- 「Ollama Embeddings」の「Embeddings」を、「Supabase」の「Embedding」に接続
- 「Supabase」の「Toolset」を、「Agent」の「Tools」に接続
- 「Ollama」の「Language Model」を、「Agent」の「Language Model」に接続
- 「Chat Input」の「Message」を、「Agent」の「Input」に接続
- 「Agent」の「Response」を、「Chat Output」の「Text」に接続
それぞれのコンポーネントをみていきましょう。
Ollama Embeddings
「Ollama Base URL」に、http://host.docker.internal:11434 を入力します。
「Ollama Model」にて、日本語にも対応している mxbai-embed-large を選択します。
Supabase
「Tool Mode」をオンにします。
「Supabase URL」に、コピーしておいたSupabaseのProject URLを入力します。
「Supabase Service Key」に、コピーしておいたSupabaseのAPI Keyの値を入力します。
「Table Name」に作成済みのテーブル名を入力します(例 ailabdataset)。
「Query Name」に作成済みのfunction名を入力します(例 match_ailabdataset)。
Ollama
「Base URL」に、http://host.docker.internal:11434 を入力します。
「Model Name」に、取得済みのLLM / SLMを選びます。たとえば「granite3.3:2b」を選びます。
フロー名の変更
「Untitled document」と表示されている部分をクリックし、「RAG Chat with Supabase & Ollama」に変更します。
動作確認
画面右上の「Playground」をクリックします。画面内にチャットボットのUIが表示されますので、質問文を投稿することで、回答が生成されることを確認することができます。
アクセスできる人向けに公開する
他の人にもつかってもらえるようにする場合は、「Publish」をクリックしましょう。
APIの提供やMCPサーバーとしての利用、Webサイトへの埋め込みコードを利用することができます。「Shareable Playground」のトグルボタンを下図のようにオンの状態にすることができます。
「Shareable Playground」をクリックすることで、単一のWebアプリケーションとしてチャットボットを使うことができます。
上記は、Llama3.2 1B モデルを使って、RAGを行った場合の結果です。IBM Granite3.3 2B モデルを使った場合と比べるとパラメータのサイズが半分ですから精度が落ちる分、レスポンスが早くなっています。
こちらは、Phi4-miniを使って、RAGを行った場合の結果です。同じ質問でも、パラメータ数が多いと違った回答をしてきます。
終わりに
ここまで読まれているということは、あれこれ試せる環境を構築されて、実際にいくつかは動かしてみたということかと思います。まだチャレンジしていない方は、Langflowを使って基本のチャットボットだけでも作ってみてください。
自由に使える環境があることで、ワクワクするのではないでしょうか。AIラボ環境を使って、拡張して、いろいろなことにチャレンジしてみてください。APIとIoT機器を連携させてみると、また違った面白さがありますので、そちらもぜひ試してみてください。
参考資料