Link Search Menu Expand Document Documentation Menu

记录特征分数

为了训练模型,需要记录特征值。这是“学习排序”插件的关键组成部分——当您搜索时,特征集中的特征值会被记录下来,以便用于训练。这使得能够有效预测相关性的模型可以被发现,这些模型使用了该特征集。

sltr 查询

sltr 查询是运行特征和评估模型的主要方法。在记录时,sltr 查询用于执行每个特征查询并检索特征分数。以下示例请求显示了一个与 hello-ltr 演示模式兼容的特征集结构

PUT _ltr/_featureset/more_movie_features
{
    "name": "more_movie_features",
    "features": [
        {
            "name": "body_query",
            "params": [
                "keywords"
                ],
            "template": {
                "match": {
                    "overview": "{{keywords}}"
                }
            }
        },
        {
            "name": "title_query",
            "params": [
                "keywords"
            ],
            "template": {
                "match": {
                    "title": "{{keywords}}"
                }
            }
        }
    ]
}

常见用例

以下各节描述了记录特征集的常见用例。

将特征值与判断列表连接

如果判断列表已可用,您可以为每个关键词/文档对连接特征值,以创建完整的训练集。例如,考虑以下判断列表

grade,keywords,docId
4,rambo,7555
3,rambo,1370
3,rambo,1369
4,rocky,4241

需要为所有对每个搜索词有判断的文档检索特征值,每次一个搜索词。例如,从 rambo 搜索开始,可以为关联文档创建如下过滤器

{
    "filter": [
        {"terms": {
                "_id": ["7555", "1370", "1369"]
        }}
    ]
}

“学习排序”插件必须指向要记录的特征。该插件中的 sltr 查询可用于此目的。sltr 查询具有一个用于引用它的 _name(命名查询功能),它引用了之前创建的特征集 more_movie_features,并传递了搜索关键词 rambo 和任何其他必需参数,如下面的示例查询所示

{
    "sltr": {
        "_name": "logged_featureset",
        "featureset": "more_movie_features",
        "params": {
            "keywords": "rambo"
        }
    }
}

使用 LTR 搜索提供了用于执行模型的 sltr 查询。此 sltr 查询用作一种机制,将“学习排序”插件指向需要记录的特征集。

为了避免影响分数,sltr 查询被注入为过滤器,如下面的示例所示

{
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "_id": [
                            "7555",
                            "1370",
                            "1369"
                        ]
                    }
                },
                {
                    "sltr": {
                        "_name": "logged_featureset",
                        "featureset": "more_movie_features",
                        "params": {
                            "keywords": "rambo"
                        }
                    }
                }
            ]
        }
    }
}

执行此查询将返回三个预期的命中。下一步是启用特征记录以引用要记录的 sltr 查询。

记录功能会识别 sltr 查询,运行特征集的查询,为每个文档评分,并以计算字段的形式返回这些分数,如下面的示例记录结构所示

"ext": {
    "ltr_log": {
        "log_specs": {
            "name": "log_entry1",
            "named_query": "logged_featureset"
        }
    }
}

日志扩展支持以下参数

  • name:要从每个文档中获取的日志条目名称。
  • named_query:对应于 sltr 查询的命名查询。
  • rescore_index:如果 sltr 查询处于重新评分阶段,则这是查询在重新评分列表中的索引。
  • missing_as_zero:对于缺失特征(当特征不匹配时)生成 0。默认值为 false

为了使日志能够定位 sltr 查询,无论是在正常查询阶段还是在重新评分期间,都必须设置 named_queryrescore_index

完整的示例请求如下

POST tmdb/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "_id": ["7555", "1370", "1369"]
                    }
                },
                {
                    "sltr": {
                        "_name": "logged_featureset",
                        "featureset": "more_movie_features",
                        "params": {
                            "keywords": "rambo"
                        }
                }}
            ]
        }
    },
    "ext": {
        "ltr_log": {
            "log_specs": {
                "name": "log_entry1",
                "named_query": "logged_featureset"
            }
        }
    }
}

现在每个文档都包含一个日志条目,如下面的示例所示

{
    "_index": "tmdb",
    "_type": "movie",
    "_id": "1370",
    "_score": 20.291,
    "_source": {
        ...
    },
    "fields": {
        "_ltrlog": [
            {
                "log_entry1": [
                    {"name": "title_query"
                     "value": 9.510193},
                    {"name": "body_query
                     "value": 10.7808075}
                ]
            }
        ]
    },
    "matched_queries": [
        "logged_featureset"
    ]
}

