菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI资讯新闻 > Neo4j GraphRAG图遍历:推荐系统精准优化
技术资讯

Neo4j GraphRAG图遍历:推荐系统精准优化

2026-05-30
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

上一篇文章中,我们演示了如何借助 Neo4j GraphRAG Python 包搭建基础 GraphRAG 应用。今天进一步

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

Neo4j GraphRAG (2):用图遍历技术让推荐系统更智能

环境配置

继续沿用相同的电影推荐知识图谱演示数据库,配置与上一篇完全一致。如果尚未连接,可直接通过浏览器访问: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 无法实现的。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多