记录特征分数
为了训练模型,需要记录特征值。这是“学习排序”插件的关键组成部分——当您搜索时,特征集中的特征值会被记录下来,以便用于训练。这使得能够有效预测相关性的模型可以被发现,这些模型使用了该特征集。
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_query
或 rescore_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 副本上进行大量迭代。这允许对新特征进行广泛的实验,并根据需要将其添加到或从特征集中删除。虽然此过程可能导致与实时索引略微不同步,但目标是获得一组令人满意的模型参数。一旦实现此目标,就可以使用生产数据训练模型,以确认性能水平仍然可接受。
后续步骤
有关训练模型的更多信息,请参阅“上传训练好的模型”文档。