news 2026/4/23 14:32:58

模型持久化(二):从 KingbaseES 加载模型,实现离线预测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模型持久化(二):从 KingbaseES 加载模型,实现离线预测

模型持久化(二):从 KingbaseES 加载模型,实现离线预测

——别再让模型“睡在库房”,它该上生产线了

大家好,我是那个总在凌晨被叫醒、因为线上预测服务挂了,又不得不手动从 KES 里捞出模型临时跑批的老架构。上一期我们把训练好的随机森林序列化存进了电科金仓 KingbaseES 的BYTEA字段,解决了“模型去哪儿”的问题。

但存进去只是第一步。
真正的价值,在于“用起来”

今天我们就干一件更硬核的事:从 KES 中加载已持久化的模型,对海量历史数据做离线批量预测,并将结果写回数据库。全程用纯 Java 实现,不依赖 Spark、Flink 或任何外部计算引擎,只为回答那个灵魂拷问:

“你的模型,到底能不能扛住真实业务的吞吐?”


一、为什么需要离线预测?

在国产化项目中,我们常陷入两个极端:

  • 要么只做实时 API 预测(单条请求);
  • 要么把全量数据导出到 Python 脚本跑批。

但现实场景往往是:

  • 每天凌晨对 100 万用户做风险重评
  • 每周对历史交易做反欺诈回溯
  • 每月生成监管报送的模型打分表

这些任务:

  • 数据量大(GB 级);
  • 对延迟不敏感(小时级完成即可);
  • 要求结果可审计、可追溯。

最好的方案,就是直接在 KES 内完成“模型加载 → 批量预测 → 结果写回”闭环


二、KES 表结构准备

假设我们有两张表:

2.1 模型注册表(复用上期)

-- ai_models.model_registry (含 model_blob)

2.2 待预测的用户表

CREATETABLEai_features.user_profiles(user_idBIGINTPRIMARYKEY,ageINT,incomeREAL,debt_ratioREAL,credit_scoreINT,payment_histVARCHAR(10),-- ... 其他特征risk_scoreREAL,-- ← 预测结果(待填充)model_versionVARCHAR(20)-- ← 使用的模型版本);

目标:用最新 active 模型,为所有risk_score IS NULL的用户打分


三、Java 实现:高效批量预测

3.1 分页读取特征数据

避免 OOM,我们按批次读取:

publicList<UserFeature>loadBatch(Connectionconn,longoffset,intbatchSize)throwsSQLException{Stringsql=""" SELECT user_id, age, income, debt_ratio, credit_score, payment_hist FROM ai_features.user_profiles WHERE risk_score IS NULL ORDER BY user_id LIMIT ? OFFSET ? """;List<UserFeature>batch=newArrayList<>();try(PreparedStatementps=conn.prepareStatement(sql)){ps.setInt(1,batchSize);ps.setLong(2,offset);ResultSetrs=ps.executeQuery();while(rs.next()){batch.add(newUserFeature(rs.getLong("user_id"),Map.of("age",newFeatureValue("age",rs.getInt("age")),"income",newFeatureValue("income",rs.getDouble("income")),"debt_ratio",newFeatureValue("debt_ratio",rs.getDouble("debt_ratio")),"credit_score",newFeatureValue("credit_score",rs.getInt("credit_score")),"payment_hist",newFeatureValue("payment_hist",rs.getString("payment_hist")))));}}returnbatch;}

3.2 从 KES 加载模型(复用上期逻辑)

