如果我将内容分块并矢量化到 Azure AI 搜索中,我是否为每个嵌入创建一个新项目,是否会产生重复的文档?

问题描述 投票:0回答:1

我正在尝试在 Azure AI 搜索中设置矢量搜索。我有一些长达数百页的文档,我想对内容进行矢量化。这意味着我需要对文本进行分块。我遇到的问题是,在对文本进行分块并生成嵌入后,我不知道如何重新组合它们(或者是否应该)。

我遇到的主要问题是,我似乎需要为每个文本块创建重复的条目,这意味着我的搜索结果将多次返回相同的文档。这准确吗?

是否有一个示例说明如何对大型文档(不是来自存储)进行分块并将其索引到 Azure AI 搜索中,而无需在索引中多次使用相同的文档?我没有使用 Azure 存储,所以我似乎没有选择使用集成矢量化,这显然可以以某种方式处理这个问题。

azure azure-ai-search
1个回答
0
投票

当您进行分块时,所有块都存储在数组中的单个文档引用下,如下所示:

enter image description here

所以,这看起来像是重复的文档。

要为每个块创建单独的文档,您需要有一个二级索引并在二级索引的技能集中定义索引投影。

以下是技能组的定义。在索引器中提供此技能组,该技能组针对二级索引。

{
  "@odata.context": "https://jgsearch.search.windows.net/$metadata#skillsets/$entity",
  "@odata.etag": "\"0x8DC681E216E4055\"",
  "name": "vector-1714372801582-skillset",
  "description": "Skillset to chunk documents and generate embeddings",
  "skills": [
    {
      "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
      "name": "#1",
      "description": null,
      "context": "/document/pages/*",
      "resourceUri": "https://jgsopenai.openai.azure.com",
      "apiKey": "<redacted>",
      "deploymentId": "ada-002",
      "inputs": [
        {
          "name": "text",
          "source": "/document/pages/*"
        }
      ],
      "outputs": [
        {
          "name": "embedding",
          "targetName": "vector"
        }
      ],
      "authIdentity": null
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
      "name": "#2",
      "description": "Split skill to chunk documents",
      "context": "/document",
      "defaultLanguageCode": "en",
      "textSplitMode": "pages",
      "maximumPageLength": 2000,
      "pageOverlapLength": 500,
      "maximumPagesToTake": 0,
      "inputs": [
        {
          "name": "text",
          "source": "/document/content"
        }
      ],
      "outputs": [
        {
          "name": "textItems",
          "targetName": "pages"
        }
      ]
    }
  ],
  "cognitiveServices": null,
  "knowledgeStore": null,
  "indexProjections": {
    "selectors": [
      {
        "targetIndexName": "secondary-index",
        "parentKeyFieldName": "parent_id",
        "sourceContext": "/document/pages/*",
        "mappings": [
          {
            "name": "chunk",
            "source": "/document/pages/*",
            "sourceContext": null,
            "inputs": []
          },
          {
            "name": "vector",
            "source": "/document/pages/*/vector",
            "sourceContext": null,
            "inputs": []
          },
          {
            "name": "title",
            "source": "/document/metadata_storage_name",
            "sourceContext": null,
            "inputs": []
          }
        ]
      }
    ],
    "parameters": {
      "projectionMode": "skipIndexingParentDocuments"
    }
  },
  "encryptionKey": null
}

这会为每个块生成一个单独的文档。

enter image description here

正如您所说,您还可以通过集成矢量化来完成此操作,该矢量化处于预览状态,而无需手动执行所有这些操作。

您也可以在不进行索引投影的情况下实现此目的。暂时,您需要使用自定义 Web API 将分块数据存储在存储中,并将其加载到二级索引中。

有关此方法的更多信息,请参阅此Stack解决方案

© www.soinside.com 2019 - 2024. All rights reserved.