向量数据库实战:选型、调优与落地~系列文章20:向量数据库在推荐系统中的应用:从协同过滤到向量召回
向量数据库在推荐系统中的应用从协同过滤到向量召回 本文是《向量数据库实战选型、调优与落地》专栏第 20 篇⏱️阅读时间约 13 分钟 开篇推荐系统的召回革命传统推荐系统的核心流程 ┌─────────────────────────────────────────────────────────┐ │ 推荐系统经典架构 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 用户请求 │ │ │ │ │ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 召回层 │ → │ 粗排层 │ → │ 精排层 │ │ │ │ (Recall) │ │ (Pre- │ │ (Rank) │ │ │ │ │ │ ranking) │ │ │ │ │ │ 百万→千 │ │ 千→百 │ │ 百→几十 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ ▼ │ │ ┌──────────┐ │ │ │ 重排层 │ │ │ │ (Re-rank)│ │ │ │ 几十→展示 │ │ │ └──────────┘ │ │ │ │ 召回层是核心它决定了推荐的天花板 │ │ → 向量数据库就是召回层的发动机 │ │ │ └─────────────────────────────────────────────────────────┘ 从协同过滤到向量召回传统协同过滤的问题用户 A 喜欢[商品1, 商品2, 商品3] 用户 B 喜欢[商品2, 商品3, 商品4] → A 和 B 有相似偏好 → 给用户 A 推荐商品4 问题 ❌ 只能发现显式相似的用户/物品 ❌ 稀疏性问题大部分用户-物品对没有交互 ❌ 无法理解为什么相似向量召回的优势商品1 的向量: [0.12, -0.34, ...] ← learned representation 商品2 的向量: [0.13, -0.33, ...] ← 语义相近 商品3 的向量: [0.89, 0.12, ...] ← 语义远 向量召回 ✅ 能发现隐式相似语义相近但没交互过的 ✅ 不受稀疏性影响 ✅ 能理解为什么相似向量空间中的距离 向量召回实战Step 1训练双塔模型importtorchimporttorch.nnasnnclassTwoTowerModel(nn.Module):双塔模型用户塔 物品塔def__init__(self,user_dim,item_dim,embedding_dim128):super().__init__()# 用户塔self.user_towernn.Sequential(nn.Linear(user_dim,256),nn.ReLU(),nn.Linear(256,128),nn.ReLU(),nn.Linear(128,embedding_dim),nn.LayerNorm(embedding_dim))# 物品塔self.item_towernn.Sequential(nn.Linear(item_dim,256),nn.ReLU(),nn.Linear(256,128),nn.ReLU(),nn.Linear(128,embedding_dim),nn.LayerNorm(embedding_dim))defforward(self,user_features,item_features):user_embself.user_tower(user_features)item_embself.item_tower(item_features)# 内积作为相似度return(user_emb*item_emb).sum(dim-1)defget_user_embedding(self,user_features):returnself.user_tower(user_features)defget_item_embedding(self,item_features):returnself.item_tower(item_features)Step 2生成物品向量并存入数据库frompymilvusimportCollection# 为所有物品生成向量item_embeddings[]foriteminall_items:item_featuresextract_features(item)# 类别、价格、标签等withtorch.no_grad():vecmodel.get_item_embedding(item_features)item_embeddings.append(vec.numpy()[0])# 存入向量数据库data[[item.idforiteminall_items],item_embeddings,[{category:item.category,price:item.price}foriteminall_items]]collection.insert(data)collection.flush()# 建索引collection.create_index(embedding,{index_type:HNSW,metric_type:IP,# 推荐系统用内积params:{M:32,efConstruction:256}})Step 3在线召回defrecall_for_user(user_id,user_features,collection,model,top_k100):为单个用户做向量召回# 1. 生成用户向量withtorch.no_grad():user_vecmodel.get_user_embedding(user_features).numpy()[0]# 2. 向量检索collection.load()resultscollection.search(data[user_vec.tolist()],anns_fieldembedding,param{metric_type:IP,params:{ef:128}},limittop_k,output_fields[category,price])# 3. 过滤已购买purchasedget_purchased_items(user_id)filtered[hitforhitinresults[0]ifhit.idnotinpurchased]returnfiltered[:top_k] 多路召回架构┌─────────────────────────────────────────────────────────┐ │ 多路召回架构 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 用户请求 │ │ │ │ │ ├──→ 向量召回语义相似→ 100 个候选 │ │ │ │ │ ├──→ 热门召回全局热门→ 50 个候选 │ │ │ │ │ ├──→ 协同过滤召回 → 50 个候选 │ │ │ │ │ ├──→ 标签召回同类目→ 50 个候选 │ │ │ │ │ └──→ 实时召回最近浏览的相似品→ 50 个候选 │ │ │ │ ↓ 合并去重 │ │ ~300 个候选 │ │ ↓ │ │ 粗排 → 精排 → 重排 → 展示 │ │ │ └─────────────────────────────────────────────────────────┘ 本篇核心要点回顾要点说明向量召回用双塔模型生成用户/物品向量向量数据库检索度量选择推荐系统用内积IP不是余弦多路召回向量召回只是其中一路需要多路融合性能要求召回层要求极低延迟 10ms下篇预告《向量数据库在图像搜索引擎中的应用以图搜图的完整实现 》有问题欢迎评论区讨论觉得有用请点赞收藏 作者高炉炼铁智能化技术研究者专注钢铁冶金与人工智能 交叉领域。 如果觉得有帮助请点赞、收藏、转发版权归作者所有未经许可请勿抄袭套用商用(或其它具有利益性行为)。 关注专栏不错过后续精彩内容

相关新闻

LangChain大模型应用开发实战与架构解析

LangChain大模型应用开发实战与架构解析

1. LangChain大模型应用开发全景解析作为一位长期深耕AI工程化落地的开发者,我见证了从早期单一大模型调用到如今复杂Agent工作流编排的技术演进。LangChain框架的出现,彻底改变了我们构建大模型应用的方式——它不再是把prompt简单封装成API的玩具&…

2026/10/27 0:05:17 阅读更多 →
Claude Code工具链:AI辅助编程的Handler与Agent架构解析

Claude Code工具链:AI辅助编程的Handler与Agent架构解析

1. 项目概述:Claude Code工具链的核心价值在AI辅助编程领域,Claude Code正逐渐成为开发者效率提升的利器。这个基于先进语言模型的工具链,通过Handler机制和Agent扩展架构,实现了代码生成、问题诊断、自动化重构等核心功能。不同于…

2026/10/27 0:10:15 阅读更多 →
Python afs-py 包完全指南:功能、安装、语法、参数与8个实战案例

Python afs-py 包完全指南:功能、安装、语法、参数与8个实战案例

1. 引言 afs-py 是一个专为 Python 开发者设计的文件系统操作增强库,旨在简化文件读写、目录遍历、路径处理等常见任务。本文将全面介绍 afs-py 包的核心功能、安装方法、语法参数,并通过 8 个实际应用案例帮助读者快速上手,同时总结常见错误与使用注意事项。 2. afs-py 包…

2026/10/24 19:01:07 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →