Link Search Menu Expand Document Documentation Menu

稀疏编码处理器

稀疏编码 (`sparse_encoding`) 处理器用于从文本字段生成稀疏向量/词元和权重,以通过稀疏检索进行神经稀疏搜索

先决条件
在使用 `sparse_encoding` 处理器之前,您必须设置一个机器学习 (ML) 模型。有关更多信息,请参阅选择模型

以下是 `sparse_encoding` 处理器的语法

{
  "sparse_encoding": {
    "model_id": "<model_id>",
    "field_map": {
      "<input_field>": "<vector_field>"
    }
  }
}

配置参数

下表列出了 `sparse_encoding` 处理器所需和可选的参数。

参数 数据类型 必需/可选 描述
model_id 字符串 必需 用于生成嵌入的模型 ID。该模型必须先部署在 OpenSearch 中才能用于神经搜索。有关更多信息,请参阅在 OpenSearch 中使用自定义模型神经稀疏搜索
prune_type 字符串 可选 稀疏向量的剪枝策略。有效值为 `max_ratio`、`alpha_mass`、`top_k`、`abs_value` 和 `none`。默认为 `none`。
prune_ratio 浮点型 可选 剪枝策略的比例。当指定 `prune_type` 时必需。
field_map 对象 必需 包含键值对,用于指定文本字段到 `rank_features` 字段的映射。
field_map.<input_field> 字符串 必需 用于获取文本以生成向量嵌入的字段名称。
field_map.<vector_field> 字符串 必需 用于存储生成的向量嵌入的向量字段名称。
description 字符串 可选 处理器的简要描述。
tag 字符串 可选 处理器的标识符标签。有助于调试以区分相同类型的处理器。
batch_size 整数 可选 指定每次批量处理的文档数量。默认为 `1`。
skip_existing 布尔型 可选 当为 `true` 时,处理器不会对已包含嵌入的字段进行推理调用,保持现有嵌入不变。默认为 `false`。

剪枝稀疏向量

稀疏向量通常具有词元权重长尾分布,其中不重要的词元会占用大量存储空间。剪枝通过删除语义重要性较低的词元来减小索引大小,从而在搜索相关性略有下降的同时获得更紧凑的索引。

通过配置 `prune_type` 和 `prune_ratio` 参数,`sparse_encoding` 处理器可用于剪枝稀疏向量。下表列出了 `sparse_encoding` 处理器支持的剪枝选项。

剪枝类型 有效剪枝比例 描述
max_ratio 浮点数 [0, 1) 通过仅保留其值在向量中最大值的 `prune_ratio` 范围内的元素来剪枝稀疏向量。
abs_value 浮点数 (0, +∞) 通过移除值低于 `prune_ratio` 的元素来剪枝稀疏向量。
alpha_mass 浮点数 [0, 1) 通过仅保留其累积值总和在总和的 `prune_ratio` 范围内的元素来剪枝稀疏向量。
top_k 整数 (0, +∞) 通过仅保留前 `prune_ratio` 个元素来剪枝稀疏向量。
none 不适用 保持稀疏向量不变。

在所有剪枝选项中,将 `max_ratio` 设置为 `0.1` 在测试数据集上表现出强大的泛化能力。这种方法可将存储需求减少约 40%,同时搜索相关性损失小于 1%。

使用处理器

请按照以下步骤在管道中使用该处理器。创建处理器时必须提供模型 ID。有关更多信息,请参阅在 OpenSearch 中使用自定义模型

步骤 1:创建管道。

以下示例请求创建了一个摄入管道,其中 `passage_text` 中的文本将转换为文本嵌入,并存储在 `passage_embedding` 中

PUT /_ingest/pipeline/nlp-ingest-pipeline
{
  "description": "A sparse encoding ingest pipeline",
  "processors": [
    {
      "sparse_encoding": {
        "model_id": "aP2Q8ooBpBj3wT4HVS8a",
        "prune_type": "max_ratio",
        "prune_ratio": 0.1,
        "field_map": {
          "passage_text": "passage_embedding"
        }
      }
    }
  ]
}

步骤 2 (可选):测试管道。

建议在摄取文档之前测试您的管道。

要测试管道,请运行以下查询

POST _ingest/pipeline/nlp-ingest-pipeline/_simulate
{
  "docs": [
    {
      "_index": "testindex1",
      "_id": "1",
      "_source":{
         "passage_text": "hello world"
      }
    }
  ]
}

响应

响应确认,除了 `passage_text` 字段,处理器已在 `passage_embedding` 字段中生成了文本嵌入

{
  "docs" : [
    {
      "doc" : {
        "_index" : "testindex1",
        "_id" : "1",
        "_source" : {
          "passage_embedding" : {
            "!" : 0.8708904,
            "door" : 0.8587369,
            "hi" : 2.3929274,
            "worlds" : 2.7839446,
            "yes" : 0.75845814,
            "##world" : 2.5432441,
            "nothing" : 0.8625516,
            "greeting" : 0.96817183,
            "birth" : 1.2788506,
            "life" : 1.5750692,
            "world" : 4.7300377,
            "earth" : 2.6555297,
            "universe" : 2.0308156,
            "worldwide" : 1.3903781,
            "hello" : 6.696973,
            "?" : 0.67785245
          },
          "passage_text" : "hello world"
        },
        "_ingest" : {
          "timestamp" : "2023-10-11T22:35:53.654650086Z"
        }
      }
    }
  ]
}

创建摄入管道后,您需要创建一个索引用于摄入,并将文档摄入到该索引中。有关完整示例,请参阅自动生成稀疏向量嵌入


后续步骤

剩余 350 字符

有问题?

想贡献吗?