背景や目的
ローカルでAIを使いたいというニーズは以前からあり、以前試した時は業務レベルでの利用は少し厳しいような内容でした(OpenWebUIで確認)。その実験から10か月経過したので、ここで改めて検証してみたいと思います。今回はAIアプリのノーコードツールLangflowを使ってみます。
以前の実験では、問題箇所は検索部で、おそらくチャンクのされ方が良くないのだろう、という内容でした。→記事内容のリンク
今回はその辺りに注目しながら、精度の確認をしてみます。
本記事では、その手順と検証結果を共有します。
精度確認の方針
ローカルPCにLangflowをインストールし、RAGアプリを作成し、以下の通り精度確認をします。
1.利用ツール
Langflowを使います。→公式ページ
2.試す機能
RAGを実現してみます。
3.使うデータ
別途構築済で試験運用中のRAGツールのデータを使います。精度比較がし易いので。
内容的には、社内ナレッジの情報です。
4.精度確認の方法
データに関する質問を投げ、結果を比較します。
構築手順サマリー
LangflowでRAGアプリをつくる部分の手順の概要は、以下の通りです。
1.Langflowのインストール
ローカル環境にLangflowをインストールします。
2.RAGアプリ作成
アプリ(Flow)を作成し、ローカルRAGを実現するようなコンポーネントを追加します。
3.ローカルモデルをセットアップ
Ollamaでモデルをpullして、Langflow上でセットアップします。
4.ベクトルDB作成
既存RAGのベクトルDBから出力したデータを、ChromaDBに登録します。
5.プロンプト等を設定
質問入力して回答文が返却されるために必要な諸設定をします。
6.動作確認
コンソール上で簡単な動作確認をしておきます。
7.RAG精度の確認
ローカルAIが使えるかを確かめます。
順番に紹介してゆきます。
構築1)Langflowのインストール
自分のローカルPCでLangflowをセットアップしていきます。私はwindowsPC内のWSL/Ubuntuを利用しています。
・今回は Pythonパッケージからのインストール方法を採用したため、まずPython関連のパッケージを更新・インストールします。
sudo apt update
sudo apt install -y python3 python3-venv python3-pip curl・次に、Langflowの利用にはPythonパッケージマネージャーuvが必要となるため、これをインストールします。
root@PC999:~# curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.8.22 x86_64-unknown-linux-gnu
no checksums to verify
installing to /root/.local/bin
uv
uvx
everything's installed!
To add $HOME/.local/bin to your PATH, either restart your shell or run:
source $HOME/.local/bin/env (sh, bash, zsh)
source $HOME/.local/bin/env.fish (fish)
root@PC999:~# source $HOME/.local/bin/env・以下のコマンドで仮想環境を作成し、有効化(activate)します。
root@PC999:~# uv --version
uv 0.8.22
root@PC999:~# uv venv langflow-vol36
Using CPython 3.11.0rc1 interpreter at: /usr/bin/python
Creating virtual environment at: langflow-vol36
Activate with: source langflow-vol36/bin/activate
root@PC999:~# source langflow-vol36/bin/activate
(langflow-vol36) root@PC999:~# ・仮想環境が有効化になりましたら、以下のコマンドでLangflowをインストールします。
(langflow-vol36) root@PC999:~# uv pip install langflow

・上記のようにインストールが完了したら、以下のコマンドでLangflowを起動します。
(langflow-vol36) root@PC999:~# uv run langflow run
✓ Initializing Langflow...
✓ Checking Environment...
▣ Starting Core Services...2025-10-03T00:36:33.597005Z [warning ] DEPRECATION NOTICE: Starting in v1.7, CORS will be more restrictive by default. Current behavior allows all origins (*) with credentials enabled. Consider setting LANGFLOW_CORS_ORIGINS for production deployments. See documentation for secure CORS configuration.
2025-10-03T00:36:33.597809Z [warning ] SECURITY NOTICE: Current CORS configuration allows all origins with credentials. In v1.7, credentials will be automatically disabled when using wildcard origins. Specify exact origins in LANGFLOW_CORS_ORIGINS to use credentials securely.
✓ Starting Core Services...
✓ Connecting Database...
✓ Loading Components...
✓ Adding Starter Projects...
□ Launching Langflow...2025-10-03T00:36:41.782344Z [error ] Error importing module langflow.components.composio.googletasks_composio: No module named 'base'
✓ Launching Langflow...
╭─────────────────────────────────────────────────────────────────────────╮
│ │
│ Welcome to Langflow │
│ │
│ 🌟 GitHub: Star for updates → https://github.com/langflow-ai/langflow │
│ 💬 Discord: Join for support → https://discord.com/invite/EqksyE2EX9 │
│ │
│ We collect anonymous usage data to improve Langflow. │
│ To opt out, set: DO_NOT_TRACK=true in your environment. │
│ │
│ 🟢 Open Langflow → http://localhost:7860 │
│ │上記の通り、画面内に「Welcome to Langflow」が表示されたら起動完了です。
・早速、Chromeブラウザで、「http://localhost:7860」にアクセスします。

