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ナレッジに投入した公開レポジトリの紹介です。
- https://github.com/docker/docs
- https://github.com/kubernetes/website
- https://github.com/ollama/ollama
- https://github.com/open-webui/docs
- https://github.com/longhorn/website
- https://github.com/python/cpython
- https://github.com/cilium/cilium
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