🐥

Open WebUI の RAG 利用時に参照するナレッジドキュメントのバルクアップロードスクリプト

に公開

前置き

最近はAI初心者がLLMを触ってみたという記事でOllamaとOpen WebUIをMac mini M4で動かすといったことを書きましたが、今回またOpen WebUIに関係する記事となります。

指定のGitHubの公開レポジトリよりデータをダウンロードし、指定のディレクトリ以下の指定のファイルタイプを、Open WebUI上の指定のknowledge collectionにアップロードするスクリプトを作りました。

Open WebUI自体のknowledgeへドキュメントをアップロードする機能自体、フォルダ単位でアップロードできるなど多機能で、不便に感じることはないと思います。それでも書いてしまいましたのがowui-knowledge-managerスクリプトです。公開レポジトリにございます。今回はこれを紹介します。

https://github.com/pkkudo/owui-knowledge-manager.git

なぜこのスクリプトを書いたのか(どういう利便性を求めたのか)

  • おうちラボで多様なopen sourceサービスを利用しており、各サービスの公式ドキュメントをRAGのソースとして用意しておくと便利かもしれないという思いつき
  • サービスによってはバージョンごとのドキュメントがbranch, tag, releaseなどで管理されており、都度ずばりおうちラボで利用しているバージョンのドキュメントがあるとなお良いかもしれないという思いつき

実行される内容

以下の三つのコマンド例に沿ってスクリプトが実行する内容を紹介します。

  • 一つ目のコマンド
    • kubernetes/websiteレポジトリのsnapshot-initial-v1.32リリースのアーカイブデータをダウンロードし、展開する
    • レポジトリ内、content/en/docs/conceptsフォルダ内の".md"でファイル名が終わるものを収集する
    • kube-conceptという名称のknowledge collectionをOpen WebUI上に用意
    • 指定のkube-concept knowledge collectionに収集したファイルを投入する
  • 二つ目のコマンド
    • レポジトリ内、content/en/docs/referenceフォルダ内の".md"でファイル名が終わるものを収集する
    • kube-refという名称のknowledge collectionをOpen WebUI上に用意
    • 指定のkube-ref knowledge collectionに収集したファイルを投入する
  • 三つ目のコマンド
    • Open WebUI上の既存のknowledge collection名をリストし、
    • 各コレクションに含まれるファイル数と合計ファイルサイズを表示する
  • そのほかメモ
    • --dir 指定ディレクトリよりrecursiveに掘ってファイルを集めてきます
    • tag, branch, release指定ない場合はmain, masterの順にデータダウンロードを試みます
    • ".rst"ファイルの場合、(Open WebUIのUI操作からでも)ナレッジコレクションにファイル追加できないため、pandocがPATHにある場合はmarkdownに変換してアップロードし、ない場合は諦めてなにもアップロードしません
# download repository archive zip file
# and upload markdown files in content/en/docs/concepts directory to Open WebUI
# and create "kube-concept" knowledge collection and add files there
python app.py --download \
  --repo kubernetes/website \
  --release snapshot-initial-v1.32 \
  --upload \
  --collection_name kube-concept \
  --filter md \
  --dir content/en/docs/concepts

# (data is already downloaded...)
# (data download will be skipped even if you set "--download" in the argument)
# upload markdown files in content/en/docs/reference directory to Open WebUI
# and create "kube-ref" knowledge collection and add files there
python app.py --upload \
  --repo kubernetes/website \
  --release snapshot-initial-v1.32 \
  --collection_name kube-ref \
  --filter md \
  --dir content/en/docs/reference

# list knowledge collections available
# along with the file count and total size for each collection
python app.py --list

--uploadと一緒に--prepareを渡すと、実際のファイルアップロード手前でスクリプトは止まり、アップロード予定のファイル数と合計サイズが確認できます。この時指定したコレクション名は作られてしまうので、まったく関係ない名前でこのコマンドを走らせる場合はUIから手動で片づけてください。

以下はdockerのドキュメンテーションが置いてあるレポジトリでの例ですが、すべて丸ごととなるとすごいボリュームになります。私の場合は別々のナレッジコレクションに分けて格納することにしました。

$ python app.py --download \
  --repo docker/docs \
  --upload \
  --collection_name test \
  --prepare
2025-03-22 22:04:21,406 INFO Starting Open WebUI Knowledge Manager...
2025-03-22 22:04:21,406 INFO Generating download URL...
2025-03-22 22:04:21,406 INFO The knowledge source data is already downloaded
2025-03-22 22:04:21,407 INFO Collecting files...
2025-03-22 22:04:21,407 INFO Start collecting knowledges in kb-source/docker/docs
2025-03-22 22:04:21,424 INFO Collected 2174 knowledge sources sizing 39,727,691 byte.
2025-03-22 22:04:21,424 INFO Ensuring the knowledge collection is created...
2025-03-22 22:04:21,586 INFO Collection test already exists
2025-03-22 22:04:21,586 INFO Knowledge ID found: e157d312-732b-4410-9131-8775b759a73f
2025-03-22 22:04:21,587 INFO Stopping the upload actions here when --prepare is set

$ du -sh kb-source/docker/docs/
45M     kb-source/docker/docs/

そしてダウンロードデータ、展開したものなどすべて片づけるには./kb-sourceディレクトリに入っているのでディレクトリを削除してください。

