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?

RAG のデスクトップ

0
Posted at

1. はじめに

古いPCに、FAISS と Dify を使用したRAG環境を構築します。NVIDIA GeForce などのグラフィックボードを搭載していないため、FAISS は最高性能ではありませんが、個人で使用するには十分です。LLM は、クラウドの OpenAI を使用します。

以前に書いた Docker Desktop、Dify のインストールの記事はこちら。

以前に書いた FAISS のインストールの記事はこちら。今回は NVIDIA ドライバをインストールしません。

RAG を実行するためのアプリケーションは他にもありますが、問い合わせ(テキスト)と登録した文書(テキスト)の、より正確なマッチングを行うために、単にコサイン類似度を計算したいので、FAISS を使用します。

文書の埋め込み(embedding)には、クラウドの OpenAI text-embedding-3-large を使用します。NVIDIA GeForce グラフィックボードを搭載した別のPCで、Alibaba qwen3-embedding-8b のようなローカルの embedding を使用することも可能です。

2. Xubuntu インストール

PC電源投入時、
起動メニュー F12キー
BIOS F2キー

デスクトップの使い易さのために Xubuntu を使用しています。日本語入力をセットアップしますが、画面は英語のままにしています。

xubuntu-26.04.1-desktop-amd64.iso

Rufus を使って起動 USB メモリを作成(DVD からだとアクセスが頻発して正常に動作しなかった)
PCの電源を入れて F12キーを押して USB から立ち上げる
デスクトップに表示される Install Xubuntu 26.04.1 LTS アイコンをダブルクリックして、PCへのインストールを開始

Language: English
Keyboard: Japanese
Connect to the internet: Connect to a Wi-Fi network ※ 先にメニューバーから接続しておく
An update is available for the installer: Update now ※ インストーラーを再開
Interactive installation
Xubuntu Desktop
Erase disk and install Xubuntu
Select drive: sda - 500GB SSD-PSTA/D BUFFALO
No encryption
Your name: webmaster
Your computer's name: noble34
Your username: webmaster
Password: ******
Confirm password: ******
Select your timezone: Asia/Tokyo

インストールが終わったら、USB メモリを外して起動

OS アップデート
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
再起動

SSH インストール
sudo apt update
sudo apt install openssh-server

外部から SSH で接続
ssh -l webmaster 192.168.1.41
password: ******

Xfce メニュー
メニューから Panel Profiles、Xfce 4.16、Apply Configuration ボタン押下

Application -> Settings -> Xfce Screensaver
60 minutes

Application -> Settings -> Language Support
追加のインストールのためにパスワードを入力
Install / Japanese、Password
但し、画面表示は英語のままで使用する
再起動

ログイン後、バー右上、右クリック、Preference -> Input Method -> Add
Japanese -> Mozc

Preference -> General -> Keyboard Shortcuts
<Super>space から <Control>space に変更、Apply ボタン
バー右上、左クリックで Input Mode を Direct input から Hiragana に変更

固定IP
Wifi 接続の場合は、メニューバー右上でマウス右クリック、Edit Connections から設定する
Address: 192.168.1.34
Netmask: 255.255.255.0
Gateway: 192.168.1.1
DNS: 999.999.99.99, 888.888.888.88 ※プロバイダから入手
再起動

よく使うコマンド
pwd
ls -alF
ip addr show
nano .env(矢印キーでカーソル移動、保存Ctrl+S、終了Ctrl+X)
sudo reboot
sudo shutdown -h now
画面キャプチャ PrtSc、範囲指定 Shift+PrtSc、アクティブウィンドウのみ Ctrl+PrtSc ※ Alt が機能しないため Settings - Keyboard - Application Shortcuts で Ctrl に変更

3. Docker Desktop

下記リンクの手順に従って、Ubuntu に Docker Desktop をインストールします。

https://docs.docker.com/engine/install/ubuntu/
1.Docker の APT レポジトリの設定
# Add Docker's official GPG key
# Add the repository to Apt sources
2.Docker パッケージのインストール
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.hello-world イメージの実行
sudo docker run hello-world

https://docs.docker.com/desktop/setup/install/linux/ubuntu/
sudo apt install gnome-terminal
docker-desktop-amd64.deb をダウンロード
sudo apt-get update
sudo apt install ./docker-desktop-amd64.deb
再起動
メニューから Development > Docker Desktop で起動。または systemctl --user start docker-desktop で起動
ユーザー登録は行わず、skip、skip で Docker Containers の画面が表示される

 
Docker Desktop のコンテナーのメモリ制限を、2GB(デフォルト)から4GBに変更する

 
Docker Desktop の自動起動
Docker Engine は、Xubuntu 標準のものと、Dify のためにインストールした Docker Desktop のものがあります。次のコマンドでどちらを使用しているか確認できます。

