Neo4j GraphRAG图遍历:推荐系统精准优化
摘要
上一篇文章中,我们演示了如何借助 Neo4j GraphRAG Python 包搭建基础 GraphRAG 应用。今天进一步
上一篇文章中,我们演示了如何借助 Neo4j GraphRAG Python 包搭建基础 GraphRAG 应用。今天进一步挖掘该包的能力,通过引入其他类型的检索器来提升应用的灵活性与扩展性。具体而言,我们会在图数据库中先用 Cypher 查询执行图遍历,再结合向量搜索——这种组合方式能显著增强推荐系统的精准度。

环境配置
继续沿用相同的电影推荐知识图谱演示数据库,配置与上一篇完全一致。如果尚未连接,可直接通过浏览器访问:https://demo.neo4jlabs.com:7473/browser/,用户名和密码均为“recommendations”。
连接数据库的代码简洁明了:
from neo4j import GraphDatabase
URI = "neo4j+s://demo.neo4jlabs.com"
AUTH = ("recommendations", "recommendations")
driver = GraphDatabase.driver(URI, auth=AUTH)
别忘了配置 OpenAI 密钥:
import os os.environ["OPENAI_API_KEY"] = "sk-…"
图谱中的关联节点
在浏览器中执行以下查询,观察电影 “Tom and Huck” 及其周围节点的关系:
MATCH (m:Movie {title: 'Tom and Huck'})-[r]-(n) RETURN *;
结果会展示电影的类别、参演演员——这些信息并不直接存储在 Movie 节点中,而是通过关联节点提供。
上一篇文章中,我们仅利用电影情节的嵌入向量进行检索,找到与用户查询最相似的电影节点,然后将这些节点作为上下文提交给大语言模型(LLM)生成答案。但这种方式只利用了电影节点本身的信息,完全忽略了周边关联节点中的内容,例如演员、类型。一旦用户询问“这部电影是什么类型?”或“主演是谁?”,LLM 因缺乏相关上下文而无法准确回答。
检索增强
Neo4j GraphRAP 包提供了 VectorCypherRetriever 类来解决这一痛点。该检索器的工作流程是:首先通过向量搜索从图中获取初始节点集合,然后利用 Cypher 查询从这些节点出发遍历图谱,一并带回相邻节点的附加信息。
使用它的第一步是编写一段 Cypher 查询,明确需要提取哪些关联数据。例如,要同时获取电影及其演员信息,可以这样写:
retrieval_query = """ MATCH (actor:Actor)-[:ACTED_IN]->(node) RETURN node.title AS movie_title, node.plot AS movie_plot, collect(actor.name) AS actors; """
这段查询中的 node 变量指向向量搜索步骤检索到的电影节点。MATCH 子句找出出演这些电影的所有演员,RETURN 将演员姓名、电影标题和情节一起返回。
接着将查询传递给 VectorCypherRetriever,参数与之前传给 VectorRetriever 的基本一致——向量索引名称和嵌入模型:
from neo4j import GraphDatabase
from neo4j_graphrag.embeddings.openai import OpenAIEmbeddings
from neo4j_graphrag.retrievers import VectorCypherRetriever
driver = GraphDatabase.driver(URI, auth=AUTH)
embedder = OpenAIEmbeddings(model="text-embedding-ada-002")
vc_retriever = VectorCypherRetriever(
driver,
index_name="moviePlotsEmbedding",
embedder=embedder,
retrieval_query=retrieval_query,
)
这里选用 text-embedding-ada-002 模型,因为演示数据库中的电影情节嵌入最初就是由该模型生成的。
现在测试搜索:“关于魔法棋盘游戏的电影,演员都有谁?”
query_text = "Who were the actors in the movie about the magic jungle board game?" retriever_result = vc_retriever.search(query_text=query_text, top_k=3)
返回结果中,每部电影的标题、情节和演员名单清晰呈现:
items=[ RetrieverResultItem(content="对比来看,如果使用之前的
VectorRetriever,只能获取标题和情节;演员信息存储于关联的演员节点中,无法被检索到。GraphRAG 构建
要搭建完整的 GraphRAG 管道,只需将之前文章中的
VectorRetriever替换为VectorCypherRetriever:from neo4j_graphrag.llm import OpenAILLM from neo4j_graphrag.generation import GraphRAG llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0}) rag = GraphRAG(retriever=vc_retriever, llm=llm) query_text = "Who were the actors in the movie about the magic jungle board game?" response = rag.search(query=query_text, retriever_config={"top_k": 3}) print(response.answer)输出结果:
电影 “Jumanji”,关于一个神奇的棋盘游戏,主演演员包括 Robin Williams、Bradley Pierce、Kirsten Dunst 和 Jonathan Hyde。小结
本文演示了如何利用
VectorCypherRetriever类构建一个简单的 GraphRAG 应用。关键在于,该检索器在向量检索的基础上额外添加了图遍历步骤——从图中获取那些仅靠向量检索无法触及的信息。这样一来,LLM 能够回答更多类型的问题,例如“演员是谁”“电影是什么类型”,而这些是单纯的VectorRetriever无法实现的。来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。