稀疏编码处理器
稀疏编码 (`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"
}
}
}
]
}
创建摄入管道后,您需要创建一个索引用于摄入,并将文档摄入到该索引中。有关完整示例,请参阅自动生成稀疏向量嵌入。
后续步骤
- 要了解如何在稀疏搜索中使用 `neural_sparse` 查询,请参阅神经稀疏查询。
- 要了解有关稀疏搜索的更多信息,请参阅神经稀疏搜索。
- 要了解更多关于在 OpenSearch 中使用模型的信息,请参阅选择模型。
- 有关完整示例,请参阅语义和混合搜索入门。