Repository navigation
Basalt 3.6.0 — 统一模型层:Auto 也能筛语言模型
Basalt 3.6.0
Auto 不再只会筛表格模型。这一版在下面加了一层统一模型层,让经典估计器、神经网络和序列语言模型
在同一张筛选表里比较。
- 坐标 —
io.github.9178nekomc:basalt:3.6.0 - 在线文档 — https://9178nekomc.github.io/basalt/
- 运行要求 — Java 21,启动加
--add-modules jdk.incubator.vector - 规模 — 242 个公开类型 / 1550 个公开成员,全部带逐参数说明
一句话的区别
AutoModel tabular = Auto.quickstart(features, labels); // 之前只有这条
AutoModel lm = Auto.sequence(tokenIds); // 现在也能这样
int[] next = lm.generate(seed, 15);两者走的是同一条筛选路径:数据声明任务 → 该任务下的全部求解器打分 → 最优者在全量数据上重训。
新增 basalt.model
| 类型 | 作用 |
|---|---|
Task |
任务族:表格分类、表格回归、序列语言模型。指标语义也在这里,包括把 RMSE 取负 |
Dataset |
表格数据或 token 流。任务由数据声明,不再是 Auto 猜的 |
Solver |
一个可训练候选:能给自己打分,也能在全部数据上拟合 |
Fitted |
训练好的模型:predict 或 generate,按任务二选一 |
ClassicalSolver |
包装注册表里的估计器,用 k 折打分 |
NeuralSolver |
包装「网络 + 训练配方」,用单次留出打分 |
Solvers |
目录,跨模型家族 |
三个设计要点:
- 对称的接口,不对称的评分。 经典求解器交叉验证,神经求解器留出一片数据训一次——五折要对网络训五次,
为了排序候选不值得。这个差异写在文档里,也原样列在筛选表中,而不是抹平成一个数。 - 经典求解器是推导出来的,不是拷贝的。
Solvers按需从Registry生成它们,所以「注册一个
Estimator就能参与筛选」这个承诺依然成立,不需要再包一层。 - 能力按任务区分。 对序列模型调用
predict会抛UnsupportedOperationException,消息里点明它的任务,
而不是返回一个空数组让错误在别处爆掉。
三层的对应变化
- 第一层:
Auto.sequence进入序列领域;AutoModel增加generate与fitted,去掉estimator()
(获胜者可能是网络,返回一个Estimator已经没有意义)。Builder 去掉testFraction和task——
评分策略归求解器,任务归数据集。 - 第二层:
Zoo.charLm提供一个窗口式字符级模型(嵌入 → 展平 → 瓶颈残差块 → 词表投影),
序列家族因此有内置结构可筛。 - 第三层:
Solver与Module两个契约都保持最小。写一个新算法 = 实现Solver并注册;
写一个新结构 = 实现Module的forward与parameters。
其它修正
Estimators.Metric增加CROSS_ENTROPY。所有对指标的穷尽switch随之编译报错,正好把
Estimators与GridSearchCV里两处漏掉的分支补齐。verify.sh的测试编译排除规则从「逐个点名 JUnit 类」改成! -name "*Test.java",
以后新增测试文件不再需要改脚本。
产物
| 文件 | 说明 |
|---|---|
basalt-3.6.0.jar |
标准 jar,含四个平台原生库 |
basalt-3.6.0-all.jar |
Fat jar,无外部依赖 |
basalt-3.6.0-sources.jar |
源码 |
basalt-docs-3.6.0.zip |
离线文档,18 页,解压双击 index.html |
验证
./verify.sh:Rust 单测、javac -Xlint:all零告警、6 套 legacy 测试、Phase 1–3、JUnit 5、6 个编译期拒绝用例UnifiedModelTest8 项:序列筛选与生成、神经候选与估计器同台、注册表联动、能力按任务区分、数据校验AdvancedApiTest9 项:三层 API 各 3 项,含自定义层与自定义算法- 文档:18 页 / 242 类型 / 1550 成员中 1550 有说明 / 0 占位符 / 0 断链