返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

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

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 11:31 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;visibility: visible;">在我们上一篇关于 Neo4j GraphRAG Python 包的公号文章中,我们介绍了如何使用该包构建一个基本的 GraphRAG 应用程序。在本篇及后续的文章中,我们将深入探讨该包的功能,并展示如何通过使用其他包含的检索器来进一步自定义和改进您的应用程序。在这里,我们将演示如何使用 Cypher 查询扩展上一篇文章中使用的向量搜索方法,通过添加图遍历作为额外的步骤。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(1, 155, 252);color: rgb(255, 255, 255);">设置

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我们将使用与上一篇公号文章中相同的预配置 Neo4j 演示数据库。该数据库模拟了一个电影推荐知识图谱。(有关数据库的更多详细信息,请参阅上一篇公号文章的“设置”部分。)

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">您可以通过浏览器访问数据库,网址为 https://demo.neo4jlabs.com:7473/browser/,用户名和密码均为“recommendations”。使用以下代码片段连接到您的应用程序中的数据库:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">fromneo4jimportGraphDatabase

URI="neo4j+s://demo.neo4jlabs.com"
AUTH=("recommendations","recommendations")

driver=GraphDatabase.driver(URI,auth=AUTH)

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">另外,请确保导出您的 OpenAI 密钥:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">importos

os.environ["OPENAI_API_KEY"]="sk-…"

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 1.2em;font-weight: bold;display: table;margin: 4em auto 2em;padding-right: 0.2em;padding-left: 0.2em;background: rgb(1, 155, 252);color: rgb(255, 255, 255);">图中的其他节点

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">在 Neo4j 网页界面中运行以下命令,以可视化电影 “Tom and Huck” 及其与其他节点的直接关系:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;overflow-x: auto;border-radius: 8px;margin: 10px 8px;">MATCH(m:Movie{title:'TomandHuck'})-[r]-(n)RETURN*;

请注意,我们现在可以看到电影的类型、出演的演员以及其他未包含在 Movie 节点中的有用信息。

在上一篇文章中,我们使用了电影情节嵌入和向量检索器来检索与用户查询最相似的电影节点。这些电影节点作为大语言模型(LLM)生成答案的上下文。然而,在这种设置中,只有电影节点本身包含的信息可以作为上下文,连接到未使用的电影节点的其他节点中的附加信息没有被利用。因此,如果用户询问有关电影类型或主演演员的问题,LLM 将无法获得适当的上下文来回答这些问题。

检索

幸运的是,我们可以使用VectorCypherRetriever类来检索这些附加信息。该检索器首先使用向量搜索从知识图谱中检索初始一系列节点,然后使用 Cypher 查询从这些初始节点遍历图谱,收集与它们连接的节点中的附加信息。

要使用此检索器,我们首先需要编写 Cypher 查询,以指定与通过向量搜索检索到的节点一起获取的确切附加信息。例如,要与电影节点一起检索演员信息,我们可以使用以下查询:

retrieval_query="""
MATCH
(actor:Actor)-[:ACTED_IN]->(node)
RETURN
node.titleASmovie_title,
node.plotASmovie_plot,
collect(actor.name)ASactors;
"""

此查询中的node变量是对通过初始向量搜索步骤检索到的节点的引用,这里是电影节点。此查询查找出演每部电影的所有演员,并返回他们的名字以及电影的标题和情节。

然后,我们将此查询传递给VectorCypherRetriever,并传递与上一篇文章中传递给VectorRetriever的相同信息,例如向量索引的名称和嵌入:

fromneo4jimportGraphDatabase
fromneo4j_graphrag.embeddings.openaiimportOpenAIEmbeddings
fromneo4j_graphrag.retrieversimportVectorCypherRetriever

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="Whoweretheactorsinthemovieaboutthemagicjungleboardgame?"
retriever_result=retriever.search(query_text=query_text,top_k=3)
items=[
RetrieverResultItem(content="<Record
movie_title='Jumanji'
movie_plot='Whentwokidsfindandplayamagicalboardgame,theyreleaseamantrappedfordecadesinitandahostofdangersthatcanonlybestoppedbyfinishingthegame.'
actors=['RobinWilliams','BradleyPierce','KirstenDunst','JonathanHyde']",
metadata=None),
RetrieverResultItem(content="<Record
movie_title='WelcometotheJungle'
movie_plot='Acompanyretreatonatropicalislandgoesterriblyawry.'
actors=['Jean-ClaudeVanDamme','AdamBrody','RobHuebel','KristenSchaal']",
metadata=None),
RetrieverResultItem(content='<Record
movie_title=\'LastMimzy,The\'
movie_plot=\'Twosiblingsbegintodevelopspecialtalentsaftertheyfindamysteriousboxoftoys.Soonthekids,theirparents,andeventheirteacheraredrawnintoastrangenewworldandfindataskaheadofthemthatisfarmoreimportantthananyofthemcouldimagine!\'
actors=[\'JoelyRichardson\',\'RhiannonLeighWryn\',\'TimothyHutton\',"ChrisO\'Neil"]',
metadata=None)
]
metadata={'__retriever':'VectorCypherRetriever'}

请注意,我们已经检索到了每部电影的演员以及其标题和情节。使用VectorRetriever,我们只能检索到标题和情节,而演员信息存储在连接到每个电影节点的演员节点中,因此无法检索到。

GraphRAG

要构建一个完整的 GraphRAG 管道,我们只需将上一篇文章中使用的VectorRetriever替换为我们的VectorCypherRetriever

fromneo4j_graphrag.llmimportOpenAILLM
fromneo4j_graphrag.generationimportGraphRAG

llm=OpenAILLM(model_name="gpt-4o",model_params={"temperature":0})

rag=GraphRAG(retriever=vc_retriever,llm=llm)

query_text="Whoweretheactorsinthemovieaboutthemagicjungleboardgame?"
response=rag.search(query=query_text,retriever_config={"top_k":3})
print(response.answer)

这将返回以下响应:

电影“Jumanji”,关于一个神奇的棋盘游戏,主演演员包括RobinWilliams、BradleyPierce、KirstenDunst和JonathanHyde。

总结

在本篇文章中,我们演示了如何使用 Neo4j GraphRAG Python 包中的VectorCypherRetriever类构建一个简单的 GraphRAG 应用程序。我们展示了该强大的类如何在初始向量检索步骤之外,结合图遍历步骤,从图中获取无法通过向量检索获取的信息。随后我们展示了如何使 LLM 回答关于我们电影数据库的某些问题,而这些问题使用VectorRetriever类是无法回答的。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