【推荐系统简介以及其链路流程】

  • 推荐系统是一项(软件)服务,可以生成个性化的推荐列表。作为面向用户的服务,怎么展示、怎么跟用户交互、交互过程中的遇到的各种场景问题都是需要解决的。
  • 同时,需要注意的是,推荐模型算法并非推荐系统的全部,推荐系统需要各个模块有效地协作在一起:
  • 日志系统收集用户日志,从而为推荐系统提供原始数据;
  • 大数据框架、流式计算系统从原始数据中提取信息,可供推荐模型作为输入;
  • 在线学习系统要实时更新推荐模型,即进行动态训练更新:因为推荐算法面对的是数以亿计的用户,每个用户的行为记录时动态变化的;待推荐的物料(Item)也是十分庞大且是动态更新的。因此对推理的实时性要求很高,而且需要动态更新模型。
  • A/B实验系统评估模型效果等;
  • 因此,作为推荐算法工程师,要从推荐系统的全局角度思考问题,不要只局限于算法模型上。

1、数据收集和预处理

  • 用户行为数据:记录用户与系统交互的行为,如浏览、点击、购买、播放、搜索、收藏、点赞、评论、转发等。
  • 用户特征数据:包括用户的基本信息、偏好设置、社交网络信息等。
  • 物品(Item)特征数据:物品的属性信息,如类别、标签、价格等。
  • 有结构化的的数据,也有非结构化的文本、图片、音频、视频数据等:
  • 例如在给Item打标签的过程中,可以直接人工打上一些类别标签;也可以由内容理解算法根据封面、标题等自动完成(例如:”豆瓣评分9.3,最恐怖的喜剧电影—楚门的世界“;可以打的标签:”电影,喜剧,真人秀,金凯瑞“等)
  • 将所有Item组织到一起,在简单的推荐系统中,可以建立倒排索引(类似哈希表,键为标签,值为打上这个标签的所有Item);建立的倒排索引后续可用于召回排序等
  • 数据预处理包括清洗(去除噪声和异常值)、归一化、缺失值处理等步骤。

1.1、推荐系统的数据架构

  • 推荐系统中所涉及到的数据包含User和Item的大量数据,而互联网的大数据系统中极其复杂,为了应对这种复杂性,大多使用了Lambda架构。推荐系统中存在的难点如下:

1)要统计过去一段时间内内的历史数据,但互联网系统每天的日志量以TB计,要回溯的历史越长,计算量也就越大
2)时间要求非常高,线上预测时,从接收用户请求到返回推荐结果的总耗时要控制在几十毫秒,而还需要留大部分时间在模型推理上,因此可供数据处理和特征计算的时间会很短
3)冷数据和热数据的问题。冷数据(Cold Data)是指回溯在Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)上存储的那部分日志;但由于HDFS只支持批量读写的性质,还会存在一部分历史数据未来得及组成日志,未落盘到HDFS上,这部分数据为热数据(Hot Data)。例如:下午3点想获取历史数据,但HDFS的日志只保留到下午1点,1点至3点的数据为热数据。

  • Lambda架构可以应对这些问题,主要包括以下几点:
    在这里插入图片描述

1)将数据请求拆分为冷数据、热数据两个子请求;
2)针对冷数据的子请求,由离线层批量完成计算,近线层缓存并提供快速查询;
3)针对热数据的子请求,由在线层基于流式算法进行处理;
4)汇总从冷、热数据分别获得的子结果,得到最终的计算结果

  • 例如,以计算每个视频的CTR为例,拆分为两个子请求:

1)在冷数据上计算长期、稳定的CTR_cold
2)在热数据上计算短期、当前的CTR_hot

  • 离线层:可以启动一个定时任务,统计每个视频每个小时内的曝光数、点击数,要统计一周的CTR,汇总168(24*7)个中间结果即可。以上定时批量计算的任务构成了离线层,可以采用Hadoop、Spark、Flink等大数据框架完成,多个任务之间的协同通过Airflow完成
  • 近线层:HDFS是一种擅长批量读写,但随机读写效率极低的存储介质,因此不利于线上快速读取。为了提高在冷数据的查询效率,可利用近线层,将离线层批量计算的结果存入Cassandra、Redis等键—值型数据库(可利用每个视频的ID作为键,进行快速检索)
  • 在线层:通过Storm、Flink等流式计算框架,对接用户的行为数据流,不等数据落地,可以直接进行分析计算,结果可缓存在Redis的数据库中,在线层可以处理热数据,并不会占用太多资源