ブラウザでLangflowが使える状態になりました!
(参考)Langflow Desktopアプリの1.5.1バージョンでは起動時にエラーが発生し、セットアップに失敗しました。そのため、上記の方法で対応しました。
同様の不具合は他のフォーラムでも報告されているため、FYI として共有します。

構築2)RAGアプリ作成
Langflow上でRAGアプリ(Flow)を作ってみます。
・初めて起動する場合の画面では、「+Create first flow」を押し、Templates画面で「Vector Store RAG」を選択します。


・Flowの画面が開き、RAG用のコンポーネントが配置された状態で表示されます。

画面内コンポーネントは大きく2 つのFlowに分かれています。
- Load Data Flow(データ記入部):
RAG 用データベースに文書を取り込むフロー。 - Retriever Flow(チャット部):
ユーザーの質問に対し、取り込んだデータを検索してチャット応答するフロー。
ローカル利用にしたいので、ベクターDBはChromaDBをモデルはOllamaを選択します。
(例えば、OpenAIやAstraDBなどローカルじゃないので気を付けてね。)
そのコンポーネントをFlow内で変更します。
まず”Load Data Flow”部を作成しましょう。

・AstraDBコンポーネントを削除し、代わりにChromaDBを追加します。


・「Split Text」コンポーネント(Chunk 部)から線をドラッグし、ChromaDB の「Ingest Data」に接続します。

・「OpenAI Embeddings」コンポーネントを削除し、代わりに「Ollama Embeddings」を追加します。


・「Ollama Embeddings」から embeddings を ChromaDB に接続します。

・同じように以下の”Retriever Flow”部も作成しましょう。

・左側の「OpenAI Embeddings」と「Astra DB」コンポーネントを削除し、「Ollama Embeddings」と「Chroma DB」に変更します。


・変更した後、「Chat Input」から「Chat Message」→ChromaDBの「Search Query」に接続します。

・右側の「Language Model」コンポーネントを削除し、「Ollama」に変更します。


Promptの出力をOllamaのInputにつなぎ、Model ResponseをOutputにつなぎます。
Flow内のコンポーネント準備が全て終わりました。次に進みます。
構築3)ローカルモデルをセットアップ
ローカルに使うモデルはOllama内で設定しておく必要があり、その準備をします。
・以下の2つモデルを取得しておきます。
– ELYZA-Shortcut-1.0-Qwen-7B(チャットモデル用)
– nomic-embed-text(ベクトル埋め込み用)
※Ollama のインストール方法とモデルの pull 手順は、この記事内の
「インストール:Ollama」に詳しく記載しています。参考にしてください。
root@PC999:~# ollama pull nomic-embed-text
root@PC999:~# ollama pull hf.co/mmnga/ELYZA-Shortcut-1.0-Qwen-7B-gguf
・Ollamaでモデルをpullした後、「ollama list」コマンドで確認します。
root@PC999:~# ollama list
NAME ID SIZE MODIFIED
ELYZA-Shortcut-1.0-Qwen-7B:latest 1172ece7f7d2 4.7 GB 4 days ago
hf.co/mmnga/ELYZA-Shortcut-1.0-Qwen-7B-gguf:latest 1172ece7f7d2 4.7 GB 4 days ago
gemma3:1b 8648f39daa8f 815 MB 4 days ago
mistral:latest 6577803aa9a0 4.4 GB 4 days ago
dsasai/llama3-elyza-jp-8b:latest ecfdd92e89f6 4.9 GB 4 days ago
nomic-embed-text:latest 0a109f422b47 274 MB 2 weeks ago
elyza:jp8b 00b0534ffc09 4.7 GB 13 months ago
llama3:latest 365c0bd3c000 4.7 GB 13 months ago
llama2:latest 78e26419b446 3.8 GB 13 months agolist内「ELYZA-Shortcut-1.0-Qwen-7B」と「nomic-embed-text」が表示されたら、良し。
・次に、「ollama serve」を実行して Ollama サーバを起動します。
root@PC999:~# ollama serveOllamaAPIが動作しているか確認します。
・Chromeブラウザ画面で「http://localhost:11434」にアクセスします。

