0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu上のOllama+Open WebUIで構築したローカルLLMでRAG(前編)

Last updated at Posted at 2025-04-12

はじめに

今流行りのローカルLLMを作ったので、その作成方法を公開します。
採用するのは簡単にできそうなOllama+Open WebUIで、Dockerコンテナ上に立てます。
環境構築から始めてパラメータチューニングの方法まで解説します。

前編は構築編として、初期設定からRAGができるようになるところまでを解説していきます。
後編はコード解説編として、RAG周りのコードを読んでどのような処理をしているのかを解説していきます。

ハードウェア構成
・CPUはIntel(R) Core(TM) i5-8400
・GPUはGeForce GTX 1050
・メモリはDDR4 32GB

ソフトウェア構成
・OSはUbuntu Server 24.04.02 LTS
・Dockerを使ってその上にOllamaとOpen WebUIを構築

GPUがあるのでDockerでもGPUが使えるようにセットアップしていきます。
正直機械学習を行うには低スペックなPCですが、構築方法やパラメータ解説自体は参考になるかなと思います。

完成図は以下です。

abs.png

OSインストール

ここは省略します。
今回は機械学習でよく使われている(と個人的に思っている)Ubuntu Server 24.04.02 LTS
をインストールしました。
詳細は他の記事にいくらでも転がっていると思うので省略します。
Ubuntuが起動し、SSHログインできるようになった状態からスタートします。

Dockerインストール

ここからDockerを使えるようにするための準備をしていきます。

Dockerの公式ドキュメントのPrerequisitesに従って
GPUドライバインストール、nvidia-container-toolkitのインストールの順番でいきます。

GPUドライバインストール

GPUドライバのインストールは魔境なのですが、nvidiaの人の記事を参照してcuda-toolkit経由でGPUドライバを入れます。1

写真のように自分の構成に合わせて出てきたスクリプトを入れます。

cudatoolkit.png

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-ubuntu2404.pin
sudo mv cuda-ubuntu2404.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-ubuntu2404-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2404-12-8-local_12.8.1-570.124.06-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2404-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8
sudo apt-get -y install cuda-drivers

一度再起動し、これでnvidia-smiコマンドが打てるようになっていればOKです。

nvidia-smi.png

nvidia-container-toolkitのインストール

NVIDIAの公式サイトに従って、nvidia-container-toolkitをインストールしていきます。これは公式ドキュメントのPrerequisitesに書いてある通りです。

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

両方インストールできたら改めてDockerをインストールします。
Dockerの公式ドキュメントのインストールガイドに従ってインストールします。

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

これでDockerインストールできたことを確認します。

sudo docker run hello-world

docker.png

Hello from Docker!が表示されればDockerのインストールは問題ありません。
また、コンテナ上でもGPUがちゃんと認識できているか確認します。

sudo docker run -it --rm --gpus all ubuntu nvidia-smi

docker_nvidia-smi.png

うまくコンテナ上で問題なくnvidia-smiができていればDockerのインストール完了です。

なお、これからはsudoコマンドを毎回打つのが面倒なのでdockerユーザグループを作り、そこにtestユーザを追加しておきます。詳細は公式ドキュメントを参照してください。Ubuntu Serverなら以下のコマンドでOKです。

sudo usermod -aG docker $USER
logout

一度ログアウトし、再ログインすればsudoなしでもdockerコマンドが使えるようになっています。

sudodocker.png

Ollama+Open WebUIの起動

Open WebUIの公式ドキュメントを参照してコンテナを起動します。

docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama

ついでにバージョン管理のためにwatchtowerを入れます。
1日(86400秒)に1回Updateの確認をし、自動でコンテナイメージのアップデートをしてくれるようにします。

docker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --interval 86400 open-webui

自動でアップデートされるのが嫌な方はこの手順は飛ばすでもOKです。
Open WebUIの公式ドキュメントに手動アップデートの方法も書かれているので参照にしてください。

ちなみにイメージが更新されると以下のようにログに表示されます。
スクリーンショット 2025-04-02 18.19.07.png

http://IPアドレス:3000
にアクセスを実施し、Open WebUIの画面が出てくればOKです。

GUIで管理者アカウントを作り、ログインしてください。

スクリーンショット 2025-03-24 20.51.22.png

