当前位置:主页 > 新闻热点 >正文

舍弃Python,为什么知乎选用Go重构推荐系统?

作者: 丈哥 分类: 新闻热点 发布时间: 2019-01-10 23:22

舍弃Python,为什么知乎选用Go重构推荐系统?

作者:孙付伟

知乎从问答起步,已逐步成长为一个大规模的综合性知识内容平台,截止目前,用户数突破 2.2 亿,有超过 3000 万的问题被提出,并获得超过 1.3 亿个回答。同时,知乎内还沉淀了数量众多的优质文章、电子书以及其它付费内容。

因此,在链接人与知识的路径中,知乎存在着大量的推荐场景。粗略统计,目前除了首页推荐之外,我们已存在着 20 多种推荐场景;并且在业务快速发展中,不断有新的推荐业务需求加入。在这个背景之下,构建一个较通用的且便于业务接入的推荐系统就变成不得不做的事了。

重构推荐系统需要考虑哪些因素?如何做技术选型?重构的过程中会遇到哪些坑?希望知乎的踩坑经验能给你带来一些思考。

背景

舍弃Python,为什么知乎选用Go重构推荐系统?

在讲通用架构的设计之前,我们一起回顾一下推荐系统的总体流程和架构。通常,因为模型所需特征及排序的性能考虑,我们通常将简单的推荐系统分为召回层和 ranking 层,召回层主要负责从候选集合中粗排选择待排序集合,之后获取 ranking 特征,经过排序模型,挑选出推荐结果给用户。

舍弃Python,为什么知乎选用Go重构推荐系统?

简单推荐模型适合一些推荐结果要求单一,只对单目标负责的推荐场景,比如新闻详情页推荐、文章推荐等等。但在现实中,作为通用的推荐系统来说,其需要考虑用户的多维度需求,比如用户的多样性需求、时效性需求、结果的满足性需求等。因此就需要在推荐过程中采用多个不同队列,针对不同需求进行排序,之后通过多队列融合策略,从而满足用户不同的需求。

舍弃Python,为什么知乎选用Go重构推荐系统?

从我们知乎来说,也大体是这样一个发展路线,比如今年的 7 月份时,因为一些业务快速发展且架构上相对独立的历史原因,我们的推荐系统存在多套,并且架构相对简单。以其中一个推荐架构设计相对完善的系统为例,其总体架构是这样的。可以看出,这个架构已经包含了召回层和 ranking 层,并且还考虑了二次排序。

舍弃Python,为什么知乎选用Go重构推荐系统?

那么存在哪些问题呢?

首先,对多路召回支持不友好。现有架构的召回是耦合在一起的,因此开发调研成本高,多路召回接入相对困难。

然后,召回阶段只使用 redis 作为召回基础。redis 有很多优点,比如查询效率高,服务较稳定。但将其作为所有召回层的基础,就放大了其缺点,第一不支持稍复杂的召回逻辑,第二无法进行大量结果的召回计算,第三不支持 embedding 的召回。

第三点,总体架构在实现时,架构逻辑剥离不够干净,使得架构抽样逻辑较弱,各种通用特征和通用监控建设都较困难。

第四点,我们知道,在推荐系统中,特征日志的建设是非常重要的一个环节,它是推荐效果好坏的重要基础之一。但现有推荐系统框架中,特征日志建设缺乏统一的校验和落地方案,各业务『各显神通』。

第五点,当前系统是不支持多队列融合的,这就严重限制了通用架构的可扩展性和易用性。

因此,我们就准备重构知乎的通用推荐服务框架。

重构之路

在重构前的考虑

第一,语言的选择。早期知乎大量的服务都是基于 Python 开发的,但在实践过程中发现 Python 资源消耗过大、不利用多人协同开发等各种问题,,之后公司进行了大规模的重构,现在知乎在语言层面的技术选型上比较开放,目前公司内部已有 Python、Scala、Java、Golang 等多种开发语言项目。那么对于推荐系统服务来说,由于其重计算,多并发的特点,语言的选择还是需要考虑的。

第二,架构上的考虑,要解决支持多队列混排和支持多路召回的问题,并且其设计最好是支持可插拔的。

第三,召回层上,除了传统的 redis 的 kv 召回(部分 cf 召回,热门召回等等应用场景),我们还需要考虑一些其他索引数据库,以便支持更多索引类型。

首先我们先看语言上的选择,先总体上比较一下各种语言的特点,我们简单从如下几个方面进行比较。

从性能上,依照公开的 benchmark,Golang 和 Java、Scala 大概在一个量级,是 Python 的 30 倍左右。其次 Golang 的编译速度较快,这点相对于 Java、Scala 具有比较明显的优势,再次其语言特性决定了 Golang 的开发效率较高,此外因为缺乏 trycatch 机制,使得使用 Golang 开发时对异常处理思考较多,因此其上线之后维护成本相对较低。但 Golang 有个明显缺陷就是目前第三方库较少,特别跟 AI 相关的库。

舍弃Python,为什么知乎选用Go重构推荐系统?

那么基于以上优缺点,我们重构为什么选择 Golang?


本文链接地址:https://www.0471seo.com/news/1438.html
  • 上一篇:<<机器学习与数据科学决策树指南

  • 下一篇:数据不足,如何进行迁移学习?>>
  • 如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!