我正在尝试在 Azure AI 搜索中设置矢量搜索。我有一些长达数百页的文档,我想对内容进行矢量化。这意味着我需要对文本进行分块。我遇到的问题是,在对文本进行分块并生成嵌入后,我不知道如何重新组合它们(或者是否应该)。
我遇到的主要问题是,我似乎需要为每个文本块创建重复的条目,这意味着我的搜索结果将多次返回相同的文档。这准确吗?
是否有一个示例说明如何对大型文档(不是来自存储)进行分块并将其索引到 Azure AI 搜索中,而无需在索引中多次使用相同的文档?我没有使用 Azure 存储,所以我似乎没有选择使用集成矢量化,这显然可以以某种方式处理这个问题。
当您进行分块时,所有块都存储在数组中的单个文档引用下,如下所示:
所以,这看起来像是重复的文档。
要为每个块创建单独的文档,您需要有一个二级索引并在二级索引的技能集中定义索引投影。
以下是技能组的定义。在索引器中提供此技能组,该技能组针对二级索引。
{
"@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
}
这会为每个块生成一个单独的文档。
正如您所说,您还可以通过集成矢量化来完成此操作,该矢量化处于预览状态,而无需手动执行所有这些操作。
您也可以在不进行索引投影的情况下实现此目的。暂时,您需要使用自定义 Web API 将分块数据存储在存储中,并将其加载到二级索引中。
有关此方法的更多信息,请参阅此Stack解决方案。