当前位置: 首页 > news >正文

基于大语言模型的推荐系统(1)

        推荐系统(recommendation system)非常重要。事实上,搜索引擎,电子商务,视频,音乐平台,社交网络等等,几乎所有互联网应用的核心就是向用户推荐内容,商品,电影,音乐。推荐系统几乎无处不在。

      传统的推荐(搜索)系统就是依据各种数学算法实现,例如Google 搜索就是以MapReduce 技术而诞生的。伴随着推荐(搜索)系统的发展,也催生了各种人工智能技术出现。推荐技术的核心就是AI。这就不难理解,为什么像Google,Meta 这样的公司会如此重视发展AI技术。目前的许多推荐系统内部是基于各种神经网络,深度学习技术实现。例如Tiktok 的推荐系统就是基于TensorFlow 构建的AI 模型。

    最近,集中学习了网络上关于推荐系统技术。从TensorFlow Recommandation,TensorFlow Agent 以及Tiktok 的Monolith 推荐算法。

   推荐系统的本质是提出一个事物的特征描述,在一组事物的特征集(Feature set)中寻找与之匹配的事物。实现的基本思想是将特征用矢量来表示,然后通过计算矢量之间的差别,来寻找特征匹配的事物。 例如使用余弦相似度 。

    假设我们有一张包含书籍 1 和 2 的表格,如图 3 所示,其中包含它们的类型。对于类型表中的每个单词,我们在第二个表中创建另一列,如果该单词属于该类型,则赋予它 1,如果不是,则赋予它 0。由于我们的类型是科幻小说和小说,所以我们用这两个词创建另一个表格。如果我们绘制一个图形,其中 x 轴是科学轴,Y 轴是小说轴,我们可以将一个点与每本书关联起来。例如,书籍 1 将是蓝点,其科学轴为 1,小说轴为 1(科幻小说)。书籍 2 将是黄点,其科学轴为 0,小说轴为 1(小说)。我们从原点到这些点绘制一个矢量,我们称之为书籍矢量。

现在,我们可以看到书本向量彼此之间形成一个角度 θ。这个角度的余弦就是我们的相似度度量,它由以下公式给出:

其中AB是我们要考虑的向量,|| A || 和 || B || 是它们的范数(长度)。公式中的A i 和B i 是每个向量的分量。书籍向量 1 为 (1,1),书籍向量 2 为 (0,1)。让我们计算余弦相似度:

这说明了两件事:首先,这些向量具有一定的相似性;其次,θ 是 45º,这是我们已经预料到的,可以使用勾股定理计算出来,并使用三角形的边计算余弦值。

如果两本书都是科幻小说,那么我们将拥有相同的书籍向量 (1,1),余弦值为 1,这意味着它们是相同的。但是,如果第 1 本书是科幻小说 (1,1),第 2 本书是恐怖小说 (0,0),在这种情况下,它们没有任何共同之处,余弦值为 0。因此,相似度高意味着余弦值接近于 1,相似度低意味着余弦值接近于 0 

使用 Python 计算

我们可以列举至少两种方法来计算两个给定向量之间的余弦相似度。一种是使用 numpy:

import numpy as np
from numpy.linalg import norm 

A = np.array([1,8])
B = np.array([9,2])

cos_sim = np.dot(A,B)/(norm(A)*norm(B))
print(f"The cosine similarity is: {round(cos_sim,2)}")

打印的结果 

The cosine similarity is: 0.34

推荐系统的复杂性

从上面的例子看出来,推荐系统似乎比较简单,但是在具体的实现中工程技术是极其复杂的。

        当数据变得巨大时,数据的预处理,存储和算法的计算是十分巨大的,需要各种IT技术做支撑,例如计算机集群系统,大型消息系统,分布式数据库,并行计算,CPU/GPU 算力优化等。这些技术大多数是google 这样的大型互联网公司为了大型推荐系统发展起来的。

针对不同的应用,推荐系统的算法也不尽相同。以视频推荐系统为例:

数据主要包括:

 用户数据

   用户的基本特征:姓名,年龄,语言,爱好

  用户的观看行为:观看的视频,关注,点赞,分享,收看时长

电影数据

  电影的基本特征:标题,描述,语言

  电影的播出行为:收看的听众数量,点赞数,分享数等

推荐方法

