设置与安装
要使用此功能,请安装langchain-hana 包:
pip install langchain_hana
HanaSparqlQAAgent 是一种基于智能体的方法,用于回答存储在 SAP HANA Cloud 中的 RDF 数据的问题。与基于链的方法不同,智能体可以:
- 动态检索本体 使用专用工具
- 生成并执行 SPARQL 查询 迭代
- 自我纠正 如果查询失败或返回意外结果
- 逐步推理 关于复杂问题
初始化
您需要:- 一个 LLM 为智能体的推理提供支持
- 一个
HanaRdfGraph(包含连接、graph_uri和本体)
HanaRdfGraph 实例的信息。
导入 HanaSparqlQAAgent
from langchain_hana import HanaSparqlQAAgent
agent = HanaSparqlQAAgent.create_agent(graph=graph, model=llm)
智能体概述
智能体使用工具迭代执行以下操作:- 首先检索本体以理解数据结构
- 根据模式生成适当的 SPARQL 查询
- 执行查询并解释结果
- 制定自然语言答案
默认设置
- 工具:
retrieve_ontology- 从图中以 Turtle 格式检索 RDF 本体/模式execute_sparql- 对 HANA RDF 图执行 SPARQL 查询
- 系统提示词:提供默认系统提示词,包含 SPARQL 生成和工具使用的说明。
- 中间件:
ModelRetryMiddleware(max_retries=3)和ToolRetryMiddleWare(max_retries=2)默认添加以防止无限循环
自定义您的智能体
您可以通过向create_agent 提供附加参数来自定义智能体的行为:
agent = HanaSparqlQAAgent.create_agent(
graph=graph, # Required: HanaRdfGraph instance
model=llm, # Required: LLM to power the agent
system_prompt=your_custom_prompt, # Custom system prompt (str or SystemMessage)
tools=[your_custom_tools], # Additional tools to include
middleware=[your_custom_middlewares], # Additional middleware to include
include_default_tools=True, # include default tools (default: True)
include_default_middleware=True, # include default middleware (default: True)
)
示例:在 “Movies” 知识图谱上进行问答
前提条件: 您必须有一个启用了 三元组存储 功能的 SAP HANA Cloud 实例。 有关详细说明,请参阅:启用三元组存储加载
kgdocu_movies 示例数据。参见 知识图谱示例。
以下示例:
- 实例化
HanaRdfGraph指向电影数据图 - 创建一个由 LLM 驱动的
HanaSparqlQAAgent - 提问自然语言问题,并让智能体通过推理得出答案
import os
from dotenv import load_dotenv
from hdbcli import dbapi
# Load environment variables if needed
load_dotenv()
# Establish connection to SAP HANA Cloud
connection = dbapi.connect(
address=os.environ.get("HANA_DB_ADDRESS"),
port=os.environ.get("HANA_DB_PORT"),
user=os.environ.get("HANA_DB_USER"),
password=os.environ.get("HANA_DB_PASSWORD")
)
from gen_ai_hub.proxy.langchain.openai import ChatOpenAI
from langchain_hana import HanaRdfGraph, HanaSparqlQAChain
# from langchain_openai import ChatOpenAI # or your chosen LLM
# Set up the Knowledge Graph
graph_uri = "kgdocu_movies"
graph = HanaRdfGraph(
connection=connection,
graph_uri=graph_uri,
auto_extract_ontology=True
)
# a basic graph schema is extracted from the data graph. This schema will guide the LLM to generate a proper SPARQL query.
schema_graph = graph.get_schema
print(schema_graph.serialize(format="turtle"))
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://kg.demo.sap.com/acted_in> a owl:ObjectProperty ;
rdfs:label "acted_in" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range <http://kg.demo.sap.com/Film> .
<http://kg.demo.sap.com/dateOfBirth> a owl:DatatypeProperty ;
rdfs:label "dateOfBirth" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range xsd:dateTime .
<http://kg.demo.sap.com/directed> a owl:ObjectProperty ;
rdfs:label "directed" ;
rdfs:domain <http://kg.demo.sap.com/Director> ;
rdfs:range <http://kg.demo.sap.com/Film> .
<http://kg.demo.sap.com/genre> a owl:ObjectProperty ;
rdfs:label "genre" ;
rdfs:domain <http://kg.demo.sap.com/Film> ;
rdfs:range <http://kg.demo.sap.com/Genre> .
<http://kg.demo.sap.com/placeOfBirth> a owl:ObjectProperty ;
rdfs:label "placeOfBirth" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range <http://kg.demo.sap.com/Place> .
<http://kg.demo.sap.com/title> a owl:DatatypeProperty ;
rdfs:label "title" ;
rdfs:domain <http://kg.demo.sap.com/Film> ;
rdfs:range xsd:string .
rdfs:label a owl:DatatypeProperty ;
rdfs:label "label" ;
rdfs:domain <http://kg.demo.sap.com/Actor>,
<http://kg.demo.sap.com/Director>,
<http://kg.demo.sap.com/Genre>,
<http://kg.demo.sap.com/Place> ;
rdfs:range xsd:string .
<http://kg.demo.sap.com/Director> a owl:Class ;
rdfs:label "Director" .
<http://kg.demo.sap.com/Genre> a owl:Class ;
rdfs:label "Genre" .
<http://kg.demo.sap.com/Place> a owl:Class ;
rdfs:label "Place" .
<http://kg.demo.sap.com/Actor> a owl:Class ;
rdfs:label "Actor" .
<http://kg.demo.sap.com/Film> a owl:Class ;
rdfs:label "Film" .
# Initialize the LLM
llm = ChatOpenAI(proxy_model_name="gpt-4o", temperature=0)
# Create a SPARQL QA Agent
agent = HanaSparqlQAAgent.create_agent(
graph=graph,
model=llm,
)
# Example queries:
# question = "Which movies are in the data?"
# question = "In which movies did Keanu Reeves and Carrie-Anne Moss play together"
# question = "which movie genres are in the data?"
# question = "which are the two most assigned movie genres?"
# question = "where were the actors of 'Blade Runner' born?"
# question = "which actors acted together in a movie and were born in the same city?"
question = "which actors acted in Blade Runner?"
for event in agent.stream(
{"messages": [{"role": "user", "content": question}]},
stream_mode="values",
):
event["messages"][-1].pretty_print()
================================ Human Message =================================
which actors acted in Blade Runner?
================================== Ai Message ==================================
Tool Calls:
retrieve_ontology (call_9T3Dxy3zKczTQKVAgTxPBfQm)
Call ID: call_9T3Dxy3zKczTQKVAgTxPBfQm
Args:
================================== Ai Message ==================================
Tool Calls:
retrieve_ontology (call_9T3Dxy3zKczTQKVAgTxPBfQm)
Call ID: call_9T3Dxy3zKczTQKVAgTxPBfQm
Args:
================================= Tool Message =================================
Name: retrieve_ontology
Ontology Information:
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://kg.demo.sap.com/acted_in> a owl:ObjectProperty ;
rdfs:label "acted_in" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range <http://kg.demo.sap.com/Film> .
<http://kg.demo.sap.com/dateOfBirth> a owl:DatatypeProperty ;
rdfs:label "dateOfBirth" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range xsd:dateTime .
<http://kg.demo.sap.com/directed> a owl:ObjectProperty ;
rdfs:label "directed" ;
rdfs:domain <http://kg.demo.sap.com/Director> ;
rdfs:range <http://kg.demo.sap.com/Film> .
<http://kg.demo.sap.com/genre> a owl:ObjectProperty ;
rdfs:label "genre" ;
rdfs:domain <http://kg.demo.sap.com/Film> ;
rdfs:range <http://kg.demo.sap.com/Genre> .
<http://kg.demo.sap.com/placeOfBirth> a owl:ObjectProperty ;
rdfs:label "placeOfBirth" ;
rdfs:domain <http://kg.demo.sap.com/Actor> ;
rdfs:range <http://kg.demo.sap.com/Place> .
<http://kg.demo.sap.com/title> a owl:DatatypeProperty ;
rdfs:label "title" ;
rdfs:domain <http://kg.demo.sap.com/Film> ;
rdfs:range xsd:string .
rdfs:label a owl:DatatypeProperty ;
rdfs:label "label" ;
rdfs:domain <http://kg.demo.sap.com/Actor>,
<http://kg.demo.sap.com/Director>,
<http://kg.demo.sap.com/Genre>,
<http://kg.demo.sap.com/Place> ;
rdfs:range xsd:string .
<http://kg.demo.sap.com/Director> a owl:Class ;
rdfs:label "Director" .
<http://kg.demo.sap.com/Genre> a owl:Class ;
rdfs:label "Genre" .
<http://kg.demo.sap.com/Place> a owl:Class ;
rdfs:label "Place" .
<http://kg.demo.sap.com/Actor> a owl:Class ;
rdfs:label "Actor" .
<http://kg.demo.sap.com/Film> a owl:Class ;
rdfs:label "Film" .
================================== Ai Message ==================================
Tool Calls:
execute_sparql (call_LwHuDXaPsx3nDJF7Hn6If8s9)
Call ID: call_LwHuDXaPsx3nDJF7Hn6If8s9
Args:
query: PREFIX kg: <http://kg.demo.sap.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?actorLabel
FROM <kgdocu_movies>
WHERE {
?movie rdf:type kg:Film .
?movie kg:title "Blade Runner" .
?actor kg:acted_in ?movie .
?actor rdfs:label ?actorLabel .
}
================================== Ai Message ==================================
Tool Calls:
execute_sparql (call_LwHuDXaPsx3nDJF7Hn6If8s9)
Call ID: call_LwHuDXaPsx3nDJF7Hn6If8s9
Args:
query: PREFIX kg: <http://kg.demo.sap.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?actorLabel
FROM <kgdocu_movies>
WHERE {
?movie rdf:type kg:Film .
?movie kg:title "Blade Runner" .
?actor kg:acted_in ?movie .
?actor rdfs:label ?actorLabel .
}
================================= Tool Message =================================
Name: execute_sparql
SPARQL Query Result:
actorLabel
Morgan Paull
William Sanderson
James Hong
M. Emmet Walsh
Joe Turkel
Brion James
Q81328
Daryl Hannah
Rutger Hauer
Joanna Cassidy
Hy Pyke
Sean Young
Edward James Olmos
================================== Ai Message ==================================
The actors who acted in "Blade Runner" are:
- Morgan Paull
- William Sanderson
- James Hong
- M. Emmet Walsh
- Joe Turkel
- Brion James
- Daryl Hannah
- Rutger Hauer
- Joanna Cassidy
- Hy Pyke
- Sean Young
- Edward James Olmos
================================== Ai Message ==================================
The actors who acted in "Blade Runner" are:
- Morgan Paull
- William Sanderson
- James Hong
- M. Emmet Walsh
- Joe Turkel
- Brion James
- Daryl Hannah
- Rutger Hauer
- Joanna Cassidy
- Hy Pyke
- Sean Young
- Edward James Olmos
底层工作原理是什么?
-
本体检索
智能体首先使用
retrieve_ontology工具以 Turtle 格式获取 RDF 模式。这使其了解可用的类、属性和关系。 -
SPARQL 生成
根据本体和用户的问题,智能体推理要查询的实体和属性,然后生成一个有效的
SELECT查询。 -
查询执行
智能体调用
execute_sparql工具在 HANA RDF 图上运行生成的查询。如果查询失败或返回意外结果,智能体可以自我纠正并重试。 - 答案制定 智能体解释查询结果,并严格基于检索到的数据制定简洁、人类可读的答案。
官方原文:src/oss/python/integrations/agents/sap_hana_sparql_qa_agent.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。