Ollamaのセットアップ&テスト

好きなLLMを一覧から選んでダウンロードします。
パラメータ数が少なめのllama3.2:1bとパラメータ数が多めのqwqをひとまずダウンロードしておきます。

llama.png

qwq.png

docker container exec open-webui ollama pull qwq
docker container exec open-webui ollama pull llama3.2:1b

Open WebUIの画面で右上で好きなモデルを選択できるようになっているかと思います。

それぞれ会話をしてみます。

select.png

パラメータ数が少ないllama3.2:1bはちょっと日本語が怪しそうですが、無事に回答は返って来ました。2

次はqwqに「こんにちは」と投げかけてみましょう。

qwq.png

ちょっとはまともそうな会話になりそうです。

それぞれのGPU利用状況を見てみましょう。

nvidia_1b.png

こちらは画像下側でOllamaのプロセスがGPUメモリを1500MiB使っていることが確認できます。

qwqを実行した時は、ここのプロセスが表示されません。
コンテナのログを見てみましょう。

docker container logs open-webui

qwqはパラメータ数が32bであり、合計で19.7GBのメモリが必要というログが出ています。

qwq_log.png

必要なメモリが多すぎるため、GPUメモリに乗らなかったようです。
その分は普通のメモリに表れています。

こちらがqwqを実行する直前freeの状況です。

free_bf.png

こちらがqwqを実行した直後freeの状況です。
free_af.png

usedが増えており、必要なメモリ数を確保していることがわかります。

RAGのテスト

ここからはOpen WebUIではデフォルトで使えるRAGを試していきます。

まずはRAGのために使用する架空のデータを生成します。
ネットに出ているものはすでに学習されている可能性があるので、今回は新たに生成した架空の人物の紹介文を使っていきます。

以下のプロンプトでデータを生成します。

架空の人物である男女4人の紹介を行ってください。
氏名、部署名、役職、部署での業務、趣味は必ず含めてください。
文字数は各人500文字程度としてください。

結果が出力されました。

アストラ.png

全文は長いので折りたたんで記載しておきます。

林小夏(リン・ショウハ)

部署:AI研究開発部
役職:シニアAIエンジニア
業務内容:
主に自然言語処理(NLP)を活用した会話型AIの開発を担当。医療診断支援システムのアルゴリズム設計や、製造業向けの予測メンテナンスAIのテスト工程をリード。チーム内の若手エンジニアのメンタリングも行い、週1回の技術勉強会を主催しています。近年は医療機関との共同研究プロジェクトを推進し、倫理的なAIの活用方法についても研究中です。
趣味:
週末は古本屋巡りを楽しみ、特に1950年代のSF小説に造詣が深い。自宅で3Dプリンタで小型ロボットを自作する「工作マニア」でもあり、昨年はアマゾン川の熱帯雨林調査チームに協力し、野生動物の生体情報収集用ドローンを製作。また、月1回は陶芸教室に通い、制作した作品はすべて地元の子供病院に寄付しています。

陳立(チェン・リ)

部署:グローバルマーケティング部
役職:地域担当マネージャー
業務内容:
東南アジア市場における新製品のプロモーション戦略を統括。現地企業との提携交渉や、SNSを活用したコンテンツマーケティングを指揮。特に、タイ・ベトナム市場向けのローカルタレント起用キャンペーンで売上150%増を達成。最近ではメタバースを活用したバーチャル展示会の企画を推進し、VR空間での商談システムの構築を進める。
趣味:
中国伝統楽器の二胡を演奏する「隠れ芸人」であり、休日はオンラインでクラシック音楽の配信をしています。また、自宅のガレージを改造した「家庭用自動車整備工房」で、1965年式のイギリス製ヴィンテージカーのレストアに没頭。車検証はなくとも、公道走行可能な状態を目指しています。

佐藤美咲(サトウ・ミサキ)