docker context ls

webmaster@noble01:~$ docker context ls
NAME              DESCRIPTION                               DOCKER ENDPOINT                                      ERROR
default           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock
desktop-linux *   Docker Desktop                            unix:///home/webmaster/.docker/desktop/docker.sock

Docker Desktop は、ユーザーがログインした後でないと起動できません。GUI で以下を設定します。

Settings、Session and Startup、Application Autostart
Add
Name: Docker Desktop
Comment: Docker Desktop 起動
Command: /opt/docker-desktop/bin/docker-desktop

Docker Desktop を起動すると、Dify のコンテナが自動的に起動します。

4. Dify

https://docs.dify.ai/getting-started/install-self-hosted/docker-compose

mkdir Repos
cd Repos

git clone --branch 1.18.0 https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env

openssl rand -base64 32
表示されたキーを .env の DIFY_AGENT_LOCAL_SANDBOX_AUTH_TOKEN に記入する
nano .env

docker compose up -d
インストールが完了すると、Docker Desktop で実行中になる

ブラウザで http://192.168.1.34/install または http://localhost/install を表示

管理者アカウントの設定
Email address
Username
Password

ブラウザで http://192.168.1.34/signin または http://localhost/signin を表示
Email と Password でログイン

LLMモデルの設定
連携 - モデルプロバイダーをインストール
OpenAI
API Key:********
デフォルトのモデルは gpt-5.4-mini
従来との互換性のために gpt-4.1 を選択

HTTPS 化(手順はこちら)
ドメインを取得し、ホスト名を登録する
ルーターの80と443のポートフォワードを、このPCにする
自分のドメインでこのPCの http://localhost/ が表示されることを確認する
docker/.env の編集。.env に、説明にある赤字の項目を設定する
コマンドの実行(Docker Desktop が立ち上がっていること)
cd dify/docker
docker compose --profile certbot up --force-recreate -d
コンテナが作成された後に、
docker compose exec -it certbot /bin/sh /update-cert.sh
docker/.env の(再)編集。.env に以下を設定する
NGINX_HTTPS_ENABLED=true
コマンドの実行
docker compose --profile certbot up -d --no-deps --force-recreate nginx
外部から https://your_domain.com で見れることを確認する
SSL 証明書の更新
docker compose exec -it certbot /bin/sh /update-cert.sh
docker compose exec nginx nginx -s reload
 

5. FAISS

Anaconda

https://www.anaconda.com/download

ホームページでメールを登録すると、ダウンロードリンクが届きます
Linux、現在 Python 3.14.4
Anaconda3-2026.07-1-Linux-x86_64.sh
をダウンロード。home ディレクトリにファイルを移動
bash ~/Anaconda3-2026.07-1-Linux-x86_64.sh
./anaconda3/bin/conda init
次のターミナルの起動から、conda 環境(base)になります

FAISS 用に、Python のバージョンを 3.12 にします
conda create -n faiss python=3.12 -y
conda activate faiss
echo 'conda activate faiss' >> ~/.bashrc

解除は conda deactivate
 

ベクトルデータベース(faiss)のインストール

事前準備

sudo apt install unzip

faiss-cpu インストール

conda install -c pytorch -c conda-forge faiss-cpu=1.15.1

※ バージョンは FAISS のウェブページに表示されているもの

動作確認のために、faiss のページにある DOWNLOAD ZIP からプログラムコード一式をダウンロードします

unzip faiss-main.zip
cd faiss-main/tutorial/python

コンソール
(faiss) webmaster@noble34:~/faiss-main/tutorial/python$ ls -1
1-Flat.py
10-FaissCuvsExample.ipynb
11-SVS.py
2-IVFFlat.py
3-IVFPQ.py
4-GPU.py
5-Multiple-GPUs.py
6-HNSW.py
7-PQFastScan.py
8-PQFastScanRefine.py
9-RefineComparison.py
実行
python 1-Flat.py
結果
True
100000
[[  0 393 363  78]
 [  1 555 277 364]
 [  2 304 101  13]
 [  3 173  18 182]
 [  4 288 370 531]]
