Vector Search × Knowledge Graph Integration Research
本プロジェクトは、非構造化データの「検索(Search)」から、構造化された「理解(Understanding)」への進化を目指す研究開発(PoC)です。
これまでの研究により、以下の技術知見を獲得しました:
- Natural Language Search:
lsh-cascade-pocにて、LSHを用いた高速な近似最近傍探索と、意味空間での検索精度を検証。 - Image Vectorization:
image-vector-pocにて、画像を数値ベクトル化し、視覚情報の検索可能性を実証。
これらの技術は強力ですが、「点(単一のドキュメント)」の検索に留まります。本プロジェクト graph-rag-poc では、データ間の「線(関係性)」を扱う**ナレッジグラフ(Knowledge Graph)**を導入し、ベクトル検索の限界(文脈欠落、多段推論の欠如)を突破することを目的とします。
-
Hypothesis 1: Hybrid Retrieval Superiority — Status: Confirmed
- ベクトル検索 + グラフ構造探索の「ハイブリッド検索」が、単純なベクトル検索より高い回答精度を得られる。
- 結果: 全スケール(17, 5K, 400K)で確認。40万件でVector 15.6ms / Hybrid 31.8ms、平均+8.7件の追加コンテキスト発見。
-
Hypothesis 2: Local Feasibility — Status: Confirmed
- ローカルLLMとグラフDBの組み合わせで、実用的な速度とコストで動作可能。
- 結果: Neo4j 5 + E5-base + Ollama、すべてRTX 4090上で動作。クラウドAPI依存なし。
-
Hypothesis 3: Temporal Knowledge Graph — Status: Confirmed
- 時系列情報を持つナレッジグラフにより、「最新」「変遷」「意思決定の追跡」といった時間的クエリに回答可能。
- 結果: PyCon JP議事録78件から時間的KGを構築。Hybrid RAG(LightRAG + Temporal KG)で最新情報・意思決定クエリに正確回答。
- Graph Database: Neo4j 5 Community (Docker)
- Vector Indexes: Neo4j native vector index (E5-base 768d)
- External Data: DuckDB (Wikipedia 40万件, PyCon JP議事録115件)
- KG構築: 正規表現 + GiNZA NER + LLMハイブリッド抽出
- LightRAG: エンティティ・関係性の自動抽出 + ベクトル検索
- Temporal KG: 会議日付・NEXT_MEETING時間チェーン・エンティティ解決
- Retrieval: Temporal RAG v1/v2/v3/v4 + LightRAG + Hybrid RAG
- LLM: Ollama (qwen2.5:14b, qwen3.5:9b, gemma3:12b 等) — ローカルGPU
- Gradio App: LightRAGグラフ探索 + 可視化 (
run_app.py) - Meeting Explorer: 議事録閲覧 + 関連検索 (
run_meeting_explorer.py)
40万件Wikipediaデータでのハイブリッド検索の基本的有効性を検証。
| # | Notebook | Focus |
|---|---|---|
| 01 | 01_foundation.ipynb |
Neo4j graph construction, Cypher basics |
| 02 | 02_hybrid_search.ipynb |
Keyword embedding + graph traversal |
| 03 | 03_embedding_search.ipynb |
E5-base vs keyword comparison |
| 04 | 04_graph_rag.ipynb |
Local LLM + hybrid search RAG |
| 05 | 05_wikipedia_knowledge_graph.ipynb |
DuckDB → Neo4j pipeline (5K) |
| 06 | 06_scale_testing.ipynb |
400K benchmark, RAG quality at scale |
| 07 | 07_02_multimodal_image.ipynb |
CLIP image integration |
| 08 | 08_evaluation_summary.ipynb |
Cross-experiment evaluation |
Key Results: 399,430 nodes, Vector 15.6ms / Hybrid 31.8ms, LightRAG 1-hopがパレート最適。
LightRAGによる自動グラフ構築と、非公開文書2,768件での検証。
| # | Notebook | Focus |
|---|---|---|
| 09-14 | Series 1 追加実験 | SigLIP 2, VLM, マルチホップ等 |
| 21 | 21_lightrag_setup.ipynb |
LightRAG初期設定 |
| 22 | 22_lightrag_private_docs.ipynb |
非公開文書でのLightRAG検証 |
| 23 | 23_lightrag_full_private_docs.ipynb |
全件2,768ドキュメント投入 |
| 24 | 24_lightrag_evaluation.ipynb |
4モード比較評価 |
| 25 | 25_lightrag_interactive.ipynb |
インタラクティブ検索 |
PyCon JP運営会議議事録115件でのLightRAG検証。結果: 適切な回答が得られず、構造化アプローチの必要性を確認。
| # | Notebook | Focus |
|---|---|---|
| 31 | 31_pyconjp_scraping.ipynb |
議事録スクレイピング・DuckDB保存 |
| 32 | 32_pyconjp_lightrag.ipynb |
LightRAGグラフ構築 |
| 33 | 33_pyconjp_incremental.ipynb |
増分インジェスト |
| 34 | 34_pyconjp_evaluation.ipynb |
評価(不十分な結果) |
| 35 | 35_pyconjp_no_minutes.ipynb |
非議事録ページの検証 |
| 36-37 | 36-37_lightrag_qwen_eval.ipynb |
Qwen2.5モデルでの再評価 |
PyCon JP議事録から時間的ナレッジグラフを構築し、時系列クエリに対応するRAGパイプラインを開発。
| # | Notebook | Focus |
|---|---|---|
| 41 | 41_temporal_extraction.ipynb |
正規表現+GiNZA+LLMハイブリッド抽出 |
| 42 | 42_temporal_graph.ipynb |
Neo4j時間的KG構築・NEXT_MEETINGチェーン |
| 43 | 43_temporal_rag.ipynb |
Temporal RAG v1 (基本) |
| 44 | 44_temporal_rag_v2.ipynb |
Temporal RAG v2 (追加コンテキスト) |
| 45 | 45_temporal_reasoning.ipynb |
v3: TOPIC_CONTINUEDチェーン推論 |
| 46 | 46_temporal_rag_v4.ipynb |
v4: LLMルーティング・クエリ分類 |
| 47 | 47_hybrid_rag.ipynb |
Hybrid RAG (LightRAG + Temporal KG統合) |
| 48 | 48_graph_direct_answer.ipynb |
グラフ直接回答 |
| 49 | 49_temporal_kg_visualization.ipynb |
Gradioアプリでの可視化・検証 |
| 50-53 | 50-53_*.ipynb |
因果分析・トピッククラスタリング・評価 |
Qwen3.5モデル比較 (NB54-61):
| # | Notebook | Focus |
|---|---|---|
| 54 | 54_qwen35_baseline.ipynb |
qwen3.5 9B/27B ベースライン |
| 55 | 55_temporal_extraction_qwen35.ipynb |
Qwen3.5での全件再抽出 |
| 56 | 56_temporal_rag_qwen35.ipynb |
Temporal RAG v1/v2 評価 |
| 57 | 57_temporal_reasoning_qwen35.ipynb |
v3/v4 + Reasoning評価 |
| 58 | 58_lightrag_qwen35.ipynb |
LightRAGグラフ再構築 (9B) |
| 59 | 59_hybrid_rag_qwen35.ipynb |
Hybrid RAG統合評価 |
| 60 | 60_qwen35_moe_baseline.ipynb |
MoE 35B-A3B ベースライン |
| 61 | 61_qwen35_moe_q3_comparison.ipynb |
Q4 vs Q3量子化比較 |
| 62-63 | スキップ | MoEは4090で実用外と判断 |
- Temporal KG: 会議78件、918エンティティ、1,288リレーション、NEXT_MEETINGチェーン
- 最適モデル: qwen2.5:14b(速度重視: 19s/件)、qwen3.5:9b(バランス: 70s/件)
- MoE 35B-A3B: RTX 4090ではメモリ帯域律速で実用外(212s/件、品質も9b以下)
- Hybrid RAG: 最新情報・意思決定追跡で構造化データの正確性が発揮(Q8, Q13)
- 手法別推奨: 最新情報→Hybrid RAG、一般クエリ→LightRAG、時系列→Temporal v3/v4
src/graph_rag_poc/ に再利用可能なモジュールを配置。
| Module | Description |
|---|---|
connection.py |
Neo4j接続管理 |
embedding.py |
E5-base テキスト埋め込み |
llm.py |
Ollama LLMクライアント |
temporal_extraction.py |
正規表現+GiNZA+LLMハイブリッド抽出 |
temporal_graph.py |
Neo4j時間的KG構築・エンティティ解決 |
temporal_rag.py / v2 / v4 |
Temporal RAG v1/v2/v4 |
temporal_reasoning.py |
TOPIC_CONTINUEDチェーン推論 (v3) |
hybrid_rag.py |
LightRAG + Temporal KG統合パイプライン |
lightrag_service.py |
LightRAGシングルトン管理・グラフ分析 |
app.py |
Gradio LightRAG Explorer |
meeting_explorer.py |
Gradio 議事録エクスプローラー |
LightRAGのナレッジグラフを対話的に探索・可視化するWebアプリ。
python run_app.py- グラフ統計・ハブランキング
- エンティティ検索・近傍可視化
- 4モード検索 (naive/local/global/hybrid)
PyCon JP議事録のTemporal KGを可視化し、関連性を人の目で検証するアプリ。
python run_meeting_explorer.py- 会議一覧・議題閲覧
- エンティティ関連検索
- 時系列可視化
# Python 3.13 + uv
uv sync
# Neo4j (Docker)
docker compose up -d
# Ollama (LLM)
ollama pull qwen2.5:14b
ollama pull qwen3.5:9b
# Gradio App
python run_app.py- Python 3.13, uv
- Neo4j 5 (Docker)
- Ollama + RTX 4090 (24GB VRAM)
- GiNZA (ja-ginza) for Japanese NER
- Local First: ローカル環境で完結する技術を選定(コスト・プライバシー)
- Visual Verification: グラフ可視化で「データの繋がり」を目で検証
- Modular Design: モデル・DB・検索手法を差し替え可能な設計
Author: [Manabu TERADA / CMScom Lab] Status: Series 1-4 Complete Last Updated: 2026-03-07