老铁们,今天咱们来看看如何在 Ontotext GraphDB 上通过大语言模型(LLM)实现自然语言查询。这种技术也叫做 text2sparql,主要目的是将自然语言转化为 SPARQL 查询。在这个教程中,我们会利用 Star Wars API (SWAPI) 的本体和数据集来进行演示。
技术背景介绍
Ontotext GraphDB 是一个图数据库和知识发现工具,它支持 RDF 和 SPARQL 标准。通过引入大语言模型,我们可以增强 GraphDB 的查询功能,包括生成 GPT 查询、解析结果、索引知识图谱实体等。今天我们主要聚焦在如何利用 LLM 从自然语言生成 SPARQL 查询。
原理深度解析
GraphDB 支持多种 LLM 集成功能,比如:
- GPT 查询:利用 LLM 从知识图谱中提取文本、列表或表格。
- 查询解释:不仅能生成为 SPARQL 查询,还能解释结果,进行总结和翻译。
- 检索-graphdb-connector:把知识图谱的实体索引到矢量数据库中。
在这个教程中,我们将主要使用 SPARQL 的自然语言生成,所以我们需要搭建一个 GraphDB 环境并载入 Star Wars 数据集。
实战代码演示
设置环境
确保你有一个运行中的 GraphDB 实例。为了简单,我们使用 Docker 来快速搭建一个本地 GraphDB 环境:
docker build --tag graphdb .
docker compose up -d graphdb
等待数据库启动后,可以在浏览器中访问 http://localhost:7200/
来确认。
开始开发
安装所需的 Python 库并启动 Jupyter Notebook 环境:
# 用 conda 新建环境
conda create -n graph_ontotext_graphdb_qa python=3.9.18
conda activate graph_ontotext_graphdb_qa
# 安装所需库
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
# 启动 Jupyter
jupyter notebook
构建 SPARQL 查询
首先,我们需要将本体(ontology)提供给 LLM。可以通过本地 RDF 文件或直接从 SPARQL 端点获取:
from langchain_community.graphs import OntotextGraphDBGraph
graph = OntotextGraphDBGraph(
query_endpoint="http://localhost:7200/repositories/langchain",
query_ontology="CONSTRUCT {?s ?p ?o} FROM <https://swapi.co/ontology/> WHERE {?s ?p ?o}",
)
我们还可以用 OntotextGraphDBQAChain
来进行自然语言问答:
import os
from langchain.chains import OntotextGraphDBQAChain
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = "sk-***"
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.'
优化建议和链修改
这个 QA 链允许我们对提示进行细化,改进查询的准确性。例如,可以通过修改 sparql_generation_prompt
来优化 SPARQL 生成过程。
在查询的过程中,如果遇到语法错误,还可以使用 sparql_fix_prompt
来进行自动修正。
补充说明和总结
今天的教程中,我们深入探讨了如何在 Ontotext GraphDB 中结合大语言模型实现自然语言查询。虽然讲解了很多细节,核心主旨就是让开发者能用更自然的方式与复杂数据进行交互。
这波操作可以说是相当丝滑,当然,过程中如果有碰到问题或者需要进一步探讨,欢迎在评论区留言交流。
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—