打造智能化问答体验:使用LLM和Kùzu构建自然语言接口

157 阅读3分钟
## 引言

随着图数据库在大数据时代的应用日益增长,能够通过自然语言查询这些数据显得尤为重要。本文介绍如何使用大语言模型(LLMs)为Kùzu数据库提供自然语言接口,以便轻松地查询复杂的数据集。

## 主要内容

### Kùzu简介

Kùzu是一个嵌入式属性图数据库管理系统,以其查询速度和可扩展性闻名。它实现了Cypher查询语言,并采用列式存储及新颖的连接算法来处理大量数据而不降低性能。

### 环境搭建

因为Kùzu是嵌入式的,安装和管理都非常简单。使用Python包管理器安装:

```bash
pip install kuzu

在本地创建数据库并连接:

import kuzu

db = kuzu.Database("test_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'})")
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' CREATE (p)-[:ActedIn]->(m)")

创建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,
)

查询图数据库

通过自然语言提问:

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

代码示例

以下是一个完整的代码示例,展示如何用自然语言询问电影数据库中的信息:

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

# 创建并连接到数据库
db = kuzu.Database("test_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 (:Movie {name: 'The Godfather'})")
conn.execute("MATCH (p:Person), (m:Movie) WHERE p.name = 'Al Pacino' AND m.name = 'The Godfather' CREATE (p)-[:ActedIn]->(m)")

# 设置QA Chain
graph = KuzuGraph(db)
chain = KuzuQAChain.from_llm(
    llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo-16k"),
    graph=graph,
    verbose=True,
)

# 查询示例
result = chain.invoke("Who acted in The Godfather?")
print(result['result'])

常见问题和解决方案

  1. 查询延迟或失败

    • 解决方案:考虑使用API代理服务来提高访问的稳定性,尤其是在网络不稳定的地区。
  2. 模式更新后查询出错

    • 解决方案:使用graph.refresh_schema()来刷新模式信息。

总结和进一步学习资源

通过本文介绍的方法,您可以使用LLMs与Kùzu结合打造强大的自然语言查询接口。这不仅简化了数据检索过程,还为用户提供更友好的交互体验。

进一步学习资源:

参考资料

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

---END---