「Ollama is running」が表示されたので、動いていますね!では次に進みます。
Langflowのアプリ画面に戻り、Ollama関連のコンポーネントを以下のように設定します。
・Ollama Embeddingsコンポーネント(2個)は、下表の値をセットしました。
| Ollama Model | nomic-embed-text:latest ※ダウンロードしたベクトル埋め込み用モデル |
| Ollama Base URL | http://localhost:11434 ※Ollamaのデフォルト |
| 他設定 | 全てデフォルト |

・Ollamaコンポーネントの方は、下表の値をセットしました。
| Ollama Base URL | http://localhost:11434 ※Ollamaのデフォルト |
| Model Name | ELYZA-Shortcut-1.0-Qwen-7B:latest ※ダウンロード済みのチャット用モデル |
| Tool Model Enabled | OFF ※Ollama上すべてのLLMモデルを表示するため |
| 他設定 | 全てデフォルト |

これでモデル関連のセットアップは完了です。次はベクトルDB作成しましょう。
構築4)ベクトルDB作成
ベクトルDBの元情報として社内ルール情報データを用意しました。
| データ形態 | テキストファイル |
| ファイル数 | 1 |
| 情報の概要 | 社内のルール情報を収容 |
| 情報の数 | 1038個 |
| 情報の区切り文字 | ¥n¥n |
ルール情報の内容は、イメージ的には以下のようなものです。
| 以下は、社内ルール等の応答情報です。 user:A メール受信を開始したいです。どうしたら良いですか? user:B 以下のルール集に記載があります。項目「メールの利用」を参照して、設定等を進めて下さい。 https://drive.google.com/file/d/xxxxx user:A ありがとう。わかりました。 |
Langflow画面でデータ登録用のFlowを実行し、情報をChromaDBに保存します。
・データ記入部Flow内Fileコンポーネントで「Select Files」を押します。

・押下時、以下の画面が表示され、そこでルール情報のファイルをアップしました。

・「Select files」を押下時、Fileコンポーネントが以下のように変わりました。

・次は「Split Text」コンポーネントを以下の値でチャンク方針を設定します。
| Chunk Overlap | 0 ※今回のデータでは必要性を感じないので |
| Chunk Size | 1 ※「最小サイズ」を示しているようです。 なぜか、これより大きい値を指定すると複数のチャンクが自動的にマージされてしまいました。 ただし、この挙動には何らかの意図された仕組みがある可能性があり、それは私にまだ不明です。 |
| Separator | \n\n ※元データはこのマークで分割しています |
| 他設定 | 全てデフォルト |

・そして、ChromaDBを以下の値で設定します。
| Collection Name | langflow_rag ★好きな名称で |
| Persist Directory | /home/root/chroma_store ★ローカルPC内好きな場所で |
| 他設定 | 全てデフォルト |

・準備が完了できたら、ChromaDBコンポーネントの右上部の「▷」を押し登録を開始します。



データをChromaDBへ登録するのに、約30分かかりました。
・登録後、設定したChromaDB保存先を以下のコマンドで確認します。
root@PC999:~# ls -lh /home/root/chroma_store/
total 13M
drwxr-xr-x 2 root root 4.0K Oct 7 15:44 111cb847-a577-476c-9489-774bd89ab5f1
-rw-r--r-- 1 root root 13M Oct 7 15:44 chroma.sqlite3データがPC内に登録されており、確かにローカルですね!
ベクトルDB作成は完了です。
構築5)プロンプト等の設定
Flow内コンポーネントの追加設定をします。まずはLLMのプロンプトを設定しましょう。
・Promptコンポーネントの「Template」欄を押し、下記のプロンプトを入力します
| あなたは質問に回答するテクニカルセンターのチャットbotです。 以下のユーザーからの質問に対して、以下の検索結果を参考にして回答して下さい。 検索結果の中に質問に対する答えがない場合や、わからない場合、不確かな情報で回答しないでください。 回答文に「https://」や「http://」で始まるリンク箇所があればその部分はそのwebページを別ウィンドウで開くようにHTMLタグを追記してください。 【検索結果】 {context} 【質問】 {question} 【回答】 |

