> ## Documentation Index
> Fetch the complete documentation index at: https://langchain-docs-zh.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 HanaSparqlQAAgent 进行问答

> 使用 LangChain Python 集成 HanaSparqlQAAgent 类型

## 设置与安装

要使用此功能，请安装 `langchain-hana` 包：

```python theme={null}
pip install langchain_hana
```

`HanaSparqlQAAgent` 是一种基于智能体的方法，用于回答存储在 SAP HANA Cloud 中的 RDF 数据的问题。与基于链的方法不同，智能体可以：

1. **动态检索本体** 使用专用工具
2. **生成并执行 SPARQL 查询** 迭代
3. **自我纠正** 如果查询失败或返回意外结果
4. **逐步推理** 关于复杂问题

## 初始化

您需要：

* 一个 **LLM** 为智能体的推理提供支持
* 一个 **`HanaRdfGraph`**（包含连接、`graph_uri` 和本体）

请按照此处 [HanaRdfGraph](https://langchain-docs-zh.mintlify.site/langchain/oss/python/integrations/graphs/sap_hana_rdf_graph.md) 的步骤了解更多关于创建 `HanaRdfGraph` 实例的信息。

导入 `HanaSparqlQAAgent`

```python theme={null}
from langchain_hana import HanaSparqlQAAgent
agent = HanaSparqlQAAgent.create_agent(graph=graph, model=llm)
```

## 智能体概述

智能体使用工具迭代执行以下操作：

1. 首先检索本体以理解数据结构
2. 根据模式生成适当的 SPARQL 查询
3. 执行查询并解释结果
4. 制定自然语言答案

### 默认设置

* **工具**:
  * `retrieve_ontology` - 从图中以 Turtle 格式检索 RDF 本体/模式
  * `execute_sparql` - 对 HANA RDF 图执行 SPARQL 查询
* **系统提示词**：提供默认系统提示词，包含 SPARQL 生成和工具使用的说明。
* **中间件**：`ModelRetryMiddleware(max_retries=3)` 和 `ToolRetryMiddleWare(max_retries=2)` 默认添加以防止无限循环

### 自定义您的智能体

您可以通过向 `create_agent` 提供附加参数来自定义智能体的行为：

```python theme={null}
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 实例。
有关详细说明，请参阅：[启用三元组存储](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-knowledge-graph-guide/enable-triple-store/)\

加载 `kgdocu_movies` 示例数据。参见 [知识图谱示例](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-knowledge-graph-guide/knowledge-graph-example)。

以下示例：

1. 实例化 `HanaRdfGraph` 指向电影数据图
2. 创建一个由 LLM 驱动的 `HanaSparqlQAAgent`
3. 提问自然语言问题，并让智能体通过推理得出答案

这展示了智能体如何动态检索本体、生成 SPARQL 查询并返回人类可读的答案。

```python theme={null}
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")
)
```

然后，设置知识图谱实例

```python theme={null}
from gen_ai_hub.proxy.langchain.openai import ChatOpenAI
from langchain_hana import HanaRdfGraph, HanaSparqlQAChain

# from langchain_openai import ChatOpenAI  # or your chosen LLM
```

```python theme={null}
# Set up the Knowledge Graph
graph_uri = "kgdocu_movies"

graph = HanaRdfGraph(
    connection=connection,
    graph_uri=graph_uri,
    auto_extract_ontology=True
)
```

```python theme={null}
# 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"))
```

```output theme={null}
@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" .
```

之后，初始化 LLM。

```python theme={null}
# Initialize the LLM
llm = ChatOpenAI(proxy_model_name="gpt-4o", temperature=0)
```

然后，创建 SPARQL 问答智能体。

```python theme={null}
# Create a SPARQL QA Agent
agent = HanaSparqlQAAgent.create_agent(
    graph=graph,
    model=llm,
)
```

```python theme={null}
# 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()
```

```output theme={null}

================================ 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
```

### 底层工作原理是什么？

1. **本体检索**
   智能体首先使用 `retrieve_ontology` 工具以 Turtle 格式获取 RDF 模式。这使其了解可用的类、属性和关系。

2. **SPARQL 生成**
   根据本体和用户的问题，智能体推理要查询的实体和属性，然后生成一个有效的 `SELECT` 查询。

3. **查询执行**
   智能体调用 `execute_sparql` 工具在 HANA RDF 图上运行生成的查询。如果查询失败或返回意外结果，智能体可以自我纠正并重试。

4. **答案制定**
   智能体解释查询结果，并严格基于检索到的数据制定简洁、人类可读的答案。

***

> 官方原文：[src/oss/python/integrations/agents/sap\_hana\_sparql\_qa\_agent.mdx](https://github.com/langchain-ai/docs/blob/main/src/oss/python/integrations/agents/sap_hana_sparql_qa_agent.mdx) · 非官方翻译，译文由 AI 生成，以英文原文为准。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.