判断列表可以与特征值连接以生成训练集。对于对应于关键词 rambo 的文档 1370 的行,可以添加以下内容

> 4 qid:1 1:9.510193 2:10.7808075

对所有查询重复此过程。

对于大型判断列表,建议批量记录多个查询的日志。为此,您可以使用多搜索功能。

记录实时特征集的值

如果您在生产环境中运行模型,并且该模型在 sltr 查询中执行,那么实时模型可能类似于以下示例请求

POST tmdb/_search
{
    "query": {
        "match": {
            "_all": "rambo"
        }
    },
    "rescore": {
        "query": {
            "rescore_query": {
                "sltr": {
                    "params": {
                        "keywords": "rambo"
                    },
                    "model": "my_model"
                }
            }
        }
    }
}

有关模型执行的信息,请参阅“使用 LTR 搜索”文档。

要记录查询的特征值,请应用适当的记录规范来引用 sltr 查询,如下面的示例所示

"ext": {
    "ltr_log": {
        "log_specs": {
            "name": "log_entry1",
            "rescore_index": 0
        }
    }
}

该示例记录了响应中的特征,从而能够使用相同的特征集进行未来的模型再训练。

修改和记录现有特征集

特征集可以扩展。例如,如下面的示例请求所示,如果需要包含一个新特征(例如 user_rating),可以将其添加到现有特征集 more_movie_features

PUT _ltr/_feature/user_rating/_addfeatures
{
    "features": [
        "name": "user_rating",
        "params": [],
        "template_language": "mustache",
        "template" : {
            "function_score": {
                "functions": {
                    "field": "vote_average"
                },
                "query": {
                    "match_all": {}
                }
            }
        }
    ]
}

有关更多信息,请参阅“使用特征”文档。

执行记录时,新特征会包含在输出中,如下面的示例所示

{
    "log_entry1": [
        {
            "name": "title_query",
            "value": 9.510193
        },
        {
            "name": "body_query",
            "value": 10.7808075
        },
        {
            "name": "user_rating",
            "value": 7.8
        }
    ]
}

记录建议特征集的值

您可以出于实验目的创建一个全新的特征集,例如 other_movie_features,如下面的示例请求所示

PUT _ltr/_featureset/other_movie_features
{
    "name": "other_movie_features",
    "features": [
        {
            "name": "cast_query",
            "params": [
                "keywords"
            ],
            "template": {
                "match": {
                    "cast.name": "{{keywords}}"
                }
            }
        },
        {
            "name": "genre_query",
            "params": [
                "keywords"
            ],
            "template": {
                "match": {
                    "genres.name": "{{keywords}}"
                }
            }
        }
    ]
}

特征集 other_movie_features 可以通过将其作为另一个过滤器附加到实时生产集 more_movie_features 旁边进行记录,如下面的示例请求所示

POST tmdb/_search
{
"query": {
    "bool": {
        "filter": [
            { "sltr": {
                "_name": "logged_featureset",
                "featureset": "other_movie_features",
                "params": {
                    "keywords": "rambo"
                }
    }},
            {"match": {
                "_all": "rambo"
            }}
        ]
    }
},
"rescore": {
    "query": {
        "rescore_query": {
            "sltr": {
                "params": {
                    "keywords": "rambo"
                },
                "model": "my_model"
            }
        }
    }
}
}

您可以根据需要继续添加任意数量的特征集进行记录。

记录场景

掌握基础知识后,您可以考虑一些实际的特征记录场景。

首先,记录用于从用户分析中开发判断列表,以捕获在用户交互精确时间点的特征确切值。例如,您可能想了解用户交互发生时的时新性、标题分数和其他值。这将有助于您分析在训练期间哪些特征或因素具有相关性。为实现这一目标,您可以构建一个全面的特征集以供未来的实验。

其次,记录可用于再训练您已有信心的模型。您可能希望使您的模型与不断变化的索引保持同步,因为模型会随着时间推移而失去其有效性。您可能已经进行了 A/B 测试或正在监控业务指标,并注意到模型性能逐渐下降。

第三,记录在模型开发期间使用。您可能有一个判断列表,但希望在本地 OpenSearch 副本上进行大量迭代。这允许对新特征进行广泛的实验,并根据需要将其添加到或从特征集中删除。虽然此过程可能导致与实时索引略微不同步,但目标是获得一组令人满意的模型参数。一旦实现此目标,就可以使用生产数据训练模型,以确认性能水平仍然可接受。

后续步骤

有关训练模型的更多信息,请参阅“上传训练好的模型”文档。

剩余 350 字符

有问题?

想做贡献?