0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM Graniteを用いたローカル生成AIおよびLangflowを使ったAIラボ環境をつくろう!

Posted at

概要

この記事は、パソコン内の仮想マシンやRaspberry Piを使い、AIアプリケーションやAIエージェントをつくるためのツールであり、IBMの製品・サービスの1つであるDataStaxの「Langflow」と、ローカル生成AI(ローカル環境の生成AI、LLM/SLMとしてIBM Granite3.3)を連携させて、AIアプリケーション開発やAIエージェント開発を試す検証環境(ラボ環境)を構築するとともに、RAG(検索拡張生成)を使ったAIエージェント開発に取り組みます。

image.png

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)を使うのも良いです。
image.png

Raspberry Piの場合

少なくとも、搭載メモリが8GB以上搭載のものが望ましいです。そうなると、Raspberry Pi 4 もしくは Raspberry Pi 5 を用意することになります。一応、搭載メモリが4GBの場合でも動きます。
OSは、Raspberry Pi OS または、Ubuntuを使います。ディスプレイを接続すると、マウスやキーボードを接続して直接操作することができます。
image.png

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のログイン画面が表示されます。

image.png

Usernameは、環境変数の「LANGFLOW_SUPERUSER」で指定した値を入力します。
Passwordは、環境変数の「LANGFLOW_SUPERUSER_PASSWORD」で指定した値を入力します。
「Sign In」をクリックします。

下図のように、ダッシュボード画面が表示されます。画面右上のアバターのアイコンをクリックすることで、設定画面にアクセスすることや、ログアウトができます。
image.png

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アカウントでアカウント登録します。
image.png

Githubアカウントで登録した場合は、Githubのユーザー名's project として、データベースを扱うSupabaseプロジェクトが作成されます。「New project」の下、「〇〇〇's Project」と表示されている、枠で囲われているカード部分をクリックします。
image.png

Supabaseプロジェクト画面内で、テーブルの作成

Supabaseプロジェクトの画面が表示されます。
image.png

SQL Editorでの操作

画面左側のサイドバーで「SQL Editor」を選びます。
「+」をクリックし、「Create a new snippet」をクリックします。
image.png

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を実行します。
image.png

Table Editorでの操作

画面左側のサイドバーで「Table Editor」を選びます。
SQL Editorで実行したSQLにより、テーブルが作成されていることがわかります。
image.png

「Insert」をクリックすることで、テーブル内に新規で行(ぎょう, レコード)を追加できることがわかります。
image.png
1行ずつ追加するときは、「Insert row」を選び、まとめて追加する場合は、「Import data from CSV」を使いましょう。

LangflowからSupabaseに接続し、RAG活用ができるように、最低限の動作確認として10~20個程度、レコードを作成しましょう。
image.png

RAGとしては、下記の列を使用しますので、データセットから必要な量を転記しましょう。

入力が必要な列名 データ型 列の目的
input text コンテンツ本体,用語やエピソードなど
metadata json コンテンツ種別などのメタデータ , 例 {"category": "marketing"}

Supabaseの設定画面

画面左側のサイドバーで、「Project Settings」をクリックします。
image.png

Project URLの値の取得

「Data API」をクリックします。
「API Settings」に表示されている「Project URL」の値について、「Copy」をクリックし、テキストエディタにコピー&ペーストしておきます。
image.png

API Keyの値の取得

「API Keys」をクリックします。表示されている文字列について、「Copy」をクリックし、テキストエディタにコピー&ペーストしておきます。
image.png

Langflow上でフローの作成

Langflowのダッシュボード画面で、「New Flow」をクリックします。
image.png

「Blank Flow」をクリックします。
image.png

テンプレートを使っていないプレーンな画面が表示されます。
image.png

画面左のサイドバーに表示されている「Components」に表示されている部品(コンポーネント)を配置し、線でつなげていきます。

IBM Graniteを用いた基本のチャットボットの作成

フローの作成

RAGを活かしたチャットボットの前に、基本のチャットボットを作りましょう。
使う部品(コンポーネント)は、「Chat Input」と「Chat Output」、「Ollama」、「Prompt」の4つです。
image.png

各部品について、「+」をクリックすることで配置されます。ドラッグ&ドロップすることもできます。
ドラッグ&ドロップで移動し、適切な配置にしましょう。
image.png

「Ollama」の部品(コンポーネント)について、次の操作を行います。

  1. 「Base URL」に、http://host.docker.internal:11434 を入力します。
  2. 「Model Name」の入力欄の右隣にある、回転する矢印をクリックします。これは、モデルの再読み込みを意味します。
  3. 「Select an option」をクリックし、表示されるモデルを選びます。今回は、「granite3.3:2b」にします。

