1.3K Views
July 27, 24
スライド概要
2024.07.26 集まれエンジニアの森 #6 発表用資料
name: - いけだしんのすけ work: - インフラ・情シス like: - バイク - 読書 - 映画 - アニメ - ゲーム
GraphRAGっておいしいのだろうか?
本LTの趣旨 • 最近流行りの(?) GraphRAGについて少しかじってみたのでその 内容を話します。 • かじった程度の初学者なので至らない点が多々ありますが、ご 了承ください。 • 結論、おいしいかどうかはまだ分かってないです。これからさ らなる検証と運用を通して味わっていこうと思っています。
自己紹介 name: しんのすけ X: @orc_jj like: - バイク - 読書 - 映画 - アニメ work: - インフラ certification: - Azure Solutions Architect Expert - Azure Developer Associate - Azure AI Engineer Associate - AWS Solutions Architect Professional etc.. topic: - 娘の夏休みが始まりました - コミュ力を上げたい。まじで
GraphRAGとは GraphRAGは、Retrieval Augmented Generation(RAG)の技術を拡張したもので、ナレッジグラフを利用 して情報検索と生成を行う手法。2024年2月にMicrosoft Researchから発表。 従来のRAGはベクトル検索を用いて関連情報を取得し、新たなテキストを生成するが、GraphRAGはこれ に加えてグラフ構造を用いることで、単語間の関係性や文脈をより深く理解し、精度の高い検索結果を提 供できる。 1. テキストデータをノード(単語やフレーズ)とエッジ(単語間の関係性)として表現し、ナレッジグ ラフを作成します。このグラフ構造により、言語モデルが単語同士の関係性を深く理解 1. ユーザーのクエリに対して、ナレッジグラフとベクトルストアの両方を用いて回答を検索。 これにより、単語の類似度だけでなく、文脈上の関連性も考慮した精度の高い回答が得られる。 1. データセット全体から推論。従来のRAGはデータ全体からテーマを抽出するクエリに対して、類似コ ンテンツからの検索をおこなうが、GraphRAGの場合はナレッジ グラフの構造を活用しデータセット のテーマを明確にし、意味のあるクラスターを要約して回答する。
グラフ構造って? グラフ構造は、データをノード(実 体)とエッジ(関係)として表現。 この構造により、エンティティ間の複 雑な関係や階層構造を効果的に表現・ 検索することができる。 がノード がエッジ https://blog.langchain.dev/enhancing-rag-based-applications-accuracy-by-constructing-and-leveraging-knowledge-graphs/
ドラゴンボールの情報をグラフDBに格納してみる # Wikipediaの記事を読みこむ raw_documents = WikipediaLoader(query="ドラゴンボール",lang="ja",load_max_docs=1).load() # チャンキング text_splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=24) documents = text_splitter.split_documents(raw_documents[:3]) # gpt-4を使う llm=ChatOpenAI(temperature=0, model_name="gpt-4") llm_transformer = LLMGraphTransformer(llm=llm) # LLMを使って記事をグラフ構造にする graph_documents = llm_transformer.convert_to_graph_documents(documents) # グラフDBに格納する graph.add_graph_documents( graph_documents, baseEntityLabel=True, include_source=True ) LangChainブログからサンプルコードが提供されている
Cypher クエリ
MATCH p=()-[:ATTACK]->({id: "悟空"}) RETURN p;
MATCH p=()-[:CHILD_OF]->({id:"ベジータ"}) RETURN p;
悟空に攻撃を仕掛けた人物
ベジータの子供 & トランクスの親
LangChain
chain.invoke({
"question": "ドラゴンボールの作者は?"
})
ユーザーの質問から重要な要素を
LLMで抽出
ドラゴンボール
抽出した要素からLLMでCypher クエリを生成し
て検索 + ベクトル検索
取得した情報を簡単なテキスト形式
に変換する
CALL db.index.fulltext.queryNodes('entity', ドラゴンボール~2, {limit:2})
ドラゴンボール - 作成者 -> 鳥山明
ドラゴンボール - 掲載 -> 週刊少年ジャンプ
ドラゴンボール - 主人公 -> 孫悟空
ドラゴンボール - 放送 -> フジテレビ
YIELD node,score
CALL { WITH node MATCH (node)-[r:!MENTIONS]->(neighbor) RETURN
node.id + ' - ' + type(r) + ' -> ' + neighbor.id AS output UNION
ALL WITH node MATCH (node)<-[r:!MENTIONS]-(neighbor) RETURN
neighbor.id + ' - ' + type(r) + ' -> ' +
node.id AS output }
RETURN output LIMIT 50;
「ドラゴンボール」に類似したエンティティをフル
テキスト検索し、それらのエンティティと関連する
MENTIONS 関係を持つノードの情報を収集し、最大
50件の結果を返すクエリ。
『ドラゴンボール』(DRAGON BALL)
は、鳥山明による日本の漫画作品。『週
刊少年ジャンプ』(集英社)にて1984年
51号から1995年25号まで連載された。
略称は「DB」。
世界中に散らばった七つの球をすべて集
めると、どんな願いも一つだけ叶えら
れ...
LangChain 変換されたテキスト 与えられたコンテキストを元に 最終回答を生成 ドラゴンボール - 作成者 -> 鳥山明 ドラゴンボール - 掲載 -> 週刊少年ジャンプ ドラゴンボール - 主人公 -> 孫悟空 ドラゴンボール - 放送 -> フジテレビ 『ドラゴンボール』(DRAGON BALL) は、鳥山明による日本の漫画作品。『週 刊少年ジャンプ』(集英社)にて1984年 51号から1995年25号まで連載された。 略称は「DB」。 世界中に散らばった七つの球をすべて集 めると、どんな願いも一つだけ叶えら れ... ドラゴンボールの作者は鳥山明です。
従来のRAGと違いがあるか実験 通常のベクトル検索 result = qa_chain({"question": "ブルマはどこの 星に行ったことがある?"}) 検索 検索結果にどこ の星行ったか書 いてねーじゃん 検索結果 申し訳ありません。ブルマがどの星に行っ たことがあるかについては、提供された情 報からは確認できませんでした。 異なる次元に存在し、原則上は死者と神しか立ち入ること ができないあの世へも移動可能。また対象者は必ずしも厳 密な知人である必要はなく、「ピッコロにそっくりな気」 という曖昧な認識を基に気を探って直接面識のある相手が 一人もいないナメック星への瞬間移動を果たしている。移 動だけでなく攻撃技にも組み込み、かめはめ波を併用した 「瞬間移動かめはめ波」という応用技がある他、敵の攻撃 を回避する際に用いられる。時間が無かったため悟空がヤ ードラット人に教わったのは瞬間移動のみだが、それでも ビルス編(エイジ778) 習得にかなり苦労した。漫画版の『超』では、ヤードラッ 魔人ブウ戦から数年後、悟飯とビーデルが結婚した頃にはチチ ト星人が使える術の基礎でしかないことが明かされた。¥n とセルゲーム前に交わした約束通り働いており、トラクターを 舞空術(ぶくうじゅつ)¥n全身の気をコントロールしなが 運転し畑仕事に従事している。親戚関係になったサタンから、 ら放出することによって、空中を飛行する。第23回天下一 彼が世界平和大賞を受賞した際に受け取った1億ゼニーをもらい、 武道' そのお金をチチに渡したことにより北の界王のもとに修行に行 く許可をもらう。界王星での修行中、ブルマの誕生日パーテ ィーのことを思い出すも元々パーティーが苦手だと話し、ビル スのことを隠す界王の様子が気になるため行くのをやめた。し かしその後超サイヤ人ゴッドを探しに来たビルスと戦うことに なり、超サイヤ人3になっても敵わず、たった2発の攻撃で重傷 を負う。ビルスが地球へと飛び去った後、界王たちから止めら れながらも仲間たちのことを心配するなど劇場版『ドラゴンボ ールZ 神と神』以上に仲間思いな部分が出ていた
従来のRAGと違いがあるか実験
グラフ + ベクトル検索
'ブルマ - TRAVEL_TO -> ナメック星'
result = chain.invoke({"question":
"ブルマはどこの星に行った事がある?"})
検索
ブルマ TRAVEL
TO ナメック星
書いてるう!
検索結果
ブルマはナメック星に行ったことがあります。
参考サイト サンプルコードでさくっと試す https://blog.langchain.dev/enhancing-rag-based-applicationsaccuracy-by-constructing-and-leveraging-knowledge-graphs/ もう少し詳しく理解する https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/
GraphRAG Accelerator https://github.com/Azure-Samples/graphrag-accelerator Azure上でGraphRagを動かすために必要なリソースをデ プロイするIaCや、nodebooks形式での実行コードが含ま れている。デプロイするとGraphRAG APIエンドポイント が生える。 文字数17万程のドキュメントを前処理し、動作確 認してリソース類を1日放置した際の金額 15,000円近くなってしまった (ご利用は計画的に...)
まとめ ● GraphRAGっておいしいの? まだ分かりません!!試しに既存のRAGボットを置き換えてみ てユーザー体験や、運用するにあたってのつらみがどうなのか とか色々これからやってみるつもり。 ● そもそもRAG以前に... グラフDBやグラフ構造、クエリ言語のキャッチアップをしない と良く分からない事が多い!!勉強します
ご清聴有難うございました。