Slide 1

Slide 1 text

Graph Database と Generative AI の素敵な関係 Oracle Cloud Hangout Cafe Season9 #1 Sho Obata Solutions Architect, Communication Solutions Oracle Corporation Japan

Slide 2

Slide 2 text

自己紹介 Copyright © 2024, Oracle and/or its affiliates 2 @sh-sho GitHub/Linkedin/Qiita 小畑 晶 (Sho Obata) 通信ソリューション本部 日本オラクル株式会社 コミュニティ • Oracle Cloud Hangout Caféメンバー コメント • Oracle歴 2年半 • もうすぐスノボシーズン、今年こそは北海道で滑る!

Slide 3

Slide 3 text

アジェンダ 1. Graph Databaseとは 2. Neo4j 3. Graph Database と LLM 4. Graph RAG 5. Oracle Graph 3 Copyright © 2024, Oracle and/or its affiliates

Slide 4

Slide 4 text

話すこと、話さないこと 話すこと • Graph, Graph Database, Graph RAGの概要と構築する際に役立つ周辺情報 • Neo4j, Oracle Graph, LangChain • Relational DatabaseとGraph Databaseの比較 話さないこと • LLMに関する詳細な仕組み、LLM間の比較 • 類似ツールとの比較 • LangChain vs LlamaIndex • Neo4j vs Other Graph DB 4 Copyright © 2024, Oracle and/or its affiliates

Slide 5

Slide 5 text

なぜGraph Databaseの話なのか? • Large Language Model (LLM) が注目されている • 公開情報に基づいた高度なテキスト生成が可能 • 非公開の社内データやプライベートな知識も踏まえて利用するニーズが増加 • Retrieval-Augmented Generation (RAG) の活用 • テキスト生成の精度を向上させる技術として注目 • Web検索、全文検索やVector検索によって、外部リソースからデータを取得して補う • データストアとRAGの関係 • 検索機能を備えたDBが利用され、一般的にはVector Storeが使われる • Graph Databaseが複雑なデータ関係性の管理に優れており、注目されている 5 Copyright © 2024, Oracle and/or its affiliates

Slide 6

Slide 6 text

Graph Databaseとは 6 Copyright © 2024, Oracle and/or its affiliates

Slide 7

Slide 7 text

Graphとは? 7 Copyright © 2024, Oracle and/or its affiliates 「グラフ」という言葉で何を思い浮かべますか? 円グラフ A B C 0 10 20 30 40 a b c d e 棒グラフ 0 5 10 15 20 25 30 0min 5min 10min 15min 20min 折れ線グラフ 一般的なグラフ 関係性を示したグラフ 路線図 相関図 参考: 東京近郊路線図 https://www.jreast.co.jp/map/pdf/map_tokyo.pdf 大河ドラマ「光る君へ」 全体相関図・キャスト https://www.nhk.jp/p/hikarukimie/ts/1YM111N6KW/blog/bl/p8na9PYYwM/bp/pjNQNPpQrA/

Slide 8

Slide 8 text