2、用户(user)画像和物品(item)画像的构建

  • 用户(user)画像:对用户相关信息的客观描述。包含用户自身所带的属性,比如年龄、身高、体重、性别、学历、家庭组成、职业等等。再加上用户本身的行为数据
  • 物品(item)画像:根据物品的属性和历史表现构建物品画像。例如物品的品类、价格、产地、颜色。另外,图片、音频、视频中,我们通过深度学习等技术也是可以提取关键词来作为画像特征的。
  • 场景化数据:是用户在对物品进行操作时所处的环境及状态的特征。例如用户所在地理位置、当时的时间等等

所需要准备的数据:数值数据、类别数据、文本数据、图片数据、音视频数据等5类结构化或非结构化的数据。

3、特征工程

  • 特征工程:就是将原始的各种来源、各种类型的数据加工成合适的形式,以输入到推荐模型中,使其发挥更大的威力。
  • 有一种流行观点认为,深度学习能够使特征工程自动化,这种想法在推荐系统中是不合适的:
    1)DNN虽然可以拟合复杂的函数关系,但如果不进行合适的特征工程,很容易会出现各种训练的难点,例如梯度消失、梯度爆炸、过拟合、常见和罕见特征训练不均衡不充分等问题;
    2)就算使用DNN的隐式的、自动化的特征工程,其也会存在一定代价,例如耗时。DIN的Attention和SIM的搜索,都是比较复杂的计算,耗时与候选集规模成正比。而特征工程可以将计算压力从线上转移到线下,离线提取特征,供召回、粗排等环节的在线训练与预测。
  • 特征提取:从原始数据中提取对推荐有帮助的特征。
  • 特征选择:从众多特征中选出对模型最有用的特征,以提高模型效率和性能。
    在这里插入图片描述

3.1、特征提取的框架

  • 以下介绍几种类型的特征的提取框架,可以保证每种特征提取不重不漏,包括:物料画像、用户画像、交叉特征、偏差特征

Filed:为同一类Featue的集合,例如手机品牌
Feature: 具体的特征向量或特征值,例如苹果、华为、小米等

3.1.1、物料画像

  • 待推荐的Item为物料,可以提取的物料特征包括:

1、物料属性信息

  • 是最直接的信息,物料入库时即可获取
  • 视频推荐场景:视频作者、作者等级、作者关注量、投稿分区、视频标题与简介、封面、时长等
  • 电商场景:商品标题与简介、封面图片、所属商铺、品牌、价格、折扣等信息
  • 值得注意的是,互联网大型推荐系统中往往会把物料的Item ID作为重要的特征,可以在物料侧提供给个性化的信息

如何理解?
1)Item ID作为类别特征,其特征空间的维度可能由几十、上百万,即高维稀疏的。但是之所以要将其作为一种特征,可以很简单直接的理解为,那些销量好的、播放好的、或者与用户非常相关的Item(例如数码爱好者,只要一推“iPhone 15 …”的ID就很可能点击),其ID本身就可以作为非常有用的信息,模型只需要记住,就可以取得不错的效果;
2)互联网大厂中,训练数据很多,因此Item ID作为特征还是有必要的

2、物料的类别与标签等静态画像(更加具体化的信息)

  • 通过分析物料内容得到的间接信息
  • 例如可以通过NLP算法(例如BERT)分析物料的标题、简介、评论等;通过CV算法(CNN)分析物料的封面或者视频的关键帧
  • 分析的结果可以构成物料的静态画像(三个等级的类别特征):

1)一级类别:是一个Field,例如:体育、电影、音乐等
2)二级类别:体育可以细分为足球、篮球等,…
3)标签:更细粒度的刻画物料,例如,篮球类别下又可以包含NBA、乔丹等

  • 以上的内容理解算法一般会输出物料属于某个类别或标签的概率,例如{电影:0.9,音乐:0.3}

