语义字段类型
于 3.1 版本引入
semantic
字段类型是一种高级抽象,可简化 OpenSearch 中的神经搜索设置。它可以包装各种字段类型,包括所有字符串和二进制字段。semantic
字段类型根据配置的机器学习 (ML) 模型自动启用语义索引和查询。
先决条件
在使用 semantic
字段类型之前,您必须配置托管在 OpenSearch 集群上的本地机器学习模型,或者连接到 OpenSearch 集群的外部托管模型。有关本地模型的更多信息,请参阅在 OpenSearch 中使用机器学习模型。有关外部托管模型的更多信息,请参阅连接到外部托管模型。
示例:密集嵌入模型
配置模型后,您可以使用它创建一个包含 semantic
字段的索引。此示例假设您已在集群中配置了 ID 为 n17yX5cBsaYnPfyOzmQU
的密集嵌入模型
PUT /my-nlp-index
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"passage": {
"type": "semantic",
"model_id": "n17yX5cBsaYnPfyOzmQU"
}
}
}
}
创建索引后,您可以检索其映射以验证是否自动创建了 passage_semantic_info
字段。passage_semantic_info
字段包含一个 knn_vector
子字段,用于存储密集嵌入以及用于捕获模型 ID、模型名称和模型类型等信息的附加元数据字段
GET /my-nlp-index/_mapping
{
"my-nlp-index": {
"mappings": {
"properties": {
"passage": {
"type": "semantic",
"model_id": "n17yX5cBsaYnPfyOzmQU",
"raw_field_type": "text"
},
"passage_semantic_info": {
"properties": {
"embedding": {
"type": "knn_vector",
"dimension": 384,
"method": {
"engine": "faiss",
"space_type": "l2",
"name": "hnsw",
"parameters": {}
}
},
"model": {
"properties": {
"id": {
"type": "text",
"index": false
},
"name": {
"type": "text",
"index": false
},
"type": {
"type": "text",
"index": false
}
}
}
}
}
}
}
}
}
knn_vector
字段的 dimension
和 space_type
由 ML 模型配置决定。对于预训练的密集模型,此信息包含在默认模型配置中。对于外部托管的密集嵌入模型,您必须在使用 semantic
字段的模型之前,在模型配置中明确定义 dimension
和 space_type
。
自动生成的 knn_vector
子字段支持 semantic
字段中当前不可配置的其他设置。有关更多信息,请参阅限制。
示例:稀疏编码模型
配置模型后,您可以使用它创建一个包含 semantic
字段的索引。此示例假设您已在集群中配置了 ID 为 n17yX5cBsaYnPfyOzmQU
的稀疏编码模型
PUT /my-nlp-index
{
"mappings": {
"properties": {
"passage": {
"type": "semantic",
"model_id": "nF7yX5cBsaYnPfyOq2SG"
}
}
}
}
创建索引后,您可以检索其映射以验证是否自动创建了 rank_features
字段
GET /my-nlp-index/_mapping
{
"my-nlp-index": {
"mappings": {
"properties": {
"passage": {
"type": "semantic",
"model_id": "nF7yX5cBsaYnPfyOq2SG",
"raw_field_type": "text"
},
"passage_semantic_info": {
"properties": {
"embedding": {
"type": "rank_features"
},
"model": {
"properties": {
"id": {
"type": "text",
"index": false
},
"name": {
"type": "text",
"index": false
},
"type": {
"type": "text",
"index": false
}
}
}
}
}
}
}
}
}
参数
semantic
字段类型支持以下参数。
参数 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
type | 字符串 | 必需 | 必须设置为 semantic 。 |
raw_field_type | 字符串 | 可选 | semantic 字段所包装的底层字段类型。原始输入以这种类型存储在语义字段的路径中,使其能够像该类型的标准字段一样工作。有效值为 text 、keyword 、match_only_text 、wildcard 、token_count 和 binary 。默认值为 text 。您可以使用底层字段类型支持的任何参数;这些参数将按预期运行。 |
model_id | 字符串 | 必需 | 用于在索引期间从字段值生成嵌入以及在搜索期间从查询输入生成嵌入的 ML 模型 ID。 |
search_model_id | 字符串 | 可选 | 专门用于查询时嵌入生成的 ML 模型 ID。如果未指定,则使用 model_id 。不能与 semantic_field_search_analyzer 一起指定。 |
semantic_info_field_name | 字符串 | 可选 | 用于存储嵌入和模型信息的内部元数据字段的自定义名称。默认情况下,此字段名称是通过将 _semantic_info 附加到语义字段名称而派生的。 |
chunking | 布尔型 | 可选 | 在摄取期间启用固定长度的词元分块。启用后,输入将使用默认配置分成块。请参阅文本分块。 |
semantic_field_search_analyzer | 字符串 | 可选 | 在使用稀疏模型时,指定用于对查询输入进行分词的分词器。有效值为 standard 、bert-uncased 和 mbert-uncased 。不能与 search_model_id 一起使用。有关更多信息,请参阅分词器。 |
文本分块
默认情况下,semantic
字段的文本分块功能是禁用的。这是因为启用分块需要将每个块的嵌入存储在嵌套对象中,这会增加搜索延迟。搜索嵌套对象需要将子文档与其父文档连接起来,并结合额外的评分和聚合逻辑。匹配的子文档越多,潜在延迟就越高。
如果您正在处理长文本并希望提高搜索相关性,可以在创建索引时将 semantic
字段的 chunking
参数设置为 true
,从而启用分块功能
PUT /my-nlp-index
{
"mappings": {
"properties": {
"passage": {
"type": "semantic",
"model_id": "nF7yX5cBsaYnPfyOq2SG",
"chunking": true
}
}
}
}
分块使用固定词元长度算法进行。
限制
请注意 semantic
字段的以下限制:
-
当将
semantic
字段与密集模型一起使用时,自动生成的knn_vector
子字段会从模型配置中获取dimension
和space_type
值,因此在使用模型之前必须确保定义了这些信息。其他knn_vector
参数使用默认值,无法自定义。 -
文本分块使用具有默认设置的固定词元长度算法。您无法修改分块算法。
-
对于稀疏模型,OpenSearch 在生成稀疏嵌入时会应用默认剪枝率
0.1
。此值不可配置。使用稀疏模型查询语义字段不被neural_sparse_two_phase_processor
支持,该处理器用于优化搜索延迟。 -
不支持从远程集群查询
semantic
字段。