在图数据库上构建问答应用:从入门到实践

86 阅读3分钟

在图数据库上构建问答应用:从入门到实践

引言

在数据驱动的时代,图数据库因其强大的关系查询能力而备受关注。如今,越来越多的应用程序希望通过自然语言问答的方式与图数据交互。本教程将指导您如何在图数据库上构建一个问答系统,帮助用户通过自然语言提问,并获取与之相关的数据。

主要内容

架构概述

构建一个基于图数据库的问答系统可以分为以下几个步骤:

  1. 将问题转化为图数据库查询:通过模型将用户输入转化为图数据库查询(例如,Cypher)。
  2. 执行图数据库查询:执行生成的查询以获取数据。
  3. 回答问题:使用查询结果生成自然语言的回答。

环境设置

在开始之前,我们需要安装所需的包并设置环境变量。在这个示例中,我们将使用Neo4j图数据库。

%pip install --upgrade --quiet langchain langchain-community langchain-openai neo4j

设置OpenAI API密钥:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

设置Neo4j数据库凭证:

os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "password"

图数据库准备

接下来,我们将创建一个Neo4j数据库连接,并填充一些示例数据(关于电影和演员)。

from langchain_community.graphs import Neo4jGraph

graph = Neo4jGraph()

# 导入电影信息
movies_query = """
LOAD CSV WITH HEADERS FROM 
'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'
AS row
MERGE (m:Movie {id:row.movieId})
SET m.released = date(row.released),
    m.title = row.title,
    m.imdbRating = toFloat(row.imdbRating)
FOREACH (director in split(row.director, '|') | 
    MERGE (p:Person {name:trim(director)})
    MERGE (p)-[:DIRECTED]->(m))
FOREACH (actor in split(row.actors, '|') | 
    MERGE (p:Person {name:trim(actor)})
    MERGE (p)-[:ACTED_IN]->(m))
FOREACH (genre in split(row.genres, '|') | 
    MERGE (g:Genre {name:trim(genre)})
    MERGE (m)-[:IN_GENRE]->(g))
"""

graph.query(movies_query)

建立问答链

我们将使用LangChain提供的GraphCypherQAChain来处理问答过程。

from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
chain = GraphCypherQAChain.from_llm(graph=graph, llm=llm, verbose=True)
response = chain.invoke({"query": "What was the cast of the Casino?"})
print(response)

代码示例

完整的代码示例如下:

import os
from langchain_community.graphs import Neo4jGraph
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

# 设置API密钥和Neo4j数据库凭证
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"  # 使用API代理服务提高访问稳定性
os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "password"

# 创建Neo4j图和导入数据
graph = Neo4jGraph()
movies_query = (...)
graph.query(movies_query)

# 创建问答链
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
chain = GraphCypherQAChain.from_llm(graph=graph, llm=llm, verbose=True)
response = chain.invoke({"query": "What was the cast of the Casino?"})

print(response)

常见问题和解决方案

  1. 网络限制:在某些地区,访问OpenAI API可能受限。这时考虑使用API代理服务以提高访问的稳定性。
  2. 图查询方向错误:LLMs可能产生错误的Cypher关系方向。利用validate_cypher参数,可以验证并纠正这些问题。

总结和进一步学习资源

通过本教程,您应该已经掌握了如何在图数据库上构建一个问答应用的基础知识和实践技巧。要深入学习,可参考以下资源:

  • 提示工程技术:探索高级提示工程技术。
  • 值映射技术:学习从问题到数据库的值映射技术。
  • 语义层实现:探索实现语义层的技术。
  • 知识图谱构建:学习构建知识图谱的技术。

参考资料

  1. Neo4j 官方文档: Neo4j Docs
  2. Langchain 框架: Langchain

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

---END---