Java+AI实战:从零构建智能推荐系统(三)

简介: 教程来源 https://tmywi.cn/category/lvxing.html 本文详解Java+AI智能推荐系统实战,涵盖多路召回、DeepFM排序、Caffeine+Redis多级缓存、异步协同与A/B测试框架,集成特征工程、在线服务优化及数据驱动迭代,适用于推荐、搜索与广告系统。

第五部分:在线推荐服务

5.1 推荐服务实现

// smart-rec-api/src/main/java/com/smartrec/api/service/RecommendService.java
package com.smartrec.api.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.cache.annotation.Cacheable;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 推荐服务
 * 
 * 这是推荐系统的核心服务,协调召回、排序、重排等模块,
 * 为用户生成个性化推荐结果。
 * 
 * 性能优化:
 * 1. 多级缓存:本地缓存(Caffeine) + 分布式缓存(Redis)
 * 2. 异步处理:使用CompletableFuture并行执行
 * 3. 预计算:热门推荐等可提前计算
 */
@Slf4j
@Service
public class RecommendService {

    // 本地缓存(Caffeine)
    private final Cache<Long, List<RecommendItem>> localCache = Caffeine.newBuilder()
        .maximumSize(10000)
        .expireAfterWrite(1, TimeUnit.MINUTES)
        .recordStats()
        .build();

    private final MultiChannelRecallMerger recallMerger;
    private final RankingService rankingService;
    private final ReRankService reRankService;
    private final FeatureExtractor featureExtractor;

    public RecommendService(
            MultiChannelRecallMerger recallMerger,
            RankingService rankingService,
            ReRankService reRankService,
            FeatureExtractor featureExtractor) {
        this.recallMerger = recallMerger;
        this.rankingService = rankingService;
        this.reRankService = reRankService;
        this.featureExtractor = featureExtractor;
    }

    /**
     * 获取个性化推荐
     * 
     * 这是推荐系统的核心流程:
     * 1. 获取用户行为特征
     * 2. 多路召回候选物品
     * 3. 特征提取
     * 4. 排序模型打分
     * 5. 重排(多样性、去重、业务规则)
     * 
     * @param userId 用户ID
     * @param size 推荐数量
     * @param context 上下文信息
     * @return 推荐结果列表
     */
    public List<RecommendItem> recommend(Long userId, int size, ContextInfo context) {
        long startTime = System.currentTimeMillis();

        // 1. 检查本地缓存
        List<RecommendItem> cached = localCache.getIfPresent(userId);
        if (cached != null && !cached.isEmpty()) {
            log.debug("Cache hit for user: {}", userId);
            return cached.subList(0, Math.min(size, cached.size()));
        }

        // 2. 获取用户行为
        List<UserAction> userActions = getUserActions(userId, 100);

        // 如果用户行为为空,返回热门推荐
        if (userActions.isEmpty()) {
            log.info("New user: {}, returning hot recommendations", userId);
            return getHotRecommendations(size);
        }

        // 3. 多路召回
        List<RecallItem> recallItems = recallMerger.merge(userId, userActions, size * 3);
        if (recallItems.isEmpty()) {
            log.warn("No recall items for user: {}", userId);
            return getHotRecommendations(size);
        }

        // 4. 特征提取与排序
        List<RankingItem> rankingItems = new ArrayList<>();
        for (RecallItem recallItem : recallItems) {
            // 提取特征向量
            FeatureVector features = featureExtractor.buildFeatureVector(
                userId, recallItem.getItemId(), context);

            // 模型预测
            float score = rankingService.predict(features);

            rankingItems.add(new RankingItem(recallItem.getItemId(), score));
        }

        // 5. 按分数排序
        rankingItems.sort((a, b) -> Float.compare(b.getScore(), a.getScore()));

        // 6. 重排(多样性调整)
        List<RecommendItem> recommendations = reRankService.rerank(rankingItems, size);

        // 7. 缓存结果
        localCache.put(userId, recommendations);

        long duration = System.currentTimeMillis() - startTime;
        log.info("Recommend for user {} completed in {}ms, {} items returned", 
                 userId, duration, recommendations.size());

        return recommendations;
    }

    /**
     * 获取热门推荐(兜底策略)
     */
    private List<RecommendItem> getHotRecommendations(int size) {
        // 从Redis获取全局热门商品
        List<Long> hotItems = getGlobalHotItems(size);
        List<RecommendItem> results = new ArrayList<>();
        for (Long itemId : hotItems) {
            results.add(new RecommendItem(itemId, 0.5f, "hot"));
        }
        return results;
    }