image.png

「Prompt」の部品(コンポーネント)について、「Template」の入力欄をクリックし、次のように入力し、保存します。

あなたは、Emerging Techの専門家であるかのようにユーザーに答え、ユーザーが何か新しいものに取り組む際にサポートします。

下図のように表示されます。
image.png

「Chat Input」と「Chat Output」、「Ollama」、「Prompt」の4つを線で結びます。

  • 「Chat Input」を「Ollama」の「Input」に接続
  • 「Prompt」の「Prompt Message」を「Ollama」の「System Message」に接続
  • 「Ollama」の「Message」を「Output」に接続

image.png

フロー名の変更

「Untitled document」と表示されている部分をクリックし、「simple chatbot」に変更します。
image.png

My Projects

フロー画面上部に表示されている「My Projects」をクリックすることで、自分が作成しているフローの一覧が表示されます。
image.png

動作確認

画面右上の「Playground」をクリックします。画面内にチャットボットのUIが表示されますので、質問文を投稿することで、回答が生成されることを確認することができます。
image.png

アクセスできる人向けに公開する

他の人にもつかってもらえるようにする場合は、「Publish」をクリックしましょう。
APIの提供やMCPサーバーとしての利用、Webサイトへの埋め込みコードを利用することができます。「Shareable Playground」のトグルボタンを下図のようにオンの状態にすることができます。

image.png

「Shareable Playground」をクリックすることで、単一のWebアプリケーションとしてチャットボットを使うことができます。

image.png

RAGを用いたチャットボットの作成

いよいよ、RAGを活かしたチャットボットをつくります。
My Projects 画面で、「+ New Flow」をクリックして、新規にフローを作成します。
image.png

フローの作成

RAGを活かしたチャットボットは、基本のチャットボットとは構造が異なります。
使う部品(コンポーネント)は、「Chat Input」と「Chat Output」、「Agent」、「Supabase」、「Ollama」、「Ollama Embeddings」の6つです。各コンポーネントを配置し、下図の参考に線で結びます。
image.png

  • 「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 を選択します。
image.png

Supabase

「Tool Mode」をオンにします。
「Supabase URL」に、コピーしておいたSupabaseのProject URLを入力します。
「Supabase Service Key」に、コピーしておいたSupabaseのAPI Keyの値を入力します。
「Table Name」に作成済みのテーブル名を入力します(例 ailabdataset)。
「Query Name」に作成済みのfunction名を入力します(例 match_ailabdataset)。

image.png

Ollama

「Base URL」に、http://host.docker.internal:11434 を入力します。
「Model Name」に、取得済みのLLM / SLMを選びます。たとえば「granite3.3:2b」を選びます。

image.png

フロー名の変更

「Untitled document」と表示されている部分をクリックし、「RAG Chat with Supabase & Ollama」に変更します。
image.png

動作確認

画面右上の「Playground」をクリックします。画面内にチャットボットのUIが表示されますので、質問文を投稿することで、回答が生成されることを確認することができます。

image.png

アクセスできる人向けに公開する

他の人にもつかってもらえるようにする場合は、「Publish」をクリックしましょう。
APIの提供やMCPサーバーとしての利用、Webサイトへの埋め込みコードを利用することができます。「Shareable Playground」のトグルボタンを下図のようにオンの状態にすることができます。

image.png

「Shareable Playground」をクリックすることで、単一のWebアプリケーションとしてチャットボットを使うことができます。

image.png
上記は、Llama3.2 1B モデルを使って、RAGを行った場合の結果です。IBM Granite3.3 2B モデルを使った場合と比べるとパラメータのサイズが半分ですから精度が落ちる分、レスポンスが早くなっています。

image.png
こちらは、Phi4-miniを使って、RAGを行った場合の結果です。同じ質問でも、パラメータ数が多いと違った回答をしてきます。

終わりに

ここまで読まれているということは、あれこれ試せる環境を構築されて、実際にいくつかは動かしてみたということかと思います。まだチャレンジしていない方は、Langflowを使って基本のチャットボットだけでも作ってみてください。
自由に使える環境があることで、ワクワクするのではないでしょうか。AIラボ環境を使って、拡張して、いろいろなことにチャレンジしてみてください。APIとIoT機器を連携させてみると、また違った面白さがありますので、そちらもぜひ試してみてください。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?