前言
很早之前就有过想写推荐系统系列文章了,本人曾任职高级大数据工程师全程参与过推荐系统的搭建,故在搭建推荐系统算得上是有一定的经验。推荐系统搭建有相当多的细节和要考虑的业务情况,以及要结合当前业务信息和用户信息的多维度属性,可以说得上是个大工程。做推荐系统的最看重的就是模块设计和用户画像体系,这两块相当于推荐系统的心脏和肌肉,光靠一篇文章是比较难全面讲解整体推荐系统的搭建的,好在腾讯云推出了向量数据库,免去了最为繁琐复杂的向量数据库设计步骤,可以直接利用腾讯云数据库强大的功能快速构建推荐系统。本篇文章将详细介绍推荐系统的定义以及推荐系统的架构设计,和深入浅出讲解向量分析,最后通过实例案例结合腾讯云向量数据库完成轻量级推荐系统搭建。
一、客户价值体系推荐系统综述
关于大数据标记和大数据杀熟此类网络用语在报道和资讯里面屡见不鲜,很多时候我们搜索完关键词之后进入网购平台或者是短视频平台的时候,总会推送包含相关内容的信息,其中的巧妙就在于平台的推荐系统设计。如何的提供互联网服务形式种类多样且层出不同,那么如何让这些服务准确找到合适的人群就是推荐系统要解决的主要问题。
1.1推荐系统解决了什么问题?
推荐系统本质上是在用户需求不明确的情况下, 从海量的信息中为用户寻找其感兴趣的信息的技术手段。在博主写过的用户画像构建系统文章中有写到利用推荐系统作为下游服务,通过整合用户信息、物品信息和用户历史行为,推荐系统利用机器学习技术构建了个性化的用户兴趣模型。这个模型考虑了用户的地域、年龄、性别等信息,物品的价格、产地等属性,以及用户过去对物品的行为,例如购买、点击、播放等。这个综合的模型使得推荐系统能够更准确地理解用户的偏好和需求,为用户提供个性化、精准的推荐。
在这个过程中,推荐系统实现了平台、标的物提供方和用户三方的利益协调:
- 标的物提供方(商家、内容创作者等): 推荐系统通过向用户推荐符合其兴趣的商品或内容,提高了标的物提供方的曝光和销售机会。这有助于促进商品的流通,提高销售额,从而为商家带来更多的业务。
- 平台方(例如淘宝、电商平台等): 推荐系统提升了平台的用户体验,使用户更容易找到符合其需求的商品或服务。这有助于提高用户在平台上的活跃度,延长停留时间,增加用户粘性,进而推动平台的业务发展。
- 用户: 推荐系统为用户提供了个性化、精准的推荐,使其更容易发现感兴趣的商品或内容。这提高了用户的购物或使用体验,减轻了信息过载和选择困难的问题,增加了用户的满意度。
1.2推荐系统表现形式及应用
1.2.1推荐系统的应用领域
不同行业的产品虽说都可以提供以上推荐产品形态,但是在具体落地时是不一样的,需要考虑到具体的产品功能和使用场景进行调整,即所谓的场景化推荐:基于时间、地理位置、上下文等提供差异化的推荐。比如对于电商平台要根据季节来调整推荐货物,生活平台要根据地理位置和地方人文更改推荐内容,而且同一个用户在产品的不同位置、模块、阶段提供不一样的推荐,也就是上下文推荐内容是有分层的。
1.2.2推荐系统的定义
在了解以上推荐系统具体需求和面向对象种类之后,我们可以给推荐系统下个定义:推荐系统是一种工程技术解决方案,其核心在于通过运用机器学习等先进技术,实现在用户与产品互动的过程中主动呈现可能符合用户兴趣的物品。这样的系统旨在提高用户体验,通过精准的推荐,帮助用户更快地找到并消费符合其喜好的物品,从而节省用户时间和精力。一句话概括就是:推荐系统是工程技术解决方案,旨在通过智能化、个性化的推荐,实现资源的有效配置,满足用户需求,提高用户满意度,并在商业层面促进产品的销售和业务发展。
那么我们从核心推荐算法和策略这一块来归纳推荐系统的种类。
1.2.3推荐系统的算法
推荐系统中有多种常用的算法,它们可以根据不同的原理和方法进行分类。
1.2.3.1基于内容的推荐算法(Content-Based Recommendation)
基于内容的推荐算法的核心思想是通过分析用户和物品的内容信息,为用户推荐与他们过去喜欢的相似内容。这种方法侧重于物品的特征以及用户的个人偏好,以提供更个性化和精准的推荐。具体建模步骤可参考:
首先简历用户行为画像和商品属性类别画像,之后将物品和用户的内容特征转化为特征向量。这可以通过将文本进行向量化(如TF-IDF、Word Embeddings)或使用其他技术,再使用相似性度量(如余弦相似度)来计算物品之间或用户与物品之间的相似性。相似性度量用于衡量特征向量之间的接近程度。基于计算的相似性度量,为用户推荐与他们过去喜欢的物品相似度较高的其他物品。
1.2.3.2协同过滤算法(Collaborative Filtering)
协同过滤算法目前也算得上是较为经典的算法了,现在还有相当多的系统用了此算法。协同过滤算法分为两种主要类型:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤是通过寻找与目标用户相似的其他用户,然后利用这些相似用户的历史行为来预测目标用户可能喜欢的物品。这个算法基于假设:相似的用户在过去喜欢的物品上可能会有相似的评价。而基于物品的协同过滤是通过寻找与目标物品相似的其他物品,然后利用用户对这些相似物品的历史行为来预测目标用户可能喜欢的物品。这个算法基于假设:用户对相似物品的评价可能是相似的。
二者算法都存在明显的缺陷,前者面临稀疏性问题,当用户-物品矩阵稀疏时,难以找到足够相似的用户。后者难以处理新物品,因为需要先有用户的反馈数据才能计算物品之间的相似度,所以工作量和评论量处理都需求很大。我们可以通过sklearn和numpy简单模拟一下计算过程:
代码语言:javascript复制from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 用户-物品评分矩阵
user_item_matrix = np.array([
[5, 4, 0, 0, 1],
[4, 0, 0, 0, 2],
[0, 5, 0, 3, 0],
[0, 0, 4, 0, 5],
])
# 计算用户之间的余弦相似度
user_similarity = cosine_similarity(user_item_matrix)
# 选择与目标用户相似度最高的用户
target_user_index = 0
similar_users = user_similarity[target_user_index]
# 基于相似用户的评分,预测目标用户对未评价物品的评分
target_user_ratings = user_item_matrix[target_user_index]
predicted_ratings = np.sum((similar_users[:, np.newaxis] * target_user_ratings), axis=0) / np.sum(np.abs(similar_users))
print("Predicted Ratings:", predicted_ratings)
通过计算用户之间的余弦相似度,选择了与目标用户相似度最高的用户,并基于相似用户的评分预测了目标用户对未评价物品的评分:Predicted Ratings: [5. 4. 0. 0. 1.]。实际应用中,通常需要考虑更多的细节和优化,比如处理缺失值、调整相似度的计算方式等。
1.3如何搭建一套推荐系统?
推荐系统与大数据有天然的联系,没有用户和物品的数据就无法进行最基础的推荐算法运算,要落地推荐系统往往需要企业具备一套完善的大数据分析平台。所以要开展推荐系统的搭建是建立在我们已经有了一套完善的大数据平台之上再去搭建,推荐系统与大数据平台的依赖关系如下图:
大数据平台在推荐系统中扮演着关键角色,它可以被抽象为两个主要组成部分:数据中心和计算中心。
数据中心: 在数据中心,推荐系统得以存储各类数据,包括但不限于训练推荐模型所需的数据、相关的附加数据,以及最终的推荐结果数据。这一中心负责管理和存储推荐系统所需的多样化数据,构建了一个数据湖,供计算中心使用。这样的结构使得推荐系统能够更加灵活地利用各类信息,从而提升个性化推荐的质量和效果。
计算中心: 计算中心则是提供算力支持的关键部分。它负责执行各项任务,包括数据预处理、模型训练,以及模型推断。在这个中心,推荐系统利用大数据平台的强大计算资源,确保了对海量数据进行高效处理。从而,系统可以有效地学习用户行为模式,生成个性化的推荐结果。这种计算中心的支持使得推荐系统能够在面向终端用户的业务中展现出色的性能。
在大数据支撑下的人工智能技术体系中,推荐系统是备受推崇且具有极大商业价值的前台业务之一。在产品中巧妙整合推荐系统是一项涉及多方面的系统工程。为了确保推荐系统在产品中创造真正的价值,提升用户体验的同时为平台方带来更大的收益,我们可以将推荐系统的业务流程描述为一个不断迭代优化的闭环系统,如下所示:
- 数据源 (DS): 数据源是推荐系统的基础,它包括用户行为数据、物品信息、用户属性等。这些数据源在大数据中心被集中管理和存储,为推荐系统提供充足、多样的信息。
- 大数据中心 (DC): 大数据中心充当数据的枢纽,承担着数据的存储、处理和分析任务。它通过强大的计算资源支持推荐系统的模型训练、特征工程等计算密集型任务。
- 推荐系统 (RecSys): 推荐系统是连接数据中心和业务的桥梁。它利用大数据中心提供的数据进行模型训练、特征提取,最终生成个性化的推荐结果。推荐系统不断迭代优化,通过AB测试和指标体系进行验证,以保证推荐的质量和效果。
- 上层业务 (BIZ): 推荐系统的输出被整合到上层业务中,为用户提供个性化的产品或服务推荐。这包括商品推荐、内容推荐、广告推荐等,以提升用户体验。
- 闭环流程优化
- 数据采集与预处理: 从数据源获取用户行为数据、物品信息等,进行数据清洗和预处理。
- 模型训练: 利用大数据中心的计算资源进行推荐模型的训练,学习用户和物品之间的关系。
- 推荐生成: 根据训练好的模型,为每个用户生成个性化的推荐列表。
- AB测试: 将新的推荐算法或策略与现有版本进行对比,通过AB测试验证新方案的有效性。
- 指标评估: 利用指标体系对推荐效果进行评估,包括点击率、转化率、用户满意度等。
- 反馈回流: 根据AB测试和指标评估结果,优化模型和算法,形成闭环迭代优化的过程。
通过这个闭环系统,推荐系统能够不断地学习和适应用户的行为变化,从而更好地满足用户的需求,提升用户体验,同时为平台方创造更大的商业价值。这种迭代优化的流程使得推荐系统在不断变化的业务和用户环境中保持高效、灵活,真正发挥其潜在的商业价值。
1.3.2推荐系统模块设计
推荐系统是一个复杂的体系工程,涉及到很多相关组件。简而言之有以下这些:
1.3.2.1 数据收集与存储
数据收集模块负责从多个数据源中采集用户行为数据、物品信息以及其他相关数据,为推荐系统提供训练和推断所需的信息。在设计数据收集模块之前,首先需要明确推荐系统的业务需求和目标。确定系统要收集哪些类型的数据,例如用户浏览、点击、购买行为,物品的属性、标签等信息。同时,明确数据的频率和实时性要求。确定需要收集的数据后,选择合适的数据源进行接入。常见的数据源包括:
- 用户行为数据源: 如网站日志、移动应用日志、电商交易记录等。
- 物品信息数据源: 包括商品数据库、内容数据库等。
- 用户属性数据源: 包括用户注册信息、用户画像等。
制定详细的数据收集计划,包括数据采集的时间范围、频率、采集方式等。考虑到数据的多样性和实时性,可能需要采用不同的数据采集策略,包括批量采集和实时采集。确保在数据收集过程中遵循隐私和安全的最佳实践,合规地收集和处理用户数据,避免泄露敏感信息。定期评估数据收集过程的效果,根据反馈不断优化和迭代数据收集模块,以适应业务需求的变化和系统的演进。
1.3.2.2ETL
ETL(Extract, Transform, Load)模块在推荐系统中负责从原始数据源中提取数据,进行必要的转换和处理,最后加载到数据仓库或其他存储系统中。ETL可以描述为Extract、Transform、Load,其中提取数据(Extract)主要负责两个功能:
- 实施数据源连接:通过适当的方式连接到不同的数据源,例如数据库、API、日志文件等。
- 制定提取任务:使用ETL工具或编写脚本,执行数据提取任务。
Transform负责特征工程、数据清洗、数据合并功能,需要考虑编写转换逻辑和并行处理,加速大规模数据的转换过程。Load 加载数据确定目标存储和制定加载策略,需要设计数据表结构和执行加载任务。
1.3.2.3特征工程
特征工程在推荐系统中是至关重要的一环,它涉及从原始数据中提取、转换和选择特征,以构建能够有效训练推荐模型的输入数据。在推荐系统中,机器学习算法用于学习用户偏好,从而能够为用户提供个性化的推荐。这些算法需要接受能够被数学模型理解和处理的训练数据,通常以向量的形式表示。在这个过程中,特征工程的任务就是将原始数据通过ETL流程进行转换,以生成适合推荐算法学习的特征向量。每个特征向量的维度对应着一个特征,而这些特征则反映了用户行为、物品信息和其他上下文因素,为推荐模型提供了有意义的输入。实现的技术有Embedding技术、TF-IDF、时间特征处理等,这里不展开讲述。
推荐算法在上述文章有详细探讨,这里不再过多描述。
1.3.2.4存储模块
通常,推荐系统的结果并不是直接在模型推断阶段写入推荐存储数据库的,而是通过一个数据管道(例如Kafka)来进行解耦。这种做法使得整个系统更加模块化,易于维护和扩展。数据管道充当了一个中间层,将模型生成的推荐结果发送到一个独立的处理流程中,然后再将处理后的结果写入推荐存储数据库。这种架构的优势在于可以实现推荐系统的各个组件之间的解耦,提高系统的灵活性和可维护性。同时,通过使用数据管道,系统能够更好地适应未来的变化和拓展,使整个推荐流程更为可控。
二、项目实战:基于腾讯云向量数据库的客户价值体系推荐系统设计
2.1腾讯云向量数据库产品特性
现在大部分的企业服务都是直接上云进行托管或者快速进行敏捷开发,可以节省相当多的人力和技术成本,但是使用云产品需要对该产品有个大致的了解,如果想要使用向量数据库推荐使用腾讯云向量数据库,首先我们需要对向量数据库有个基本的概念,好帮助我们更好的使用腾讯云向量数据库。
OLAMA 是腾讯自研的向量引擎,具有高性能、高可用、简单易用等特点。它支持单索引10亿级向量规模,适用于 AI 运算、检索场景,已稳定服务于近40个线上业务。基于此引擎开发的数据库可支持百万级 QPS 及毫秒级查询延迟。向量数据库提供多副本高可用特性,其多可用区和三节点的架构可用性可达99.99%,显著提高系统的可靠性和容错性,确保数据库在面临节点故障和负载变化等挑战时仍能正常运行。
我们只需在管理控制台按照指引,简单操作几个步骤,即可快速创建向量数据库实例,全流程平台托管,无需进行任何安装、部署和运维操作,有效减少机器成本、运维成本和人力成本开销。向量数据库的 Embedding 功能会自动将原始文本进行转换,生成对应的向量数据并插入数据库或进行相似性检索,实现了文本到向量数据的一体化转换,减少了用户的操作步骤,极大降低了使用门槛。
那么现在我们来进行整个推荐系统的搭建。
2.2推荐系统架构搭建
首先我们设计简易基础的系统架构:
2.2.1创建向量数据库实例
接下来我们按着以下操作步骤来逐渐实现推荐系统的搭建。如果第一次体验的用户需要先创建私有网络:
现在新建向量数据库实例是免费的,推荐大家尝试:
之后可以直接登陆到我们的实例:
进入管理模块可以实时看到Embedding的Token消耗监控:
2.2.2连接并写入向量数据
如果没有云服务器CVM的话可以先购买一个,一定要注意的是处于不同地域的云产品内网不通,创建成功后不支持切换地域,所以如果先创建了向量数据库实例的话要记得是在哪个地区创建的。如果没有购买CVM可以配置外网访问:
外网访问仅适用于开发、调试或辅助管理数据库实例,正式生产业务推荐使用内网访问。开启外网访问后,可以使用系统分配的域名和端口通过外网访问向量数据库,生效时间大概需要5分钟。配置完成之后可以创建数据库:
代码语言:javascript复制import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
#create a database client object
client = tcvectordb.VectorDBClient(url='公网IP', username='root', key='密码', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# create a database
db = client.create_database(database_name='db-test')
这样就创建了数据库,之后我们要创建数据集合,该集合需要根据我们的数据集格式和属性进行导入,具体数据在本人另一篇文章里面有具体描述:https://blog.csdn.net/master_hunter/article/details/120937164
经过RFM判别模型进行特征过程处理,记录三个指标:
- 最近一次消费(Recency)
- 消费频率(Frequency)
- 消费金额(Monetary)
所以最后入库有三个向量,先创建集合
代码语言:javascript复制import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType, EmbeddingModel
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
#create a database client object
client = tcvectordb.VectorDBClient(url='公网IP', username='root', key='密码', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)b = client.database('db-test')
index = Index(
FilterIndex(name='user_id', field_type=FieldType.String, index_type=IndexType.PRIMARY_KEY),
FilterIndex(name='Customer_type', field_type=FieldType.String, index_type=IndexType.FILTER),
VectorIndex(name='vector', dimension=3, index_type=IndexType.HNSW,
metric_type=MetricType.COSINE, params=HNSWParams(m=16, efconstruction=200))
)
# create a collection
# 第二步,创建 Collection
coll = db.create_collection(
name='RFM-vector',
shard=1,
replicas=2,
description='this is a collection of test embedding',
index=index
)
之后插入数据:
代码语言:javascript复制from tcvectordb.model.collection import UpdateQuery
from tcvectordb.model.document import Document, SearchParams, Filter
from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams
coll = db.collection('RFM-vector')
coll = db.collection('RFM-vector')
res = coll.upsert(
documents=[
Document(id='2000001555945280',Customer_type='流失用户',vector=[6.86, 1, 7]),
Document(id='2000001556645220',Customer_type='重要价值用户', vector=[1.75, 39, 4]),
Document(id='2000001558047800',Customer_type='潜力价值用户', vector=[1.00, 24, 6])
],
build_index=True
)
以上我写入部分数据,批量写入设定固定参数可以批量写入。
2.2.3相似度检索
在腾讯云向量库可以直接进行相似度检索,相似度检索是基于向量之间的相似度来检索与查询向量最相似的文档的检索方式。而对于我们输入的数据而言,可以说就是用户-物品评价矩阵,在以上矩阵分解推荐算法也有说到。因此我们直接进行相似度检索:
代码语言:javascript复制doc_lists = coll.searchById(
document_ids=['2000001555945280','2000001556645220'],
params=SearchParams(ef200),
limit=3,
retrieve_vector=True,
output_fields=['Customer_type']
)
for i, docs in enumerate(doc_lists):
print(i)
for doc in docs:
print(doc)
输出结果说明:
- 输出的 Document ID 顺序与查询时配置的参数 document_ids 输入的顺序一致。
- 每一个查询结果都返回 TopK 条相似度计算的结果。其中,K 为 limit 设置的数值,如果插入的数据不足 K 条,则返回实际插入的 Document 数量。
- 检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
之后记录score即可完成对用户价值体系的评价和物品推荐的先后程度。以上基础的推荐系统就搭建好了,腾讯云向量数据库目前是公测阶段。免费测试版实例每个账号仅限申领1个,高可用版与单机版实例免费试用时长1个月,大家可以自行体验,搭建不同体系的推荐系统。
条相似度计算的结果。其中,K 为 limit 设置的数值,如果插入的数据不足 K 条,则返回实际插入的 Document 数量。
检索结果会按照与查询向量的相似程度进行排列,相似度最高的结果会排在最前面,相似度最低的结果则排在最后面。相似程度则通过 L2(欧几里得距离)、IP(内积)或 COSINE(余弦相似度)计算得出的分数来衡量,输出参数 score 表示相似性计算分数。其中,欧式距离(L2)计算所得的分数越小与搜索值越相似;而余弦相似度(COSINE)与 内积(IP) 计算所得的分数越大与搜索值越相似。
之后记录score即可完成对用户价值体系的评价和物品推荐的先后程度。以上基础的推荐系统就搭建好了,腾讯云向量数据库目前是公测阶段。免费测试版实例每个账号仅限申领1个,高可用版与单机版实例免费试用时长1个月,大家可以自行体验,搭建不同体系的推荐系统。