publicRandomForestloadActiveModel(Connectionconn,StringmodelName){// 复用 ModelLoader.loadActiveModelFromKES()}

3.3 批量预测 + 批量写回

publicvoidrunOfflinePrediction(Connectionconn,StringmodelName,intbatchSize)throwsSQLException{// 1. 加载模型RandomForestmodel=loadActiveModel(conn,modelName);StringmodelVersion=getModelVersion(conn,modelName);// 查询 version 字段// 2. 获取待处理总数longtotal=countPendingUsers(conn);System.out.printf("Starting offline prediction for %d users...%n",total);// 3. 分批处理for(longoffset=0;offset<total;offset+=batchSize){List<UserFeature>batch=loadBatch(conn,offset,batchSize);// 批量预测(并行可选)List<PredictionResult>results=batch.parallelStream().map(user->{doubleprob=model.predictProbability(user.features);returnnewPredictionResult(user.userId,prob,modelVersion);}).collect(Collectors.toList());// 批量更新updateRiskScores(conn,results);System.out.printf("Processed %d / %d%n",Math.min(offset+batchSize,total),total);}}

3.4 批量更新结果(使用 PreparedStatement 批处理)

privatevoidupdateRiskScores(Connectionconn,List<PredictionResult>results)throwsSQLException{Stringsql="UPDATE ai_features.user_profiles SET risk_score = ?, model_version = ? WHERE user_id = ?";try(PreparedStatementps=conn.prepareStatement(sql)){for(PredictionResultr:results){ps.setDouble(1,r.riskScore);ps.setString(2,r.modelVersion);ps.setLong(3,r.userId);ps.addBatch();}ps.executeBatch();// ← 关键:批量提交}}

💡性能提示

  • batchSize建议 1000~5000;
  • 开启 JDBC 批处理(KES 驱动默认支持);
  • 在事务中执行,失败可回滚。

四、端到端启动脚本

publicstaticvoidmain(String[]args)throwsException{// 1. 连接 KESConnectionconn=DriverManager.getConnection("jdbc:kingbase8://localhost:54321/ai_prod","ai_user","secure_password");// 2. 启动离线预测OfflinePredictorpredictor=newOfflinePredictor();predictor.runOfflinePrediction(conn,"loan_risk_rf",2000);// 3. 提交事务(或自动提交)conn.close();System.out.println("✅ Offline prediction completed.");}

运行输出:

Starting offline prediction for 1,248,562 users... Processed 2000 / 1248562 Processed 4000 / 1248562 ... Processed 1248562 / 1248562 ✅ Offline prediction completed.

🔗 使用 电科金仓 JDBC 驱动 确保批处理高效执行。


五、工程优化建议

5.1 并行加速

  • 单机多线程:parallelStream()已足够;
  • 分布式扩展:按user_id % N分片,多进程并行读不同 offset。

5.2 内存控制

  • 特征对象轻量化(避免冗余字段);
  • 批次大小动态调整(监控 GC 日志)。

5.3 容错与断点续传

-- 增加状态字段ALTERTABLEai_features.user_profilesADDCOLUMNpred_statusVARCHAR(10)DEFAULT'pending';-- 更新时标记 'completed'

下次启动时只处理pred_status = 'pending'的记录。


六、为什么这适合国产化场景?

  1. 零外部依赖:不引入 Spark/Flink,降低技术栈复杂度;
  2. 资源可控:JVM 内存、CPU 可精确限制,适配国产服务器;
  3. 安全合规:数据不出库,符合金融/政务数据本地化要求;
  4. 运维简单:一个 JAR 包 + 定时任务(如 crontab)即可调度。

而这套能力,正建立在电科金仓 KES 提供的高吞吐 OLTP + 轻量批处理能力之上——它不仅是数据库,更是 AI 批处理引擎。


结语:让模型从“资产”变成“生产力”

在很多项目里,模型训练完就束之高阁,成了 PPT 里的数字。
但真正的 AI 工程化,是让模型每天默默处理百万级请求,为业务创造真实价值

当你能用一段 Java 代码,从 KES 中加载模型,对全量用户做风险评分,并将结果原子写回——你就完成了从“AI 实验”到“AI 生产”的关键一跃。

因为你知道:模型的价值,不在训练时的 AUC,而在上线后的每一条预测

  • 需要适配飞腾/鲲鹏/龙芯的 JDBC 驱动?立即下载
  • 想了解 KES 如何支撑企业级 AI 全流程?点击查看产品介绍

—— 一位相信“模型,不该只活在 notebook 里”的架构师

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

AI写教材必备工具!快速生成低查重教材,节省大量时间精力!

利用 AI 工具高效编写教材 在编写教材的过程中&#xff0c;我总能把握住其中的“慢节奏”&#xff0c;时常面临各种难题。虽然框架和资料都准备得差不多&#xff0c;却总在内容撰写上陷入困境——一句话反复琢磨半小时&#xff0c;始终觉得不够合适&#xff1b;章节间的衔接问…

作者头像 李华
网站建设 2026/4/23 13:10:49

逻辑运算(C++): 从入门到精通,轻松应对各类考试真题

C 逻辑运算&#xff1a;从入门到精通&#xff0c;轻松应对各类考试真题 C 中的逻辑运算符是考试和面试中出现频率极高的部分&#xff0c;尤其是选择题、填空题、程序阅读题、程序填空题、判断题&#xff0c;几乎每套试卷都会涉及。 下面按照从基础到高阶的顺序系统讲解&#…

作者头像 李华
网站建设 2026/4/23 14:20:15

从此告别拖延,AI论文工具 千笔ai写作 VS 笔捷Ai,本科生专属神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。从开题报告到文献综述&#xff0c;从框架搭建到内容生成&#xff0c;越来越多的学生开始借助AI工具提升写作效率、降低学术压力。然而&#xff0c;面对市场上功能各异、质量参…

作者头像 李华
网站建设 2026/4/23 13:11:25

摆脱论文困扰! 10个降AIGC工具测评:自考降AI率必备神器

在当今学术写作日益依赖AI技术的背景下&#xff0c;论文的AIGC率问题成为了自考学生和研究者不得不面对的挑战。无论是初稿撰写还是最终定稿&#xff0c;如何有效降低AI痕迹、避免查重率过高&#xff0c;已经成为一项关键技能。而随着AI降重工具的不断成熟&#xff0c;越来越多…

作者头像 李华
网站建设 2026/4/20 7:58:56

AI写论文快速上手!这4款AI论文生成工具,开启论文写作新体验!

学术写作智能化 - AI论文助手推荐 在2025年&#xff0c;随着学术写作智能化的潮流逐渐兴起&#xff0c;越来越多的人开始尝试使用AI写论文工具。现有的许多AI论文写作工具在处理硕士、博士论文等长篇学术作品时&#xff0c;往往表现欠佳。要么缺少理论的深度&#xff0c;要么逻…

作者头像 李华
网站建设 2026/4/23 13:10:36

机器学习算法之特征工程(数据预处理)的使用场景和使用方法及算法,优化方法,缺点_blog

特征工程新纪元&#xff1a;2024自动化、可解释与实战全景指南 引言在机器学习项目的完整生命周期中&#xff0c;特征工程往往是决定模型性能上限的关键环节&#xff0c;其耗时通常占据整个项目的60%以上。随着AutoML、大模型等技术的冲击&#xff0c;传统“手工炼丹”式的特征…

作者头像 李华