Wikipediaのデータから作成したローカルRAGを検索し、その検索結果をOllama上のローカルLLMへ渡して回答を生成するWeb UIです。
このリポジトリは RAGを実際に検索してLLMを動かす部分 を担当します。Wikipediaダンプの変換や、FAISS / SQLiteインデックスの生成は別プロジェクトで行います。
Wikipedia XML dump
│
▼
wikipediadump_xml-to-jsonl
│
│ JSONL (.bz2)
▼
generate-RAG-from-jsonl
│
│ FAISS + SQLite + vector data
▼
LocalLLM_with_RAG
│
├─ RAG検索
├─ Ollamaで回答生成
└─ 参照したWikipedia記事をViewerで表示
このシステムはWindows上での利用を前提にしています。
最低限、次の環境が必要です。
- Python
- Ollama
- Pythonから利用できる
ollama - NumPy
- FAISS
generate-RAG-from-jsonlで生成済みのRAGデータ- Ollamaに登録済みのEmbeddingモデル
- 回答生成に使用するOllamaモデル
現在のRAGは ruri-v3
系のEmbedding設定で生成したデータを前提としています。検索時にも、インデックス生成時と同じEmbeddingモデル・次元数・query
prefixを使用する必要があります。
回答生成用モデルはWeb UIから選択できます。
注意
このリポジトリだけではWikipediaデータからRAGを生成できません。 RAGデータの作成には
generate-RAG-from-jsonlを使用してください。
3つのリポジトリ、生成データ、外部Viewerを次のように並べる構成を想定しています。
RAG/
├─ wikipediadump_xml-to-jsonl/
├─ generate-RAG-from-jsonl/
├─ LocalLLM_with_RAG/
│ ├─ webui.py
│ ├─ start-rag.cmd
│ ├─ start-rag-kiwix.cmd
│ ├─ prompts/
│ ├─ static/
│ ├─ templates/
│ ├─ wikirag/
│ └─ docs/
│
├─ data/
│ ├─ index/
│ ├─ wikipedia_viewer/
│ │ └─ wikipedia_articles.sqlite3
│ └─ kiwix/
│ └─ wikipedia_ja_all_nopic_YYYY-MM.zim
│
└─ tools/
├─ wikipedia_viewer/
│ └─ wikipedia_jsonl_viewer.py
└─ kiwix/
├─ kiwix-serve.exe
└─ Kiwix Toolsの関連ファイル
LocalLLM_with_RAG から見ると、
../data/index
../data/wikipedia_viewer
../data/kiwix
../tools/wikipedia_viewer
../tools/kiwix
を参照します。
generate-RAG-from-jsonl で生成したproduction indexを、
RAG/data/index/
へ配置します。
LocalLLM_with_RAG/webui.py はデフォルトで、
../data/index
を検索インデックスとして読み込みます。
このフォルダには少なくとも、生成処理によって作られた
config.json、metadata.sqlite、FAISS shard、shard
manifest、および設定に応じたvectorデータが存在する構成になります。
ファイルを個別に手作業で作るのではなく、generate-RAG-from-jsonl
の出力一式をそのまま使用することを想定しています。
Ollamaを起動し、次の2種類のモデルを利用できる状態にします。
RAG生成時に使用したものと同じEmbeddingモデルが必要です。
検索質問は実行時にEmbeddingされ、そのベクトルをFAISS indexと比較します。そのため、RAG生成時と検索時でEmbedding設定を変えることはできません。
回答生成用モデルはWeb UIの Model から選択します。
UIはOllamaに登録されているモデル一覧を取得し、Embedding用と思われるモデルを除いて表示します。
デフォルトモデルは webui.py
で指定されていますが、UI上で別のモデルを選択できます。
JSONL Viewerを記事Viewerとして使う場合は、
start-rag.cmdを実行します。
直接Pythonから起動する場合は、
python webui.py --viewer jsonl --open-browserです。
デフォルトでは、
http://127.0.0.1:8765
でWeb UIが起動し、ブラウザが開きます。
Kiwix Viewerを使う場合は、
start-rag-kiwix.cmdまたは、
python webui.py --viewer kiwixで起動します。
Kiwixを使うには、後述する tools/kiwix と data/kiwix
の準備が必要です。
Web UIを開くと、質問入力欄と検索・生成パラメータが表示されます。
基本的には、
- Question に質問を書く
- Model で回答に使うOllamaモデルを選ぶ
- 必要なら Search mode を変更する
- Ask を押す
だけで使用できます。
回答の下には、検索時間、生成時間、コンテキスト文字数、token数などの情報が表示されます。
回答下部の Referenced articles を開くと、RAG検索で参照したWikipedia記事が記事単位で表示されます。
記事タイトルをクリックすると、選択しているArticle Viewerで元記事を開きます。
RAGのチャンクを無理に結合して「元記事らしいもの」を作るのではなく、元データ側の記事を別Viewerで表示する設計です。
Web UIの Quit ボタンで終了できます。
通常起動では、Web UIを表示しているブラウザページが閉じられたことも監視しており、ブラウザセッションが終了するとWebサーバーも終了します。
通常は article_focus または auto を使用します。
モード 用途
article_focus 質問先頭から記事を特定し、その記事内を重点的に検索
auto 記事特定とWikipedia全体検索を自動的に組み合わせる
legacy_auto 旧auto方式との比較・検証
strict 対応する記事を確定できた場合だけ検索
balanced 本命記事と関連する別記事を組み合わせる
discovery Wikipedia全体を横断して関連情報を探す
検索方法を詳しく知りたい場合は、
docs/SEARCH_MODES.md
docs/SEARCH_DESIGN.md
を参照してください。
data はGitリポジトリの外に置く、大容量データ用のフォルダです。
data/
├─ index/
├─ wikipedia_viewer/
│ └─ wikipedia_articles.sqlite3
└─ kiwix/
└─ wikipedia_ja_all_nopic_YYYY-MM.zim
RAG検索本体が使用するデータです。
generate-RAG-from-jsonl が生成したFAISS
index、検索用SQLite、vectorデータ、設定ファイルなどをまとめて配置します。
webui.py → wikirag/search_engine.py がこのフォルダを読み込みます。
JSONL Viewer専用のデータです。
wikipedia_articles.sqlite3
は、Wikipediaの元JSONLを記事単位で閲覧するためのSQLiteデータベースです。
これはRAG検索用の、
data/index/metadata.sqlite
とは別物です。
metadata.sqlite: RAG検索用wikipedia_articles.sqlite3: 元記事閲覧用
という役割分担です。
Kiwixで使用するZIMファイルを置きます。
例:
wikipedia_ja_all_nopic_2026-06.zim
Kiwixを使わない場合は不要です。
tools には、本体とは独立した補助プログラムを置きます。
tools/
├─ wikipedia_viewer/
└─ kiwix/
Wikipedia JSONLから作成した記事データベースを表示する専用Viewerです。
中心となるスクリプトは、
wikipedia_jsonl_viewer.py
です。
RAG本体は記事タイトルをこのViewerへ渡します。
概念的には次のように呼び出しています。
py wikipedia_jsonl_viewer.py --db <database> --title "<記事タイトル>"Viewer自身がSQLiteから記事を検索し、全文を表示します。
KiwixをArticle Viewerとして使う場合のKiwix Toolsを置きます。
kiwix-serve.exe
と、その実行に必要な関連ファイルを同じフォルダへ配置します。
ZIM本体は tools ではなく、
data/kiwix/
へ置きます。
Kiwixの詳細は、
docs/KIWIX_SETUP.md
を参照してください。
RAG検索とArticle Viewer連携のPythonコードです。
検索処理の中心です。
主に、
config.jsonの読み込みmetadata.sqliteの読み込み- FAISS indexの読み込み
- 質問Embedding
- タイトル一致判定
- article focus
- 記事内検索
- vector / lexical情報を使ったランキング
- 検索結果の生成
を担当します。
Wikipediaでは記事タイトルそのものがEmbeddingへ強く影響するため、単純に「質問に近いチャンク」を探すだけではなく、
どの記事か
↓
記事内のどこか
という二段階の考え方を取り入れています。
詳しくは docs/SEARCH_DESIGN.md を参照してください。
検索質問をEmbedding vectorへ変換します。
RAG生成側にもEmbedding処理がありますが、本体でも検索時に質問をベクトル化する必要があるため、このファイルが必要です。
config.json に記録されたEmbeddingモデル、次元数、query
prefixなどを利用します。
BuildConfig
やチャンクなど、RAGデータの構造を表すPythonのデータクラスを定義しています。
名前に BuildConfig が含まれていますが、本体でも生成済みindexの
config.json を正しく解釈するために使用します。
RAG本体と記事Viewerの間をつなぎます。
現在は、
jsonl
kiwix
の2種類のbackendがあります。
JSONL Viewerの場合は外部Pythonスクリプトを起動し、Kiwixの場合は
kiwix-serve を管理してブラウザで記事を開きます。
Article Viewerが使う外部ファイルの場所をまとめています。
主に、
RAG/tools/wikipedia_viewer
RAG/data/wikipedia_viewer
RAG/tools/kiwix
RAG/data/kiwix
へのパスを定義します。
Viewer関連の配置を変える場合は、まずこのファイルを確認してください。
JSON読み込み、ログ設定、Wikipediaタイトルの正規化など、複数の処理から使う小さな共通関数をまとめています。
検索結果をLLMへ渡す際のpromptをSearch modeごとに保存しています。
prompts/
├─ article_focus/
├─ auto/
├─ balanced/
├─ discovery/
├─ legacy_auto/
└─ strict/
各モードには、
system.txt
user.txt
があります。
検索アルゴリズムとLLMへの指示を分離するため、promptはPythonコードへ直接書き込まず、このフォルダから読み込む構成です。
回答の仕方を調整したい場合はここを変更できますが、検索結果そのものが悪い場合はpromptより先に
search_engine.py 側の検索結果を確認する方が切り分けやすくなります。
Web UIのHTMLを置きます。
中心となるファイルは、
templates/index.html
です。
質問欄、モデル選択、Search mode、各種パラメータ、回答表示欄など、画面の基本構造を定義しています。
ブラウザ側で使うJavaScript、CSSなどを置きます。
Web UIとPython側APIの通信を担当します。
主な処理は、
- Ollamaモデル一覧の取得
- 質問の送信
- 回答の表示
- Markdownのレンダリング
- 検索・生成metricsの表示
- Referenced articlesの表示
- 記事Viewerを開く
- Quit
- ブラウザ終了監視用heartbeat
です。
Web UIのレイアウトや表示スタイルを定義します。
LLMが返したMarkdown形式の回答をブラウザ上でHTMLとして表示するためのMarkdown rendererです。
システムの設計や、通常利用より詳しい情報を置きます。
docs/
├─ ARCHITECTURE.md
├─ SEARCH_DESIGN.md
├─ SEARCH_MODES.md
├─ VIEWER_CONFIGURATION.md
└─ KIWIX_SETUP.md
3プロジェクトの関係、本体の責務、データフロー、Viewerとの役割分担など、システム全体の構造を説明します。
現在の検索方式になった理由と、検索アルゴリズムの設計を説明します。
検索精度を改良するときは、まずこのファイルを読むことを想定しています。
各Search modeの違いと使い分けを説明します。
JSONL Viewer / Kiwix Viewerの切り替えと配置について説明します。
Kiwix ToolsとZIMファイルの配置、Kiwix backendの使い方を説明します。
アプリケーションの入口です。
主に、
- コマンドライン引数の処理
- HTTPサーバー
- Web API
- RAG検索の呼び出し
- Ollamaへのchat request
- コンテキスト構築
- Article Viewerの呼び出し
- ブラウザセッションの監視
- 終了処理
を担当します。
デフォルトでは、
Host: 127.0.0.1
Port: 8765
Index: ../data/index
Viewer: jsonl
で動作します。
主な起動オプションは、
--host
--port
--index
--prompts
--model
--context-chars
--viewer
--open-browser / --no-open-browser
です。
通常利用では .cmd
から起動すればよいため、これらを指定する必要はありません。
通常起動用です。
JSONL Viewerを使用して webui.py を起動します。
Kiwix Viewerを使用する場合の起動用です。
どこを変更すればよいか迷った場合は、次を目安にできます。
変更したいもの 主に見る場所
検索結果がおかしい wikirag/search_engine.py
Embedding処理 wikirag/embedding.py
回答の指示 prompts/
Web画面 templates/index.html, static/
Ollamaへの問い合わせ webui.py
JSONL Viewer / Kiwix連携 wikirag/article_viewers.py
Viewerやdataの配置 wikirag/viewer_config.py
Search modeの意味 docs/SEARCH_MODES.md
検索方式そのもの docs/SEARCH_DESIGN.md
特に検索精度の問題では、
LLMの回答が悪い
のか、
LLMへ渡す前の検索結果が悪い
のかを分けて考えると原因を追いやすくなります。
このシステムは、Wikipediaデータ処理を3段階に分離しています。
WikipediaからダウンロードしたXML dumpをJSONL形式へ変換します。
変換済みJSONLをチャンク化・Embeddingし、FAISS indexとSQLiteデータベースを生成します。
生成済みRAGを検索し、OllamaのローカルLLMで回答を生成します。
この分離により、Wikipedia dumpの更新、RAGの再生成、日常的な検索・LLM利用をそれぞれ独立して扱えるようにしています。