✨
PathRAGについて見る
はじめに
- 最近話題のPathRAGについて、ざっくりまとめてみました。「RAG系の新しい手法って何が違うの?」という方や、「GraphRAGやLightRAGとの違いが気になる!」という方の参考になればうれしいです。
- まず使い方について解説したあと、簡単な概要について解説します。
使い方・実装例
PathRAGはオープンソースで公開されていて、Python環境があればすぐに試せます。筆者はv3.11で試しました。
リポジトリのクローン
- 以下をクローンします。
インストール
cd PathRAG
pip install -r requirements.txt
環境変数設定
OPENAI_API_KEY=your_openai_key
OPENAI_API_BASE=https://api.openai.com/v1
RAGに使う文章の作成
これは、chatgptに「スチームパンクな赤ずきんの物語を書いて」と依頼したものです。普通の赤ずきんの文章の場合、LLMがすでに学習している可能性があります。なので、あえて少し外した文章を用いています。data.txt
という名前でプロジェクトルートに配置してください。
深々と蒸気が立ち込める工業都市ダルクスピア。その街角を、錆びついた歯車仕掛けの縫い目が光る赤いケープを羽織った少女──“赤ずきん”ことリディアが歩いていた。エンジニアでもある彼女は、祖母が暮らす丘上の蒸気館まで、特製の蒸気推進バイクを操りながら乗りつけるつもりだ。
しかし、市街地を抜けた暗渠のトンネルで、金属の咆哮が響く。鋭い歯をむき出しにした機械狼──オートマトン・ウルフが闇を切り裂き、リディアの前に現れた。普通の狼なら撃退もたやすいが、これには蒸気圧で強化された鋼鉄の骨格と、高速切断可能なギア刃が搭載されている。ピストンがリズムを刻むその咆哮に、リディアは一瞬たじろいだ。
だが彼女も負けてはいない。コートの内ポケットから小型クロノメーターを取り出し、ギアをひねると――背中のジェットパックから蒸気が噴き出し、鋭く跳躍! 機械狼の頭上を飛び越えると、手首のリストキャノンから高圧蒸気を放射。アームに組み込まれたガントレットが白熱し、狼の銃剣付き前脚を撃ち砕いた。
なおも襲いかかろうとする金属獣を前に、リディアは落ち着いて蒸気圧調整レバーを操作。背面ブースターで急加速し、狼の脇腹部分に装着された圧力弁をねらいうち! 「これでおしまいよ!」――破裂した圧力弁から吹き出した蒸気が狼を制御不能にし、ギア刃は空を切る。やがて重い金属の躯体はガタリと倒れ、蒸気だけが霧のように漂った。
息を整えたリディアは、まだ微かに動くオートマトンを残しつつ、坂道を駆け上がる。やがて見慣れた蒸気館の大扉を押し開けると、古びた真鍮の時計仕掛けが時を刻む中、祖母がにこりと笑って迎えてくれた。機械狼の襲撃をものともせず、真紅のケープは今日も澄んだ蒸気に揺れる──新しい伝説の始まりとして。
昔話を加工してRAG用の文章に使うアイディアは、以下の本を参考にしました。以下のリンクから、目次とはじめの部分をPDFで閲覧することができます。
インデックスグラフの作成
- PathRAGは、文章をエンティティとエッジに分けたグラフに変換します。この変換されたグラフのことをインデックスグラフと言います。
import os
from PathRAG import PathRAG, QueryParam
from PathRAG.llm import gpt_4o_mini_complete
WORKING_DIR = "working_dir" # プロジェクトルートにworking_dirディレクトリを作成してください。
rag = PathRAG(
working_dir=WORKING_DIR,
llm_model_func=gpt_4o_mini_complete,
)
with open(data_file) as f:
rag.insert(f.read())
working_dirにグラフ構造を表すファイルが保存されます。
実際に質問をしてみる
question="リィディアとオートマトン・ウルフの関係はなに?"
result = await rag.aquery(question, param=QueryParam(mode="hybrid"))
print(result)
- 上のコードを実行すると、以下のようなレスポンスが来ました。
INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
INFO:PathRAG:kw_prompt result:
{
"high_level_keywords": ["リィディア", "オートマトン", "関係"],
"low_level_keywords": ["ウルフ", "キャラクター", "ストーリー", "設定", "背景"]
}
INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
INFO:PathRAG:Local query uses 11 entites, 6 relations, 1 text units
INFO:httpx:HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
INFO:PathRAG:Global query uses 5 entites, 4 relations, 1 text units
INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
response all ready
## リディアとオートマトン・ウルフの関係
リディアとオートマトン・ウルフの関係は、物語において非常に重要な対立の構造を形成しています。リディアは「赤ずきん」と呼ばれる少女であり、彼女自身はエンジニアでもあります。彼女は祖母が暮らす蒸気館に向かう途中で、オートマトン・ウルフという金属の狼と遭遇し、戦いを繰り広げることになります。
### 戦いと対立
この戦闘シーンは、リディアの能力を発揮させる場面であり、彼女は特製の蒸気推進バイクを使い、自身の持つ技術を駆使してオートマトン・ウルフに立ち向かいます。オートマトン・ウルフは高度な技術で強化された機械であり、その挑戦はリディアにとって大きな試練となります。その結果、彼女がオートマトン・ウルフを撃退することに成功すると、新しい伝説が始まるという象徴的な意味を持ちます。
### 物語の発展
この戦いは、物語の中でリディアの成長や冒険の一環として描かれており、オートマトン・ウルフとの対立が物語の発展に寄与しています。オートマトン・ウルフを倒すことによって、彼女は新たな章に足を踏み入れ、新たな伝説を築くことになるのです。
### まとめ
このように、リディアとオートマトン・ウルフの関係は、ただの敵対関係ではなく、物語の核心を成すテーマとして位置づけられています。彼女の冒険や技術的な挑戦は、物語全体の進行に深く影響しているのです。リディアの成長とオートマトン・ウルフとの戦いは、読者にとっても感情的なつながりを生む要素となるでしょう。
LLMに投げるプロンプトを見てみる
question="リィディアとオートマトン・ウルフの関係はなによ"
result = await rag.aquery(question, param=QueryParam(mode="hybrid", only_need_prompt=True))
print(result)
-
only_need_prompt=True
とすることで、プロンプトを見ることができます。 - ただ、2025年5月22日現在、
working_dir/kv_store_llm_response_cache.json
にキャッシュが存在すると、このプロンプトが表示されないようです。キャッシュを消せば問題なく表示されます。
Neo4jで可視化してみよう
-
working_dir/graph_chunk_entity_relation.graphml
はGraphML形式のXMLファイルとなっていて、Cypherクエリに変換可能です。実際に可視化してみると、
- 見ていて楽しいですね。
PathRAGとは
PathRAGは、Retrieval-Augmented Generation(RAG)をさらに進化させた新しいフレームワークです。
従来のRAGは外部知識ベースから関連情報を検索し、大規模言語モデル(LLM)の生成能力と組み合わせることで、より正確で文脈に沿った回答を実現してくれます。
ただ、従来型RAGには「情報の構造化や関係性の活用がイマイチ」「冗長な情報取得やプロンプトの非効率性が課題」みたいな悩みもありました。
PathRAGはこのあたりを解決するために、グラフ構造による知識表現や、パス(経路)に基づく情報抽出・プロンプト生成を導入しています。
PathRAGの特徴まとめ
1. グラフ構造によるインデックス化
- テキストデータベースをノード(テキストチャンク)とエッジ(意味的関係)からなるグラフとして構築します。
- これで知識間の依存関係や文脈的なつながりを、よりリッチに表現できるようになります。
2. フローに基づくプルーニング(剪定)
- PathRAGは、グラフ全体から関連情報を広く集めるのではなく、**最も重要な経路(パス)**だけを抽出します。
- これで冗長な情報を減らしつつ、LLMへの入力トークン数も大幅に削減。回答の一貫性や関連性もアップします。
3. パスベースのプロンプト生成
- 取得したパスを論理的な順序でテキスト化し、LLMに与えるプロンプトを構成します。
- これにより、LLMは文脈を踏まえた一貫性のある応答を生成しやすくなります。
参考文献
Discussion