news 2026/7/27 8:23:45

向量数据库实战:选型、调优与落地~系列文章20:向量数据库在推荐系统中的应用:从协同过滤到向量召回

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
向量数据库实战:选型、调优与落地~系列文章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_dim=128):super().__init__()# 用户塔self.user_tower=nn.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_tower=nn.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_emb=self.user_tower(user_features)item_emb=self.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_features=extract_features(item)# 类别、价格、标签等withtorch.no_grad():vec=model.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_k=100):"""为单个用户做向量召回"""# 1. 生成用户向量withtorch.no_grad():user_vec=model.get_user_embedding(user_features).numpy()[0]# 2. 向量检索collection.load()results=collection.search(data=[user_vec.tolist()],anns_field="embedding",param={"metric_type":"IP","params":{"ef":128}},limit=top_k,output_fields=["category","price"])# 3. 过滤已购买purchased=get_purchased_items(user_id)filtered=[hitforhitinresults[0]ifhit.idnotinpurchased]returnfiltered[:top_k]

📊 多路召回架构

┌─────────────────────────────────────────────────────────┐ │ 多路召回架构 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 用户请求 │ │ │ │ │ ├──→ 向量召回(语义相似)→ 100 个候选 │ │ │ │ │ ├──→ 热门召回(全局热门)→ 50 个候选 │ │ │ │ │ ├──→ 协同过滤召回 → 50 个候选 │ │ │ │ │ ├──→ 标签召回(同类目)→ 50 个候选 │ │ │ │ │ └──→ 实时召回(最近浏览的相似品)→ 50 个候选 │ │ │ │ ↓ 合并去重 │ │ ~300 个候选 │ │ ↓ │ │ 粗排 → 精排 → 重排 → 展示 │ │ │ └─────────────────────────────────────────────────────────┘

🔑 本篇核心要点回顾

要点说明
向量召回用双塔模型生成用户/物品向量,向量数据库检索
度量选择推荐系统用内积(IP),不是余弦
多路召回向量召回只是其中一路,需要多路融合
性能要求召回层要求极低延迟(< 10ms)

📌下篇预告:《向量数据库在图像搜索引擎中的应用:以图搜图的完整实现 📸》

💬有问题欢迎评论区讨论,觉得有用请点赞收藏 👍

作者:高炉炼铁智能化技术研究者,专注钢铁冶金与人工智能 交叉领域。

👍 如果觉得有帮助,请点赞、收藏、转发!
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)
🔔 关注专栏,不错过后续精彩内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 8:23:28

TMS320C6421开发全解析:从命名规则到工具链与实战避坑指南

1. 项目概述与核心价值 在嵌入式DSP开发领域&#xff0c;尤其是面对德州仪器&#xff08;TI&#xff09;TMS320C6000这类高性能平台时&#xff0c;新手和老手都容易在一个看似简单的问题上栽跟头&#xff1a;如何正确解读芯片型号那一长串字母数字组合&#xff0c;以及如何为它…

作者头像 李华
网站建设 2026/7/27 8:21:33

LangChain结构化输出:Pydantic与JSON解析器实战

1. 为什么需要模型返回结构化数据&#xff1f;在自然语言处理的实际应用中&#xff0c;我们经常会遇到这样的场景&#xff1a;模型输出的文本内容需要被后续程序解析和处理。比如你问模型"明天北京的天气如何&#xff1f;"&#xff0c;理想的回答可能是&#xff1a;{…

作者头像 李华
网站建设 2026/7/27 8:20:29

uv:快得像火箭,顺便把“安装依赖”藏起来了

Python 的包管理长期以来像一个人员严重超编、职责划分不明的政府部门&#xff1a;pip 负责装包&#xff0c;venv 负责建环境&#xff0c;pip-tools 负责锁版本&#xff0c;pipx 负责装工具&#xff0c;pyenv 负责管 Python 版本。每个工具都说自己只负责一小块&#xff0c;最后…

作者头像 李华
网站建设 2026/7/27 8:17:23

FSDrive框架:时空思维链与视觉推理的自动驾驶决策

1. 项目概述&#xff1a;FSDrive 框架的核心定位FSDrive 是一个将时空思维链&#xff08;CoT&#xff09;与视觉推理相结合的自动驾驶决策框架。不同于传统基于规则或端到端学习的方案&#xff0c;它通过模拟人类驾驶时的"观察-思考-决策"认知过程&#xff0c;在复杂…

作者头像 李华
网站建设 2026/7/27 8:10:39

TVA数字小脑:具身智能的物理交互革命(7)

前沿技术探索&#xff1a;AI智能体视觉&#xff08;TVA&#xff0c;Transformer-based Vision Agent&#xff09;是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术&#xff0c;是集深度强化学习&#xff08;DRL&#xff09;、卷积神经网络&#xff08;CNN…

作者头像 李华
网站建设 2026/7/27 8:09:23

MSO算法在柔性作业车间调度中的Matlab实现与优化

1. 项目概述&#xff1a;MSO算法与柔性作业车间调度 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem, FJSP&#xff09;是制造业中一个经典且具有挑战性的优化问题。它要求在满足工序顺序约束的前提下&#xff0c;将多个工件的多道工序分配到多台可选的…

作者头像 李华