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

news2025/4/6 10:47:35

        推荐系统(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.coloradmin.cn/o/2306095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.js新闻推荐系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Android 布局系列(一):LinearLayout 使用指南

引言 在 Android 开发中,布局是每个应用的基础,而 LinearLayout 无疑是最常见、最简单的布局之一。它允许我们将多个视图按顺序排列,可以选择水平方向(horizontal)或垂直方向(vertical)。 Line…

Android级联选择器,下拉菜单

近期android开发,遇到的需求,分享二个android可能用到的小组件 下拉选择器:它的实现,主要是需要监听它依附的组件当前距离屏幕顶端的位置。 在显示下拉菜单中,如果需要点击上面有响应。可通过activity拿到decorview(ac…

【每日八股】MySQL篇(一):概述

关系的三个范式是什么? 第一范式(1NF):用来确保每列的原子性,要求每列都是不可再分的最小数据单元。 概括:表中的每一列都是不可分割的最小原子值,且每一行都是唯一的。 第二范式&#xff08…

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…

自由学习记录(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、为图书表设置更新触发器&#xff0c;根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录&#xff0c;然后更新书名、作者…

CPU多级缓存机制

目录 一、前置知识 ---- CPU的核心 1.1. 单核与多核CPU 二、CPU多级缓存机制 三. 缓存的基本结构/缓存的存储结构 四、CPU缓存的运作流程/工作原理 五、CPU多级缓存机制的工作原理【简化版】 5.1. 缓存访问的过程 (5.1.1) L1缓存&#xff08;一级缓存&#xff09;访问 …

神经网络八股(3)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小&#xff0c;最终趋近于零&#xff0c;这会导致靠前层的神经网络层权重参数更新缓慢&#xff0c;甚至不更新&#xff0c;学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大&#xff0c;…

SmartMediakit之音视频直播技术的极致体验与广泛应用

引言 在数字化时代&#xff0c;音视频直播技术已经深入到各个行业和领域&#xff0c;成为信息传递和交流的重要手段。视沃科技自2015年成立以来&#xff0c;一直致力于为传统行业提供极致体验的音视频直播技术解决方案&#xff0c;其旗下的大牛直播SDK凭借强大的功能和卓越的性…

【R包】tidyplots----取代ggplot2的科研绘图利器

文章目录 介绍安装Usage文档参考 介绍 tidyplots----取代ggplot2的科研绘图利器。tidyplots的目标是简化为科学论文准备出版的情节的创建。它允许使用一致和直观的语法逐渐添加&#xff0c;删除和调整情节组件。 安装 You can install the released version of tidyplots fro…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

微信小程序实现拉卡拉支付

功能需求&#xff1a;拉卡拉支付&#xff08;通过跳转拉卡拉平台进行支付&#xff09;&#xff0c;他人支付&#xff08;通过链接进行平台跳转支付&#xff09; 1.支付操作 //支付 const onCanStartPay async (obj) > {uni.showLoading({mask: true})// 支付接口获取需要传…

Unity 第三人称人物切动画时人物莫名旋转

前提: 使用Starter Asset包中的第三人称插件包. 在给3D角色的动画器增加新动画时, 发现进入新动画会让角色莫名转动. 观察后发现是动画强行将朝向掰"正", 人物动画在进行时朝向会一直变化, 这使得动作非常的怪异. 对系动画进行以下处理后, 将可以解决这种不自然: 选…

启动Redis报错记录

突然启动Redis就报了个错&#xff1a;‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案&#xff0c;应该是6379端口已绑定&#xff0c;服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…

自然语言处理NLP 04案例——苏宁易购优质评论与差评分析

上一篇文章&#xff0c;我们爬取了苏宁易购平台某产品的优质评价和差评&#xff0c;今天我们对优质评价与差评进行分析 selenium爬取苏宁易购平台某产品的评论-CSDN博客 目录 1. 数据加载 2. 中文分词 3. 停用词处理 4. 数据标注与合并 5. 数据集划分 6. 文本特征提取 …

图片爬取案例

修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

官方文档学习TArray容器

一.TArray中的元素相等 1.重载一下 元素中的 运算符&#xff0c;有时需要重载排序。接下来&#xff0c;我们将id 作为判断结构体的标识。 定义结构体 USTRUCT() struct FXGEqualStructInfo {GENERATED_USTRUCT_BODY() public:FXGEqualStructInfo(){};FXGEqualStructInfo(in…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…