推荐的策略可以许多种,我们列出了常见的几种:

  1.  计算用户的特征与电影的特征的相似度,列出前10个最相似的电影。
  2. 列出用户最近看过的前十部电影,计算出与这10部电影相似的电影,比如选择2部电影,一共列出10*2=20 部新的影片。
  3. 计算与用户的特征相似的其它用户,列出前10个相似的用户,找出相似用户看过的电影(每个用户选择2部),于是推荐20部电影。

LLM 时代的推荐系统

   近年来,LLM 横空出世,基于LLM 的应用层出不穷。有意思的是,LLM 也可以被认为是一种推荐系统!根据用户的Prompt ,推荐一段合适的回答。如果说LLM 加上实时数据采集,就成为了搜索引擎,传统搜索公司受到前所未有的压力。这使我在头脑中冒出了一个想法,能够使用LLM 来实现推荐系统么?这将使事情变的简单,清晰。本人觉得这是一个有意思的课题。

LLM 推荐系统的可能有两种:

  •    训练一个专业的LLM 实现推荐。
  •    利用LLM embedding ,LLM 和矢量数据库,实现的推荐系统

第一种方式不知道效果会怎么样,后一种方式已经有人做了出来。我们重点研究第二种方式。 

主要工具

  1.         利用大模型embedding 实现矢量化。
  2.         构建vector 数据库。
  3.         使用大模型的技术架构 

实时 Embedding 技术

        Embedding 潜入是针对已有的,静态的数据集构建的矢量集,例如RAG 技术,将文本向量化,将它们存储在矢量数据库,实现所谓的检索增强生成(RAG)。

     但是在实际应用中,用户,视频的特征,行为是不断变化的。比如在TikTok 的推荐系统中设置了两个模型服务器,一个用于实时训练,另一个用于推理。训练模型和推理模型定时地实现参数同步。因此,如果将LLM 技术应用于推荐系统(或者说搜索系统)的话,要构建实时embedding 机制。

从现有的一些国外文献来看,实现实时Embedding 的技术无非有两种:

真正的实时嵌入

  当用户的信息和行为发生变化的时候,就从新训练一次embedding ,并且更新生产系统中的embedding。为了提高系统的效率,可以考虑将信息分段。使用户特征变化需要更新的矢量数据最小。例如通过语言区分用户,中文用户变化时,只是更新中文用户矢量数据库。当然,实现实时嵌入的成本是很高的。

准实时嵌入

        与实时embedding的流程类似,只是将用户的特征数据暂存起来,间隔一段时间进行一次矢量库更新。

        也可以采取TikTok 的方法,设立两个矢量数据看,一个用于生产系统,一个用于实时更新。当更新达到一定的维度(例如1530) 就开始切换矢量数据库。

在实际应用中,要根据用户和电影的特点,做分段存储和更新。工程实现中有许多技术细节需要考虑。

在下一篇博文中,我们来探讨如何构建一个基于LLM 的播客推荐系统。

http://www.dtcms.com/a/31227.html

相关文章:

  • 数据库索引:优点、缺点及常见类型
  • 鸿蒙-自定义布局-实现一个可限制行数的-Flex
  • MySQL优化
  • Pandas库:(二)数组对象的索引
  • Python 高级特性-生成器
  • 计算机组成原理——输入/输出系统(十七)
  • 【个人开源】——从零开始在高通手机上部署sd(二)
  • 边缘安全加速(Edge Security Acceleration)
  • Redis 的线程安全问题解析:为什么 Redis 是线程安全的?
  • Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
  • 【opencv】图像基本操作
  • 机器学习 - 参数平均感知器
  • STM32MP157A单片机移植Linux驱动深入版
  • 视频mp4垂直拼接 水平拼接
  • 高级系统架构师--第七章:安全架构设计理论与实践
  • Nginx Embedded Variables 嵌入式变量解析(4)
  • Gradio全解11——使用transformers.agents构建Gradio UI(4)
  • Windows 权限结构和原理:深入浅出
  • 基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • React Router v5 vs v6 路由配置对比
  • Vue 中 nextTick 的原理详解
  • DeepSeek掘金——快速集成DeepSeek满血版 搭建智能运维助手
  • 黑马点评自学03
  • Spring MVC 对象转换器:初级开发者入门指南
  • 图书管理系统
  • C++ 设计模式-访问者模式
  • python中的异常-模块-包
  • 基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)
  • Vue 和 React 响应式的区别
  • 波兰发布世界首个双足肌肉骨骼机器人,细节高度模拟人类生物特征