Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Graph Database と Generative AI の素敵な関係

Graph Database と Generative AI の素敵な関係

2024/10/9に行われた OCHaCafe Season9 #1 の資料です。

oracle4engineer

October 09, 2024
Tweet

Video

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Graph Database と Generative AI の素敵な関係 Oracle Cloud Hangout Cafe

    Season9 #1 Sho Obata Solutions Architect, Communication Solutions Oracle Corporation Japan
  2. 自己紹介 Copyright © 2024, Oracle and/or its affiliates 2 @sh-sho

    GitHub/Linkedin/Qiita 小畑 晶 (Sho Obata) 通信ソリューション本部 日本オラクル株式会社 コミュニティ • Oracle Cloud Hangout Caféメンバー コメント • Oracle歴 2年半 • もうすぐスノボシーズン、今年こそは北海道で滑る!
  3. アジェンダ 1. Graph Databaseとは 2. Neo4j 3. Graph Database と

    LLM 4. Graph RAG 5. Oracle Graph 3 Copyright © 2024, Oracle and/or its affiliates
  4. 話すこと、話さないこと 話すこと • 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
  5. なぜ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
  6. 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/
  7. 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によるグラフデータモデルとグラフデータベース入門より)
  8. 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歳
  9. 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はウェブ技術の標準化を推進する国際的な団体
  10. 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
  11. 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
  12. 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
  13. Graph Databaseの特徴 14 Copyright © 2024, Oracle and/or its affiliates

    • グラフを辿る検索 (トラバーサル) が高速 • 各頂点は接続先の辺の情報を持つ。 • 探索時に経路に関係するデータのみのアクセスで辿ることができるため、 高速に結果を取得できる • 辿る検索の高速性を生かし、パターン照合を行うクエリをパターンマッ チングという • グラフのクエリ言語による処理が可能 • Cypher, PGQL, Gremlinといったグラフ専用のクエリ言語 • グラフクエリの国際規格が定められている Graph Query Language: GQL ※リレーショナルモデルのSQLで記述すると 複数回のjoinが発生しクエリが複雑 になることが多い
  14. Graph Databaseのユースケース 顧客マッチング・レコメンデーション • 顧客情報と購入製品やカタログをグラフモデルにする • グラフモデルに顧客とその顧客が好む製品の関係性が 反映されており、レコメンデーションを行える マネーロンダリング •

    ユーザー間のトランザクションやメールアドレス、住所な どをグラフモデルにする • ユーザーの口座間での送金の関係性が明らかになり、 犯罪者の不正取引を発見することができる。 15 Copyright © 2024, Oracle and/or its affiliates Product Customer Purchased Recommendation $2,000 $3,000 $1,000 Customer Bank
  15. 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
  16. 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
  17. 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よりクエリが短く、トラバース処理が速い
  18. Graphの得意なこと、苦手なこと 19 Copyright © 2024, Oracle and/or its affiliates 得意なこと

    • ノードとエッジにより複雑な関係性を直接表現する • ソーシャルネットワーク • レコメンドシステム • ネットワーク分析 • 直接トラバースするためパス探索のクエリが高速 • グラフ構造を活かした最短経路探索 • 複雑な接続性を取得するトポロジカルクエリ • 厳密なスキーマを必要としない柔軟なスキーマ管理 苦手なこと • SUM、AVGといった集計処理や大規模データの統計分析 処理は、RDBのほうが適している • 単純なテーブルや整合性を必要とするデータには不向き • 関係がシンプルな場合、Graphの優位性はあまりない • スキーマレスなため、整合性を強制することは難しい • 周辺ツールやエコシステムの制限 • RDBに比べてGraph DatabaseはBI、ETLなどの 周辺ツールが進んでいない
  19. 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
  20. 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
  21. Neo4j データアクセス グラフデータベースのネイティブ処理機能のひとつにインデックスなし隣接性という特性がある • 各ノードが隣接ノードへの直接アクセスが可能 • グローバルなインデックスより低リソースで検索ができる インデックスが有効なケース • 特定のデータを高速に検索できる

    • e.g. 年齢が40歳以上の人物を検索する インデックスなし隣接性が有効なケース • 隣接するノードを高速に探索できる • e.g. 織田信長の部下は誰か検索する 23 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城
  22. Neo4j 可用性 Neo4jのクラスタリングは、以下の機能を提供する • 安全性、スケール、一貫性、操作性 • Raftによるレプリケーション • リードレプリカあり プライマリモード

    • 読み取り、書き込み操作が許可されている • 高可用性を実現するには、複数のプライマリが必要 • F台の障害を許容するには、2F+1台必要 • 1台の障害を許容するには3台のクラスタ • 2台の障害を許容するには5台のクラスタ セカンダリモード • 読み取り専用 • プライマリから非同期にレプリケート 24 Copyright © 2024, Oracle and/or its affiliates 負荷分散クラスタ プライマリ セカンダリ セカンダリ 高可用性クラスタ プライマリ プライマリ プライマリ
  23. Cypher グラフ要素のCRUD (Create、Read、Update、Delete) をするクエリ言語 • Neo4jによって設計された言語 • CREATE, DELETE等の変更処理やMATCH, RETURN等の読み取り処理がある

    25 Copyright © 2024, Oracle and/or its affiliates (人物) 織田信長 年齢:40歳 部下 雇用年:1554年 (人物) 豊臣秀吉 年齢:37歳 (人物) 蜂須賀正勝 年齢:48歳 部下 雇用年:1566年 居城 (城) 岐阜城
  24. 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 } )
  25. 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 )
  26. 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 … 言語モデル 大規模言語モデル
  27. 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つです。…
  28. 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
  29. 従来の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
  30. なぜ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の相性が良いから
  31. 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 グラフコミュニティとは? グラフ上で類似性の高いノードを部分グラフに分割する操作をコミュニティ検 出という。階層型のコミュニティに分割し、サマリーを作成することで、グラフの 範囲を絞って理解し検索することができるため精度が上がる。
  32. 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
  33. 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)
  34. 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
  35. 語彙グラフ エンティティ拡張 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 …
  36. 語彙グラフ エンティティ拡張 & コミュニティサマリー 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
  37. 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
  38. 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()
  39. 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"] )
  40. 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
  41. グラフ要素からグラフの作成 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
  42. グラフ要素からグラフの作成 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
  43. 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
  44. 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
  45. 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/
  46. 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
  47. 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} # デフォルト文
  48. 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を取得
  49. 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: # デフォルト文
  50. 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…
  51. 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文
  52. リレーショナルテーブルからグラフ定義 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), … )
  53. 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 ) );
  54. 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には未実装 ライブラリをカスタマイズで作成した
  55. 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
  56. まとめ 新しいデータストアの選択肢としての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
  57. 参考資料 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