结合 PHP‑ORT 构建推荐系统的核心思想是:使用 ONNX 格式的机器学习模型,在 PHP 中本地执行推理,实时给出推荐结果。下面是一个完整的架构设计与实现路径,适合你快速上手。
🎯 场景目标
你想在一个 PHP 网站中实现推荐功能,比如:
- 商品推荐(基于用户浏览历史)
- 视频推荐(基于兴趣标签)
- 内容排序(基于点击率预测)
使用 PHP‑ORT 的好处是:本地执行推荐模型推理,延迟低,无需依赖 Python 或外部服务。
🧱 推荐系统架构(使用 PHP‑ORT)
┌────────────┐│ 客户端 │└────┬───────┘│▼┌─────────────────────┐│ PHP 应用后端 ││ ┌─────────────────┐ ││ │ 收集用户行为数据│ ││ └─────────────────┘ ││ ┌─────────────────┐ ││ │ 调用 PHP-ORT 推理 │ ◄───────┐│ └─────────────────┘ │ │└─────────────────────┘ │▲ ││ │┌───────┴──────┐ ┌────┴────┐│ PHP-ORT 加载 │ │ ONNX 推荐模型 │└──────────────┘ └─────────┘
🔧 实现步骤详解
第一步:准备推荐模型(ONNX)
在 Python 中使用推荐算法(如 LightFM、XGBoost、NeuralCF)训练模型,并导出为 .onnx
格式:
import skl2onnx
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType# 假设用 XGBoost 训练好了点击率模型
model = ... # 训练好的模型
initial_type = [('input', FloatTensorType([None, 10]))]
onnx_model = convert_sklearn(model, initial_types=initial_type)with open("recommender.onnx", "wb") as f:f.write(onnx_model.SerializeToString())
第二步:PHP 中加载模型
在 PHP 安装好 php-ort
扩展后,加载模型:
use Ort\Runtime;
use Ort\Model;
use Ort\Tensor;$modelPath = __DIR__ . '/recommender.onnx';$runtime = new Runtime();
$model = $runtime->loadModelFromFile($modelPath);
第三步:构建用户行为特征输入(Tensor)
假设你使用的是 10 个特征值(如用户性别、年龄、最近浏览品类、浏览时间段等),构造一个输入张量:
$features = [[1.0, 25.0, 0.0, 1.0, 0.0, 0.5, 0.3, 0.0, 1.0, 0.2] // float32[]
];$inputTensor = Tensor::fromArray($features, [1, 10]); // 1 行 10 列
第四步:执行模型推理
$output = $model->run([$inputTensor]);// 输出可能是推荐分数、概率等
$resultTensor = $output[0];
$scores = $resultTensor->toArray();$topItemId = array_keys($scores, max($scores))[0];
第五步:推荐结果反馈到业务系统
$recommendedItem = getItemById($topItemId);
return json_encode(['recommend' => $recommendedItem
]);
✅ 技术优势
优势 | 描述 |
---|---|
⚡ 性能好 | SIMD 加速,低延迟推理 |
💡 可嵌入 | 不需要调用外部 Python 微服务 |
🔐 安全 | 本地部署,不暴露模型接口 |
🔁 可扩展 | 模型可以替换 / 多模型共存 |
🛠️ 提示与建议
- 使用
ONNX Runtime
导出模型时选择小模型、轻量网络(如 XGBoost、MLP); - 输入张量必须为 float32 类型,PHP 端预处理必须精准;
- 模型更新时无需重启 PHP,只需重新加载 ONNX 文件;
- 对于并发调用,可用
RuntimePool
复用模型实例,避免重复加载。
🎁 示例模型推荐(可用于试验)
模型 | 推荐用途 | 是否支持 ONNX 导出 |
---|---|---|
XGBoost | 点击率预估 / 排序 | ✅ |
LightFM | 协同过滤推荐 | ✅ |
MLP | 特征学习推荐 | ✅ |
CatBoost | 分类推荐 | ✅ |
📦 最终你会得到
在 PHP 中完成以下任务:
- 接收用户请求
- 收集用户画像特征
- 构造输入张量并推理
- 输出推荐结果
不依赖外部服务,全栈纯 PHP 完成推荐系统。