3、Embedding方法

  • 上述利用CNN或BERT等算法得到的类别或标签的特征,会存在一个问题,即特征空间很稀疏,可能由上万个标签,而每个物料只包含某几个。
  • 因此Embedding的思路是将这些模型的某一层的输出作为隐式的Embedding向量,其为物料特征输入到推荐模型中。

4、物料的动态画像(历史信息)

  • 指的是物料的历史统计信息,是物料侧最重要的特征
  • 一般可以从两个维度进行特征的提取:
    1)时间粒度:全生命周期、过去一周、过去1天、过去1小时,视频的短播记录、长播记录
    2)统计对象:CTR、平均播放时长、平均消费时长等
  • 值得注意的是以下两点:

1)这些后验统计数据肯定存在一定偏差,一个物料的后验指标好不代表推荐给任何人都好(尤其是在召回粗排环节),在精排环节,动态画像还是有参考意义的,因为这些物料经过召回粗排,大部分还是跟当前用户相关的
2)可能不太利于新物料的冷启动。对于新物料,其后验指标是不存在或者不好的,可能导致获得较少的曝光机会。

5、用户与物料的交互历史信息(即用户给物料反向打标签)

  • 可以将消费过/观看过某个物料的用户身上的标签传递并累积到这个物料上,以丰富物料画像

3.1.2、用户画像

  • 可以分为用户的静态画像和动态画像两大类,如下:

1、静态画像

  • 就是用户的年龄、性别、职业、籍贯、等等比较稳定的数据信息
  • 但其实,实践中这些信息的作用十分有限:对于老用户,其历史行为记录足以反映其兴趣爱好,不需要这些静态画像;对于新用户,其作用也不明显:1)如果新老用户共用一个精排模型,由于老用户的样本多,会主导训练过程,也就很难重视这些对新用户友好的静态画像特征;2)如果新用户使用特定模型,又可能没有足够的数据进行训练。
  • 但是,值得注意的是,用户ID(User ID)是一个非常重要的特征,与Item ID一样,可以提供用户侧细粒度的个性化信息,但会有一定缺点:

1)User ID会覆盖上亿用户,特征空间维度很大,但现代大型推荐系统采用了Parameter Server分布式存储模型参数,可以缓解上述问题;
2)活跃用户的User ID更加有用,大型推荐系统中还是以存量老用户为主,因此User ID还是一个很重要的特征

2、动态画像(用户的历史行为信息)

  • 最简单的动态画像:将用户一段时间内交互过的每个物料映射为Embedding特征,再通过最大池化或平均池化聚合为一个向量

  • 再复杂一点,可以像DIN或SIM一样,通过注意力机制,以不同的权重获取用户兴趣向量

  • 这种方式的缺点是必须在线进行,会导致耗时很长,与序列长度*候选集规模成正比
    在这里插入图片描述

  • 因此,可以采用Hadoop、Spark等大数据平台,实现“离线提取,在线查询”的方法,耗时短,适合于召回、粗排等环节,但由于是离线提取,可能不能够及时捕捉用户的兴趣迁移

  • 具体来讲,可以从6个维度来获取用户行为向量:

1)用户粒度:单个用户或一群用户
2)时间粒度:比如过去1周、1小时,过去一百次曝光等
3)物料属性:比如视频的类别和标签、作者等
4)动作反馈类型:比如正向的:点赞、收藏、转发;负向的:不感兴趣、点踩
5)统计对象:比如次数、时长、金额、点击率
6)统计方法:加权、平均等

3.1.3、交叉特征

  • 深度学习模型中可以自动完成特征交叉,但进行人工的特征交叉也会有一定作用,也需要进行了解
  • 可以分为笛卡尔积和内积两种
    1)笛卡尔积:将两个Field的Feature进行简单的两两组合
    2)内积:将映射后的向量进行内积计算,得到的可以是物料的相关程度、用户对物料的匹配程度等

