

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

# Amazon Bedrock 知识库的运作方式
<a name="kb-how-it-works"></a>

Amazon Bedrock 知识库可以帮助您利用检索增强生成（RAG），后者是一种常用技术，可从数据存储中提取信息来增强大型语言模型（LLM）生成的响应。如果使用数据来源建立知识库，应用程序就可以查询该知识库以返回信息，通过直接引用数据来源或使用根据查询结果生成的自然响应来回答查询。

借助 Amazon Bedrock 知识库，您可以使用在查询知识库时接收到的上下文来丰富自己构建的应用程序。通过摆脱繁重的管道构建工作并为您提供开箱即用的 RAG 解决方案来缩短应用程序的构建时间，从而加快上市速度。添加知识库还可以提高成本效益，因为无需持续训练模型即可利用您的私有数据。

下面的示意图说明了 RAG 的执行方法。知识库可以通过自动执行 RAG 的设置和实施中的几个步骤来简化这个过程。

**预处理非结构化数据**

为了能够有效检索非结构化私有数据（即结构化数据存储中不存在的数据），通常的做法是先将数据转换为文本并将其拆分为可管理的部分。然后将这些部分或分块转换为嵌入内容并写入向量索引，同时保持与原文档的映射。这些嵌入内容用于确定查询和数据来源文本之间的语义相似性。下图说明了如何预处理向量数据库的数据。

