图谱与 RAG

使用 LangChain 和 Neo4j 的 Graph RAG

Adam Cowley

Manager, Developer Education at Neo4j

认识您的讲师

 

  • Neo4j 开发者教育经理
  • 通过 Neo4j GraphAcademy 开展开发者教育
  • 20+ 年软件开发经验
  • 10+ 年 Neo4j 经验

 

Adam 的照片

1 https://graphacademy.neo4j.com
使用 LangChain 和 Neo4j 的 Graph RAG

RAG 中的 R

一个应用示意图,用户输入被加入提示并发送给 LLM

使用 LangChain 和 Neo4j 的 Graph RAG

RAG 中的 R

提示需要来自文档和数据源的上下文

使用 LangChain 和 Neo4j 的 Graph RAG

RAG 中的 R

这些数据通常会转换为向量嵌入

使用 LangChain 和 Neo4j 的 Graph RAG

语义搜索何时失效?

向量适用场景

  • 模糊或开放式问题

向量不擅长

  • 高度具体或基于事实的问题
  • 数值型或精确匹配查询
  • 逻辑推理型查询

Paul Graham 如何看待生成式 AI?

Paul Graham 投资了多少家生成式 AI 创业公司?

使用 LangChain 和 Neo4j 的 Graph RAG

向量 vs. 知识图谱

文本 向量嵌入
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

一个图谱示意图,展示歌曲"Don't Stop Believin'"歌词中的实体:小镇男孩,与 South Detroit 的 BORN 和 RAISED 关系

使用 LangChain 和 Neo4j 的 Graph RAG

向量 vs. 知识图谱

文本 向量嵌入
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

节点包括:人物 Small town boy,地点 South Detroit,列车 Midnight Train,地点 Anywhere

使用 LangChain 和 Neo4j 的 Graph RAG

向量 vs. 知识图谱

文本 向量嵌入
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

关系 BORN 和 RAISED 从人物指向地点;GOING 关系从 Midnight Train 节点指向 Anywhere 节点

使用 LangChain 和 Neo4j 的 Graph RAG

知识图谱与 Neo4j

 

  • Neo4j 是全球领先的图数据库
  • 灵活,支持可选模式
  • langchain-neo4j 与 LangChain 集成
  • LCELLangChain 表达式语言

neo4j 和 langchain 的标志

1 https://db-engines.com/en/ranking/graph%20dbms
使用 LangChain 和 Neo4j 的 Graph RAG

节点表示事物

from langchain_neo4j.graphs.graph_document \
  import Node

book = Node(
type="Book",
id=f"9781098127107",
properties={ "title": "Building Knowledge Graphs" }
)

图谱中的一本书节点,包含 ID 和标题属性

使用 LangChain 和 Neo4j 的 Graph RAG

关系连接节点

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(





)

两个 WRITTEN_BY 关系从 Book 节点指向两个代表作者的 Person 节点

使用 LangChain 和 Neo4j 的 Graph RAG

关系连接节点

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,



)

WRITTEN_BY 关系的源节点是 Book 节点

使用 LangChain 和 Neo4j 的 Graph RAG

关系连接节点

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,


)

WRITTEN_IN 关系的目标节点是 Person

使用 LangChain 和 Neo4j 的 Graph RAG

关系连接节点

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,
type="WRITTEN_BY"
properties=dict(...)
)

包含 Book 节点及指向作者的两个 WRITTEN_BY 关系的节点图,展示节点可拥有多条关系。

使用 LangChain 和 Neo4j 的 Graph RAG

连接到 Neo4j

from langchain_neo4j import Neo4jGraph


graph = Neo4jGraph( url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD )
1 https://neo4j.com/docs/getting-started/
使用 LangChain 和 Neo4j 的 Graph RAG

保存图文档

from langchain_neo4j.graphs.graph_document import GraphDocument


# 节点与关系的封装 doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# 将节点与关系保存到数据库 graph.add_graph_documents([graph_document])
使用 LangChain 和 Neo4j 的 Graph RAG

那么,什么是 GraphRAG?

前一张图,包含来自文档及其嵌入的上下文

使用 LangChain 和 Neo4j 的 Graph RAG

那么,什么是 GraphRAG?

前一张图,基于文档的上下文新增了一个知识图谱,展示从文档提取的节点与关系

使用 LangChain 和 Neo4j 的 Graph RAG

让我们一起练习吧!

使用 LangChain 和 Neo4j 的 Graph RAG

Preparing Video For Download...