一个优秀的推荐系统在系统结构设计上应该具备通用性、模块化,组件化、层次化,易扩展,易维护等特点,满足平台上线后的高可靠高可用。
依据信息化系统软件模块化层次化设计思路,给出了推荐系统功能模块结构框图,主要包含以下几个层级模块:
其中基础数据、特征工程、推荐算法、推荐服务和效能评估属于推荐系统的独特核心功能。服务调度、管理界面、日志模块和系统监控模块是信息系统建设要求。由此可见,搭建和开发一个企业级推荐系统并非只搞定推荐算法就行,这是一项系统工程任务。即使您搞定算法模型,您还会面临大量的信息化开发工作需要落实,比如技术路线、系统架构、数据库、中间件等选型和参数调优。
基础数据:基础数据包含用户属性数据、商品属性数据、场景属性数据和用户行为数据。数据是推荐系统的基础,尤其是用户个性化的数据。没有用户个性化数据,想要实现个性化推荐是无从下手的。推荐系统使用的基础数据需要维护和更新,尤其是用户行为数据。用户行为数据支撑用户兴趣偏好特征挖掘和推荐算法模型训练与优化。
特征工程:基于收集的用户属性数据、用户行为数据、商品属性数据,场景属性数据等,特征工程模块调用算法模型分析和挖掘数据,构建用户特征标签、商品特征标签和场景特征标签,将处理结果存放到指定位置。
特征工程是推荐系统建设重要工作之一。推荐系统设计时,可把特征工程任务设计成独立系统,微服务架构,对外提供标准的服务接口,满足服务与服务之间的相互调度。特征工程对外提供的接口服务方式不限于web service、josn/xml/csv、Redis和Hive等。在服务调度指挥下,特征工程定期或不定期更新特征数据。系统设计阶段,需要结合数据属性特征分类考虑,哪些数据处理一次,哪些数据周期处理,哪些数据实时处理,并设计数据处理服务运行的触发机制。特征工程建设需要使用统计工具、算法,机器学习模型去处理数据,挖掘规律,构建标签和实现特征标签值的向量化。
推荐算法:推荐算法完成推荐系统的召回、粗排、精排和重排等任务。基于商品候选集,通过召回算法从不同维度匹配用户兴趣偏好,生成召回列表。调用排序模型完成用户对商品喜欢度的预测,根据喜欢度预测值从大到小排序,将排在前面的TopN作为推荐列表输出。值得注意的是,推荐系统属于运营级系统,需要支持根据运营规则需求调整输出顺序。比如禁止向黑名单用户推荐商品,优先推荐置顶的商品,优先推荐参加营销活动的商品,按推荐列表类别多样性指标重排推荐列表等等。
推荐系统算法模型需要在训练平台上训练好,离线环境下模型精度达到要求后,发布到线上系统。工程实践中,通常把算法模型的训练平台和算法模型的使用平台分开建设。算法模型的训练平台,称为线下平台,用于算法模型的训练和模型参数的调优。算法模型的使用平台,称为线上平台,用于线上环境的推荐列表的生成。推荐算法模型输入为商品特征向量,用户特征向量,场景特征向量和用户行为数据,输出为推荐结果列表。推荐算法模块对外提供web Service服务调用接口,满足界面管理和结果展示的调用。通过这些服务接口管理和使用推荐算法,监控算法运行状态,查看算法计算结果等。推荐系统算法模型支持界面统一管理功能,上线操作,下线操作,状态跟踪。每一个算法模型独立工作,使用共享数据源,输出结果缓存在Redis或Hive数据库。
推荐服务:推荐服务以Restfull API接口展示,部署在web服务器上,满足用户推荐请求和数据上报的需求。通常,推荐服务支持个性化推荐,热点推荐、相关推荐、场景推荐和feed流等。具体的推荐服务需要与UI系统的页面功能设计综合考虑。推荐服务离不开推荐算法的支撑。推荐服务与推荐算法的交互方式支持离线和在线方式。离线模式直接访问Redis数据库读取用户推荐结果,在线模式调用推荐算法web Service接口实时计算。
效能评估:效能评估根据用户反馈的行为数据评价推荐系统效能,包含算法模型性能,推荐输出点击效果和系统本身的健壮性。推荐系统属于反复迭代升级的系统,效能评价指标为系统迭代升级提供数据支持。HTTP请求响应时间指标反映系统的综合处理能力。当指标数据较大时,需要分析师何种原因导致的。如果是服务计算负载较大,需要优化系统,增加复杂均衡设备,必要时拆分为微服务。如果点击率和转化率指标不高,需要重新评估算法效能,调整算法参数,必要时更换性能更加优越的新算法模型。为了研究新算法的线上表现,设计开发A/B测试管理平台,对用户进行分流评价,生成A/B方案下的评价效能。
界面管理:界面系统为推荐系统后台管理提供可视化管理界面,满足运营需求。界面上通常定义数据管理、特征管理、模型管理、推荐服务管理、策略管理、运营管理等操作菜单。运营人员操作模型管理菜单,查看推荐系统当前使用的算法模型,算法模型性能参数,算法模型上下线操作,训练算法模型。界面管理通过web service接口服务读取推荐算法、特征工程和效能评估等模块内部数据读取。
服务调度:推荐系统业务模块采用微服务架构开发,独立部署和运行,如何将这些模块串联起来,协同工作,这就是服务调度要完成的任务。服务调度简单理解,就是管理服务,按指定的时间周期启动代码程序。推荐系统大部分以微服务方式开发,服务与服务之间通过数据交换完成任务协同,服务调度需要确定先启动的服务,后启动的服务,启动1次的服务还是周期启动的服务。这个模块完成服务任务的工作编排,设置服务参数依赖,启动服务执行。设计服务调用策略,保证推荐系统各项任务按照图2.1所示的业务流程运行。对于特征工程中的服务任务,需要根据特征标签的时变属性配置调度策略,哪些特征标签只计算1次,哪些特征标签按天为周期更新,哪些特征标签支持按小时为周期更新,哪些特征标签支持实时更新。服务调度可以选用行业主流组件来完成,比如Linux系统自带的crontab,Apache 基金会的Airflow , Linkedin 公司的Azkaban 等。
日志采集:系统日志反映系统业务流程的运行状态,设计开发日志采集系统,统一收集推荐系统各个业务功能模块中的日志,为后续系统优化和故障排查提供数据支撑。
系统监控:系统监控关注推荐系统运行状态,确保系统响应及时,工作顺畅,不宕机。系统监控范围分为系统层面监控和业务层面监控。
系统层面监控主要是对系统的硬件、数据库、中间件、网络等资源进行监控,确保系统基础资源运行正常。系统监控范围一般包含CPU负荷,内存负荷,磁盘负荷、网络端口和日志等。通常要求推荐系统在毫秒级响应推荐请求,并反馈推荐列表,即使在大并发环境下,这个指标也需要保证。不妨设想:由于网络攻击、高并发接入或者数据库堵塞,推荐系统出现了大量请求排队现象,处理每个请求需要到秒或分钟才能反馈推荐列表。用户页面刷新半天得不到反馈输出,这种情况下,用户作何种响应呢,相信大部分用户会弃系统而去。所以系统监控非常重要。通过系统监控指标,运维人员可掌握推荐系统资源层面的稳定性、可用性和可靠性。系统层面监控可以采用开源Zabbix,自主研发IT运维系统,采购商用软件。
业务层面监控主要是对系统的组件、模块、流程和数据进行监控,确保推荐系统业务运行顺利:收集数据是否正常,特征工程标签更新是否实时,机器学习模型训练精度是否达标,推荐系统计算速度是否达标等。监控范围一般涉及组件的工作状态、负载情况,数据是否异常,流程是否通畅。业务层面监控涉及的组件、数据、模块和规格差异性较大,导致监控指标不一样,监控复杂度较大,需要结合实际应用,设计合适合理的业务监控指标。