系列《为什么 InfiniSQL 是最适合 Agentic 范式的数据语言》第 13 篇
配图:测试环境实测

让 Agent 做机器学习,主流路线是生成 sklearn 代码。看看这条路上 Agent 要跨过多少东西:train_test_split 的参数顺序、fit/transform/fit_transform 的区别、numpy 数组和 DataFrame 的形状匹配、joblib.dump 的路径管理、预测时 feature 顺序必须和训练时一致......每一项都是一类经典 bug。
InfiniSQL 把整条 ML 流水线压成了 4 条语句:
sql
load jsonStr.`jsonStr` as rawData;
-- ① 特征工程:数组 → 向量,仍然是 select
select vec_dense(array(f1, f2, f3, f4)) as features,
cast(label as double) as label
from rawData as trainData;
-- ② 训练:train 表 as 算法.`模型路径`
train trainData as RandomForest.`/models/iris_rf` where
keepVersion="true"
and `fitParam.0.labelCol`="label"
and `fitParam.0.featuresCol`="features"
and `fitParam.0.maxDepth`="4";
-- ③ 模型注册成 SQL 函数
register RandomForest.`/models/iris_rf` as iris_predict;
-- ④ 预测:模型就是一个普通函数
select label as actual,
vec_argmax(iris_predict(features)) as predicted
from trainData as predictions;
测试环境实测:训练集回代 9/9 全部正确。换无监督也是同一套动词------train ... as KMeans 后 register,cluster_of(features) 直接在 select 里给每个点标簇号(实测六个点精确分成两簇)。

三个值得咀嚼的设计
1. 模型的消费形态是"函数",不是"对象"。
sklearn 的模型是一个要被 Python 代码持有的对象(怎么加载、怎么序列化、怎么保证版本一致,全是使用者的事)。InfiniSQL 的模型 register 之后就是一个 UDF------iris_predict(features) 和 upper(name) 在语法地位上没有任何区别。Agent 不需要"模型管理"这个心智模块,它只是在用一个函数。
2. ML 没有打断"表"的世界观。
特征工程是 select,训练输入是表,预测输出还是表。整个 ML 环节插在数据管道中间,上游清洗和下游聚合都不用切换语境。对 Agent 来说这意味着:做 ML 和做 group by 是同一种任务,不存在"从 SQL 模式切换到 Python 模式"的上下文重载。
3. 多组参数一次跑,版本自动管理。
fitParam.0.*、fitParam.1.* 可以并排写多组超参,引擎并行训练返回对比结果;keepVersion="true" 让每次训练自动落成新版本。调参这种最容易让 Agent 陷入循环的活,被语言收敛成了声明式的参数组。
这决定了 Agent 的角色
用 sklearn 的 Agent 是一个机器学习工程师 :管对象、管序列化、管环境依赖。用 InfiniSQL 的 Agent 是一个分析师:它只回答"用什么特征、试哪个算法、看哪个指标"。
前者的错误空间是无限的(任何 Python 代码都可能错),后者的错误空间被文法框死在 train/register/predict 的参数表里------而参数表还能用 !show et/params/RandomForest 现场查(第 7 篇)。
把 ML 从"一段代码"变成"一条语句",Agent 的 ML 能力就从"碰运气"变成了"查表"。
下一篇:!assert 质量门------让管道自己拒绝脏数据。
InfiniSQL 是 InfiniSynapse 数据分析 Agent 底座引擎。RandomForest 与 KMeans 示例均在 Infinity SQL 测试环境实测通过。