[[7.6293945e-06 7.1751785e+00 7.2076302e+00 7.2511673e+00]
 [0.0000000e+00 6.3235664e+00 6.6845779e+00 6.7999382e+00]
 [3.8146973e-06 5.7964020e+00 6.3917236e+00 7.2815170e+00]
 [3.8146973e-06 7.2779007e+00 7.5279808e+00 7.6628418e+00]
 [0.0000000e+00 6.7638016e+00 7.2951088e+00 7.3688126e+00]]
[[ 381  207  210  477]
 [ 526  911  142   72]
 [ 838  527 1290  425]
 [ 196  184  164  359]
 [ 526  377  120  425]]
[[ 9900 10500  9309  9831]
 [11055 10895 10812 11321]
 [11353 11103 10164  9787]
 [10571 10664 10632  9638]
 [ 9628  9554 10036  9582]]

実行
python 2-IVFFlat.py
結果
[[ 9900  9309  9810 10048]
 [11055 10895 10812 11321]
 [11353 10164  9787 10719]
 [10571 10664 10632 10203]
 [ 9628  9554  9582 10304]]
[[ 9900 10500  9309  9831]
 [11055 10895 10812 11321]
 [11353 11103 10164  9787]
 [10571 10664 10632  9638]
 [ 9628  9554 10036  9582]]

実行
python 3-IVFPQ.py
結果
[[   0   78  424  608]
 [   1  555 1063  380]
 [   2  179  304   33]
 [   3  265  527  139]
 [   4  288  531  827]]
[[1.5948839 6.2905183 6.3059173 6.5697308]
 [1.282814  5.9320083 5.9512424 6.5773916]
 [1.698801  6.1244454 6.2004113 6.401427 ]
 [1.82021   6.721145  6.8056335 6.995647 ]
 [1.4857421 5.8346977 6.303232  6.400938 ]]
[[ 8746  9380 10914  9842]
 [10913 11373  9014 10507]
 [10719 11291 10600 11353]
 [11578  9671 10709 10664]
 [ 9229  9878  9905  9459]]

 

PostgreSQL インストール

sudo apt update
sudo apt install postgresql postgresql-contrib
psql --version

sudo -i -u postgres
psql
postgres=#

CREATE USER admin WITH PASSWORD 'mypassword' SUPERUSER;
CREATE USER webmaster WITH PASSWORD 'mypassword';

CREATE DATABASE webmaster OWNER webmaster;

\q
で抜ける
exit
で postgres ユーザーを抜ける

psql -U webmaster -d webmaster -h localhost

CREATE TABLE knowledge_documents (
    id UUID PRIMARY KEY,
    knowledge_id TEXT NOT NULL,
    content TEXT NOT NULL,
    title TEXT NOT NULL,
    metadata JSONB,
    created_at TIMESTAMP DEFAULT now()
);

\q
で抜ける

\d knowledge_documents  (テーブル一覧)
\l  (データベース一覧)
\c  (現在接続しているデータベース)
SELECT * FROM knowledge_documents;
TRUNCATE TABLE knowledge_documents;
 

faiss_service の作成

次のように作成します。

項目 ツール
文書データベース PostgreSQL
ベクトルデータベース・検索 faiss-cpu
埋め込み(Embeddings) OpenAI API(text-embedding-3-small)
ナレッジIDを指定して切り替え可能
ウェブサーバー Python Flask
# 一旦、通常の Ubuntu 環境に戻す
conda deactivate

sudo apt update
sudo apt install -y build-essential libpq-dev python3-dev

# conda 環境で実行
conda activate faiss
pip install flask psycopg2 openai flasgger ollama

mkdir faiss_service
cd faiss_service
nano faiss_service.py

[faiss_service.py を他のPCからコピーして入手]

LangChain を使用したチャンク分割(upload_files_chunk)は行わないこととし、upload_files_chunk の部分を削除します。また、LangChain の API_KEY も設定しません。

faiss_gpu から faiss_cpu への変更

faiss_service.py
# 変更前
res = faiss.StandardGpuResources()  # use a single GPU
gpu_index = faiss.index_cpu_to_gpu(res, 0, index)
index = faiss.index_gpu_to_cpu(gpu_indexes[knowledge_id])

# 変更後
#res = faiss.StandardGpuResources()  # コメントアウトまたは削除
gpu_index = index  # 3か所
index = gpu_indexes[knowledge_id]  # 1か所

実行
export PSQL_DB_PASSWORD="..."
export OPENAI_API_KEY="..."
python faiss_service.py

