概念マップ勉強会
書籍一冊分のデータを入れて概念間の関係を可視化
あとで詳しく解説するけどまず具体例を見た方がイメージしやすいと思う
この論文は色々な構成をまとめて説明しているので抽象度高い
「入力がテキストの場合もグラフの場合もあるよね」とか
今回の勉強会では我々のユースケースをメインのフォーカスに絞って解説する
従来型RAGもGraphRAGも家族的類似性でまとまってる概念なので性質の説明は必要条件ではなく傾向にすぎない
「GraphRAGにはXという特徴がある」はすべてのGraphRAGにはXという特徴があるという意味ではない、しばしば例外がある
従来型RAGの問題点
従来: たとえば短い断片に刻んでからベクトル埋め込みしてベクトルの類似度で検索
関係性を扱うのが苦手
関係性を拾うことに失敗しやすい、後で図で説明する
"ベクトルの類似度で検索"
"ベクトルの類似性"は一般的な意味の類似性
一般的にはGrは「グループ」だけどサイボウズ文脈だと「Garoon」だ、みたいなことをembeddingモデルは知らない
「Gr=Garoon=ガルーン」とか「ガブキン=GovTech Kintone」とかの知識を与えて、使って欲しいが、その知識をどう与えるか、どう使わせるかが悩ましい
コンテキストが繰り返しだらけ、長くなる
自前でモデルの学習をトレーニングするのは高コストなのでコンテキストに積むことが行われがち
検索して似ているものを見つけてコンテキストに積むので、コンテキストが似た文章の断片の羅列になる
そういう「ベクトル検索の結果の羅列ドキュメント」ってLLM以前にはなかったから、LLMにとって「見慣れないフォーマット」であり、それを扱うことはあんまり得意ではない
リランカーを訓練するアプローチが有効
GraphRAGのアプローチ
従来型RAGにおけるチャンクは生のテキストを切り出したもの
GraphRAGは概念と関係性を抽出する
https://gyazo.com/43aa53e2a4ea5d217fc3f5c4ff0a5ec4
グラフであることによって幅優先探索や経路探索ができる
「概念Aと概念Dの関係は?」
https://gyazo.com/f72de3b271c5ed327491ce5e4ce4eae2
元文章に"A→B"、"B→C"、"C→D"の記述があるとする
従来型RAGの検索では「B→C」のチャンクを拾わない
そのチャンクにAもDも含まれてないからね
GraphRAGはグラフからAとDのノードを見つけた後、グラフ上での経路探索を行なってB→Cの情報を見つけられる
https://gyazo.com/1e08ee504135c94d046c2c44f3a3b776
一般的な会話で使う概念は数学などと違って明確な境界を持っていない
境界のぼんやりした意味MをシンボルAで表現したりBで表現したりする
その二つは同義語なのではなく、まだ言語化されていないニュアンスの違いがあったりする
二つのシンボルはMの異なる「側面」と関連している(関連: 経験の側面) あるシンボルC1はもっぱらAと繋がり、あるシンボルC2はもっぱらBと繋がり、あるシンボルC3はAともBとも繋がる、なんてことが起きる
Pythonの授業に使うe-bookから概念と関係を抽出
GPT-4oでの実験でエキスパートの作成した主要概念リストと8割がた一致
概念とその関係を抽出するところがGraphRAGのインデクシング部分と近い構造
ちょうどPlurality本の原稿データが利用可能になったところなので実験対象にしてみた
GPT5 Proが論文を読んでプロトタイプ実装を作ってくれた、捗る
https://gyazo.com/a1cfde62ef95370929bd2455fe1c9d07
具体的な実装
元ドキュメントを3〜4回読んでいる
1: 章ごとに概念を抽出
2: 章ごとに概念間の関係を抽出
3: 章ごとに作成したグラフが連結になるように最小限の概念と関係を新たに抽出
4: 章をまたいだ関係性を抽出
これは「重要」の微調整だという認識
文章だけを見て「重要」と判定されたものが(1)
「一つの章に書かれた内容がひとつながりになるために橋渡ししている概念は重要だよね」が(3)
「一つの書籍の中で複数の章の記述を橋渡ししてる関係性は重要だよね」が(4)
オリジナル論文はGPT-4oを使っていたがGPT-5-miniの方がぱっと見いいデータだった
書籍1冊分で1USD
出来上がったグラフを可視化してみた
イメージ湧きにくいGraphRAGのイメージを深める
してみたら連結でなかったので別途連結化をした(3)
ここはプロンプトを生成してからChatGPT GPT5 Thinkingにコピペしてやらせている
Thinkingなら一発で連結グラフになる、gpt-5-miniとかだとダメ
抽出される概念や関係は「根拠」として原文からの引用を伴う
https://gyazo.com/1acd76185195045530b452c077f23f7f
これを使って原文の該当箇所にジャンプできるようにした
これによってグラフを眺めて違和感があったときに引用や原文を見て「確かにそう書いてあるな」とか「いや、この抽出は適切じゃないか」とか判断できる
今の概念マップWebサービスにはJSONで静的に与えてるけど、将来的には質問したりツッコミを入れたりしながらグラフが改善されていくといいと思う
オリジナルの論文では関係はカテゴリカル
is_aとかpart_ofとかいくつかの選択肢に限定している
これは個人的に好きではないので、関係は文で表現するようにした
カテゴリカルだとLLMを使わずにプログラムで判断できるメリットはあるだろうけど、それが必要なら後付けでis_a, part_of, ..., otherに分類することをLLMにやらせたらいいやという判断
limitation/future work
今回の概念マップ作成はグラフの作成と可視化にフォーカスした
GraphRAGの3段階のうちの一つGraph-Based Indexingだけ
Graph-Based Indexing
Graph-Guided Retrieval
Graph-Enhanced Generation
残り2つもいずれ試したい
今回、Markdown形式のPlurality本の本体部分の原稿を処理してから、サイボウズ式に置かれている著者らの日本語版に向けての前書きと、WIREDに置かれている鈴木健さんの解説とを追加コンテンツとしてマージした
こうやって追加コンテンツを増やしていってコンテンツ間リンクで繋いでいくのは面白そう
特にテキストで書かれた文章と、講演などの動画の字幕との間に橋渡しができると面白い
技術的には難しくない
出典リンクが動画のタイムスタンプリンクになって欲しいからSRTを使うと良さそう
追加コンテンツを3つ足して思ったこと
どんどん追加していくと本編のグラフにどんどん外部リンクが増えてしまう
https://gyazo.com/1ee6df9ae95fb0bc9154fe3c3b4a83dd
そりゃそうだ、どうしたらいいか?
ノードや関係の数は段階的に増えていくのがいいと思う
まずは「この章の中だけ」
それから「この本の中だけ」
それが終わった後で「他のコンテンツとの関係」
そう考えると「各章」がスタートでいいのか?という疑問が湧いてくる
「書籍まるごと」のダイジェスト版が必要かも
今は章をまたぐリンクを双方向表示にしているが、本編からextraへのリンクは無しにした方がいいのかも?
グループウェア的文脈
全データを対象にしようとするのではなく、新人向けオンボーディング資料から始めた方がいいのではないか
小規模なデータで試して観察して改善するプロセスを数回回すのが良さそう
社内用語集的なデータは親和性高そう
ほぼ「人間がチョイスした重要概念」
それらの概念間の関係を抽出するのはすぐにでもできそう
ただし書籍と違ってひとつながりのストーリーとして執筆されてないのでグラフを可視化しても散り散りになりそう
GraphRAGまで社内でやるようになった時には、質の高いデータソースとして有望
Keichobot的文脈
ユーザと会話しながらキーワード抽出
頻出するキーワードを重要なキーワードだとみなして掘り下げ質問
十分重要なキーワードが見つかったらそのキーワードの間の関係を質問する
これ「概念抽出」してから「関係抽出」する流れと同じじゃん!
チャットしながらサイドに概念マップを出したら面白いのではないか?
そもそも「ゼロからチャットする」ことを今までやってきたが、書きかけの文章などを入れると質問してくれて、話した内容を元に文章を改善してくれるとかの構成を考えると「概念マップと会話する」形になる
概念がユーザの外にあって中に入れようとしてるのか、ユーザの中にあるものの言語化を促して外に出そうとしてるのかの方向は逆
チャットによって言語化を促す系は、もう1年くらい経つと音声でスムーズに会話できるサービスが手軽に使えるようになると思う
情報整理の文脈