![\[预处理数据以实现检索增强生成\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/kb/rag-preprocess.png)


向量嵌入是一系列数字，用于代表每个文本块。模型将每个文本块转换为一系列数字（称为向量），以便能够以数学方式对文本进行比较。这些向量可以是浮点数（float32），也可以是二进制数。默认情况下，Amazon Bedrock 支持的大多数嵌入模型都使用浮点向量。但是，有些模型支持二进制向量。如果选择二进制嵌入模型，还必须选择支持二进制向量的模型和向量存储。

每个维度仅使用 1 位的二进制向量没有浮点（float32）向量那么昂贵的存储成本，后者每个维度使用 32 位。但是，二进制向量在表示文本时的精度不如浮点向量。

以下示例用三种表示形式显示了一段文本：


****  

| 表示 | 值 | 
| --- | --- | 
| 文本 | “Amazon Bedrock 采用来自领先的 AI 公司和 Amazon 的高性能基础模型。” | 
| 浮点向量 | [0.041..., 0.056..., -0.018..., -0.012..., -0.020..., ...] | 
| 二进制向量 | [1,1,0,0,0, ...] | 

**运行时执行**

在运行时，使用嵌入模型将用户的查询转换为向量。然后，通过将文档向量与用户查询向量进行比较来查询向量索引，查找与用户查询在语义上相似的数据块。最后，使用从向量索引中检索到的数据块中的附加上下文来增强用户提示。接下来，将提示和附加上下文一起发送给模型，以便为用户生成响应。下图说明了 RAG 如何在运行时运行以增强对用户查询的响应。

![\[运行时检索增强生成\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/kb/rag-runtime.png)


要详细了解如何将数据转换为知识库、如何在设置知识库后查询知识库，以及在摄取期间可以应用于数据来源的自定义设置，请参阅以下主题：

**Topics**
+ [将数据转换为知识库](kb-how-data.md)
+ [使用 Amazon Bedrock 知识库从数据来源检索信息](kb-how-retrieval.md)
+ [自定义知识库](kb-how-customization.md)

# 将数据转换为知识库
<a name="kb-how-data"></a>

要创建知识库，请连接到您希望知识库能够访问的受支持数据来源。知识库将能够响应用户查询或者根据检索到的数据生成响应。

 Amazon Bedrock 知识库支持各种文档，包括文本、图像，或包含表格、图表、示意图和其他图像的多模态文档。*多模态*数据是指文本和视觉数据的组合。包含非结构化数据的文件类型的示例包括文本、markdown、HTML 和。 PDFs

以下各部分介绍了 Amazon Bedrock 知识库支持的数据类型以及您可以针对每种数据将知识库与之关联的服务：

## 非结构化数据
<a name="kb-how-unstructured"></a>

非结构化数据是指未强制进入预定义结构的数据。Amazon Bedrock 知识库支持连接到以下服务，以将非结构化数据添加到知识库中：
+ Amazon S3
+ Confluence（预览版）
+ Microsoft SharePoint（预览版）
+ Salesforce（预览版）
+ Web Crawler（预览版）
+ 自定义数据来源（支持将数据直接摄取到知识库中，无需同步）

数据来源包含文档的原始形式。为了优化查询流程，知识库会将原始数据转换为*向量嵌入*（数据的数字表示形式），以量化与同样转换为向量嵌入的查询的相似性。Amazon Bedrock 知识库在转换数据来源的过程中会使用以下资源：
+ 嵌入模型 – 用于将数据转换为向量嵌入的基础模型。对于同时包含文本和图像的多模态数据，您可以使用多模嵌入模型，例如 Amazon Titan 多模态嵌入 G1 或 Cohere Embed v3。
+ 向量存储 – 用于存储数据的向量表示形式的服务。支持以下向量存储：
  + Amazon OpenSearch 无服务器
  + Amazon Neptune
  + Amazon Aurora（RDS）
  + Pinecone
  + Redis Enterprise Cloud
  + MongoDB Atlas

将数据转换为向量嵌入的过程称为*摄取*。将数据转化为知识库的摄取过程包括以下步骤：

**摄取**

1. 数据由您选择的解析器进行解析。有关解析的更多信息，请参阅[数据来源的解析选项](kb-advanced-parsing.md)。

1. 数据来源中的每个文档都被分成*分块*，这些细分数据可以由词元数量和其他参数定义。有关分块的更多信息，请参阅[知识库的内容分块是如何运作的](kb-chunking.md)。

1. 选择的嵌入模型会将数据转换为向量嵌入。对于多模态内容，图像作为视觉向量嵌入，而文本则作为文本矢量嵌入，从而允许在两种模式下进行搜索。

1. 向量嵌入将写入所选向量存储中的向量索引。

摄取过程完成后，即可查询您的知识库。有关如何从知识库中查询和检索信息的信息，请参阅[使用 Amazon Bedrock 知识库从数据来源检索信息](kb-how-retrieval.md)。

如果您对数据来源进行更改，则必须同步更改，才能将添加、修改和删除内容摄取到知识库。某些数据来源支持将文件直接摄取到知识库中或从中删除，因此无需将数据来源的修改和摄取看作单独的步骤，也无需始终执行完全同步。要了解如何将文档直接摄取到知识库以及支持知识库的数据来源，请参阅[将更改直接摄取到知识库中](kb-direct-ingestion.md)。

Amazon Bedrock 知识库提供了可用于自定义数据摄取方式的多种选项。有关自定义此过程的更多信息，请参阅[自定义知识库](kb-how-customization.md)。

## 结构化数据
<a name="kb-how-structured"></a>

结构化数据是指格式由其所在的数据存储预定义的表格数据。Amazon Bedrock 知识库通过 Amazon Redshift 查询引擎连接到支持的结构化数据存储。Amazon Bedrock 知识库提供了一种完全托管的机制，这种机制可以分析查询模式、查询历史记录和架构元数据，从而将自然语言查询转换为 SQL 查询。然后，使用这些转换后的查询从支持的数据来源中检索相关信息。

Amazon Bedrock 知识库支持连接到以下服务，以将结构化数据存储添加到知识库中：
+ Amazon Redshift
+ AWS Glue Data Catalog(AWS Lake Formation)

如果将知识库连接到结构化数据存储，则无需将数据转换为向量嵌入。相反，Amazon Bedrock 知识库可以直接查询结构化数据存储。在查询期间，Amazon Bedrock 知识库可以将用户查询转换为 SQL 查询，以检索与用户查询相关的数据并生成更准确的响应。您还可以在不检索数据的情况下生成 SQL 查询，并在其他工作流程中使用这些查询。

例如，数据库存储库包含下表，其中包含有关客户及其购买金额的信息：


****  

| 客户 ID | 2020 年购买的金额 | 2021 年购买的金额 | 2022 年购买的金额 | 截至目前的总购买金额 | 
| --- | --- | --- | --- | --- | 
| 1 | 200 | 300 | 500 | 1000 | 
| 2 | 150 | 100 | 120 | 370 | 
| 3 | 300 | 300 | 300 | 900 | 
| 4 | 720 | 180 | 100 | 900 | 
| 5 | 500 | 400 | 100 | 1000 | 
| 6 | 900 | 800 | 1000 | 2700 | 
| 7 | 470 | 420 | 400 | 1290 | 
| 8 | 250 | 280 | 250 | 780 | 
| 9 | 620 | 830 | 740 | 2190 | 
| 10 | 300 | 200 | 300 | 800 | 

如果用户查询显示“为我提供前五名消费客户的摘要”，知识库可以执行以下操作：
+ 将查询转换为 SQL 查询。
+ 返回包含以下内容的表中的摘录：
  + 相关表列“客户 ID”和“截至目前的总购买金额”
  + 包含消费最高的 10 位客户的总购买金额的表行
+ 生成响应，说明哪些客户是消费排名前五的客户，以及他们的购买量。

知识库可以为其生成表格摘录的其他查询示例包括：
+ “2020 年按消费金额排名前五的客户”
+ “2020 年按购买金额排名最高的客户”
+ “2020-2022 年按购买金额排名前五的客户”
+ “2020-2022 年消费最高的前五位客户”
+ “总购买金额低于 10 美元的客户”
+ “消费最低的前五位客户”

查询越具体或越详细，知识库就越能缩小要返回的确切信息范围。例如，不要查询“2020 年按消费金额排名前 10 的客户”，而是提供更具体的查询“查找 2020 年截至目前总购买金额最高的 10 位客户”。具体查询指的是客户支出数据库表中的列名“截至目前的总购买金额”，还表示数据应按“最高”排序。

# 使用 Amazon Bedrock 知识库从数据来源检索信息
<a name="kb-how-retrieval"></a>

设置完知识库后，您可以设置应用程序以查询其中的数据来源。要查询知识库，您可以采用以下 API 操作：
+ [https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Retrieve.html](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Retrieve.html) – 从您的数据中检索与查询最相关的源分块或图像，并将其作为数组返回到响应中。
+ [https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html) – 将 `Retrieve` 与 Amazon Bedrock 中的 [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html) 操作相结合，从您的数据中检索与查询最相关的源分块，并生成自然语言响应。包括对数据中特定源分块的引用。如果数据来源包含视觉元素，模型在生成文本响应时会利用这些图像的见解，并为图像提供来源归因。
+ [GenerateQuery](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_GenerateQuery.html) – 将自然语言用户查询转换为适合结构化数据存储格式的查询。

`RetrieveAndGenerate` 操作是一个组合操作，它主要使用 `GenerateQuery`（如果您的知识库已连接到结构化数据存储）、`Retrieve` 和 `InvokeModel` 执行整个 RAG 流程。由于 Amazon Bedrock 知识库还为您提供访问 `Retrieve` 操作的权限，因此您可以灵活地将 RAG 中的步骤分开，并根据您的特定使用案例对其进行自定义。

使用 `Retrieve` 或 `RetrieveAndGenerate` 重排查询期间检索到的文档的相关性时，也可以使用[重排模型](rerank.md)。

要了解如何在查询知识库时使用这些 API 操作，请参阅[利用查询和响应测试知识库](knowledge-base-test.md)。

# 自定义知识库
<a name="kb-how-customization"></a>

Amazon Bedrock 知识库提供了用于自定义如何将数据来源处理到知识库中的选项，使您可以灵活地处理数据的存储、解析以及返回给最终用户的方式。选择以下主题之一，可详细了解在设置知识库时可以考虑的自定义选项：

**Topics**
+ [知识库的内容分块是如何运作的](kb-chunking.md)
+ [数据来源的解析选项](kb-advanced-parsing.md)
+ [使用自定义转换 Lambda 函数定义数据的摄取方式](kb-custom-transformation.md)
+ [在数据来源中包含元数据以改进知识库查询](kb-metadata.md)

# 知识库的内容分块是如何运作的
<a name="kb-chunking"></a>

在摄取数据时，Amazon Bedrock 首先将您的文档或内容拆分为可管理的分块，以实现高效的数据检索。然后将这些分块转换为嵌入内容并写入向量索引（数据的向量表示），同时保持与原文档的映射。向量嵌入支持对文本进行定量比较。

**Topics**
+ [标准分块](#kb-standard-chunking)
+ [分层分块](#kb-hiearchical-chunking)
+ [语义分块](#kb-semantic-chunking)
+ [多模态内容分块](#kb-multimodal-chunking)

## 标准分块
<a name="kb-standard-chunking"></a>

Amazon Bedrock 支持以下分块的标准方法：

**注意**  
文本分块策略仅适用于文本文档。对于多模态内容（音频、视频、图像），分块发生在嵌入模型级别，而不是通过这些基于文本的策略。
+ 固定大小分块：您可以通过指定每个分块的词元数量和重叠百分比来配置所需的分块大小，从而灵活地满足您的特定要求。您可以设置分块中词元数量不得超过的最大值以及连续分块之间的重叠百分比。
**注意**  
对于已解析的内容（例如使用高级解析器或从 HTML 转换的内容），Amazon Bedrock 知识库可能会对内容进行分块以优化以获得最佳结果。分块器尊重逻辑文档边界（例如页面或部分），并且不会跨越这些边界合并内容，即使增加最大令牌大小会允许更大的块。
+ 默认分块：将内容拆分为包含大约 300 个词元的文本块。分块过程遵循句子边界，确保在每个分块中保留完整的句子。

您还可以选择不为文档分块。每个文档都被视为为单个文本块。在选择不分块作为分块方法/策略之前，您需要先预处理文档，将它拆分为单独的文件。如果您为文档选择不分块，则无法在引文中查看页码，也无法按 *x-amz-bedrock-kb-document-page-number* 元数据字段/属性进行筛选。

## 分层分块
<a name="kb-hiearchical-chunking"></a>

分层分块涉及将信息整理成子块和父块的嵌套结构。创建数据来源时，您可以定义父块大小、子块大小以及每个分块之间重叠的词元数量。在检索过程中，系统最初会检索子块，但会用更广泛的父块替换它们，以便为模型提供更全面的上下文。

小文本嵌入更精确，但检索的目的是获得全面的上下文。分层分块系统通过适时将检索到的子块替换为父块来平衡这些需求。

**注意**  
由于在检索过程中子块会被父块替换，因此返回的结果数可能少于请求的数量。
使用 S3 矢量存储桶作为矢量存储时，不建议使用分层分块。使用大量令牌进行分块（总共超过 8000 个令牌）时，可能会遇到元数据大小限制。

对于分层分块，Amazon Bedrock 知识库支持为分块指定两个级别或以下深度：
+ 父级：您可以设置父块词元的最大大小。
+ 子级：您可以设置子块词元的最大大小。

您还可以设置分块之间的重叠词元数量。这是连续父块和连续子块之间重叠词元的绝对数量。

## 语义分块
<a name="kb-semantic-chunking"></a>

语义分块是一种自然语言处理技术，它将文本分成有意义的块，以增强理解和信息检索。它旨在通过关注语义内容而不仅仅是句法结构来提高检索的准确性。这样做有助于更精确地提取和处理相关信息。

配置语义分块时，您可以选择指定以下超级参数。
+ 最大词元数量：在遵守句子边界的情况下，单个分块中应包含的最大词元数。
+ 缓冲区大小：对于给定的句子，缓冲区大小定义了创建嵌入时要添加的周围句子的数量。例如，缓冲区大小为 1 会产生 3 个句子（当前句、上一句和下一句）的组合和嵌入。此参数能够影响一起检查多少文本以确定每个分块的边界，从而影响生成的分块的粒度和连贯性。较大的缓冲区大小可能会捕获更多的上下文，但也会带来噪音，而较小的缓冲区大小可能会错过重要的上下文，但可以确保更精确的分块。
+ 断点百分位数阈值：在句子之间画断点的句 distance/dissimilarity 子的百分位数阈值。较高的阈值要求句子更容易区分，以便分成不同的块。阈值越高，分块越少，平均分块大小通常越大。
**注意**  
由于语义分块使用基础模型，因此使用语义分块会产生额外的成本。费用取决于您拥有的数据量。有关基础模型成本的更多信息，请参阅 [Amazon Bedrock 定价](https://aws.amazon.com/bedrock/pricing/)。

## 多模态内容分块
<a name="kb-multimodal-chunking"></a>

对于多模式内容（音频、视频、图像），分块行为与文本文档不同：
+ **Nova 多模态嵌入：**分块发生在嵌入模型级别。您可以将音频和视频区块的持续时间配置为 1-30 秒（默认值：5 秒）。对于视频文件，即使视频包含音频，也只适用视频区块时长。音频区块持续时间仅适用于独立音频文件。
+ **基岩数据自动化 (BDA) 解析器：**首先将内容转换为文本（脚本和场景摘要），然后将标准文本分块策略应用于转换后的文本。

**注意**  
使用 Nova 多模态嵌入时，知识库中配置的文本分块策略仅影响数据源中的文本文档，而不影响音频、视频或图像文件。

# 数据来源的解析选项
<a name="kb-advanced-parsing"></a>

解析是指理解并提取原始数据的内容。Amazon Bedrock 知识库提供了以下选项，用于在摄取期间解析您的数据来源：
+ **Amazon Bedrock 默认解析器** – 仅解析文本文件中的文本，包括 .txt、.md、.html、.doc/.docx、.xls/.xlsx 和 .pdf 文件。此解析器不会产生任何使用费。
**注意**  
由于默认解析器仅输出文本，因此，如果您的文档包含数字、图表、表格或图像，我们建议使用 Amazon Bedrock 数据自动化或基础模型作为解析器，而不是默认解析器。Amazon Bedrock 数据自动化和基础模型可以从您的文档中提取这些元素，并将其作为输出返回。
+ Amazon Bedrock 知识库提供了以下解析器来解析多模态数据，包括 .pdf 文件中的数字、图表和表格，以及 .jpeg 和 .png 图像文件。这些解析器还可以提取这些数字、图表、表格和图像，并将它们作为文件存储在知识库创建期间指定的 S3 目标中。在知识库检索期间，这些文件可以在响应或来源归因中返回。
  + **Amazon Bedrock 数据自动化** – 一项完全托管的服务，可有效处理多模态数据，而无需提供任何额外的提示。此解析器的成本取决于文档中的页数或要处理的图像数量。有关此服务的更多信息，请参阅 [Amazon Bedrock 数据自动化](bda.md)。
  + **基础模型** – 使用基础模型处理多模态数据。此解析器为您提供了选项，以自定义用于数据提取的默认提示。此解析器的成本取决于基础模型处理的输入和输出词元的数量。有关支持解析 Amazon Bedrock 知识库数据的模型列表，请参阅[用于解析的支持的区域和模型](knowledge-base-supported.md#knowledge-base-supported-parsing)。

**重要**  
如果您选择 Amazon Bedrock 数据自动化或基础模型作为解析器，那么即使 .pdf 文件仅包含文本，也将使用您选择的方法来解析数据来源中的所有 .pdf 文件。不会使用默认解析器来解析这些 .pdf 文件。您的账户会因使用 Amazon Bedrock 数据自动化或基础模型解析这些文件而产生费用。

在选择如何解析数据时，请考虑以下事项：
+ 无论数据是纯文本，还是包含多模态数据，如图像、图形和图表，您是否希望知识库能够查询这些数据。
+ 您是否希望可选择自定义提示，以指示模型如何解析数据。
+ 解析器的成本。Amazon Bedrock 数据自动化采用按页定价，而基础模型解析器则根据输入和输出词元收费。有关更多信息，请参阅 [Amazon Bedrock 定价](https://aws.amazon.com/bedrock/pricing/)。
+ 文件总大小限制。使用基础模型作为解析器时，所有文件的总文件大小不得超过 100 GB。

要了解如何配置知识库的解析方式，请参阅[将数据来源连接到知识库](data-source-connectors.md)中的数据来源的连接配置。

# 使用自定义转换 Lambda 函数定义数据的摄取方式
<a name="kb-custom-transformation"></a>

您可以定义自定义转换 Lambda 函数，将自己的逻辑注入知识库摄取过程。

您可能有特定的分块逻辑，Amazon Bedrock 知识库本身不支持这些逻辑。使用无分块策略选项，同时指定包含分块逻辑的 Lambda 函数。此外，您需要为知识库指定一个 Amazon S3 存储桶，以写入要由 Lambda 函数分块的文件。

分块后，您的 Lambda 函数会将分块文件写回同一个存储桶中，并返回知识库的引用以供进一步处理。您可以选择提供自己的 AWS KMS 密钥来加密存储在 S3 存储桶中的文件。

**注意**  
如果使用 Web 连接器，则会向 Lambda 传递 markdown 文本，而不是 HTML。

或者，您可能需要指定块级元数据，同时让知识库应用一种原生支持的分块策略。在这种情况下，选择一种预定义的分块策略（例如，默认或固定大小分块），同时提供对您的 Lambda 函数和 S3 存储桶的引用。在这种情况下，知识库会将已解析和预分块的文件存储在预定义的 S3 存储桶中，然后再调用 Lambda 函数进一步添加块级元数据。

添加块级元数据后，您的 Lambda 函数会将分块文件写回同一个存储桶中，并返回知识库的引用以供进一步处理。请注意，如果发生任何冲突，块级元数据优先，并会覆盖文件级元数据。

有关使用 Python Lambda 函数进行自定义分块的示例，请参阅 [Custom chunking using Lambda function](https://github.com/aws-samples/amazon-bedrock-samples/blob/main/rag/knowledge-bases/features-examples/03-optimizing-accuracy-retrieved-results/advanced_chunking_options.ipynb)。

有关 API 和文件合约，请参阅以下结构：

**使用 Lambda 函数添加自定义转换时的 API 合约**

```
{
...
    "vectorIngestionConfiguration": {
        "customTransformationConfiguration": { // Custom transformation 
            "intermediateStorage": {
                "s3Location": { // the location where input/output of the Lambda is expected 
                    "uri": "string"
                }
            },
            "transformations": [{
                "transformationFunction": {
                    "transformationLambdaConfiguration": {
                        "lambdaArn": "string"
                    }
                },
                "stepToApply": "string" // enum of POST_CHUNKING
            }]
        },
        "chunkingConfiguration": {
            "chunkingStrategy": "string",
            "fixedSizeChunkingConfiguration": {
                "maxTokens": "number",
                "overlapPercentage": "number"
            }
            ...
        }
    }
}
```

**自定义 Lambda 转换输入格式**

```
{
    "version": "1.0",
    "knowledgeBaseId": "string",
    "dataSourceId": "string",
    "ingestionJobId": "string",
    "bucketName": "string",
    "priorTask": "string",
    "inputFiles": [{
        "originalFileLocation": {
            "type": "S3",
            "s3_location": {
                "uri": "string"
            }
        },
        "fileMetadata": {
            "key1": "value1",
            "key2": "value2"
        },
        "contentBatches": [{
            "key":"string"
        }]
    }]
}
```

**自定义 Lambda 转换输出格式**

```
{
    "outputFiles": [{
        "originalFileLocation": {
            "type": "S3",
            "s3_location": {
                "uri": "string"
            }
        },
        "fileMetadata": {
            "key1": "value1",
            "key2": "value2"
        },
        "contentBatches": [{
            "key": "string"
        }]
    }]
}
```

** 中引用的对象的文件格式`fileContents`**

```
{
    "fileContents": [{
        "contentBody": "...",
        "contentType": "string", // enum of TEXT, PDF, ...
        "contentMetadata": {
            "key1": "value1",
            "key2": "value2"
        }
    }
    ...
    ]
}
```

# 在数据来源中包含元数据以改进知识库查询
<a name="kb-metadata"></a>

在提取 CSV（逗号分隔值）文件时，您可以让知识库将某些列视为内容字段而不是元数据字段。现在，您可以拥有一个 CSV 文件和一个相应的 metadata.json 文件，从而为知识库提供有关如何处理 CSV 中每列的提示，而不必拥有成百上千个内容/元数据文件对。

每个分块的文档元数据字段/属性有限制。请参阅 [Quotas for knowledge bases](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html)

在提取 CSV 文件之前，请确保：
+ 您的 CSV 格式为 RFC4180，并采用 UTF-8 编码。
+ CSV 的第一行包含标题信息。
+ 您的 metadata.json 中提供的元数据字段以列的形式出现在 CSV 中。
+ 您提供一个采用以下格式的 fileName.csv.metadata.json 文件：

  ```
  {
      "metadataAttributes": {
          "${attribute1}": "${value1}",
          "${attribute2}": "${value2}",
          ...
      },
      "documentStructureConfiguration": {
          "type": "RECORD_BASED_STRUCTURE_METADATA",
          "recordBasedStructureMetadata": {
              "contentFields": [
                  {
                      "fieldName": "string"
                  }
              ],
              "metadataFieldsSpecification": {
                  "fieldsToInclude": [
                      {
                          "fieldName": "string"
                      }
                  ],
                  "fieldsToExclude": [
                      {
                          "fieldName": "string"
                      }
                  ]
              }
          }
      }
  }
  ```

CSV 文件每次解析一行，并将分块策略和向量嵌入应用于内容字段。Amazon Bedrock 知识库目前支持一个内容字段。内容字段被拆分为多个分块，与每个分块关联的元数据字段（列）被视为字符串值。

例如，假设有一个 CSV 中有一列“描述”和一列“创建日期”。描述字段是内容字段，创建日期是关联的元数据字段。描述文本被分成多个块，并转换为 CSV 中每行的向量嵌入。创建日期值被视为日期的字符串表示形式，并与描述的每个分块相关联。

如果未提供包含/排除字段，则除内容列外，所有列都将被视为元数据列。如果仅提供包含字段，则仅将提供的列视为元数据。如果仅提供排除字段，则除排除列之外的所有列都将被视为元数据。如果您在 `fieldsToInclude` 和 `fieldsToExclude` 中都提供了相同的 `fieldName`，Amazon Bedrock 将引发验证异常。如果包容和排除之间存在冲突，则将导致失败。

在 CSV 中找到的空行将被忽略或跳过。