0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「本当に役立つネットワークグラフ分析」に寄与するツールが世になかったので、自分で作った — Hybrid GER 第1弾

0
Last updated at Posted at 2026-06-01

はじめに — この記事で伝えたいこと

最初に、いちばん伝えたいことを書きます。

この記事は、私のコーディング能力の自慢でも、技術的な新規性の主張でもありません。

伝えたいのは、たった一つです。

「本当に役に立つ価値ある分析」とは何か。そして、その分析手法に寄与できるツールとはどんなものか。

それが世の中に見当たらなかったので、自分で作りました。

Hybrid GER(Hybrid Graph Expansion Retrieval):DB(構造化データ)と文書(非構造化データ)から関係性を抽出し、対話的に育てるネットワークグラフ分析ツール

Hybrid GERは、私が長年実務で続けてきた分析手法を、一体のツールとして形にしたものです。第1弾はその出発点を共有させていただくためのものです。技術の話は最小限にし、**「どんな分析をしたいのか」「そのために何が必要なのか」**を中心に書きます。


目次

私が考える「価値ある分析」とは

関係性を扱う分析には、出発点が大きく2つあります。

  • ミクロ視点 — 少ない手がかりから始める状態。
  • マクロ視点 — 膨大な情報から絞り込んでいく状態。

どちらの出発点であっても、目指す中間地点は同じです。関係性を保ったまま、分析に最適な規模へ整えた状態。これを「メゾ」と呼びます。

そして、メゾの構造から中核となる要素だけを抜き出す。残ったものが、その事案の**「コア」=背骨**です。

つまり、私が価値があると考える分析とは、こういう道のりです。

ミクロ/マクロ → メゾ → コア(背骨)

このうち、出発点からメゾへ向かう過程と、メゾからコアへ向かう過程は、性質がまったく違います。

  • 育む(育つ・育てる)= メゾへ向かって、関係性を漏らさずグラフを拡張する過程
  • 刈り取る(絞る)= メゾから中核だけを抽出してコアに至る過程

つまり、「育む → 刈り取る」の二段構え。これが分析の本質だと考えています。

「育む」を飛ばすと、最初から見えていた関係しか分析できません。「刈り取る」を飛ばすと、育ちすぎたグラフはただの絡まった毛糸玉となり、そこからは何も読み取れません。両方が、地続きで必要となるのです。

第1弾でお見せするのは、このうちミクロ視点から出発し、グラフを「育み」メゾへ至る過程です。「育む」ことが、第1弾の主役です。


なぜ既存ツールでは足りなかったのか

この「育む→刈り取る」を、従来は複数のツールをまたいで行っていました。私の典型的な手順はこうです。

  1. 一般的なデータベースで検索を繰り返し、手がかりとなるデータ範囲を絞る
  2. グラフに落とすため「元(sender)+先(recipient)+量(weight)」という最小限のエッジリストに整形して受け渡す
  3. Cytoscape.js や Cytoscape アプリで描画する
  4. フィルターで絞り込む
  5. 画像編集して出力する

これでも分析は可能です。しかし工程が分断され、各ステップの結果は次に渡すと固まってしまう。途中で「この人物も入れたい」と思っても、検索からやり直し。そして何より、「育む」フェーズと「刈り取る」フェーズが別々のツールに分かれているため、分析が地続きになりません。

私が欲しかったのは、検索した瞬間にグラフが立ち上がり、問いを重ねるたびに同じキャンバスでメゾへと育まれていき、最後に同じ画面でコアまで刈り取れられる、一気通貫のツールでした。

正直に書いておくと、技術は新しくありません

念のため、誠実に書いておきます。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回では終わりません。前回の探索キャンバスを呼び出し、新しい探索と結合して、分析を積み上げていけます。

これらは「あると便利」という程度の話ではなく、「育む→刈り取る」の分析を成立させるための必須機能です。地味ですが、ここが実用と非実用を分けます。


ここまでで伝えたかったこと

  1. 価値ある分析は「育む→刈り取る」の二段構え — ミクロ/マクロから、関係性を保ってメゾへ育み、そこからコア(背骨)を刈り取る。
  2. 2つの抽出経路は、相補ではなくそれぞれを極める — 構造化された問いと、意味的な近さ。別角度から漏らさず拾う。
  3. 編集・操作機能が分析を成立させる — ツールチップ、右クリック展開、整列、保存・結合。地味だが必須。
  4. LLMは支援役、人が主役 — 解釈を盲信せず、必ず人が介入できる。
  5. 技術は新しくない。価値ある分析に寄与する形に組み上げたことに意味がある。

今後について

第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弾の公開に合わせて書きました。動画と同時公開しています。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?