    private List<UserAction> getUserActions(Long userId, int limit) {
        // 从Redis获取用户最近的行为
        return new ArrayList<>();
    }

    private List<Long> getGlobalHotItems(int limit) {
        // 从Redis获取热门商品列表
        return new ArrayList<>();
    }
}

第六部分:A/B测试框架

6.1 A/B测试实现

// smart-rec-api/src/main/java/com/smartrec/api/abtest/ABTestManager.java
package com.smartrec.api.abtest;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * A/B测试管理器
 * 
 * A/B测试是推荐系统迭代的核心工具,通过对比不同算法、不同模型的效果,
 * 用数据驱动决策,避免"拍脑袋"式优化。
 * 
 * A/B测试的关键要素:
 * 1. 实验分组:实验组和对照组
 * 2. 流量分配:均匀分配或按比例分配
 * 3. 指标评估:CTR、转化率、停留时长等
 * 4. 统计显著性:确保结果不是随机波动
 */
@Slf4j
@Component
public class ABTestManager {

    // 实验配置
    private final Map<String, Experiment> experiments = new ConcurrentHashMap<>();

    public ABTestManager() {
        // 注册实验
        registerExperiment(Experiment.builder()
            .name("ranking_model_v2")
            .description("新版排序模型A/B测试")
            .variants(Map.of(
                "control", 0.5,   // 50%流量使用旧模型
                "treatment", 0.5  // 50%流量使用新模型
            ))
            .defaultVariant("control")
            .build());

        registerExperiment(Experiment.builder()
            .name("recall_strategy")
            .description("召回策略对比")
            .variants(Map.of(
                "itemcf", 0.33,
                "vector", 0.33,
                "hybrid", 0.34
            ))
            .defaultVariant("hybrid")
            .build());
    }

    /**
     * 获取用户所属的实验变体
     * 
     * 使用一致性哈希保证同一用户始终看到同一版本
     */
    public String getVariant(Long userId, String experimentName) {
        Experiment experiment = experiments.get(experimentName);
        if (experiment == null) {
            return null;
        }

        // 使用用户ID哈希分配
        int hash = Math.abs(userId.hashCode() % 100);
        int cumulative = 0;

        for (Map.Entry<String, Double> entry : experiment.getVariants().entrySet()) {
            cumulative += entry.getValue() * 100;
            if (hash < cumulative) {
                return entry.getKey();
            }
        }

        return experiment.getDefaultVariant();
    }

    /**
     * 记录实验指标
     */
    public void trackMetric(Long userId, String experimentName, String metricName, double value) {
        String variant = getVariant(userId, experimentName);
        if (variant == null) return;

        // 将指标发送到监控系统
        String metricKey = String.format("abtest.%s.%s.%s", experimentName, variant, metricName);
        // 记录到Prometheus
        // metricsCollector.record(metricKey, value);

        log.debug("Track metric: {} = {}", metricKey, value);
    }

    private void registerExperiment(Experiment experiment) {
        experiments.put(experiment.getName(), experiment);
        log.info("Registered experiment: {}", experiment.getName());
    }
}

本文通过构建一个完整的智能推荐系统,全面展示了Java+AI项目开发的各个环节:

数据采集:用户行为日志的实时采集和存储

特征工程:用户特征、物品特征、交叉特征的提取和处理

召回算法:协同过滤、向量召回、多路召回合并

排序模型:DeepFM深度学习模型的训练和部署

在线服务:高性能推荐服务的实现和优化

A/B测试:实验框架和效果评估

这个实战项目涵盖了Java+AI的核心技术栈,其设计思想和实现技巧可以复用到搜索系统、广告系统、内容推荐等多种场景。希望本文能帮助你建立起AI工程化的完整知识体系,在实际工作中游刃有余!
来源:
https://tmywi.cn/category/shishang.html