なお".rst"のように、ファイル形式によってはOpen WebUIはアップロードを受け付けるもののナレッジコレクションへの追加はできないというものが他にもあると思います。その場合はアップロードだけしてナレッジとして使えない状態になってしまうので、そういったファイルを片づけるコマンドも用意してあります。以下、何もクリーンアップ対象はなかった時の出力となりますが実行例です。

$ python app.py --cleanup
2025-03-22 22:12:32,913 INFO Starting Open WebUI Knowledge Manager...
2025-03-22 22:12:32,913 INFO Retrieve knowledge collections list
2025-03-22 22:12:33,068 INFO Retrieve uploaded files list
2025-03-22 22:12:33,695 INFO Clean up uploaded files not used in any collection
2025-03-22 22:12:33,696 INFO File ID count: 2134

$ python app.py --list
2025-03-22 22:15:15,413 INFO Starting Open WebUI Knowledge Manager...
2025-03-22 22:15:15,604 INFO Collection Name: kube-tasks
2025-03-22 22:15:15,604 INFO File Count: 211
2025-03-22 22:15:15,604 INFO Knowledge size: 1,661,430
2025-03-22 22:15:15,604 INFO Collection Name: kube-ref
2025-03-22 22:15:15,604 INFO File Count: 973
2025-03-22 22:15:15,604 INFO Knowledge size: 6,003,566
2025-03-22 22:15:15,604 INFO Collection Name: kube-concept
2025-03-22 22:15:15,604 INFO File Count: 147
2025-03-22 22:15:15,604 INFO Knowledge size: 1,757,209
2025-03-22 22:15:15,604 INFO Collection Name: ollama-docs
2025-03-22 22:15:15,604 INFO File Count: 14
2025-03-22 22:15:15,604 INFO Knowledge size: 142,509
2025-03-22 22:15:15,604 INFO Collection Name: owui-docs
2025-03-22 22:15:15,604 INFO File Count: 32
2025-03-22 22:15:15,604 INFO Knowledge size: 216,316
2025-03-22 22:15:15,604 INFO Collection Name: longhorn-docs
2025-03-22 22:15:15,604 INFO File Count: 152
2025-03-22 22:15:15,604 INFO Knowledge size: 741,789
2025-03-22 22:15:15,604 INFO Collection Name: python-3.13-library
2025-03-22 22:15:15,604 INFO File Count: 319
2025-03-22 22:15:15,604 INFO Knowledge size: 6,901,912
2025-03-22 22:15:15,604 INFO Collection Name: cilium-docs
2025-03-22 22:15:15,604 INFO File Count: 286
2025-03-22 22:15:15,604 INFO Knowledge size: 3,656,733

レポジトリや投入コマンド例

Open WebUIナレッジに投入した公開レポジトリの紹介です。

python app.py --download \
  --repo docker/docs \
  --upload \
  --collection_name docker-ref \
  --filter md \
  --dir content/reference

python app.py --repo docker/docs \
  --upload \
  --collection_name docker-guides \
  --filter md \
  --dir content/guides

python app.py --repo docker/docs \
  --upload \
  --collection_name docker-build-manual \
  --filter md \
  --dir content/manuals/build

python app.py --repo docker/docs \
  --upload \
  --collection_name docker-compose-manual \
  --filter md \
  --dir content/manuals/compose

python app.py --repo docker/docs \
  --upload \
  --collection_name docker-engine-manual \
  --filter md \
  --dir content/manuals/engine

python app.py --repo docker/docs \
  --upload \
  --collection_name docker-security-manual \
  --filter md \
  --dir content/manuals/security

python app.py --download \
  --repo kubernetes/website \
  --release snapshot-initial-v1.32 \
  --upload \
  --collection_name kube-concept \
  --filter md \
  --dir content/en/docs/concepts

python app.py --upload \
  --repo kubernetes/website \
  --release snapshot-initial-v1.32 \
  --collection_name kube-ref \
  --filter md \
  --dir content/en/docs/reference

python app.py --upload \
  --repo kubernetes/website \
  --release snapshot-initial-v1.32 \
  --collection_name kube-tasks \
  --filter md \
  --dir content/en/docs/tasks

python app.py --upload --download \
  --repo ollama/ollama \
  --tag v0.6.0 \
  --collection_name ollama-docs \
  --filter md \
  --dir docs

python app.py --upload --download \
  --repo open-webui/docs \
  --collection_name owui-docs \
  --filter mdx \
  --dir docs

python app.py --upload --download \
  --repo longhorn/website \
  --collection_name longhorn-docs \
  --filter md \
  --dir content/docs/1.9.0

python app.py --upload --download \
  --repo python/cpython \
  --tag v3.13.2 \
  --collection_name python-3.13-library \
  --filter rst \
  --dir Doc/library

python app.py --upload --download \
  --repo cilium/cilium \
  --tag v1.17.1 \
  --collection_name cilium-docs \
  --filter rst \
  --dir Documentation

終わりに

公開レポジトリ情報はやはり学習しつくされているのか、ナレッジコレクションを指定せずに質問しても素晴らしい回答が返ってきます。特にプログラミングに関する質問をするならば、専用に追加トレーニングされたモデルがいくらでもあります。

このスクリプトを用意してよかったと思う時が来るのか自信がありませんが、作っていて楽しかったです。以上!

Discussion