

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过连接到结构化数据存储来创建知识库
<a name="knowledge-base-structured-create"></a>

要将知识库连接到结构化数据存储，请指定以下组件：
+ 

**查询引擎配置**  
将执行生成的 SQL 查询的计算服务的配置。查询引擎用于将自然语言用户查询转换为可用于从数据存储中提取数据的 SQL 查询。您可以选择 Amazon Redshift 作为查询引擎。选择此配置时，您必须指定：
  + 计算连接元数据，例如集群 ID 或工作组 ARN，具体取决于所选的查询引擎。
  + 使用查询引擎的身份验证方法，可以是使用具有相应权限的 IAM 服务角色、查询引擎数据库用户或与您的数据库凭证关联的 AWS Secrets Manager 密钥。
+ 

**存储配置**  
包含数据的数据存储的配置。你可以连接亚马逊 Redshift Provisioned 或 Amazon Redshift Serverless，然后使用亚马逊 Redshift 或作为数据存储。 AWS Glue Data Catalog 
+ 

**（可选）查询配置**  
可以使用可选的查询配置来提高 SQL 生成的准确性：
  + **最大查询时间** – 查询超时后的时间量。
  + **描述** – 提供有关表或列的元数据或补充信息。您可以包括表或列的描述、使用说明或任何其他属性。您添加的描述可以通过提供有关表或列的结构的额外上下文和信息来改进 SQL 查询生成。
  + **包含项和排除项** – 指定生成 SQL 时要包括或排除的一组表或列。如果您想将 SQL 查询的范围限制为已定义的可用表或列子集，则此字段至关重要。此选项可以通过减少不必要的表或列引用来协助优化生成过程。

    如果指定包含项，则会忽略所有其他表和列。如果指定排除项，则会忽略您指定的表和列。
**注意**  
包含项和排除项不能替代护栏，仅用于提高模型准确度。
  + **精选查询** – 一组预定义的问答示例。问题以自然语言查询（NLQ）形式编写，而答案是相应的 SQL 查询。这些示例通过提供应生成的查询类型的示例来为 SQL 生成过程提供协助。它们可用作提高生成式 SQL 输出的准确性和相关性的参考点。

展开与您的使用案例相对应的部分：

## 使用控制台
<a name="knowledge-base-structured-create-console"></a>

要使用连接到结构化数据存储 AWS 管理控制台，请执行以下操作：