相关文章
|
2月前
|
机器学习/深度学习 缓存 搜索推荐
Java+AI实战:从零构建智能推荐系统(一)
教程来源 https://tmywi.cn/category/jiankang.html 本文详解如何用Java从零构建生产级智能推荐系统SmartRec,覆盖数据采集、特征工程、多路召回、深度排序、重排及A/B测试全链路。聚焦高并发、实时性与可扩展性,助你掌握AI落地核心能力。
|
2月前
|
机器学习/深度学习 搜索推荐 算法
Java+AI实战:从零构建智能推荐系统(二)
教程来源 https://tmywi.cn/category/jiaju.html 本节详解推荐系统核心模块:第三部分“召回算法”涵盖协同过滤(ItemCF)、向量召回(Embedding+ANN)及多路融合策略;第四部分“排序模型”介绍DeepFM——融合FM低阶交叉与DNN高阶特征的CTR预估模型,兼顾可解释性与表达能力。
|
29天前
|
人工智能 弹性计算 安全
2026年阿里云入门级云服务器特惠价格:2核2G38元1年、99元1年,2核4G9.9元1个月、199元1年
阿里云2026年推出四款特惠云服务器,覆盖从个人到企业的多元需求。轻量应用服务器2核2G抢购价仅38元/年,内置WordPress、OpenClaw等镜像,开箱即用,适合个人开发者与学生;2核4G版本9.9元/月起,可一键部署AI助理。经济型e实例99元/年、通用算力型u1实例199元/年,均享"新购续费同价"政策,有效解决后续涨价顾虑。其中e实例不限新老用户,u1实例面向企业用户,活动持续至2027年3月31日。此外还有u2a实例2.5折、九代实例6.4折及百炼Token Plan、JVS Claw等AI产品优惠。
|
1月前
|
人工智能 前端开发 Cloud Native
2026 前端研发效能白皮书:如何利用智能开发助手提升页面构建速度?
在 2026 年的前端开发生态中,页面构建已从手写代码转向“设计即生产”的智能化模式。本文立足阿里云开发者社区,评测年度 AI 编程辅助工具,揭示如何通过多模态解析与智能体协作实现前端产出的量级增长。
181 6
|
1月前
|
人工智能 弹性计算 双11
2026年阿里云最新优惠券领取与使用攻略:企业补贴优惠券、学生无门槛优惠券、百炼先用后返券
2026年阿里云优惠券体系覆盖企业、学生、AI开发者三大核心场景。企业用户可申请迁云补贴和出海扶持(最高10万元),需通过官网活动页或商务经理办理;高校学生完成认证即可领取300元无门槛券,有效期1年,适用于全量公共云产品;百炼大模型用户参与按量达标返券,满20返20、满100返100、满200返200,有效降低AI开发成本。此外还有AI焕新季满减礼包、618/双11阶梯满减等不定期推出的优惠券。善用阿里云优惠券,结合身份精准领券,可实现上云与AI创新成本最优。
|
1月前
|
人工智能 供应链 安全
2026 年全球网络安全威胁态势与关键技术防御研究
本文基于Security Affairs 2026年第576期情报,系统分析Linux无文件远控(QLNX)、Dirty Frag内核提权、AI供应链投毒、Bluekit工业化钓鱼及关键基础设施混合攻击等新型威胁,揭示其内存化、智能化、武器化趋势;提出漏洞治理、供应链管控、钓鱼防御、终端加固、应急响应“五位一体”纵深防御框架,并提供可复现代码与工程化方案。(239字)
533 6
|
2月前
|
人工智能 缓存 API
阿里云AI节省计划是什么?如何订阅购买使用?
阿里云百炼推出AI节省计划,助开发者降本增效:通用型计划支持跨模型抵扣,承诺消费享最高5.3折;另有专属模型计划可选。覆盖Token、工具调用等费用,自动抵扣、灵活生效,显著优化大模型API调用成本。
467 7
|
2月前
|
存储 人工智能 安全
意图共鸣科技:AI记忆链的盲存——你的记忆,只有你能打开
你和AI的对话,平台真能“看不见”吗?意图共鸣科技推出“盲存”技术:数据本地加密后上传,密钥仅用户持有,云端仅存密文。平台变“数据保管员”,无法访问明文,隐私由架构保障而非承诺。用户完全掌控记忆——可查、可导、可删,跨设备同步同样安全。
241 16
|
2月前
|
SQL 关系型数据库 MySQL
EXPLAIN 执行计划:一眼看穿你的SQL慢在哪
数据库小学妹带你轻松掌握SQL性能诊断!通过EXPLAIN查看执行计划,精准识别索引失效、全表扫描(ALL)、key为NULL等瓶颈。聚焦type、key、rows等6个关键字段,结合实战案例与避坑指南(如函数滥用、最左前缀破坏),让优化有的放矢。学完即用,告别盲目调优!

热门文章

最新文章