Graphとは? 8 Copyright © 2024, Oracle and/or its affiliates Graphとは・・・ グラフは頂点(vertex)と辺(edge)の集合。 または、少しなじみやすい言葉で言うと、一連のノード(節点)とそのノードをつなぐ関係を示している。 グラフは、エンティティをノードとして表し、エンティティが世界とどのように関連しているかを関係として表す。 頂点 (Vertex, Node) 辺 (Edge, Relation, Link) 頂点 (Vertex, Node) 頂点 (Vertex, Node) 辺 (Edge, Relation, Link) (O'Reilly: グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門より)

Slide 9

Slide 9 text

Graphとは? Property Graph 9 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城 • グラフモデルの実装 (Property Graph) • グラフにはNodeとEdgeが含まれている • 辺は向きを持ってもよい (有向グラフ) • 頂点、辺はLabelを持ってもよい • 頂点、辺はPropertyを持ってもよい 要素 説明 例 Node データのエンティティを表す 織田信長 Edge ノード間の関係性を表す 部下 Label ノードやエッジにカテゴリやタイプで識 別できるように種類を付与できる (人物) Property Key-Valueでノードやエッジに属性 データを付与できる 年齢:40歳

Slide 10

Slide 10 text

Graphとは? RDF Graph Resource Description Framework (RDF) Graphとは • RDFはW3C*によって勧告された • データを3つの要素で構成されたトリプル形式で表す • URIを利用して定義済みのものにアクセスできるようにする • 異なる情報源からデータを統一的に標準化してグラフ化し てリンクさせることが目的 • データをウェブ上で相互にリンクさせて、オープンに公開する Linked Open Data などの取り組みに使われる • SPARQLというクエリ言語を利用する 10 Copyright © 2024, Oracle and/or its affiliates 織田信長 (S) 豊臣秀吉 (O) 部下にした (V) 岐阜城 (O) 住んでいた (V) http://jp.dbpedia.org/resource/織田信長 http://jp.dbpedia.org/resource/豊臣秀吉 http://example.com/部下 http://example.com/居住 http://example.com/岐阜城 織田信長が 豊臣秀吉を 部下にした。 織田信長は 岐阜城に 住んでいた。 (S) (O) (V) (S) (O) (V) トリプル形式 • 主語 (S)-述語 (V)-目的語 (O) *W3Cはウェブ技術の標準化を推進する国際的な団体

Slide 11

Slide 11 text

Graphをシステムとして管理、処理、分析するための技術領域は大きく2つに分けられる • Graph Database • オンライントランザクション処理 (OLTP) によるグラフの永続化のための仕組み • トランザクションのパフォーマンス最適化、整合性、可用性などの技術 • e.g. Neo4j, TigerGraph, etc... • Graph Compute Engine • データマイニング、オンライン分析処理 (OLAP) やビジュアライズのための仕組み • 大規模データセットに対してグラフ生成、グラフアルゴリズムを実行したりする技術 • e.g. Giraph, Pregel, Cassovary, Neo4j, etc... Graph管理 11 Copyright © 2024, Oracle and/or its affiliates Graph Compute Engine Graph Database Data ETL View, Analyze

Slide 12

Slide 12 text

Graphをシステムとして管理、処理、分析するための技術領域は大きく2つに分けられる • Graph Database • オンライントランザクション処理 (OLTP) によるグラフの永続化のための仕組み • トランザクションのパフォーマンス最適化、整合性、可用性などの技術 • Ex. Neo4j, TigerGraph, etc... • Graph Compute Engine • データマイニング、オンライン分析処理 (OLAP) やビジュアライズのための仕組み • 大規模データセットに対してグラフ生成、グラフアルゴリズムを実行したりする技術 • e.g. Giraph, Pregel, Cassovary, Neo4j, etc... Graph管理 12 Copyright © 2024, Oracle and/or its affiliates Graph Compute Engine Data ETL View, Analyze • Graph Database • オンライントランザクション処理 (OLTP) によるグラフの永続化のための仕組み • トランザクションのパフォーマンス最適化、整合性、可用性などの技術 • e.g. Neo4j, TigerGraph, etc... 本日はココを紹介 Graph Database

Slide 13

Slide 13 text

Graph Databaseとは? 13 Copyright © 2024, Oracle and/or its affiliates • Graph Databaseについて グラフデータベース管理システム(以降、グラフデータベース)は、グラフデータモデルを公開するCRUD (Create/Read/Update/Delete)メソッドを備えた、オンラインデータベース管理システム。 一般に、グラフデータベースはトランザクション(OLTP)システムとともに使用するために構築される。 • Graph Databaseの種類 専用 Graph Database • グラフ専用のデータベースなので、グラフ操作に最適化されている 汎用 Database • RDB、NoSQLのデータベースの一機能としてGraphが搭載 • 各クラウドベンダーもGraphを扱えるDBを提供 (グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門より) Azure Cosmos DB

Slide 14

Slide 14 text

Graph Databaseの特徴 14 Copyright © 2024, Oracle and/or its affiliates • グラフを辿る検索 (トラバーサル) が高速 • 各頂点は接続先の辺の情報を持つ。 • 探索時に経路に関係するデータのみのアクセスで辿ることができるため、 高速に結果を取得できる • 辿る検索の高速性を生かし、パターン照合を行うクエリをパターンマッ チングという • グラフのクエリ言語による処理が可能 • Cypher, PGQL, Gremlinといったグラフ専用のクエリ言語 • グラフクエリの国際規格が定められている Graph Query Language: GQL ※リレーショナルモデルのSQLで記述すると 複数回のjoinが発生しクエリが複雑 になることが多い

Slide 15

Slide 15 text

Graph Databaseのユースケース 顧客マッチング・レコメンデーション • 顧客情報と購入製品やカタログをグラフモデルにする • グラフモデルに顧客とその顧客が好む製品の関係性が 反映されており、レコメンデーションを行える マネーロンダリング • ユーザー間のトランザクションやメールアドレス、住所な どをグラフモデルにする • ユーザーの口座間での送金の関係性が明らかになり、 犯罪者の不正取引を発見することができる。 15 Copyright © 2024, Oracle and/or its affiliates Product Customer Purchased Recommendation $2,000 $3,000 $1,000 Customer Bank

Slide 16

Slide 16 text

Graph Databaseのユースケース BoM Tree (Bill of Materials Tree) • 部品の製品情報とその依存関係をグラフモデルにする • 何千もの依存関係を持つ部品に対してインタラクティ ブな分析が可能 • 製品ベンダーやサプライヤー、材料などの情報をグラフ 化することで、管理や検査が容易になる ソーシャルメディア分析 • アカウントのFollow/Follower, Post/Repostの関 係をグラフモデルにする • ソーシャルメディア企業はグラフ処理を活用して世界中 の友人や家族を特定し、ユーザーや製品などをレコメ ンドすることができる。また不正行為やフェイクアカウント を特定することにも活用される。 16 Copyright © 2024, Oracle and/or its affiliates 自動車 シャーシ サスペンション ボディ タイヤ ホイール エンジン ボンネット ドア etc... Follow Follower Follow Follow Follower Repost Post DM DM

Slide 17

Slide 17 text

Relational DatabaseとGraph Databaseのリレーションの違い データ構造 Relational Database (RDB) • 行と列の表形式でリレーションを用いて表される • スキーマが厳格で、データの形式や構造が事前に定義 17 Copyright © 2024, Oracle and/or its affiliates ID Name Age Label 1 織田信長 40 人物 2 豊臣秀吉 37 人物 3 蜂須賀正勝 48 人物 ID Rel Source Target Year 1 部下 1 2 1554年 2 部下 2 3 1566年 ID Name 1 岐阜城 Graph Database • ノードとエッジによってその複雑な関係が直接表現される • スキーマが柔軟で、ノードやエッジに対してプロパティを追 加可能 (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城 ID Rel Source Target 1 居住 1 1 Person Rel_Live Rel_Person Castle

Slide 18

Slide 18 text

Relational DatabaseとGraph Databaseのリレーションの違い クエリ言語 SQL (Structured Query Language) • 宣言型で、Joinを使って複数のテーブルからデータを 取得 Q. 豊臣秀吉の上司が住んでいる城は?→A. 岐阜城 18 Copyright © 2024, Oracle and/or its affiliates GQL (Graph Query Language) • ノードとエッジの関係を直接トラバースしデータを取得 Q. 豊臣秀吉の上司が住んでいる城は?→A. 岐阜城 MATCH (a:Person {name: '豊臣秀吉'}) <– [: RETAINER] - (b) – [: RESIDES_AT] -> (c: Castle) RETURN a, b, c SELECT Castle.Name FROM Person p JOIN Rel_Person rp ON p.ID = rp.Source JOIN Rel_Live rl ON rl.Source = p.ID JOIN Castle c ON rl.Target = c.ID WHERE p.Name = '豊臣秀吉'; SQLよりクエリが短く、トラバース処理が速い

Slide 19

Slide 19 text

Graphの得意なこと、苦手なこと 19 Copyright © 2024, Oracle and/or its affiliates 得意なこと • ノードとエッジにより複雑な関係性を直接表現する • ソーシャルネットワーク • レコメンドシステム • ネットワーク分析 • 直接トラバースするためパス探索のクエリが高速 • グラフ構造を活かした最短経路探索 • 複雑な接続性を取得するトポロジカルクエリ • 厳密なスキーマを必要としない柔軟なスキーマ管理 苦手なこと • SUM、AVGといった集計処理や大規模データの統計分析 処理は、RDBのほうが適している • 単純なテーブルや整合性を必要とするデータには不向き • 関係がシンプルな場合、Graphの優位性はあまりない • スキーマレスなため、整合性を強制することは難しい • 周辺ツールやエコシステムの制限 • RDBに比べてGraph DatabaseはBI、ETLなどの 周辺ツールが進んでいない

Slide 20

Slide 20 text

Neo4j 20 Copyright © 2024, Oracle and/or its affiliates

Slide 21

Slide 21 text

Neo4j Javaで実装されたOSSの Native Graph Database ツール、アプリケーション、ライブラリが豊富でエコシステムが充実している ■用途別 • Graph Database: グラフデータ管理、トラバーサル用に設計 • Graph Data Science: データ分析、機械学習用に設計 ■利用形態 • ホスト: Neo4j Graph Database, Graph Data Science • マネージドサービス: Neo4j Aura (AuraDB, AuraDS) ■クエリ言語 • Cypher 21 Copyright © 2024, Oracle and/or its affiliates

Slide 22

Slide 22 text

Neo4j エコシステム Neo4jのエコシステムの一部を紹介 ■Language libraries • Python, Go, Java, JavaScript, .NET ■操作/描画ツール • Neo4j Desktop • Neo4j Browser • Neo4j Bloom* • Neo4j Knowledge Graph Builder ■運用/管理 • Neo4j Data Importer • Neo4j Ops Manager 22 Copyright © 2024, Oracle and/or its affiliates *Enterprise Editionが必要 Neo4j Browser Neo4j Knowledge Graph Builder

Slide 23

Slide 23 text

Neo4j データアクセス グラフデータベースのネイティブ処理機能のひとつにインデックスなし隣接性という特性がある • 各ノードが隣接ノードへの直接アクセスが可能 • グローバルなインデックスより低リソースで検索ができる インデックスが有効なケース • 特定のデータを高速に検索できる • e.g. 年齢が40歳以上の人物を検索する インデックスなし隣接性が有効なケース • 隣接するノードを高速に探索できる • e.g. 織田信長の部下は誰か検索する 23 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城

Slide 24

Slide 24 text

Neo4j 可用性 Neo4jのクラスタリングは、以下の機能を提供する • 安全性、スケール、一貫性、操作性 • Raftによるレプリケーション • リードレプリカあり プライマリモード • 読み取り、書き込み操作が許可されている • 高可用性を実現するには、複数のプライマリが必要 • F台の障害を許容するには、2F+1台必要 • 1台の障害を許容するには3台のクラスタ • 2台の障害を許容するには5台のクラスタ セカンダリモード • 読み取り専用 • プライマリから非同期にレプリケート 24 Copyright © 2024, Oracle and/or its affiliates 負荷分散クラスタ プライマリ セカンダリ セカンダリ 高可用性クラスタ プライマリ プライマリ プライマリ

Slide 25

Slide 25 text

Cypher グラフ要素のCRUD (Create、Read、Update、Delete) をするクエリ言語 • Neo4jによって設計された言語 • CREATE, DELETE等の変更処理やMATCH, RETURN等の読み取り処理がある 25 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城

Slide 26

Slide 26 text

Cypher (ノード、エッジの作成) Write Query • CREATEでグラフのノードとエッジを作成 • DELETE, REMOVEで削除可能 26 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城 Query Result CREATE ( GifuCastle:Castle { name: ’岐阜城’ } ) <-[ :RESIDES_AT ]- ( OdaNobunaga :Person { name: '織田信長‘, age: 40 } ) -[ : RETAINER { since: 1554 } ]-> ( ToyotomiHideyoshi:Person { name: ‘豊臣秀吉’, age: 37 } ) -[: RETAINER {since: 1566}]-> ( HachisukaMasakatsu:Person { name: '蜂須賀正勝’, age: 48 } )

Slide 27

Slide 27 text

Cypher (読み取り) Read Query • MATCH, OPTIONAL MATCH, RETURNを使いパターンマッチングを実行する • WHERE句、ORDER BY句、LIMIT句でフィルター可能 27 Copyright © 2024, Oracle and/or its affiliates Query Result Query Result Read Query 2 • 集計、期間、ラベルなど関数が用意されている MATCH ( a:Person )-[ :RETAINER ]->(b)-[:RETAINER ]->(c) WHERE a.name = '織田信長' RETURN a, b, c MATCH p=( n:Person )-[ r ]->( ) RETURN relationships( p ) , labels( n )

Slide 28

Slide 28 text

グラフクエリの国際規格 GQL ISO/IEC 39075:2024 グラフデータベース用のISO国際基準クエリ言語として正式 に公開された SQL/PGQ ISO/IEC 9075-16:2023 SQLの拡張としてプロパティグラフに対してクエリできる規格 e.g. Oracle 28 Copyright © 2024, Oracle and/or its affiliates

Slide 29

Slide 29 text

Graph Database と LLM 29 Copyright © 2024, Oracle and/or its affiliates

Slide 30

Slide 30 text

LLMとは? Large Language Model/大規模言語モデル 言語モデル • 人間が扱う自然言語で書かれた文や文章が生成される確率をモデル化したもの • 個別のタスク(エンティティ抽出、センチメント分析、etc.)ごとにモデルを作成 大規模言語モデル • 多くのパラメータを使用して、ラベル付けされていない多くのテキストデータから学習されたディープラーニング技術を用 いて構築された言語モデルのこと • モデル1つで汎用的にタスク(テキスト生成、要約、翻訳、エンティティ抽出、etc.)を行うことができる 30 Copyright © 2024, Oracle and/or its affiliates Task A Task B Task D … Task A Task B Task D … 言語モデル 大規模言語モデル

Slide 31

Slide 31 text

RAG(Retrieval-Augmented Generation)とは? LLMのテキスト生成を関連情報を取得する検索システムと統合することで強化する手法のこと • LLMの入力プロンプトに検索結果を組み込むことで、LLMのテキスト生成を調整する • よく使われる検索システムの例 • (ベクトル)データベース、全文検索エンジン、etc. 31 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 関連情報に基づいて、質問に回答してください ## 関連情報 OCHaCafeは、日本オラクルが主催するコミュニティ の1つです。… ## 質問 OCHaCafeってなんですか? OCHaCafeって なんですか? OCHaCafeは、日本オラクルが主 催するコミュニティの1つです。…

Slide 32

Slide 32 text

従来のRAGの課題とは? 従来のRAGの課題 • データの関係性を複数横断する際に、離れた点の関係性を結び付けて回答することが苦手 e.g. 友達の友達、前の席の横の席の人、etc... • 大規模なデータや大きなドキュメントにおいて、要約された意味的概念を総合的に理解することが苦手 e.g. ドキュメントをチャンクに分割した場合、チャンクを横断する総合的な理解が難しい 32 Copyright © 2024, Oracle and/or its affiliates Graphを使うことで、横断的なリソースを検索することが可能 この課題を解決する方法として、Graph RAGが期待されている

Slide 33

Slide 33 text

Graph RAGとは? RAGの検索システムにKnowledge Graphを使用し、検索の精度を向上させる手法のこと • Graphを使うことで関係する情報を結び付けることができる • 特にグラフデータベースと相性が良い特定のユースケースで効果を発揮 e.g. 顧客マッチング・レコメンデーション, ソーシャルメディア分析 etc... • LLMを使ってGraphを作成することもできる 33 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 Knowledge Graph (Graph Database) Graph Query

Slide 34

Slide 34 text

従来のRAG (Vector) と Graph RAG 34 Copyright © 2024, Oracle and/or its affiliates 参考: https://neo4j.com/blog/knowledge-graph-vs-vectordb-for-retrieval-augmented-generation/ Data Store: • Vector Store 複雑性: • クエリに条件を複数付与すると、情報を速く正確 に見つけるのが難しくなる 完全性: • 類似度による取得のため、不完全、無関係な結 果を提供する可能性がある データソースの透明性: • 誤った情報を検索した場合、Vectorの類似性で 判断しているため、誤った原因を特定できない Data Store: • Graph Store 複雑性: • クエリに条件を複数付与しても、情報があれば速 く正確に見つけられる 完全性: • ノードとエッジで接続されているので、グラフに存在 する正確な答えを返す データソースの透明性: • 誤った情報を検索した場合、検索されたデータを 確認し原因を特定できる 従来のRAG (Vector) Graph RAG

Slide 35

Slide 35 text

Graph RAG 35 Copyright © 2024, Oracle and/or its affiliates

Slide 36

Slide 36 text

なぜGraph RAGが登場したのか? 36 Copyright © 2024, Oracle and/or its affiliates 参考論文: From Local to Global: A Graph RAG Approach to Query-Focused Summarization MicrosoftのGraph RAGに関する論文が登場 Gtaph RAG Quick Start: https://microsoft.github.io/graphrag/posts/get_started/ GitHubリポジトリ: https://github.com/microsoft/graphrag GraphにLLMをもっと活用するには… • LLMを使いGraphを作成する • LLMを使いグラフクエリを生成する エンティティの関係性を反映できるGraph 自然言語の文脈から要素を抽出できるLLM & 理由は、GraphとLLMの相性が良いから

Slide 37

Slide 37 text

MicrosoftのGraph RAGのフロー MicrosoftのGraph RAGのフロー ① ソースドキュメント → テキストチャンク • 処理のためにテキストチャンクに分割する • 次のステップ作られるエンティティの数がチャンクサイズで変わる ② テキストチャンク → 要素インスタンス • チャンクからLLMを使い、ノード、エッジ、プロパティを抽出 ③ 要素インスタンス → 要素の概要 • 暗黙の関係も踏まえて概要を作成 ④ 要素の概要 → グラフコミュニティ • 取得した要素をグラフ化 • クラスタリングを行い階層を持つコミュニティに分割 ⑤ グラフコミュニティ → コミュニティの概要 • 各コミュニティの要約を作成 ⑥ コミュニティの概要 → コミュニティの回答 → グローバルアンサー • ユーザークエリに対して、コミュニティの要約を使い回答を作成 37 Copyright © 2024, Oracle and/or its affiliates 参考論文: From Local to Global: A Graph RAG Approach to Query-Focused Summarization 1 2 3 4 5 6 6 グラフコミュニティとは? グラフ上で類似性の高いノードを部分グラフに分割する操作をコミュニティ検 出という。階層型のコミュニティに分割し、サマリーを作成することで、グラフの 範囲を絞って理解し検索することができるため精度が上がる。

Slide 38

Slide 38 text

Graph RAGの手法 Graph RAGを考える上で重要なポイント • Knowledge Graphの作成方法 事前にグラフを作成するか、LLMにグラフを作成させるか • Graph Queryを使った検索方法 事前にクエリを用意するか、LLMにクエリを作成させるか 38 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 Knowledge Graph (Graph Database) Graph Query

Slide 39

Slide 39 text

Graph RAGの手法 Graph RAGを考える上で重要なポイント • Knowledge Graphの作成方法 事前にグラフを作成するか、LLMにグラフを作成させるか • Graph Queryを使った検索方法 事前にクエリを用意するか、LLMにクエリを作成させるか 39 Copyright © 2024, Oracle and/or its affiliates LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 Graph Query 検索システム Knowledge Graph (Graph Database)

Slide 40

Slide 40 text

Knowledge Graphの代表的な作成方法 Copyright © 2024, Oracle and/or its affiliates 40 ドメイングラフ • ビジネスドメインの Knowledge Graph • 既存のデータをGraph化して 利用するケースが多い • テキストから語彙を抽出したグラフ • LLMやアルゴリズムを使い、テキスト からノード、エッジ、プロパティを抽出 する • テキストから語彙を抽出したグラフ • LLMやアルゴリズムを使い、テキストから ノード、エッジ、プロパティを抽出する • 類似ノードごとにコミュニティを作成する 語彙グラフ エンティティ拡張 語彙グラフ エンティティ拡張 & コミュニティサマリー 参考: GraphRAG https://graphr.ag/ Document Chunk 1 Chunk 2 Chunk n Entity Z Entity Y Entity X HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY PART_OF PART_OF PART_OF RELATES_TO RELATES_TO … Documen t Chunk 1 Chunk 2 Chunk n Entity Z Entity Y Entity X HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY PART_OF PART_OF PART_OF RELATES_TO RELATES_TO … Community Ⅰ Community Ⅱ Community IN_CUMMUNITY IN_CUMMUNITY IN_CUMMUNITY PARENT_CUMMUNITY PARENT_CUMMUNITY Entity X RELATES_TO Entity Y Entity Z RELATES_TO

Slide 41

Slide 41 text

語彙グラフ エンティティ拡張 41 Copyright © 2024, Oracle and/or its affiliates ■語彙グラフ エンティティ拡張 • ドキュメントから語彙を抽出しグラフを作成する • 中規模のグラフ ■作成方法 1. ドキュメントをチャンクに分割 2. LLMを使いチャンクごとに、ノード、エッジ、プロパティを抽出 3. ノードの重複削除 ■活用イメージ • 長文ドキュメント (ショートペーパー、社内ドキュメント, etc…) 参考: GraphRAG https://graphr.ag/ Document Chunk 1 Chunk 2 Chunk n Entity Z Entity Y Entity X HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY PART_OF PART_OF PART_OF RELATES_TO RELATES_TO …

Slide 42

Slide 42 text

語彙グラフ エンティティ拡張 & コミュニティサマリー 42 Copyright © 2024, Oracle and/or its affiliates ■語彙グラフ エンティティ拡張 & コミュニティサマリー • ドキュメントから語彙を抽出しグラフを作成する • 大規模なグラフ • データセット全体に及ぶグローバルなサマリーを検索可能 ■作成方法 1. ドキュメントをチャンクに分割 2. LLMを使いチャンクごとに、ノード、エッジ、プロパティを抽出 3. ノードの重複削除 4. 類似ノード、リレーションからコミュニティ作成する ■活用イメージ • (複数の) 長文ドキュメント (論文、仕様書、etc…) 参考: GraphRAG https://graphr.ag/ Document Chunk 1 Chunk 2 Chunk n Entity Z Entity Y Entity X HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY HAS_ENTITIY PART_OF PART_OF PART_OF RELATES_TO RELATES_TO … Community Ⅰ Community Ⅱ Community IN_CUMMUNITY IN_CUMMUNITY IN_CUMMUNITY PARENT_CUMMUNITY PARENT_CUMMUNITY

Slide 43

Slide 43 text

LangChain LLMを活用したアプリケーションのためのフレームワーク • LangChain(Python), LangChain.js(JavaScript/TypeScript) • LLMアプリケーションのライフサイクルを簡素化 • 開発(LangChain)、運用監視(LangSmith)、デプロイメント(LangServe) Graphに関係するライブラリ • langchain-community/graphs: Graphの基本操作、クエリやグラフ構築 • langchain-community/chains/graph_qa: グラフを検索するQAchainを提供 • langchain_experimental/graph_transformers: Textからノード、エッジ、プロパティ情報を抽出 43 Copyright © 2024, Oracle and/or its affiliates

Slide 44

Slide 44 text

LangChainを使ったGraph RAGのフロー グラフの構築 44 Copyright © 2024, Oracle and/or its affiliates Document '織田 信長(おだ のぶなが)は、日本の戦 国時代から安土桃山時代にかけての武将・大 名。戦国の三英傑の一人。 … しかし、近年の歴史学界ではその政策の前時 代性が指摘されるようになり、しばしば「中世 社会の最終段階」とも評され[2]、その革新性 を否定する研究が主流となっている' [GraphDocument( nodes=[ Node(id='織田信長', type='Person’), Node(id='豊臣秀吉', type='Person'), … Node(id='今川義元', type='Person’), Node(id='尾張国', type='Place’) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person’), target=Node(id='豊臣秀吉', type='Person’), type=‘RETAINER’) … ] (人物) 織田信長 部下 (人物) 豊臣秀吉 (場所) 尾張国 GraphDocuments Graph Function: LLMGraphTransformer .convert_to_graph_documents() Function: Neo4jGraph .add_graph_documents()

Slide 45

Slide 45 text

LLMを使ってTextからグラフ要素を抽出 langchain_experimental.graph_transformers.LLMGraphTransformer LLMを使いDocumentからグラフのノード、エッジ、プロパティを抽出する 抽出するノードやエッジを事前に設定可能 LLMの条件: • 構造化出力が可能か (with_structured_outputが必要) e.g. OpenAI Argument: • llm: LLMを指定 • allowed_nodes: 抽出するノードの種類 • allowed_relationships: 抽出する関係の種類 • Prompt: Graph要素を抽出するためのプロンプト • node_properties: 抽出するノードのプロパティの種類 • relationship_properties: 抽出する関係のプロパティの種類 etc... 45 Copyright © 2024, Oracle and/or its affiliates Document '織田 信長(おだ のぶなが)は、日本 の戦国時代から安土桃山時代にかけて の武将・大名。戦国の三英傑の一人。 … しかし、近年の歴史学界ではその政策の 前時代性が指摘されるようになり、しばし ば「中世社会の最終段階」とも評され [2]、その革新性を否定する研究が主流 となっている' [GraphDocument( nodes=[ Node(id='織田信長', type='Person’), Node(id='豊臣秀吉', type='Person'), … Node(id='今川義元', type='Person’), Node(id='尾張国', type='Place’) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person’), target=Node(id='豊臣秀吉', type='Person’), type=‘RETAINER’) … ] GraphDocuments LLMGraphTransformer( llm=llm, allowed_nodes=["Person", "Place", "Role"], allowed_relationships=["Retainer", "Resides_at", "Had_role"] )

Slide 46

Slide 46 text

LLMを使ってTextからグラフ要素を抽出 LLMGraphTransformer.convert_to_graph_documents() convert_to_graph_ducments() (process_response()) の関数を使いTextをグラフの要素に変換する。 46 Copyright © 2024, Oracle and/or its affiliates Document GraphDocuments llm_transformer = LLMGraphTransformer( llm=llm, allowed_nodes=["Person", "Place", "Role"], allowed_relationships=["Retainer", "Resides_at", "Had_role"] ) text = """ 織田 信長(おだ のぶなが)は、日本の戦国時代から安土桃山時代にかけての武将・大名。戦国の 三英傑の一人。 … しかし、近年の歴史学界ではその政策の前時代性が指摘されるようになり、しばしば「中世社会の最 終段階」とも評され[2]、その革新性を否定する研究が主流となっている """ documents = [Document(page_content=text)] graph_documents = llm_transformer.convert_to_graph_documents(documents) print(graph_documents) [GraphDocument( nodes=[ Node(id='織田信長', type='Person', properties={}), Node(id='豊臣秀吉', type='Person', properties={}), … Node(id='徳川家康', type='Person', properties={}) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person', properties={}), target=Node(id='尾張国', type='Place', properties={}), type='RESIDES_AT', properties={}), … Relationship( source=Node(id='織田信長', type='Person', properties={}), target=Node(id='豊臣秀吉', type='Person', properties={}), type='RETAINER', properties={}), ], source=Document(metadata={}, page_content='織田 信長(おだ のぶな が)は、日本の戦国時代から安土桃山時代にかけての武将・大名 … 研究が主流となっている') # Result

Slide 47

Slide 47 text

グラフ要素からグラフの作成 langchain_community.graphs.Neo4jGraph LangChainでNeo4jのグラフを使うときのクラス Functions: • query: Cypherを使いクエリを実行する • add_graph_documents: 抽出されたグラフ要素をグラフにする etc... 47 Copyright © 2024, Oracle and/or its affiliates [GraphDocument( nodes=[ Node(id='織田信長', type='Person’), Node(id='豊臣秀吉', type='Person'), … Node(id='今川義元', type='Person’), Node(id='尾張国', type='Place’) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person’), target=Node(id='豊臣秀吉', type='Person’), type=‘RETAINER’) … ] (人物) 織田信長 部下 (人物) 豊臣秀吉 (場所) 尾張国 GraphDocuments Graph graph = Neo4jGraph( url="bolt://localhost:7687", username="neo4j", password="password" ) [{‘a': {'name': '織田信長', 'age': 40}, ‘b': {'name': ‘豊臣秀吉', 'age': 37}, ‘c': {'name': '蜂須賀正勝', 'age': 48}}] # Result graph.query( """ MATCH (a:Person)-[:RETAINER]->(b)-[:RETAINER]->(c) WHERE a.name = '織田信長' RETURN a, b, c """ ) # Query

Slide 48

Slide 48 text

グラフ要素からグラフの作成 Neo4jGraph.add_graph_document() 抽出されたグラフ要素をNeo4jのグラフに変換する 48 Copyright © 2024, Oracle and/or its affiliates graph.add_graph_documents(graph_documents) Neo4jにグラフが作成される [GraphDocument( nodes=[ Node(id='織田信長', type='Person’), Node(id='豊臣秀吉', type='Person'), … Node(id='今川義元', type='Person’), Node(id='尾張国', type='Place’) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person’), target=Node(id='豊臣秀吉', type='Person’), type=‘RETAINER’) … ] (人物) 織田信長 部下 (人物) 豊臣秀吉 (場所) 尾張国 GraphDocuments Graph

Slide 49

Slide 49 text

Graph RAGの手法 Graph RAGを考える上で重要なポイント • Knowledge Graphの作成方法 事前にグラフを作成するか、LLMにグラフを作成させるか • Graph Queryを使った検索方法 事前にクエリを用意するか、LLMにクエリを作成させるか 49 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 2. 質問に関連する情報 3. 質問 + 関連情報 4. 関連情報を含んだ回答 Knowledge Graph (Graph Database) Graph Query

Slide 50

Slide 50 text

Graph RAGの手法 Graph RAGを考える上で重要なポイント • Knowledge Graphの作成方法 事前にグラフを作成するか、LLMにグラフを作成させるか • Graph Queryを使った検索方法 事前にクエリを用意するか、LLMにクエリを作成させるか 50 Copyright © 2024, Oracle and/or its affiliates 検索システム LLM ユーザー アプリケーション 1. 質問 3. 質問 + 関連情報 4. 関連情報を含んだ回答 Knowledge Graph (Graph Database) 2. 質問に関連する情報 Graph Query

Slide 51

Slide 51 text

Graph Queryの代表的な作成方法 Copyright © 2024, Oracle and/or its affiliates 51 Templates • 事前に実行可能な固定のグラ フクエリを定義しておく • ユーザの質問に応じて使用す るテンプレートを決定する • 事前に実行可能なグラフクエリ のテンプレートを定義しておく • ユーザの質問からLLMを使い、 パラメータを抽出する • パラエータと定義済みのテンプ レートから動的にグラフクエリを 作成する • ユーザーの質問からグラフクエリ を生成する • どんなクエリでも生成はできるが、 回答が得られる信頼性はない Dynamic Generation Text to Query MATCH (a:Person)-[:RETAINER]->(b) WHERE a.name = '織田信長’ RETURN a, b MATCH (a:Person)-[:RETAINER]->(b) WHERE a.name = '{name}' RETURN a, b # Input Query {"query": "織田信長の部下を全員教えて"} # Generated Cypher: cypher MATCH (n:Person)-[:RETAINER]- >(subordinate:Person) WHERE n.id = '織田信長’ RETURN subordinate 参考: GraphRAG https://graphr.ag/

Slide 52

Slide 52 text

Cypherを使ってNeo4jを検索する langchain_community.chains.graph_qa.cypher.GraphCypherQAChain Chainを使い自然言語で質問を投げて回答を作成 Chainの処理 1. 質問文とスキーマ情報からCypherを生成する 2. 生成したCypherでグラフを検索 3. 検索結果と質問文をLLMに渡して回答を生成 52 Copyright © 2024, Oracle and/or its affiliates chain = GraphCypherQAChain.from_llm( llm=llm, graph=graph, verbose=True, allow_dangerous_requests=True ) chain.invoke({"query": "織田信長の部下を全員教えて"}) Generated Cypher: cypher MATCH (n:Person)-[:RETAINER]- >(subordinate:Person) WHERE n.id = '織田信長' RETURN subordinate Full Context: [{'subordinate': {'id': '徳川家康'}}, {'subordinate': {'id': '明智光秀'}}, {'subordinate': {'id': '足利義昭'}}, {'subordinate': {'id': '今川義元'}}, {'subordinate': {'id': '豊臣秀吉'}}, {'subordinate': {'id': '織田信秀'}}] > Finished chain. {'query': '織田信長の部下を全員教えて’, 'result': '徳川家康、明智光秀、足利義昭、今川義元、豊臣秀吉、織田信秀が織田信 長の部下です。'} # Result Text to Query

Slide 53

Slide 53 text

1. 質問文とスキーマ情報からCypherを生成 langchain_community.chains.graph_qa.cypher.GraphCypherQAChain Question と Schema を渡して、Prompt拡張によりCypherを生成する 53 Copyright © 2024, Oracle and/or its affiliates # 要約 CYPHER_GENERATION_TEMPLATE = """Task:Generate Cypher statement to query a graph database. Instructions: Use only the provided relationship types and properties in the schema. Do not use any other relationship types or properties that are not provided. Schema: {schema} Note: Do not include any explanations or apologies in your responses. Do not respond to any questions that might ask anything else than for you to construct a Cypher statement. Do not include any text except the generated Cypher statement. The question is: {question}""" タスク: グラフデータベースをクエリするためのCypher文を生成してください。 指示: スキーマで提供された関係タイプとプロパティのみを使用してください。 提供されていない関係タイプやプロパティは使用しないでください。 スキーマ: {schema} 注意: 回答に説明や謝罪を含めないでください。 Cypher文の構築以外の質問には一切答えないでください。 生成されたCypher文以外のテキストを含めないでください。 質問: {question} # デフォルト文

Slide 54

Slide 54 text

2. 生成したCypherでグラフを検索 langchain_community.chains.graph_qa.cypher.GraphCypherQAChain Cypherで検索し、Contextを取得する 54 Copyright © 2024, Oracle and/or its affiliates # Cypherで検索 Generated Cypher: cypher MATCH (n:Person)-[:RETAINER]- >(subordinate:Person) WHERE n.id = '織田信長' RETURN subordinate Full Context: [{'subordinate': {'id': '徳川家康'}}, {'subordinate': {'id': '明智光秀'}}, {'subordinate': {'id': '足利義昭'}}, {'subordinate': {'id': '今川義元'}}, {'subordinate': {'id': '豊臣秀吉'}}, {'subordinate': {'id': '織田信秀'}}] > Finished chain. # Contextを取得

Slide 55

Slide 55 text

3. 検索結果と質問文をLLMに渡して回答を生成 langchain_community.chains.graph_qa.cypher.GraphCypherQAChain Context と Questionを渡して、Prompt拡張により回答を生成する 55 Copyright © 2024, Oracle and/or its affiliates # 要約 CYPHER_QA_TEMPLATE = """You are an assistant that helps to form nice and human understandable answers. The information part contains the provided information that you must use to construct an answer. The provided information is authoritative, you must never doubt it or try to use your internal knowledge to correct it. Make the answer sound as a response to the question. Do not mention that you based the result on the given information. Here is an example: Question: Which managers own Neo4j stocks? Context:[manager:CTL LLC, manager:JANE STREET GROUP LLC] Helpful Answer: CTL LLC, JANE STREET GROUP LLC owns Neo4j stocks. Follow this example when generating answers. If the provided information is empty, say that you don't know the answer. Information: {context} Question: {question} Helpful Answer:""" あなたは、人間が理解しやすい答えを形成するのを助けるアシスタントで す。 … 以下に例を示します。 Question: Neo4jの株を保有しているマネージャーは誰ですか? Context: [マネージャー: CTL LLC、マネージャー: JANE STREET GROUP LLC] Helpful Answer: CTL LLCとJANE STREET GROUP LLCは Neo4jの株を保有しています。 この例に従って回答を生成してください。 もし提供された情報が空である場合は、「答えがわかりません」と答えてくだ さい。 Information: {context} Question: {question} Helpful Answer: # デフォルト文

Slide 56

Slide 56 text

Oracle Graph 56 Copyright © 2024, Oracle and/or its affiliates

Slide 57

Slide 57 text

Oracle Graph Oracle Graphとは • Oracle DatabaseにGraph Databaseとしての機能が備わっている (追加課金なし) • RDF Graph, Property Graphに対応 • クエリ言語: SQL, PGQL, SPARQL 57 Copyright © 2024, Oracle and/or its affiliates Oracle Labs PGX • 最先端のグラフ技術 • Parallel Graph AnalytiX • Oracle Labsで開発された並列グラフ 検索エンジン PGXの特徴 • 高速なグラフ探索 • 高速なパターンマッチングクエリ • 高速なアルゴリズム etc… Oracle Database • Oracle Databaseの強みはそのまま で、Graph Databaseとして活用可 能 グラフ専用DBの苦手科目 • ACID・トランザクション機能 • 参照、更新の混合ワークロード • セキュリティ機能 • 運用管理機能 etc…

Slide 58

Slide 58 text

Property Graph Query Language (PGQL) OracleのProperty Graphを操作するためのグラフクエリ言語 • ISO国際基準クエリ言語 • Oracle GraphのCRUD操作 • パターンマッチング、グラフアルゴリズムの実行 • Create property graph文によるテーブルのグラフ化 58 Copyright © 2024, Oracle and/or its affiliates ID Name Age Label 1 織田信長 40 人物 2 豊臣秀吉 37 人物 3 蜂須賀正勝 48 人物 ID Rel Source Target Year 1 部下 1 2 1554年 2 部下 2 3 1566年 ID Name 1 岐阜城 (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城 ID Rel Source Target 1 居住 1 1 Person Rel_Live Rel_Person Castle Create property graph文

Slide 59

Slide 59 text

リレーショナルテーブルからグラフ定義 Create property graph文 リレーショナルテーブルからのグラフデータ生成 CREATE PROPERTY GRAPH 文によって、リレーショナル テーブルをベースとしたグラフを宣言的に生成できる 59 Copyright © 2024, Oracle and/or its affiliates CREATE PROPERTY GRAPH Nobunaga_historys_graph VERTEX TABLES ( Person LABEL Person PROPERTIES (name, age), Castle LABEL Castle PROPERTIES (name), … ) EDGE TABLES ( Rel_Person SOURCE KEY (Source) REFERENCES Person (name), DESTINATION KEY (Target) REFERENCES Person (name), … )

Slide 60

Slide 60 text

GRAPH_TABLE 演算子 SQLでグラフクエリを実行する グラフに対するCRUD操作をSQLのまま書くことができる 60 Copyright © 2024, Oracle and/or its affiliates SELECT * FROM GRAPH_TABLE ( students_graph MATCH (a IS person) -[e IS friends]-> (b IS person WHERE b.name = 'Mary') WHERE a.name='John' COLUMNS (a.name AS person_a, b.name AS person_b ) );

Slide 61

Slide 61 text

LangChainを使ったGraph RAGのフロー Oracle Version 61 Copyright © 2024, Oracle and/or its affiliates Document '織田 信長(おだ のぶなが)は、日本の戦 国時代から安土桃山時代にかけての武将・大 名。戦国の三英傑の一人。 … しかし、近年の歴史学界ではその政策の前時 代性が指摘されるようになり、しばしば「中世 社会の最終段階」とも評され[2]、その革新性 を否定する研究が主流となっている' [GraphDocument( nodes=[ Node(id='織田信長', type='Person’), Node(id='豊臣秀吉', type='Person'), … Node(id='今川義元', type='Person’), Node(id='尾張国', type='Place’) ], relationships=[ Relationship( source=Node(id='織田信長', type='Person’), target=Node(id='豊臣秀吉', type='Person’), type=‘RETAINER’) … ] (人物) 織田信長 部下 (人物) 豊臣秀吉 (場所) 尾張国 GraphDocuments Graph Function: LLMGraphTransformer .convert_to_graph_documents() Function: OracleGraph .add_graph_documents() OracleGraphのクラスは LangChainには未実装 ライブラリをカスタマイズで作成した

Slide 62

Slide 62 text

SQLを使ってOracle Graphにクエリを渡す LangChainのToolsを使い、クエリを事前定義して実行する Chain の処理 1. 事前定義済みのSQLクエリを実行するToolsを作成 2. Toolsを実行するAgentsを実装 3. 質問文をAgentsに渡して回答を生成 62 Copyright © 2024, Oracle and/or its affiliates class RetainerToolInput(BaseModel): query: str = Field(description="A query for RetainerTool") names: str = Field(description="Name of target person") class RetainerTool(BaseTool): name: str = "retainer_tool" description: str =""" A function that identifies someone who is retainer a particular person and returns the names of both individuals. """ args_schema: Type[BaseModel] = RetainerToolInput def _run(self, names: str, *args: Any, **kwargs: Any) -> str: GRAPH_NAME = os.getenv("GRAPH_NAME") return f""" SELECT a, b FROM GRAPH_TABLE({GRAPH_NAME} MATCH (a IS Person) - [e] -> (b IS Person) WHERE e.name = 'RETAINER' and a.name = '{names}' COLUMNS(a.id as a, b.id as b)) ""“ retainer = RetainerTool() tools=[reside, role, retainer] Dynamic Generation

Slide 63

Slide 63 text

Oracle GraphのLangChainへのコントリビュート 実は、LangChainにコントリビュートを試みています! 63 Copyright © 2024, Oracle and/or its affiliates

Slide 64

Slide 64 text

まとめ 新しいデータストアの選択肢としてのGraph Database • Graph Databaseの得意領域 • ノードとエッジにより複雑な関係性を表現する • パス探索のクエリが高速 様々なGraph RAGの手法 • Graph RAGの基本構成について • LLMとGraphを活用する方法 • Graph RAGの周辺エコシステム (MicrosoftのGraph RAG, LangChain) • LLMを使いGraphやクエリを生成させる 64 Copyright © 2024, Oracle and/or its affiliates

Slide 65

Slide 65 text

参考資料 Graph Database • Neo4j • GitHub: https://github.com/neo4j/neo4j • Docs: https://neo4j.com/docs/ • グラフデータベース -Neo4jによるグラフデータモデルとグラフデータベース入門 • https://www.oreilly.co.jp/books/9784873117140/ • Building Knowledge Graphs • https://learning.oreilly.com/library/view/building-knowledge-graphs/9781098127091/ • はじめての知識グラフ構築ガイド • https://book.mynavi.jp/manatee/books/detail/id=144558 Graph RAG • Graph RAG (Microsoft) • https://microsoft.github.io/graphrag/ • Graph RAG (Neo4j) • https://graphr.ag/ 65 Copyright © 2024, Oracle and/or its affiliates

Slide 66

Slide 66 text

No content