部署:サステナビリティ推進室
役職:SDGsプロジェクトリーダー
業務内容:
企業のカーボンフットプリント算定システムの構築と、再生可能エネルギー活用のコンサルティングを担当。特に、食品廃棄物をバイオガスに転換する技術の実証実験を主導。社内では環境経営の意識向上を目的に、従業員向けの「エコポイント制度」を考案し、参加率75%を達成。現在は海洋プラスチック問題に取り組むNGOと協力し、AIで廃棄物の種別分類を行うシステムの開発中です。
趣味:
週末は山梨県の果樹園でボランティアとしてリンゴの収穫作業を手伝い、収益の一部を自然保護団体に寄付。また、自宅の屋上を「垂直ガーデン」に改造し、都市農業の実験を継続中。最近では、家庭菜園で収穫した野菜を使った「サステナブル料理」のレシピ動画をYouTubeで配信し、サブスクリプション数1万人を超えました。

中村翔太(ナカムラ・ショウタ)

部署:プロダクトデザイン部
役職:UX/UIデザインチーム リード
業務内容:
金融機関向けのデジタルバンキングアプリのユーザーインターフェース設計を担当。特に、視覚障害者向けの音声ガイド機能の開発で業界初の認定を獲得。最近ではメタバース空間での仮想店舗のUIデザインを手がけ、バーチャル空間での購買行動の分析データを活用したデザイン改善を推進中。週2回は外部のUX設計のワークショップを開催し、業界の標準化に貢献しています。
趣味:
週末は自転車で郊外の廃墟を探索する「廃墟アート」を撮影し、写真展を開催。SNSでは「廃墟から生まれる未来のデザイン」と題した連載コラムで人気を集めています。また、自宅の地下室を改造した「暗室」で銀塩フィルム写真の現像作業をこなし、作品は現代美術館の企画展でも展示されました。

それぞれrin.txtchen.txtmisaki.txtshota.txtという名前で保存し、これを使います。

Open WebUIではチャット画面の「+」ボタンよりドキュメントを選択し、そのファイルについて質問をする機能があります。
しかし、会社等でローカルLLMを構築する際は、固有の知識をLLMに前もって入れておき、好きな時に参照させるといったことがやりたいと思います。
Open WebUIではその機能がすでに実装されており、それをナレッジベースと呼びます。
GUIでは「ワークスペース」→「ナレッジベース」になります。

knowledge.png

実際に作ってみましょう。
右上の「+」を押すと「Create a knowledge base」が表示されるので「What are you working on?」には名前を、「What are you trying to achieve?」には説明を記載します。

create.png

ナレッジベースができたので、ファイルを添付します。

add_file.png

4人分を添付すれば今回作ったナレッジベースは完成です。なお、できたものは「コレクション」と呼ばれます。
コレクション内の一つのファイルをクリックしてみましょう。shota.txtで表示されているように改行は消えているところが確認できるかと思います。

スクリーンショット 2025-03-24 0.55.07.png

後編ではこのファイル添付でどのようなスクリプトを動いているかを解説しますが、今回は深入りしません。

それではこのナレッジを使ってRAGを実際にやっていこうと思います。

このナレッジベースに格納した情報を使うには、プロンプトに「#」を入れ、対応するナレッジを選択するだけです。

スクリーンショット 2025-04-08 18.15.45.png

「COLLECTION」に表示されている「人物紹介」を選択し、チェンについて聞いてみたいと思います。

スクリーンショット 2025-04-08 18.16.24.png

質問文を入れて、メッセージを送信してみます。

スクリーンショット 2025-04-08 18.14.48.png

うまく回答してくれましたね。

またPDFを添付した時の状態を見ていきます。
今回は具体例としてIMAP4 rev1が書かれているRFC2060のPDF版を与えてみたいと思います。

ファイル名(rfc2060.txt.pdf)を選択して、中身を見てみましょう。

スクリーンショット 2025-03-22 9.20.50.png

ぱっと見では目次に使われている...が見づらいですね。
ヘッダーやフッターが何度も表示されていることもわかると思います。

検索のためにも**不要な部分(重複するヘッダー、フッター部分、目次など)は取り除くこと*が大事です。

終わりに

今回はUbuntuにDockerを使ったOllama+Open WebUI環境を構築し、RAGをするところまで実施しました。後編はコードを読んでどのように動いているか解説していきたいと思います。

  1. DockerのドキュメントのリンクになっていたNVIDIAの公式サイトではうまくGPUドライバがインストールできませんでした

  2. 公式ドキュメントのSupported Languagesに日本語が入っていないので、しょうがないところはあると思います。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?