3.1.4、偏差特征

  • 推荐系统中固有存在偏差:即用户点击的未必是他喜欢的,未点击的也不代表用户一定不喜欢
  • 最常见的是位置偏差:
    在这里插入图片描述
  • 解决位置偏差的方法,一种方法是更严格地定义正负样本,例如:Above Click规则,只有位于被点击物料上方的未点击物料,才能纳入训练样本
    在这里插入图片描述
  • 另一种方法是将位置信息作为特征输入模型中,通过一个线性层接入模型,不要与正常特征一起输入模型,类似残差结构。
  • 由于输入的伪特征值(由于预测推理时无法知道具体位置,可以统一填充为0,认为都是最醒目的位置)经过线性层的输出相等,因此这种模式并不会影响真实排序。
  • 具体来讲,训练时,将真实位置信息输入模型;推理时,输入统一的伪特征值。之所以使用这种模式,是因为训练时增加旁路分支,可以根据位置信息更新原本模型的参数,从而引入偏差特征。
  • 上述详见《互联网大厂推荐算法实战》P24。
    在这里插入图片描述

3.2、数值特征的处理

  • 直接将数值特征输入模型,很可能导致训练不收敛,因此需要经过一定的预处理:缺失值的处理、标准化、数据平滑与消偏、分桶离散化等

3.2.1、缺失值的处理(使用均值或中位数替代)

  • 可以使用所有样本、或者某个类别的样本中的均值或中位数替代缺失值
  • 可以训练一个模型来预测缺失值

3.2.2、标准化

  • 标准化的目的是将不同量纲、不同取值范围的数值特征都压缩到同一个数值范围内,从而使训练更稳定。
  • 最常用的标准化为z-score标准化,即减均值、除标准差
  • 推荐系统中常见的是一些长尾分布的特征,可以先进行开方、取对数等再进行z-score标准化
    在这里插入图片描述

3.2.3、数据平滑与消偏

  • 例如,使用小样本计算CTR等,计算结果常常不可信,一件商品曝光了一次并被购买,购买了为100%,但肯定不可靠
  • 因此这种可以采用威尔逊区间平滑
  • 之前提到的位置偏差,也可以采用CoEC(Click over Expected Click)替代CTR来衡量物料的受欢迎程度。
  • 详见《互联网大厂推荐算法实战》P27。

3.2.4、分桶离散化

  • 类别特征可以更好地反映非线性关系,因此在实践中,可以将实数特征离散化为类别特征
  • 离散方法就是分桶,即将实数特征划分为不同区间,即划分bin,看实数特征落入哪个bin,就将bin号作为类别特征
  • 有三种实现方法:

1)等宽分桶:将特征值域均分为N等份
2)等频分桶:分完之后的各个bin内样本数大致相等(可以使用N个分位数)
3)模型分桶:例如使用决策树,其叶子节点的编号为离散化结果

3.3、类别特征的处理

  • 推荐算法的特点之一就是特征空间主要由高维、稀疏的类别特征构成,即输入的特征向量维度高,且大部分为0,即稀疏。

1)推荐系统的基础是物料画像、用户画像。高维:有上万个标签;稀疏:每个Item可能只包含十几个标签。User ID、Item ID也都是类别特征
2)线上工程实现时更偏爱类别特征,因为稀疏的特性可以实现非零存储、排零计算、减少线上开销,提升预测实时性。以LR模型为例:

  • 使用实数特征: l o g i t = w T x + b logit = w^Tx+b logit=wTx+b
  • 使用类别特征: l o g i t = b + ∑ j ∈ i ∣ x i ≠ 0 w j logit = b + \sum_{j\in {i|x_i\ne 0}}{w_j} logit=b+jixi=0wj
    使用类别特征时,只需要将非零特征对应的权重相加即可,不需要乘法运算,同时非零值很少(由于稀疏),运算速度更快。
  • 在实践中,需要将类别特征映射为固定维度的Embedding特征向量,可通过映射表模式或者特征哈希模式(分别用于小型推荐系统和大型推荐系统中)

3.3.1、映射表模式

  • 建立一个字符串(类别特征)到数字的映射表,映射后的整数是Embedding矩阵中的行号,接口获取对应的Embedding向量
  • 这种方式需要额外维护一个映射表,维护成本较高,因为需要进行更新,因此大型推荐系统中更多使用特征哈希模式
    在这里插入图片描述

3.3.2、特征哈希(Feature Hashing)

  • 特征哈希(Feature Hashing)将输入的字符串映射为一个0-N的整数x,N是Embedding矩阵的总行数,具体来讲,x是先映射为哈希值后再对N取余数得到的
  • 这种方式可以使若干Field共享一个特征哈希模块与对应的Embedding矩阵,而不需要让各个Field拥有独立的Embeddi矩阵,利用率更高,使大型推荐模型的主流方法,是互联网大厂映射类别特征的标准手段。
    在这里插入图片描述

