はじめに — この記事で伝えたいこと
最初に、いちばん伝えたいことを書きます。
この記事は、私のコーディング能力の自慢でも、技術的な新規性の主張でもありません。
伝えたいのは、たった一つです。
「本当に役に立つ価値ある分析」とは何か。そして、その分析手法に寄与できるツールとはどんなものか。
それが世の中に見当たらなかったので、自分で作りました。
Hybrid GER(Hybrid Graph Expansion Retrieval):DB(構造化データ)と文書(非構造化データ)から関係性を抽出し、対話的に育てるネットワークグラフ分析ツール
Hybrid GERは、私が長年実務で続けてきた分析手法を、一体のツールとして形にしたものです。第1弾はその出発点を共有させていただくためのものです。技術の話は最小限にし、**「どんな分析をしたいのか」「そのために何が必要なのか」**を中心に書きます。
目次
- 私が考える「価値ある分析」とは
- なぜ既存ツールでは足りなかったのか
- まずは動画でご覧ください
- 2つの抽出経路を、それぞれ「極める」
- 動画のシーンに沿って — 何が起きているか
- 「育む」分析に必須の、編集・操作機能
- ここまでで伝えたかったこと
- 今後について
- 技術スタック(簡潔に)
- 正直に書いておきたい、現時点の限界
- おわりに
私が考える「価値ある分析」とは
関係性を扱う分析には、出発点が大きく2つあります。
- ミクロ視点 — 少ない手がかりから始める状態。
- マクロ視点 — 膨大な情報から絞り込んでいく状態。
どちらの出発点であっても、目指す中間地点は同じです。関係性を保ったまま、分析に最適な規模へ整えた状態。これを「メゾ」と呼びます。
そして、メゾの構造から中核となる要素だけを抜き出す。残ったものが、その事案の**「コア」=背骨**です。
つまり、私が価値があると考える分析とは、こういう道のりです。
ミクロ/マクロ → メゾ → コア(背骨)
このうち、出発点からメゾへ向かう過程と、メゾからコアへ向かう過程は、性質がまったく違います。
- 育む(育つ・育てる)= メゾへ向かって、関係性を漏らさずグラフを拡張する過程
- 刈り取る(絞る)= メゾから中核だけを抽出してコアに至る過程
つまり、「育む → 刈り取る」の二段構え。これが分析の本質だと考えています。
「育む」を飛ばすと、最初から見えていた関係しか分析できません。「刈り取る」を飛ばすと、育ちすぎたグラフはただの絡まった毛糸玉となり、そこからは何も読み取れません。両方が、地続きで必要となるのです。
第1弾でお見せするのは、このうちミクロ視点から出発し、グラフを「育み」メゾへ至る過程です。「育む」ことが、第1弾の主役です。
なぜ既存ツールでは足りなかったのか
この「育む→刈り取る」を、従来は複数のツールをまたいで行っていました。私の典型的な手順はこうです。
- 一般的なデータベースで検索を繰り返し、手がかりとなるデータ範囲を絞る
- グラフに落とすため「元(sender)+先(recipient)+量(weight)」という最小限のエッジリストに整形して受け渡す
- Cytoscape.js や Cytoscape アプリで描画する
- フィルターで絞り込む
- 画像編集して出力する
これでも分析は可能です。しかし工程が分断され、各ステップの結果は次に渡すと固まってしまう。途中で「この人物も入れたい」と思っても、検索からやり直し。そして何より、「育む」フェーズと「刈り取る」フェーズが別々のツールに分かれているため、分析が地続きになりません。
私が欲しかったのは、検索した瞬間にグラフが立ち上がり、問いを重ねるたびに同じキャンバスでメゾへと育まれていき、最後に同じ画面でコアまで刈り取れられる、一気通貫のツールでした。
正直に書いておくと、技術は新しくありません
念のため、誠実に書いておきます。Hybrid GER が使っている要素技術は、どれも新しいものではありません。 ベクトル類似検索、文書からのエンティティ抽出、グラフの多ホップ探索 — これらは「GraphRAG」と呼ばれる分野で、いままさに活発に研究・実装されている、強いて言えば枯れつつある技術とも言えます。
私がやったのは、それらの枯れつつある技術を、自分が必要とする分析手法のために組み替えただけです。新規性ではなく、「価値ある分析に寄与する形に組み上げたこと」に意味があると考えています。
まずは動画でご覧ください
下の動画は、Hybrid GER の動作をノーカット(早送りのみ)で約3分半に収めたものです。少ない手がかりから、グラフが少しずつメゾへ「育って」いく様子をご覧ください。
撮影時点のローカルLLMにはまだ不安定な挙動が残っており、画面に一部エラー表示が出る箇所があります。これも含めて「現時点のありのまま」をお見せしています。
2つの抽出経路を、それぞれ「極める」
Hybrid GER は2系統の検索を持ちます。Text2SQL と、ベクトル類似検索です。ただし、私の発想はこの2つを「相補的に混ぜる」ことではありません。
世間の Hybrid Retrieval は「2つの検索結果を融合して1つの答えを良くする」方向ですが、私が目指したのは違います。
それぞれを、異なる角度からの「精密な抽出装置」として独立して極め、両方を使うことで多角的に・漏らさず拾う。
- Text2SQL — 構造化された明示的な問い(誰が、どの学校で、何点以上か)を精密に抽出する経路。自然言語で条件を書ける点は便利ですが、正直、これは「検索UIを自然言語に置き換えた」だけで、目新しさはありません。価値は「構造化された条件で、漏れなく正確に拾えること」にあります。
- ベクトル類似検索 — 非構造化データである文書(日記・報告書などの PDF)から、意味的に近いものを精密に抽出する経路。明示的な条件では拾えない、文脈的な関連を拾います。
この2つは補い合うのではなく、別々の角度から同じキャンバスに情報を積み上げます。構造化された問いで拾えるものと、意味的な近さで拾えるものは違う。だから両方を独立して極めることで、多角的に、漏らさずメゾまで育められる。これが Hybrid GER の設計思想です。
動画のシーンに沿って — 何が起きているか
サンプルは、架空の高校とその生徒たちのデータベースと、生徒の日記・部活動報告の PDF 文書群です(すべてダミーデータ・物語仕立て)。主人公は 狂咲、 を起点にして、グラフ描画後は、 雪舟 千手丸、さる高等学校3年A組の生徒。彼らの関係を中心に探索を進めてみます。(ただし、今回は分析思想と機能紹介が重要トピックなので、分析自体にストーリー性は持たせてありません。)
シーン1: ベクトル類似検索で、PDFから関係が立ち上がる(動画 0:06〜0:30)
「狂咲とのデート」と検索すると、結果としてキャンバスに、日記PDF・登場する生徒・所属する部活・在籍する学校が一気に描画されます。
PDF を「読む」のではなく、PDF を起点に登場人物の関係をグラフとして見る。少ない手がかり(クエリ1つ)から、複数のノードとエッジが立ち上がり、ネットワークグラフが形成されます。
💡 コラム: ローカルLLMの限界と、それでも止まらない設計
この場面で画面上部に「Text2SQL: SQL実行エラー」が出ています。ローカルLLM(gemma3:12b)が「狂咲とのデート」を「デート=対戦相手」と誤解釈し、誤った SQL を生成したためです。
しかし探索は止まっていません。Text2SQL が0件でも、ベクトル類似検索がヒットを返し、グラフは描画されました。2つの抽出経路を独立して持つことで、片方が転んでも探索が続きます。
シーン2: LLMの解釈に、人が介入する(動画 0:30〜1:30)
雪舟千手丸ノードを右クリックし、「同じ学校の生徒でバスケ部に所属」と入力。LLMは起点の文脈から「同じ学校」をさる高等学校と解釈しますが、Hybrid GER はその解釈を盲信しません。学校名による絞り込みが入ると、確認ダイアログを出して人に判断を戻します(安全弁①: 絞り込み警告)。
ここでは「そのまま検索」を選び、全校横断で 13人 のバスケ部員がヒット、グラフに追加されました。
シーン3: グラフがメゾへ育つ瞬間(動画 1:30〜3:00)
もう一度右クリックし、「英語の点数が80点以上の生徒」と入力。今度は安全弁②: 件数超過警告が発動します。
Hybrid GER は1度に追加できるノード数に上限(100件)を設けており、ヒット数が超えると描画前に絞り込みます。今回は上限を超えたため、起点から5ホップ(接続次数)以内に到達できる生徒のみへ自動で絞り、結果 28人 が追加されました。
この瞬間、それまで別々だった2つのクラスターが試験ノードを介して繋がります。グラフが「ミクロ」から「メゾ」へと育った瞬間です。
金枠ノードの本当の意味
画面に金色の枠で縁取られたノードが現れます。これは「両方の検索でヒットしたノード」ではありません。正確には:
金枠 = 分析者が条件を指定して検索し、その検索に直接ヒットしたノードの目印。
同じキャンバスで検索を繰り返すと、ノードは2種類に分かれます。検索に直接ヒットしたノード(分析者が「関係があるはず」と考えて意図的に探した結果)と、それに引きずられて出てきた周辺ノード(自動展開された関連ノード)です。
金枠は前者だけを区別する印です。グラフがメゾへ育つほど賑やかになりますが、「自分の意図でヒットさせたのはどれか」が一目で分かるので、育ったグラフの中で分析者の仮説の軌跡を見失いません。
「育む」分析に必須の、編集・操作機能
ここは強調したい点です。グラフを育む分析は、描画機能だけでは成立しません。 育てたグラフを読み解き、整理し、再利用するための操作機能が不可欠です。Hybrid GER には、実務で「これがないと分析できない」と痛感した機能を備えています。
1. ツールチップ — マウスを乗せれば、DB検索と同じ中身が見える
ノードやエッジにマウスカーソルを重ねると、そのノード・エッジの登録内容がその場で表示されます。わざわざ別画面で DB を検索しなくても、検索したのと同じ情報がグラフ上で確認できます。育ったグラフを読み解く速度が、これで段違いに早くなります。
2. 右クリック — 1次結合可能なノードを追加候補として提示
ノードを右クリックすると、そのノードと直接つながり得るノード群が追加候補として表示されます。「次に誰、何、どこ、との接続可能か」が見えるので、手がかりが少なくても育む方向を見失いません。
3. ノード操作 — 拡大縮小・整列・回転・自動レイアウト
選択したノードの拡大縮小、整列、回転、自動レイアウト。育ったグラフはそのままでは絡まっています。見やすく整える操作がなければ、メゾへ育ったままでは分析が破綻してしまうでしょう。
4. グラフ管理 — 保存・呼び出し・結合
育てたグラフを保存し、後で呼び出し、別のグラフと結合できます。調査は1回では終わりません。前回の探索キャンバスを呼び出し、新しい探索と結合して、分析を積み上げていけます。
これらは「あると便利」という程度の話ではなく、「育む→刈り取る」の分析を成立させるための必須機能です。地味ですが、ここが実用と非実用を分けます。
ここまでで伝えたかったこと
- 価値ある分析は「育む→刈り取る」の二段構え — ミクロ/マクロから、関係性を保ってメゾへ育み、そこからコア(背骨)を刈り取る。
- 2つの抽出経路は、相補ではなくそれぞれを極める — 構造化された問いと、意味的な近さ。別角度から漏らさず拾う。
- 編集・操作機能が分析を成立させる — ツールチップ、右クリック展開、整列、保存・結合。地味だが必須。
- LLMは支援役、人が主役 — 解釈を盲信せず、必ず人が介入できる。
- 技術は新しくない。価値ある分析に寄与する形に組み上げたことに意味がある。
今後について
第1弾でお見せしたのは、「育む」フェーズです。ミクロ視点から出発し、少ない手がかりからグラフをメゾまで育む工程と、そのために必要な機能を紹介しました。
次のステップは、「刈り取る」フェーズです。メゾまで育ったグラフに、次数フィルターや PageRank による絞り込みを加え、中核となる関係性だけを抜き出す — つまり「コア(背骨)を刈り取る」工程です。
さらにその先には、もう一つの出発点であるマクロ視点への対応があります。初期から膨大な情報がある場合に、それを絞り込んでメゾへ至り、同じく刈り取ってコアへ向かう。
ミクロからの出発も、マクロからの出発も、最終的に目指すのは同じ「メゾを経てコア(背骨)に至る」道です。Hybrid GER を、その両方を地続きで扱えるツールに育てていきます。
過去の探索キャンバスの保存・結合機能と、複数ノードの一括操作機能も、長期的な調査を支えるために強化していく予定です。
技術スタック(簡潔に)
- バックエンド: Django 5.2(Python 3.13)
- データベース: PostgreSQL 18 + pgvector 0.8.1(ベクトル類似検索)
- LLM: Ollama + gemma3:12b(完全ローカル動作、データを外部に送らない)
- 埋め込みモデル: intfloat/multilingual-e5-large(1024次元)
- グラフ描画: Cytoscape.js
- 動作環境: macOS(Apple Silicon、MPS推論)/ Windows 11(CUDA推論)
完全ローカル動作が、調査用途では重要です。機密情報や個人情報を含む文書を、外部APIに送ることなく手元で完結できます。
正直に書いておきたい、現時点の限界
第1弾の公開にあたり、現時点の限界も正直に書き残します。
1. ローカルLLMの Text2SQL 生成精度
曖昧なクエリでは意図しない SQL を生成することがあります(動画にもエラーが残っています)。現状はエラー表示で利用者が試行錯誤できるようにし、将来的にモデル置き換えや SQL構文チェックを追加予定です。
2. ノード数が増えると描画が重くなる
サンプル規模では問題ありませんが、メゾを超えて大規模になると描画性能が課題です。今後実装する次数フィルターなどで、表示ノード数を動的に制御できるよう設計を進めます。
3. 認証・権限管理
現時点では単独利用を前提とし、複数ユーザー利用や文書ごとの権限管理は未実装です。
おわりに
繰り返しになりますが、この記事で伝えたかったのは、技術の新しさではありません。
本当に役に立つ分析とは何か。その分析手法に寄与できるツールとは何か。それが世になかったので、自分で作った。
ただ、それだけです。同じように「育んで、刈り取る」分析に手応えや課題を感じている方に、何か通じるものがあれば嬉しく思います。
コード(ダミーデータ・セットアップ手順を含む)は現在準備中です。 公開時期が決まりましたら、本記事および動画概要欄でお知らせします。
ご質問・ご感想・「自分のデータでこういう分析をしたい」というご相談は、LinkedIn・ビズリーチ経由、または Qiita コメント欄でお気軽にどうぞ。
次回もお楽しみに。
この記事は、Hybrid GER 第1弾の公開に合わせて書きました。動画と同時公開しています。