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 管道,我们只需将上一篇文章中使用的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 (https://www.lianzai.com/) | Powered by Discuz! X3.5 |