4、推荐算法

4.1、推荐算法概览

  • 召回:当面对大量的用户和内容时,通常会首先通过召回策略,将数百万量级的内容缩小到万量级。这一步是为了筛选出可能与用户兴趣相匹配的初步候选内容。
  • 在推荐系统链路中越靠前的环节,其面对的候选集规模越大。因此召回算法需要采用技术较简单、精度稍差而速度较快的算法
  • 在推荐系统中,召回模块主要采用的是”离线计算+在线缓存“的模式实现对上百万规模的候选集的快速筛选:1)离线处理:百万级的候选Item在离线状态处理好,并存入数据库中建立索引,例如之前的倒排索引;2)在线召回:只需花费索引中的检索时间,以满足实时性的要求
  • 召回模块一般采用多路召回的方式。
  • 需要注意的是:召回与排序(特别是精排)在设计目的、输入数据规模、应用场景上有着天壤之别,二者区别很大
  • 过滤:对于某些内容不可重复消费的领域进行过滤,例如:实时性较强的新闻,当用户已经对某内容进行了曝光或点击后,这些内容将不再被推送到用户面前;需要考虑用户的地理位置和时间,推荐的外卖商家不可能太远,也要考虑到当前的时间;生鲜海鲜类商品在时效性、季节性等方面都需要考虑。这一步骤确保了用户接收到的推荐内容的新颖性和多样性。
  • 粗排+精排:对经过召回和过滤后的内容进行排序。这一步通常基于各种复杂的规则和算法,将百量级的内容按照某种顺序进行排列,以便按照优先级推送给用户。
  • 粗排在召回之后,主要是将万级规模筛选到千级规模,用于后面的精排;
  • 主流粗排模型仍使用”离线计算+在线缓存“的模式,因此和召回一样,不能使用用户信息与物料信息交叉的特征与结构。
  • 精排是从上游筛选出的千级规模的物料中,精选出几十个最符合用户兴趣的物料进行个性化的推荐:设计重点就是提升预测精度,因此会采用更复杂的模型,且重点在于用户信息和物料信息充分的交叉,因此会采用更复杂的交叉特征和结构。
  • 混排/重排:为了避免推荐内容越来越窄,导致用户兴趣受到限制,混排步骤会对精排后的结果进行一定的修改。例如,通过控制某一类型内容的出现频次,确保推荐结果的多样性和平衡性。
    在这里插入图片描述

4.2、推荐算法中的Embedding

  • 从非常简略和概述的角度来讲,推荐算法的核心问题在于记忆与扩展记忆,简单来说就是希望能记住常见、高频出现的模式,即记住历史上出现的所有模式;扩展,简单来说就是能够挖掘出潜在的、低频小众的模式,即扩展出用户喜欢的新模式
  • 然而,传统的推荐算法强于记忆,弱于扩展。例如:根据评分卡,利用LR进行CTR的预测,这种算法记忆性强,但难以扩展出新模式
  • 因此,可以引入深度学习中的Embedding操作,即将类别变量映射为稠密向量,可以引入更多潜在抽象的信息,例如:先把每个样本的类别特征编码为one-hot向量,可通过简单的线性层映射为固定维度的Embedding向量
  • 实际操作中,常见的两种embedding方式有:共享和独占

1)共享:简单来说,就是共用同一个Embedding层,例如召回的双塔模型;排序中的FM(因子分解机)。

由于共享,会导致一个缺点,多目标训练时,同一套Embedding可能会互相干扰。例如:同时优化点击率、购买率、转发率等,某些重要特征如果只使用同一个Embedding层,各个目标之间可能会相互干扰,因此常采用独占方式,即使用多个Embedding层,例如MMOE多目标优化的算法
在这里插入图片描述

2)独占:简单来说,就是对于不同的目标,使用不同的Embedding层,例如:FFM(域感知因子分解机)、CAN(Co-Action Network)

