暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Text2CypherRetriever:让数据库查询像聊天一样简单!

活水智能 2024-11-19
106

点击上方↗️活水智能关注 + 星标🌟

作者:Will Tai

编译:活水智能

在如今的信息时代,快速、准确地检索数据是每个人都会面临的问题。无论是开发者还是普通用户,传统的数据检索方式往往需要掌握复杂的查询语言和数据库结构,这让很多人望而却步。

为了解决这个问题,Text2CypherRetriever 提供了一种全新的解决方案。通过自然语言生成 Cypher 查询,用户只需输入简单的自然语言问题,系统就能自动生成查询并返回结果。无论你是否熟悉数据库查询语言,都可以轻松完成复杂的数据检索任务。

接下来,我们将介绍如何使用 Text2CypherRetriever,并将其集成到你的项目中,帮助你更高效地检索数据。

什么是 Text2Cypher?

Text2Cypher 是一种将自然语言转换为 Cypher 查询的翻译方法。Text2CypherRetriever
 通过首先请求 LLM 根据用户的问题生成一个 Cypher 查询来执行此方法。然后,该生成的查询将在 Neo4j 数据库中执行,以获取所需的信息。结果记录将添加到 LLM 的上下文中,以便为用户的查询生成最终答案。这种方法允许用户以自然语言输入查询,而 LLM 负责查询生成和答案编写,从而实现与数据库的更直观交互。

我们的内部研究表明,使用 Text2Cypher 作为检索方法相对来说是对不同问题变体最一致的应对方法,并且在处理不同复杂度的任务时表现优于其他策略。

设置

与之前的文章类似,首先连接到一个预配置的 Neo4j 演示数据库,该数据库模拟了一个电影推荐知识图谱。你可以使用 recommendations
 作为用户名和密码,在 https://demo.neo4jlabs.com:7473/browser/ 访问该数据库。这个设置提供了一个现实的场景,你的向量嵌入数据已经是 Neo4j 数据库的一部分,可以直接使用。

在你的 Python 环境中,安装 neo4j-graphrag
 包以及以下其他包:

pip install neo4j-graphrag neo4j openai

然后,使用 Neo4j Python 驱动程序建立与 Neo4j 数据库的连接:

from neo4j import GraphDatabase

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

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

检索

设置 Text2CypherRetriever

from neo4j_graphrag.retrievers importText2CypherRetriever
from neo4j_graphrag.llm importOpenAILLM

t2c_llm =OpenAILLM(model_name="gpt-3.5-turbo")

neo4j_schema ="""
  节点属性:
  Person {name: STRING, born: INTEGER}
  Movie {tagline: STRING, title: STRING, released: INTEGER}
  关系属性:
  ACTED_IN {roles: LIST}
  REVIEWED {summary: STRING, rating: INTEGER}
  关系:
  (:Person)-[:ACTED_IN]->(:Movie)
  (:Person)-[:DIRECTED]->(:Movie)
  (:Person)-[:PRODUCED]->(:Movie)
  (:Person)-[:WROTE]->(:Movie)
  (:Person)-[:FOLLOWS]->(:Person)
  (:Person)-[:REVIEWED]->(:Movie)
"""


examples =[
"用户输入: '《黑客帝国》有哪些演员参演?' 查询: MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title = 'The Matrix' RETURN p.name"
]

retriever =Text2CypherRetriever(
  driver=driver,
  llm=t2c_llm,
  neo4j_schema=neo4j_schema,
  examples=examples,
)

使用 Text2CypherRetriever
,你可以轻松生成并执行查询,从数据库中检索信息:

query_text = "雨果·维文参演了哪些电影?"
print(retriever.search(query_text=query_text))

结果为:

items=[
RetrieverResultItem(content="<Record m.title='云图'>", metadata=None),
RetrieverResultItem(content="<Record m.title='裁缝'>", metadata=None),
RetrieverResultItem(content="<Record m.title='小猪宝贝'>", metadata=None),
RetrieverResultItem(content="<Record m.title='V字仇杀队'>", metadata=None),
RetrieverResultItem(content="<Record m.title='黑客帝国'>", metadata=None),
RetrieverResultItem(content="<Record m.title='采访'>", metadata=None),
RetrieverResultItem(content="<Record m.title='沙漠妖姬'>", metadata=None),
RetrieverResultItem(content="<Record m.title='证明'>", metadata=None)
]
metadata={
'cypher':"MATCH (p:Person {name: 'Hugo Weaving'})-[:ACTED_IN]->(m:Movie) RETURN m.title",
'__retriever':'Text2CypherRetriever'
}

将此检索器添加到 GraphRAG 流水线中:

from neo4j_graphrag.generation import GraphRAG

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

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

query_text = "雨果·维文参演了哪些电影?"
response = rag.search(query_text=query_text)
print(response.answer)

结果为:

雨果·维文参演了以下电影:
- 裁缝
- V字仇杀队
- 黑客帝国
- 沙漠妖姬
- 证明

总结

Text2CypherRetriever
 是将 Neo4j 与生成式 AI 集成的一个重大进展。它通过使用自然语言处理生成 Cypher 查询,简化了检索过程,使开发人员更容易使用。此工具在需要精确、上下文相关的信息时特别有用,而无需管理向量嵌入。




学习资源

若要了解更多知识图谱或neo4j图数据库相关教学,你可以查看公众号的其他文章:


活水智能成立于北京,致力于通过AI教育、AI软件和社群提高知识工作者生产力。中国AIGC产业联盟理事。

活水现有AI线下工作坊等10+门课程,15+AI软件上线,多款产品在研。知识星球中拥有2600+成员,涵盖大厂程序员、公司高管、律师等各类知识工作者。在北、上、广、深、杭、重庆等地均有线下组织。

欢迎加入我们的福利群,每周都有一手信息、优惠券发放、优秀同学心得分享,还有赠书活动~

👇🏻👇🏻👇🏻

 点击阅读原文,立即入群

文章转载自活水智能,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论