ウェブページを表示

http://192.168.1.34:8000/apidocs/

コンテンツエディター

登録済みのコンテンツ(テキスト)を確認・編集するためのウェブページを作成します。[保存して更新]ボタンを押下すると、faiss_service の delete と add を呼び出します(Faiss を使用しているため、登録済みの内容は変更ではなく、再登録します)。

pip install requests

mkdir content_editor
cd content_editor
nano app.py

[app.py を他のPCからコピーして入手]

mkdir templates
nano templates/index.html
nano templates/edit.html

[index.html と edit.html を他のPCからコピーして入手]
 

[ 実行 ]
export PSQL_DB_PASSWORD="******"
python app.py
 

[ 表示 ]
http://localhost:5000/
または、
http://192.168.1.34:5000/
(他のPCからIPアドレスを指定)
 

 

   

 

Ubuntu 起動時に Python プログラムを実行する

参考ページ1:
https://udemy.benesse.co.jp/development/system/shellscript.html

cd ~
nano py_app_service.sh

py_app_service.sh
export PSQL_DB_PASSWORD="..."
export OPENAI_API_KEY="..."
/home/webmaster/anaconda3/envs/faiss/bin/python /home/webmaster/faiss_service/faiss_service.py &
/home/webmaster/anaconda3/envs/faiss/bin/python /home/webmaster/content_editor/app.py &
wait

chmod 744 py_app_service.sh
bash py_app_service.sh

 

参考ページ2:
https://note.com/ipa713/n/ndf1b4941362d

cd /etc/systemd/system
sudo nano run_python.service

run_python.service
[Unit]
Description=python run
After=network.target

[Service]
Type=simple
User=webmaster
WorkingDirectory=/home/webmaster/faiss_service
ExecStart=/bin/bash /home/webmaster/py_app_service.sh
Restart=on-failure
KillMode=control-group

[Install]
WantedBy=multi-user.target

※ データファイルを読み込むため、ワーキングディレクトリを faiss_service に設定する

sudo systemctl daemon-reload
sudo systemctl enable run_python.service
sudo systemctl start run_python.service
sudo systemctl status run_python.service

sudo systemctl stop run_python.service
 

多数のファイルを一度に登録する

faiss_service の画面では、最大20個のファイルを手動で指定し、登録できるようにしています。実際は、別に Python プログラムを作成し、テキストファイル(input.txt)に記述したファイル一覧をもとに、一括登録できるようにしています。input.txt の1行目には、すべてのファイルに共通するナレッジIDを記入し、2行目以降には登録するファイル名を記述します。プログラムは faiss_service.py の upload_files をもとに作成しいますが、ここでは内容を割愛します。

ファイル一覧の作成:
ls *.txt > input.txt
nano input.txt
1行目にナレッジIDを記入
2行目以降はファイル名

python upload_files.py

 

Dify と FAISS を接続

Dify で外部ナレッジベースの設定を行って、faiss_service に接続します。

ナレッジ
「外部ナレッジベースと連携 →」

外部ナレッジベース連携APIを追加

API Key は未使用なので ABCdef など


外部ナレッジベース名: ローカルRAG
外部ナレッジベースID: AAA-BBB-CCC

「連携 →」ボタン押下
 

事前準備(以前からの修正)

従来は Dify 1.13.0 を使用していましたが、1.18.0 に変更したところ、以下の対応が必要でした。

SSRF プロキシ対応
cd dify/docker
nano .env

変更前:
SSRF_PROXY_ALLOW_PRIVATE_IPS=

変更後:
SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.1.34

設定の反映
docker compose up -d --force-recreate ssrf_proxy

確認
docker exec docker-ssrf_proxy-1 \
  cat /etc/squid/dify_allow_private.conf
 

faiss_service.py、retrieval のレスポンスにおける score の型変換
変更前:
records.append({
  "score": score
変更後:
records.append({
  "score": float(score)
 

6. その他

□ ファイアウォール
sudo ufw enable
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw reload

sudo ufw status
sudo ufw status numbered
sudo ufw delete 3

 
□ ブルートフォース攻撃対策
sudo apt update
sudo apt install fail2ban

sudo nano /etc/fail2ban/jail.d/sshd.local

[sshd]
enabled = true
backend = systemd
port = ssh
filter = sshd
maxretry = 5
findtime = 600
bantime = 86400

10分間に5回以上SSH認証に失敗したIPアドレスを、24時間遮断する設定になる

sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

  
以上、

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?