FFM:是FM的改进版本,原本的FM在特征交叉时,其每个特征的Embedding权重是共享的,因为每个特征与不同特征交叉时使用的是同一个 v i v_i vi。而FFM是:每个特征与不同特征交叉时,根据对方特征所属的Filed使用不同的Embedding权重
CAN:将 E i t e m E_{item} Eitem拆分为K段,每段子向量reshape为小的Embedding层的权重矩阵 W i W_i Wi,用户特征 E u s e r E_{user} Euser输入到多个层中得到特征交叉后的结果。
在这里插入图片描述

5、推荐列表生成

  • 根据模型预测的用户对物品的兴趣程度,生成个性化的推荐列表。
  • 以及后续的在线评估与优化迭代。

6、常见的推荐产品形态

  • 热门/榜单推荐、个性化推荐、信息流推荐、物品关联推荐

1) 热门推荐

  • 有两种实现方式:一种是所有用户推荐的都是完全一样的,计算全局的TopN物品(比如根据播放量排序的TopN列表;或者基于多种策略获得的TopN列表)然后推荐给用户;另一种是先计算全局的TopM物品,然后根据用户的兴趣特征对这M个物品基于用户兴趣排序,将排在前面的N个物品推荐给用户(相当于取了个子集)
  • 可以作为其他推荐(比如个性化推荐)的冷启动策略,即当一个用户是新用户时,我们无法知道他的兴趣点,这时我们可以利用热门推荐作为该用户的初始推荐

2)个性化推荐

  • 最常见的推荐形式,基于内容和协同过滤的推荐算法

3)信息流推荐

  • 信息流推荐其实是个性化推荐的一种特例,只不过是采用实时信息流的方式与用户进行交互的。例如抖音快手这种

4)物品关联推荐

  • 物品关联推荐是用户在浏览物品详情页时,或者浏览后退出详情页时,关联一批相似或者相关的物品列表。

7、搜索、推荐、广告的区别

  • 搜广推是互联网业务的三驾马车,推荐和搜索负责留住用户,生产流量;而广告负责将流量变现。
  • 搜索推荐都是针对用户本身进行的;而广告针对的是用户和广告商。其本质都是针对用户需求找到最匹配的信息
  • 从算法本身来讲,三者很相似,都遵循”召回模块初筛,排序模块精选“
  • 从数据架构上,三者都遵循Lambda架构
  • 推荐和搜索最大的区别在于用户表达需求的方式不同:搜索中,用户主动输入查询语句,这是最重要的信息来源。因此搜索中最重要的特征是查询语句和物料信息的交叉;而推荐中是用户信息和物料信息的交叉
  • 推搜与广告的区别:
  • 广告的目的是为了变现,因此涉及到了用户、广告主、平台三方的利益,其复杂度更高,优化难度更高;
  • 广告涉及到的转化链条很长(例如APP的广告,从点击广告、下载安装注册、成功下单才是一次完整转化),因此其正样本少,特征稀疏;
  • 最重要的是预测出的CTR/CVR要参与广告费用的结算,其预测精度要求更准确。

参考链接:
《互联网大厂推荐算法实战》,赵传霖

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JT_905链路管理类流程是指在无线通信系统中,对移动台与基站之间的物理链路进行管理和控制的一系列流程。具体流程如下: 1. 链路建立:当移动台与基站需要进行通信时,首先进行链路建立。移动台向基站发送链路请求,基站收到请求后检查信道质量等条件,如果符合要求,基站向移动台发送链路确认信号,建立链路。 2. 数据传输:链路建立后,移动台与基站之间可以进行双向的数据传输。移动台可以发送数据包给基站,基站也可以发送数据包给移动台。 3. 链路维持:在链路建立之后,为了保持链路的稳定性和可靠性,需要进行链路维持操作。这包括定期发送链路保持信号、监测链路质量等。 4. 链路重建:如果链路质量下降或中断,移动台与基站之间的链路会中断。在链路重建流程中,移动台会发送链路重建请求给基站,基站收到请求后重新评估链路质量,并决定是否重新建立链路。 5. 链路释放:当通信结束或其他原因导致链路不再需要时,可以进行链路释放操作。移动台或基站可以发送链路释放请求,对链路进行释放。 总之,JT_905链路管理类流程是在移动通信系统中,用来管理和控制移动台与基站之间物理链路的一系列流程,包括链路建立、数据传输、链路维持、链路重建和链路释放等操作。这些流程的顺序和操作方式在不同的通信系统中可能会有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值