1. 使用有权使用 Amazon Bedrock 控制台的 IAM 身份登录。 AWS 管理控制台 然后，在 [https://console.aws.amazon.com/](https://console.aws.amazon.com/bedrock)bedrock 上打开 Amazon Bedrock 控制台。

1. 在左侧导航窗格中，选择**知识库**。

1. 在**知识库**部分中，选择**创建**，然后选择**包含结构化数据存储的知识库**。

1. 为知识库设置以下详细信息：

   1. （可选）更改默认名称并为知识库提供描述。

   1. 选择要用于从数据存储中检索数据的查询引擎。

   1. 选择具有适当权限的 IAM 服务角色来创建和管理此知识库。您可以让 Amazon Bedrock 创建服务角色，也可以选择您已创建的自定义角色。有关创建自定义角色的更多信息，请参阅[设置查询引擎和权限以创建带结构化数据存储的知识库](knowledge-base-prereq-structured.md)。

   1. （可选）添加要与知识库关联的标签。有关更多信息，请参阅 [标记 Amazon Bedrock 资源](tagging.md)。

   1. 选择**下一步**。

1. 配置查询引擎：

   1. 选择已在其中创建集群或工作组的服务。然后，选择要使用的集群或工作组。

   1. 选择身份验证方法并提供所需字段。

   1. 选择用于存储元数据的数据存储。然后，选择或输入数据库的名称。

   1. （可选）根据需要修改查询配置。有关不同配置的更多信息，请参阅本主题的开头部分。

   1. 选择**下一步**。

1. 查看知识库配置并根据需要编辑任何部分。确认创建知识库。

## 使用 API
<a name="knowledge-base-structured-create-api"></a>

要使用 Amazon Bedrock API 连接到结构化数据存储，请使用 [Amazon Bedrock 构建时终端节点代理](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)发送[CreateKnowledgeBase](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateKnowledgeBase.html)请求，请求内容如下：

```
{
    "name": "string",
    "roleArn": "string",
    "knowledgeBaseConfiguration": {
        "type": "SQL",
        "sqlKnowledgeBaseConfiguration": [SqlKnowledgeBaseConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_SqlKnowledgeBaseConfiguration.html)
    },
    "description": "string",
    "clientToken": "string",
    "tags": {
        "string": "string"
    }
}
```

以下字段是必填字段。


****  

| 字段 | Basic description | 
| --- | --- | 
| Name | 知识库的名称。 | 
| roleArn | 具有适当权限的[知识库服务角色](kb-permissions.md)。您可以使用控制台自动创建具有适当权限的服务角色。 | 
| knowledgeBaseConfiguration | 包含知识库的配置。对于结构化数据库，请指定 SQL 作为 type，并包含 sqlKnowledgeBaseConfiguration 字段。 | 

以下字段是可选字段。


****  

| 字段 | 使用 | 
| --- | --- | 
| 描述 | 包含知识库的描述。 | 
| clientToken | 用于确保 API 请求仅完成一次。有关更多信息，请参阅[确保幂等性](https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html)。 | 
| 标签 | 将标签与流相关联。有关更多信息，请参阅 [标记 Amazon Bedrock 资源](tagging.md)。 | 

`SQLKnowledgeBaseConfiguration` 取决于您使用的查询引擎。对于 Amazon Redshift，请将`type`字段指定为`REDSHIFT`并包括映射到 a 的`redshiftConfiguration`字段。[RedshiftConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftConfiguration.html)对于 [RedshiftConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftConfiguration.html)，您可以配置以下字段：

### queryEngineConfiguration
<a name="w2aac28c10c27c15b9b3c17b1"></a>

您可以配置以下类型的查询引擎：

#### 已预调配的 Amazon Redshift
<a name="w2aac28c10c27c15b9b3c17b1b5b1"></a>

如果您的 Amazon Redshift 数据库是在专用计算节点上配置的，则该`queryEngineConfiguration`字段的值应采用以下[RedshiftQueryEngineConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftQueryEngineConfiguration.html)格式：

```
{
    "type": "PROVISIONED",
    "provisionedConfiguration": {
        "clusterIdentifier": "string",
        "authConfiguration": [RedshiftProvisionedAuthConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftProvisionedAuthConfiguration.html)
    },
}
```

在 `clusterIdentifier` 字段中指定集群的 ID。这[RedshiftProvisionedAuthConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftProvisionedAuthConfiguration.html)取决于你使用的授权类型。选择与您的授权方法相匹配的选项卡：

------
#### [ IAM role ]

如果您使用 IAM 角色进行授权，则只需在 [RedshiftProvisionedAuthConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftProvisionedAuthConfiguration.html) 中将 type 指定为 `IAM`，且无需填写其他字段。

```
{
    "type": "IAM"
}
```

------
#### [ Temporary credentials user name ]

如果您使用数据库用户名进行授权，请将 `type` 指定为 `USERNAME`，并在 `RedshiftProvisionedAuthConfig` 中的 `databaseUser` 字段中指定用户名：

```
{
    "type": "USERNAME",
    "databaseUser": "string"
}
```

------
#### [ AWS Secrets Manager ]

如果您使用授权 AWS Secrets Manager，请在以下`type``usernamePasswordSecretArn`字段中指定 as `USERNAME_PASSWORD` 并指定密钥的 ARN：`RedshiftProvisionedAuthConfig`

```
{
    "type": "USERNAME_PASSWORD",
    "usernamePasswordSecretArn": "string"
}
```

------

#### Amazon Redshift Serverless
<a name="w2aac28c10c27c15b9b3c17b1b5b3"></a>

如果您使用的是 Amazon Redshift Serverless，则该`queryConfiguration`字段的值应采用以下[RedshiftQueryEngineConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftQueryEngineConfiguration.html)格式：

```
{
    "type": "SERVERLESS",
    "serverlessConfiguration": {
        "workgroupArn": "string",
        "authConfiguration": 
    }
}
```

在 `workgroupArn` 字段中指定工作组的 ARN。这[RedshiftServerlessAuthConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftServerlessAuthConfiguration.html)取决于你使用的授权类型。选择与您的授权方法相匹配的选项卡：

------
#### [ IAM role ]

如果您使用 IAM 角色进行授权，则只需在 `RedshiftServerlessAuthConfiguration` 中将 type 指定为 `IAM`，且无需填写其他字段。

```
{
    "type": "IAM"
}
```

------
#### [ AWS Secrets Manager ]

如果您使用授权 AWS Secrets Manager，请在以下`type``usernamePasswordSecretArn`字段中指定 as `USERNAME_PASSWORD` 并指定密钥的 ARN：`RedshiftServerlessAuthConfiguration`

```
{
    "type": "USERNAME_PASSWORD",
    "usernamePasswordSecretArn": "string"
}
```

------

### storageConfigurations
<a name="w2aac28c10c27c15b9b3c17b3"></a>

此字段映射到包含单个字段的数组 [RedshiftQueryEngineStorageConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_RedshiftQueryEngineStorageConfiguration.html)，其格式取决于数据的存储位置。

#### AWS Glue Data Catalog
<a name="w2aac28c10c27c15b9b3c17b3b5b1"></a>

如果您的数据存储在 AWS Glue Data Catalog，则`RedshiftQueryEngineStorageConfiguration`应采用以下格式：

```
{
    "type": "AWS_DATA_CATALOG",
    "awsDataCatalogConfiguration": {
        "tableNames": ["string"]
    }
}
```

在 `tableNames` 映射到的数组中添加要连接知识库的每个表的名称。

**注意**  
按照[跨数据库查询](https://docs.aws.amazon.com/redshift/latest/dg/cross-database-overview.html)（`${databaseName}.${tableName}`）中描述的模式输入表名称。您可以通过指定 `${databaseName.*}` 来包含所有表。

#### Amazon Redshift 数据库
<a name="w2aac28c10c27c15b9b3c17b3b5b3"></a>

如果您的数据存储在 Amazon Redshift 数据库中，则 `RedshiftQueryEngineStorageConfiguration` 应采用以下格式：

```
{
    "type": "string",
    "redshiftConfiguration": {
        "databaseName": "string"
    }
}
```

在 `databaseName` 字段中指定 Amazon Redshift 数据库的名称。

**注意**  
按照[跨数据库查询](https://docs.aws.amazon.com/redshift/latest/dg/cross-database-overview.html)（`${databaseName}.${tableName}`）中描述的模式输入表名称。您可以通过指定 `${databaseName.*}` 来包含所有表。

如果您的数据库是通过 Amazon A SageMaker I Lakehouse 挂载的，则数据库名称的格式为*\$1\$1db\$1@\$1\$1schema\$1*。

### queryGenerationConfiguration
<a name="w2aac28c10c27c15b9b3c17b5"></a>

此字段映射到以下内容 [QueryGenerationConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationConfiguration.html)，您可以使用这些字段来配置数据的查询方式：

```
{
    "executionTimeoutSeconds": number,
    "generationContext": {
        "tables": [
            {
                "name": "string",
                "description": "string",
                "inclusion": "string",
                "columns": [
                    {
                        "name": "string",
                        "description": "string",
                        "inclusion": "string"
                    },
                    ...
                ]
            },
            ...
        ],
        "curatedQueries": [
            {
                "naturalLanguage": "string",
                "sql": "string"
            },
            ...
        ]
    }
}
```

如果希望为查询设置超时时间，请在 `executionTimeoutSeconds` 字段中指定超时持续时间（以秒为单位）。

该`generationContext`字段映射到一个[QueryGenerationContext](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationContext.html)对象，您可以在其中根据需要配置任意数量的以下选项。

**重要**  
如果包含生成上下文，则查询引擎会尽可能在生成 SQL 时应用该上下文。生成上下文具有非确定性，并且仅用于提高模型准确度。为确保准确度，请验证生成的 SQL 查询。

有关可包括的生成上下文的信息，请展开以下部分：

#### 为数据库中的表或列添加描述
<a name="w2aac28c10c27c15b9b3c17b5c15b1"></a>

要提高用于查询数据库的 SQL 生成的准确度，您可以为表或列提供描述，此描述能比简短的表名或列名提供更丰富的上下文。您可执行以下操作：
+ 要为表添加描述，请在`tables`数组中添加一个[QueryGenerationTable](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationTable.html)对象。在该对象中，在 `name` 字段中指定表的名称，并在 `description` 字段中指定描述，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "description": "Description for Table A"
  }
  ```
+ 要为列添加描述，请在`tables`数组中包含一个[QueryGenerationTable](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationTable.html)对象。在该对象中，在字段中指定表的名称并包括该`name`字`columns`段，该字段映射到的数组[QueryGenerationColumn](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationColumn.html)。在 `QueryGenerationColumn` 对象中，在 `name` 字段中包含列的名称，并在 `description` 字段中包含描述，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "columns": [
          {
              "name": "Column A",
              "description": "Description for Column A"
          }
      ]
  }
  ```
+ 您可以同时为表及其列添加描述，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "description": "Description for Table A",
      "columns": [
          {
              "name": "columnA",
              "description": "Description for Column A"
          }
      ]
  }
  ```
**注意**  
按照[跨数据库查询](https://docs.aws.amazon.com/redshift/latest/dg/cross-database-overview.html)中描述的模式输入表名称和列名称。如果您的数据库在 AWS Glue Data Catalog，则格式为`awsdatacatalog.gluedatabase.table`。

#### 在数据库中包含或排除表或列
<a name="w2aac28c10c27c15b9b3c17b5c15b3"></a>

在生成 SQL 时，您可以使用[QueryGenerationTable](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationTable.html)和[QueryGenerationColumn](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationColumn.html)对象中的`inclusion`字段来建议要包含或排除的表或列。可以在 `inclusion` 字段中指定下列值之一：
+ INCLUDE - 生成 SQL 时，仅将您指定的表或列作为上下文包含在内。
+ EXCLUDE - 生成 SQL 时，会将您指定的表或列作为上下文排除。

您可以通过以下方式指定是包含还是排除表或列：
+ 要包含或排除表，请在`tables`数组中包含一个[QueryGenerationTable](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationTable.html)对象。在该对象中，在 `name` 字段中指定表的名称，并在 `inclusion` 字段中指定是包含还是排除表，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "inclusion": "EXCLUDE"
  }
  ```

  查询引擎不会在用于生成 SQL 的附加上下文中添加 `Table A`。
+ 要包含或排除列，请在`tables`数组中包含一个[QueryGenerationTable](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationTable.html)对象。在该对象中，在字段中指定表的名称并包括该`name`字`columns`段，该字段映射到的数组[QueryGenerationColumn](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationColumn.html)。在 `QueryGenerationColumn` 对象中，在 `name` 字段中包含列的名称，并在 `inclusion` 字段中指定是包含还是排除列，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "columns": [
          {
              "name": "database.schema.tableA.columnA",
              "inclusion": "EXCLUDE"
          }
      ]
  }
  ```

  生成 SQL 时，SQL 生成功能会忽略上下文中 `Table A` 中的 `Column A`。
+ 在指定包含项或排除项时，您可以将表和列组合使用，如以下示例所示：

  ```
  {
      "name": "database.schema.tableA",
      "inclusion": "INCLUDE",
      "columns": [
          {
              "name": "database.schema.tableA.columnA",
              "inclusion": "EXCLUDE"
          }
      ]
  }
  ```

  在添加用于生成 SQL 的上下文时，SQL 生成功能会包含 `Table A`，但会排除其中的 `Column A`。

**重要**  
表和列排除项无法替代护栏。这些表和列的包含项与排除项用作附加上下文，以供模型在生成 SQL 时参考。

#### 向查询引擎提供自然语言到 SQL 查询的示例映射
<a name="w2aac28c10c27c15b9b3c17b5c15b5"></a>

为了提高查询引擎将用户查询转换为 SQL 查询的准确性，您可以在[QueryGenerationContext](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_QueryGenerationContext.html)对象的`curatedQueries`字段中为其提供示例，该字段映射到[CuratedQuery](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CuratedQuery.html)对象数组。每个对象都包含以下字段：
+ naturalLanguage – 自然语言形式的查询示例。
+ sql – 与自然语言查询对应的 SQL 查询。