首页 > 数字化转型 > CRM > Gorse 推荐系统入门:从零到一构建推荐引擎
你在逛淘宝,搜索了"运动鞋",加购了几双 Nike。第二天打开 APP,首页推荐的都是运动装备、球鞋测评。
这就是推荐系统!
它在做三件事:
电商:淘宝、京东 → 商品推荐 视频:抖音、YouTube → 视频推荐 音乐:网易云、Spotify → 歌曲推荐 新闻:今日头条、微博 → 内容推荐 社交:微信、LinkedIn → 好友推荐
市场规模:
| 特性 | Gorse | TensorFlow Recommenders | Surprise |
|---|---|---|---|
| 语言 | Go | Python | Python |
| 学习曲线 | ⭐⭐ 简单 | ⭐⭐⭐⭐ 复杂 | ⭐⭐⭐ 中等 |
| 生产部署 | ✅ 开箱即用 | ❌ 需要额外工程 | ❌ 仅用于研究 |
| 分布式 | ✅ 原生支持 | ❌ 需要自己实现 | ❌ 不支持 |
| RESTful API | ✅ 内置 | ❌ 需要自己开发 | ❌ 无 |
| AutoML | ✅ 自动调参 | ❌ 手动调参 | ❌ 手动调参 |
| 性能 | ⚡⚡⚡ 快 | ⚡⚡ 中等 | ⚡ 慢 |
1. 5分钟上手
# 只需一行命令docker run -p 8088:8088 zhenghaoz/gorse-in-one --playground
2. 零机器学习知识
不需要懂数学公式 不需要懂算法原理 只需要会调 API
3. 生产级性能
单机 10万+ QPS 秒级推荐响应 自动水平扩展
4. 企业级功能
RESTful API Dashboard 监控 多种推荐策略 实时在线学习
# 使用 Docker 启动(推荐)docker run -p 8088:8088 zhenghaoz/gorse-in-one --playground# 等待 30 秒,看到日志:# ✓ Gorse is ready
打开浏览器访问:
http://localhost:8088
你会看到:
# 创建用户curl -X POST http://localhost:8088/api/user \
-H "Content-Type: application/json" \
-d '{
"UserId": "alice",
"Labels": ["female",gov.soccer.mbp.zuqzb.info "student", "tech_lover"]
}'# 创建物品(电影)curl -X POST http://localhost:8088/api/item \
-H "Content-Type: application/json" \
-d '{
"ItemId": "inception",
"Labels": ["scifi", "thriller"],
"Categories": ["movie"]
}'# 插入反馈(alice 喜欢 inception)curl -X POST http://localhost:8088/api/feedback \
-H "Content-Type: application/json" \
-d '[{
"UserId": "alice",
"ItemId": "inception",
"FeedbackType": "like"
}]'
# 为 alice 推荐电影curl "http://localhost:8088/api/recommend/alice?n=10" | jq .# 返回结果:[ "interstellar", "matrix", "dark_knight"]
恭喜!你的第一个推荐系统已经运行了! 🎉
用户 (User) ├─ 基础信息:ID、标签(性别、年龄、兴趣) └─ 行为历史:浏览、点击、购买 物品 (Item) ├─ 基础信息:ID、标签(类别、属性) └─ 统计数据:热度、评分 反馈 (Feedback) └─ 用户 + 物品 + 类型(喜欢、浏览、购买)+ 时间 推荐 (Recommendation) └─ 根据历史行为,预测用户可能喜欢的物品
1. 用户产生行为 └─ alice 观看了《盗梦空间》2. 系统记录反馈 └─ INSERT feedback (alice, inception, like)3. 模型训练(后台定期执行) └─ 分析:喜欢《盗梦空间》的用户还喜欢什么?4. 生成推荐 └─ 为 alice 推荐:《星际穿越》《黑客帝国》5. 用户看到推荐 └─ 首页展示推荐结果6. 循环迭代 └─ alice 点击了《星际穿越》→ 再次记录 → 优化推荐
Gorse 使用 多源融合策略:
1. 协同过滤(Collaborative Filtering)
原理:找到相似用户,推荐他们喜欢的物品 例子:- alice 和 bob 都喜欢《盗梦空间》- bob 还喜欢《星际穿越》- 推荐《星际穿越》给 alice
2. 物品相似(Item-to-Item)
原理:推荐和用户历史物品相似的其他物品 例子:- alice 喜欢《盗梦空间》(科幻、烧脑)- 找到相似电影:《星际穿越》(同样是科幻、烧脑)- 推荐《星际穿越》
3. 热门推荐(Popular)
原理:推荐最热门的物品 例子:- 当前最火的电影:《阿凡达2》- 作为冷启动用户的推荐
4. 最新推荐(Latest)
原理:推荐最新上架的物品 例子:- 今日上映:《流浪地球3》- 推荐给科幻爱好者
融合策略:
推荐结果 = 30% 协同过滤 + 30% 物品相似 + 20% 热门推荐 + 20% 最新推荐
┌─────────────────────────────────────┐ │ 用户/应用 │ │ (Web, App, 小程序) │ └───────────────┬─────────────────────┘ │ HTTP/HTTPS ↓ ┌─────────────────────────────────────┐ │ Server 节点 │ │ (RESTful API + 实时推荐) │ └───────────────┬─────────────────────┘ │ gRPC ↓ ┌─────────────────────────────────────┐ │ Master 节点 │ │ (模型训练 + 任务调度 + Dashboard) │ └───────────────┬─────────────────────┘ │ gRPC ↓ ┌─────────────────────────────────────┐ │ Worker 节点 (多个) │ │ (离线计算 + 批量推荐) │ └─────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────┐ │ 存储层 (MySQL + Redis) │ │ (用户数据 + 物品数据 + 推荐缓存) │ └─────────────────────────────────────┘
Master(大脑)
职责:1. 模型训练 - 协同过滤模型 - 点击率预估模型 2. AutoML - 自动搜索最佳超参数 3. 任务调度 - 触发 Worker 计算推荐 4. Dashboard - 系统监控 - 数据管理
Worker(手脚)
职责:1. 批量推荐 - 为每个用户生成推荐列表 2. 相似度计算 - 计算物品之间的相似度 - 计算用户之间的相似度 3. 水平扩展 - 可以启动多个 Worker - 自动负载均衡
Server(嘴巴)
职责:1. RESTful API - 提供 HTTP 接口 2. 实时推荐 - 处理用户请求 - 返回推荐结果 3. 在线更新 - 实时插入反馈 - 动态调整推荐
用户行为 → Server → DataStore (MySQL) ↓ Master 定期加载数据 ↓ 训练模型 ↓ Worker 计算推荐 → CacheStore (Redis) ↓ Server 读取缓存 ↓ 返回给用户
构建一个简单的电影推荐系统:
#!/bin/bash# movie_recommendation.shBASE_URL="http://localhost:8088"echo "🎬 开始构建电影推荐系统..."# 1. 创建用户echo "1️⃣ 创建用户..."users=("alice:female,student" "bob:male,engineer" "charlie:female,designer"
"david:male,teacher" "eve:female,doctor")for user in "${users[@]}"; do
IFS=':' read -r id labels <<< "$user"
curl -s -X POST $BASE_URL/api/user \
-H "Content-Type: application/json" \
-d "{\"UserId\": \"$id\", \"Labels\": [\"${labels//,/\",\"}\"]}" > /dev/null echo " ✓ 创建用户: $id"done# 2. 创建电影echo "2️⃣ 创建电影..."movies=( "inception:scifi,thriller:诺兰烧脑神作"
"interstellar:scifi,drama:星际穿越"
"dark_knight:action,thriller:黑暗骑士"
"matrix:scifi,action:黑客帝国"
"titanic:romance,drama:泰坦尼克号")for movie in "${movies[@]}"; do
IFS=':' read -r id labels comment <<< "$movie"
curl -s -X POST $BASE_URL/api/item \
-H "Content-Type: application/json" \
-d "{
\"ItemId\": \"$id\",
\"Labels\": [\"${labels//,/\",\"}\"],
\"Categories\": [\"movie\"],
\"Comment\": \"$comment\"
}" > /dev/null echo " ✓ 创建电影: $comment"done# 3. 插入反馈echo "3️⃣ 插入用户反馈..."feedbacks='[
{"UserId": "alice", "ItemId": zuqiu.zuqiu.zuzb.info"inception", "FeedbackType": "like"},
{"UserId": "alice", "ItemId": "interstellar", "FeedbackType": "like"},
{"UserId": "bob", "ItemId": "dark_knight", "FeedbackType": "like"},
{"UserId": "bob", "ItemId": "matrix", "FeedbackType": "like"},
{"UserId": "charlie", "ItemId": "titanic", "FeedbackType": "like"}
]'curl -s -X POST $BASE_URL/api/feedback \
-H "Content-Type: application/json" \
-d "$feedbacks" > /dev/nullecho " ✓ 插入了 5 条反馈"# 4. 等待系统计算echo "4️⃣ 等待系统计算推荐..."sleep 15# 5. 获取推荐echo "5️⃣ 获取推荐结果..."for user in "alice" "bob" "charlie"; do
echo ""
echo "📺 为 $user 推荐:"
curl -s "http://localhost:8088/api/recommend/$user?n=3" | jq -r '.[]'doneecho ""echo "✅ 电影推荐系统构建完成!"
$ bash movie_recommendation.sh 🎬 开始构建电影推荐系统... 1️⃣ 创建用户... ✓ 创建用户: alice ✓ 创建用户: bob ... 2️⃣ 创建电影... ✓ 创建电影: 诺兰烧脑神作 ✓ 创建电影: 星际穿越 ... 3️⃣ 插入用户反馈... ✓ 插入了 5 条反馈 4️⃣ 等待系统计算推荐... 5️⃣ 获取推荐结果... 📺 为 alice 推荐: dark_knight matrix titanic ✅ 电影推荐系统构建完成!
为什么 alice 会收到这些推荐?
alice 喜欢: - inception (scifi, thriller) - interstellar (scifi, drama) 推荐逻辑:1. dark_knight (action, thriller) └─ 因为:和 inception 都有 thriller 标签2. matrix (scifi, action) └─ 因为:和 interstellar 都有 scifi 标签3. titanic (romance, drama) └─ 因为:和 interstellar 都有 drama 标签
最低要求:
用户数:≥ 100物品数:≥ 100反馈数:≥ 1000推荐:用户数:≥ 1000物品数:≥ 1000反馈数:≥ 10000
冷启动策略:
数据不够时,使用:1. 热门推荐2. 最新推荐3. 基于内容的推荐(标签匹配)
实时更新(秒级):- 用户反馈立即生效- 从推荐中移除已看过的快速更新(5分钟):- 更新缓存- 调整推荐顺序全量更新(1小时):- 重新训练模型- 重新计算所有推荐
1. 增加数据维度
{
"UserId": "alice",
"Labels": ["female",gov.www.yj.jrzb2.info "25-30", "tech", "movies"], // 丰富的标签
"Comment": "Software engineer who loves sci-fi" // 描述}
2. 使用多种反馈类型
like: 喜欢(强信号)view: 浏览(弱信号)buy: 购买(最强信号)
3. 调整推荐策略
[recommend.ranker]type = "fm" # 使用 FM 模型重排序recommenders = [ "collaborative", # 协同过滤 "item-to-item", # 物品相似 "non-personalized" # 热门推荐
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3107232/ ,如需转载,请注明出处,否则将追究法律责任。