基于大语言模型的推荐系统(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(小说)。我们从原点到这些点绘制一个矢量,我们称之为书籍矢量。

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

其中A和B是我们要考虑的向量,|| 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 这样的大型互联网公司为了大型推荐系统发展起来的。
针对不同的应用,推荐系统的算法也不尽相同。以视频推荐系统为例:
数据主要包括:
用户数据
用户的基本特征:姓名,年龄,语言,爱好
用户的观看行为:观看的视频,关注,点赞,分享,收看时长
电影数据
电影的基本特征:标题,描述,语言
电影的播出行为:收看的听众数量,点赞数,分享数等
推荐方法
推荐的策略可以许多种,我们列出了常见的几种:
- 计算用户的特征与电影的特征的相似度,列出前10个最相似的电影。
- 列出用户最近看过的前十部电影,计算出与这10部电影相似的电影,比如选择2部电影,一共列出10*2=20 部新的影片。
- 计算与用户的特征相似的其它用户,列出前10个相似的用户,找出相似用户看过的电影(每个用户选择2部),于是推荐20部电影。
LLM 时代的推荐系统
近年来,LLM 横空出世,基于LLM 的应用层出不穷。有意思的是,LLM 也可以被认为是一种推荐系统!根据用户的Prompt ,推荐一段合适的回答。如果说LLM 加上实时数据采集,就成为了搜索引擎,传统搜索公司受到前所未有的压力。这使我在头脑中冒出了一个想法,能够使用LLM 来实现推荐系统么?这将使事情变的简单,清晰。本人觉得这是一个有意思的课题。
LLM 推荐系统的可能有两种:
- 训练一个专业的LLM 实现推荐。
- 利用LLM embedding ,LLM 和矢量数据库,实现的推荐系统
第一种方式不知道效果会怎么样,后一种方式已经有人做了出来。我们重点研究第二种方式。
主要工具
- 利用大模型embedding 实现矢量化。
- 构建vector 数据库。
- 使用大模型的技术架构
实时 Embedding 技术
Embedding 潜入是针对已有的,静态的数据集构建的矢量集,例如RAG 技术,将文本向量化,将它们存储在矢量数据库,实现所谓的检索增强生成(RAG)。
但是在实际应用中,用户,视频的特征,行为是不断变化的。比如在TikTok 的推荐系统中设置了两个模型服务器,一个用于实时训练,另一个用于推理。训练模型和推理模型定时地实现参数同步。因此,如果将LLM 技术应用于推荐系统(或者说搜索系统)的话,要构建实时embedding 机制。
从现有的一些国外文献来看,实现实时Embedding 的技术无非有两种:
真正的实时嵌入
当用户的信息和行为发生变化的时候,就从新训练一次embedding ,并且更新生产系统中的embedding。为了提高系统的效率,可以考虑将信息分段。使用户特征变化需要更新的矢量数据最小。例如通过语言区分用户,中文用户变化时,只是更新中文用户矢量数据库。当然,实现实时嵌入的成本是很高的。
准实时嵌入
与实时embedding的流程类似,只是将用户的特征数据暂存起来,间隔一段时间进行一次矢量库更新。
也可以采取TikTok 的方法,设立两个矢量数据看,一个用于生产系统,一个用于实时更新。当更新达到一定的维度(例如1530) 就开始切换矢量数据库。
在实际应用中,要根据用户和电影的特点,做分段存储和更新。工程实现中有许多技术细节需要考虑。
在下一篇博文中,我们来探讨如何构建一个基于LLM 的播客推荐系统。
相关文章:
基于大语言模型的推荐系统(1)
推荐系统(recommendation system)非常重要。事实上,搜索引擎,电子商务,视频,音乐平台,社交网络等等,几乎所有互联网应用的核心就是向用户推荐内容,商品,电影&…...
Docker基础实践与应用举例
Docker 是一个轻量级容器化平台,通过将应用及其依赖打包到容器中,实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例,结合具体操作步骤: 一、基础实践 1. 快速启动一个容器 # 运行一个Nginx容器,映射宿…...
计算机毕业设计SpringBoot+Vue.js新闻推荐系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Android 布局系列(一):LinearLayout 使用指南
引言 在 Android 开发中,布局是每个应用的基础,而 LinearLayout 无疑是最常见、最简单的布局之一。它允许我们将多个视图按顺序排列,可以选择水平方向(horizontal)或垂直方向(vertical)。 Line…...
蓝桥杯备赛-精卫填海-DP
精卫终于快把东海填平了!只剩下了最后的一小片区域了。同时,西山上的木石也已经不多了。精卫能把东海填平吗? 事实上,东海未填平的区域还需要至少体积为 v 的木石才可以填平,而西山上的木石还剩下 n 块,每块…...
git中,如何查看具体单个文件的log
在 Git 中,可以使用多种方式查看单个文件的提交日志(Log),以下详细介绍不同场景下的查看方法: 目录 一、基本命令查看文件的完整提交日志 二、查看文件提交日志并显示差异内容 三、限制显示的提交日志数量 四、按…...
Winform工具箱、属性、事件
工具箱 Button------按钮:用户可以点击的按钮控件。 CheckBox------复选框:允许用户选择或取消选择选项的复选框。 CheckedListBox:结合了ListBox和CheckBox的功能,允许多项选择。 ColorDialog------颜色选择对话框:用…...
科普:HTTP端口80和HTTPS端口443
你会发现,有的网址不带端口号,怎么回事? HTTP协议默认端口:HTTP协议的默认端口是80。当用户在浏览器中输入一个没有指定端口的以http://开头的网址时,浏览器会自动使用80端口与服务器建立连接,进行超文本数…...
数据分析和数据挖掘的工作内容
基本的数据分析工作通常包含以下几个方面的内容: 确定目标(输入):理解业务,确定指标口径。获取数据:数据仓库(SQL提数)、电子表格、三方接口、网络爬虫、开放数据集等。清洗数据&am…...
Android级联选择器,下拉菜单
近期android开发,遇到的需求,分享二个android可能用到的小组件 下拉选择器:它的实现,主要是需要监听它依附的组件当前距离屏幕顶端的位置。 在显示下拉菜单中,如果需要点击上面有响应。可通过activity拿到decorview(ac…...
【每日八股】MySQL篇(一):概述
关系的三个范式是什么? 第一范式(1NF):用来确保每列的原子性,要求每列都是不可再分的最小数据单元。 概括:表中的每一列都是不可分割的最小原子值,且每一行都是唯一的。 第二范式(…...
大白话Vue2和Vue3双向数据绑定的原理
大白话Vue2和Vue3双向数据绑定的原理 下面用大白话来给你详细介绍一下Vue2和Vue3双向数据绑定的原理: Vue2双向数据绑定原理 Vue2的双向数据绑定主要是通过Object.defineProperty()这个方法来实现的,就好像有一个小管家在帮你看着数据和页面。 数据劫…...
Remainder Problem CF1207F
题目:题目链接 题目大意 题目描述 给你一个长度为 500000 的序列,初值为 0 ,你要完成 q 次操作,操作有如下两种: 1 x y : 将下标为 x 的位置的值加上 y2 x y : 询问所有下标模 x 的结果为 y 的位置的值之和 输入格…...
SpringBoot之自定义简单的注解和AOP
1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…...
2.2 添加注释
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 注释是为了方便理解代码含义而添加的简短的解释性说明。在编译时,编辑器不会将注释加入最终生成的文件中,不…...
自由学习记录(38)
python语法 def def print_receipt (store_name, items, total_price, cashier"Self-Checkout", payment_method"Credit Card"): Python 的 函数定义 语法 def print_receipt(...) → 定义了一个名为 print_receipt 的函数。store_name, items, total_…...
【SQL实验】触发器
下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】 触发器 1、为图书表设置更新触发器,根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录,然后更新书名、作者…...
C语言:二维数组在内存中是怎么存储的
目录 1. 二维数组的定义: 2. 行主序存储: 具体内存排列: 3. 如何通过指针访问数据: 4. 总结: 在 C 语言中,二维数组是按 行主序(row-major order) 存储的。也就是说,…...
CPU多级缓存机制
目录 一、前置知识 ---- CPU的核心 1.1. 单核与多核CPU 二、CPU多级缓存机制 三. 缓存的基本结构/缓存的存储结构 四、CPU缓存的运作流程/工作原理 五、CPU多级缓存机制的工作原理【简化版】 5.1. 缓存访问的过程 (5.1.1) L1缓存(一级缓存)访问 …...
Ansible剧本-playbook
Ansible剧本-playbook 1 playbook基础1.1 简介1.2 playbook的组成结构Task 任务列表任务报错,如何继续执行响应事件Handler 1.3 常用选项执行playbookplaybook查询帮助信息校验playbook语法测试playbook能否正常运行 2 变量 的定义方式2.1 定义规则2.2 vars 变量2.3…...
神经网络八股(3)
1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…...
SmartMediakit之音视频直播技术的极致体验与广泛应用
引言 在数字化时代,音视频直播技术已经深入到各个行业和领域,成为信息传递和交流的重要手段。视沃科技自2015年成立以来,一直致力于为传统行业提供极致体验的音视频直播技术解决方案,其旗下的大牛直播SDK凭借强大的功能和卓越的性…...
【R包】tidyplots----取代ggplot2的科研绘图利器
文章目录 介绍安装Usage文档参考 介绍 tidyplots----取代ggplot2的科研绘图利器。tidyplots的目标是简化为科学论文准备出版的情节的创建。它允许使用一致和直观的语法逐渐添加,删除和调整情节组件。 安装 You can install the released version of tidyplots fro…...
DeepSeek 15天指导手册——从入门到精通 PDF(附下载)
DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载: https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…...
C++知识点总结与复习
c中常见的关键字(面试题中经常出现) const 总结常见用法: const int a; //定义了常量整形的变量 a; 常量表示不可修改,定义的时候必须初始化。除此之外,和 int a;使用一样。 const int * p;//定义了指向常量整形变量的指针。…...
微信小程序实现拉卡拉支付
功能需求:拉卡拉支付(通过跳转拉卡拉平台进行支付),他人支付(通过链接进行平台跳转支付) 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…...
全面汇总windows进程通信(二)
在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: 信号量(Semaphore)和互斥量(…...
Unity 第三人称人物切动画时人物莫名旋转
前提: 使用Starter Asset包中的第三人称插件包. 在给3D角色的动画器增加新动画时, 发现进入新动画会让角色莫名转动. 观察后发现是动画强行将朝向掰"正", 人物动画在进行时朝向会一直变化, 这使得动作非常的怪异. 对系动画进行以下处理后, 将可以解决这种不自然: 选…...
启动Redis报错记录
突然启动Redis就报了个错:‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案,应该是6379端口已绑定,服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…...
vue2响应式数据原理
1. 核心原理 Vue 2 的响应式系统基于 Object.defineProperty,通过 依赖收集 和 派发更新 来实现数据的响应式 依赖收集:在读取数据时,记录哪些函数(或组件)依赖了该数据。派发更新:在修改数据时ÿ…...