・入力が完了したら、右下の「Check&Save」を押し、保存します。


これでLLMプロンプトを設定しました。
続いて、プロンプト内の {context} に渡すデータを指定するため、Parserコンポーネントの設定を修正します。
・ParserコンポーネントのTemplate欄で「’Data:{text}’」に修正し、保存します。

最後に以下のFlowに構成されていればOKです。

これで完成したはずなので、動作確認をしてみます。
構築6)動作確認
まず簡単な確認だけしておきます。
・画面上右側部の「Playground」押すと、チャット画面が表示されます。


「こんにちは」と入力し、回答文が返ってくれば良し、とします。
・表示された入力欄で「こんにちは」を入力し、「Send」を押します。



動きました!(ただし、約12分かかりました。遅いですね。)
動作確認は完了です。
RAG精度の確認:既存RAGと比較
以下の質問を入力して、RAGができているかを確認してみました。
| No. | 質問文(要約) |
|---|---|
| 1 | 個人情報保護に関する調査票が届いた。申請はどうすれば良い? |
| 2 | アルバイト経験者のテレワーク勤務許可申請はどうする? |
| 3 | PCを物理破壊するが、必要な申請等を教えて下さい。 |
| 4 | PCの管理者アカウントを登録する場合の申請等はありますか? |
| 5 | 常駐先で利用中のメールを社内PCでも受信したい。手続きを教えて。 |
結果をサマリーすると、下表の通りです。
| No. | 既存RAG | Langflow結果 | 短評 |
|---|---|---|---|
| 1 | ✕ | 検索:NG(意中のチャンクは38位) 回答:検索ミスで不正解情報 | |
| 2 | ✕ | 検索:NG(意中のチャンクは100位以降) 回答:検索ミスで不正解情報 | |
| 3 | ✕ | 検索はNG。(意中のチャンクは100位以降) 回答:検索ミスで不正解情報 | |
| 4 | ✕ | 検索はNG。(意中のチャンクは100位以降) 回答:検索ミスで不正解情報 | |
| 5 | ✕ | 検索はNG。(意中のチャンクは100位以降) 回答:検索ミスで不正解情報 |
結論として、全部NGでした。
原因は検索精度で、回答情報を抽出してくれない事に尽きます。
表内の既存RAGは、以前構築したクラウドタイプのRAGシステムで、数か月試験運用をしているものです。比較として、同じ試験をして全て〇でした。
★緊急追加実験★
ローカルにならないが、EmbeddingモデルをOpenAI text-embedding-ada-002に変えて、同じ試験をしてみました。結果は以下の通りです。
| No. | 既存RAG | Langflow結果 (OpenAI-ada利用) | 短評 |
|---|---|---|---|
| 1 | 検索:OK(意中のチャンクは4位) 回答:正解情報 | ||
| 2 | 検索:OK(意中のチャンクは4位) 回答:正解情報 | ||
| 3 | 検索:OK(意中のチャンクは3位) 回答:正解情報 | ||
| 4 | ✕ | 検索:NG(意中のチャンクは35位) 回答:不正解情報 | |
| 5 | 検索:OK(意中のチャンクは1位) 回答:正解情報 |
検索ミスは、結構改善されましたね。
まとめ
ローカル環境でRAGを実験してみました。現時点では精度がまだ厳しく、検索精度もダメです。
ただし、8か月前に試したOpenWebUIと比較した改善点は以下の通りです。
– 元データを指定した区切り文字でチャンクできる。
– 処理後にコンポーネント別の結果や処理時間を確認できる。
– EmbeddingモデルはOllama又はWebAPI利用(OpenAI)から自由に選択可能。(OpenWebUI試した時はSentenceTransformersがデフォルトでした)
課題はローカルで動作するEmbeddingモデルの質の事と、普通のPCでは遅い、の2点でした。
検索の方は何とかなりそうですね。ローカルで使えるEmbeddingモデルを探してさらに試してみたいと思います。
AI ನಿಖರತೆ ಸುಧಾರಿಸುತ್ತದೆ ಎಂದು ನಾವು ಭಾವಿಸುತ್ತೇವೆ.
(ローカル AI の精度が向上することを期待します。)
