智能搜索模型预估框架的建设与实践( 三 )


Operator:通用特征处理逻辑,根据功能的不同又可以分为两类:

  • IO OP:用处理原始特征的获取,如从KV里获取数据,或者从对应的第三方服务中获取数据 。内置批量接口,可以实现批量召回,减少RPC 。
  • Calc OP:用于处理对获取到的原始特征做与模型无关的逻辑处理,如拆分、判空、组合 。业务可以结合需求实现特征处理逻辑 。
通过IO、计算分离,特征抽取执行阶段就可以进行IO异步、自动聚合RPC、并行计算的编排优化,从而达到提升性能的目的 。
Transformer:用于处理与模型相关的特征逻辑,如分桶、低频过滤等等 。一个特征可以配置一个或者多个Transformer 。Transformer也提供接口,业务方可以根据自己的需求定制逻辑 。
  • 离在线统一逻辑:Transformer是特征处理的模型相关逻辑,因此我们将Transformer逻辑单独抽包,在我们样本生产的过程中使用,保证离线样本生产与线上特征处理逻辑的一致性 。
基于这两个概念,Augur中特征的处理流程如下所示:首先,我们会进行特征抽取,抽取完后,会对特征做一些通用的处理逻辑;而后,我们会根据模型的需求进行二次变换,并将最终值输入到模型预估服务中 。如下图所示:
智能搜索模型预估框架的建设与实践

文章插图
 
4.1.2 特征计算DSL
有了Operator的概念,为了方便业务方进行高效的特征迭代,Augur设计了一套弱类型、易读的特征表达式语言,将特征看成一系列OP与其他特征的组合,并基于Bison&JFlex构建了高性能语法和词法解析引擎 。我们在解释执行阶段还做了一系列优化,包括并行计算、中间特征共享、异步IO,以及自动RPC聚合等等 。
智能搜索模型预估框架的建设与实践

文章插图
 
举个例子:
// IO Feature: binaryBusinessTime;  ReadKV 是一个 IO 类型的 OPReadKV('mtptpoionlinefeatureexp','_id',_id,'ba_search.platform_poi_business_hour_new.binarybusinesstime','STRING')// FeatureA : CtxDateInfo;   ParseJSON 是一个 Calc 类型的 OPParseJSON(_ctx['dateInfo']);// FeatureB : isTodayWeekend 需要看 Json 这种的日期是否是周末, 便可以复用  CtxDateInfo  这个特征; IsWeekend 也是是一个 Calc 类型的 OPIsWeekend(CtxDateInfo['date'])在上面的例子中,ParseJSON与IsWeekend都是OP,CtxDateInfo与isTodayWeekend都是由其他特征以及OP组合而成的特征 。通过这种方式,业务方根据自己的需求编写OP , 可以快速复用已有的OP和特征,创造自己需要的新特征 。而在真实的场景中,IO OP的数量相对固定 。所以经过一段时间的累计,OP的数量会趋于稳定,新特征只需基于已有的OP和特征组合即可实现,非常的高效 。
4.1.3 配置化的模型表达
特征可以用利用OP、使用表达式的方式去表现,但特征还可能需要经过Transformer的变换 。为此,我们同样为模型构建一套可解释的JSON表达模板,模型中每一个特征可以通过一个JSON对象进行配置,以一个输入到TF模型里的特征结构为例:
// 一个的特征的 JSON 配置{    "tf_input_config": {"otherconfig"},    "tf_input_name": "modulestyle",    "name": "moduleStyle",    "transforms": [                      // Transfomers:模型相关的处理逻辑,可以有多个,Augur 会按照顺序执行      {        "name": "BUCKETIZE",             // Transfomer 的名称:这里是分桶        "params": {          "bins": [0,1,2,3,4]           // Transfomer 的参数        }      }    ],    "default_value": -1}通过以上配置,一个模型可以通过特征名和Transformer的组合清晰地表达 。因此,模型与特征都只是一段纯文本配置,可以保存在外部,Augur在需要的时候可以动态的加载,进而实现模型和特征的上线配置化,无需编写代码进行上线,安全且高效 。


推荐阅读