Repository navigation
Releases
feng-30m 4.0 / 4.0-embed
feng-30m 4.0 / 4.0-embed(2026-10-18)
版本命名
- 测试版本:
x.y-yyyymmddC(C 按 A–Z 排当天小版本) - PC 发布版本:
x.y - 手机 / ESP32 发布版本:
x.y-embed
本次:PC 4.0,手机/ESP32 4.0-embed(测试版 4.0-20261018H)。
4.0-embed
4.0B 的 attention/FFN + v3.19-embed 的 tied embedding/lm_head,同尺寸 14.93MB。
| 指标 | v3.19-embed | 4.0-embed |
|---|---|---|
| PPL(v4_val) | 107.49 | 102.99 |
| 留出 200 题 | 83 | 85 |
| 长文 128 | 106 | 108 |
| Q4 32 题 + 召回 | 27/27 + 4/4 | 27/27 + 4/4 |
板端:tool 13/13、记忆 24/24、多轮 10/10;固件 280,736 B;q2/2048 单次 forward
1.58s(双核按 head 切分)。
包
feng-30m-v4.0-release.zip:PC 4.0 HF 权重 + 教师数据feng-30m-v4.0-embed-release.zip:4.0-embed Q4 权重 + tokenizerfeng-30m-v4.0-engine.zip:严格 C23 核心 + C++23 驱动feng-30m-v4.0-embed-firmware.zip:固件 + 4.0-embed 权重 + 烧录说明
PC 权重较大,走 Hugging Face / ModelScope;Gitee 只传后三个包。
v3.19(PC:定向教师数据修模板串台,留出 16→19)
feng-30m v3.19 —— 定向教师数据修"模板串台"
PC 端当前推荐版本(HF 权重 + 数据集)。 板端请用
v3.19-embed。
这一版做了什么
留出 30 题的失败不是"知识不够",而是模板串台:
把 1 到 5 倒着数 → 好的,我记住了(记忆模板);我和朋友吵架了 → 抱歉,这个我不能帮你(拒答模板);
太阳是什么? → 太阳是太阳。v3.18 用手写模板答案修,只是把失败换位置。
v3.19 改为:442 条定向提示词(常识/列举/造句/情绪/寒暄/推理/身份六类,自动剔除留出题原句)
交给 27B 教师自由作答,再用 440 条教师答案做末 2 层 15 epoch 微调(含多轮/身份回放)。
实测(留出 30 题是开发集;判定器 strict-v5)
| 指标 | v3.14 | v3.19 |
|---|---|---|
| 留出 30 题 | 16/30 | 19/30 |
| 范围 / 身份 / 探针 42 | 10/10 | 12/12 | 42/42 | 同 |
| 针检索单类别 | 108/128 | 110/128 |
| 针检索多类别 | 107/128 | 105/128 |
| 记忆 24 题 | 24/24 | 23/24 |
如实写的代价:多类别检索 -2、记忆 -1;留出题被多轮迭代用过,只作版本对比,不是无偏泛化分数。
评测可信度修复(这版的重要部分)
- 判定器三处假阳性(子串误命中"3000万→0度"、"查不到→不会";复读"太阳系太阳系…"误判 OK;
"推荐运动"答《飞屋环游记》里的《冰球》被"球"字误判)修为 strict-v4;
历史数字重算后 16/30、17/30 不变;本版 20/30 在收窄"运动"期望词后修正为 19/30(如实记录); eval_memory.py解码 bug(skip_special_tokens先删<|im_end|>,模型续写的下一轮混进答案)已修,
重跑记忆分数不变。
包内结构
feng-30m-v3.19/
├── USAGE.md
├── LICENSE
├── pc_chat.c
├── MANIFEST.sha256
├── weights/hf/ v3.19 完整权重(fp32 safetensors + 分词器 + chat template)
└── datasets/ 教师蒸馏数据(含本版新增的 v3_19_target_prompts / v3_19_teacher)
附件
2026-10-05 刷新:主包内
USAGE.md/pc_chat.c同步到最新(序列数数 tool + 统一采样器);
权重与数据集未变(model.safetensorssha256C70200C3…,与上一版一致)。
feng-30m-v3.19-release.zip(本页主包)feng-30m-v3.19-engine.zip:PC C 引擎源码(v3.17 引擎 +build_pc_chat.ps1,一条命令编译并跑三套单测)
—— 2026-10-05 刷新:新增序列数数 tool(把 1 到 5 倒着数一遍→5、4、3、2、1。,C 单测 41 项全过)
与统一采样器(1.15 重复惩罚 + no-repeat 3-gram,四个运行时同口径;PC 32 题矩阵输出逐字节不变)
并修掉记忆 tool 的陈述误答 bug(我最喜欢的书是《小王子》不再被工具截走;C/Python 36 回合交叉验证一致)feng-30m-c-engine-model-v3.19-embed.zip:C 引擎预导出模型(Q4+q2 双 QAT,免装 torch);
引擎里实测 32 题矩阵 27/27 + 召回 4/4、算术 21/21、mem12 12/12
许可 Apache-2.0;身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」。
v3.14(tool 版 PC:算式/时间/随机数 0.5s 秒回,记忆 24/24,GGUF 取消)
feng-30m v3.14 —— tool 版(PC)
已被 v3.19 取代
(定向教师数据修模板串台:留出 30 题 16→19,单类别检索 108→110)。
PC 端当前推荐版本(HF 权重 + 数据集)。 板端请用
v3.16-embed(当前板端发布)。
想在 PC 上跑 C 引擎:本页附件 feng-30m-v3.14-engine.zip + feng-30m-c-engine-model-v3.16-embed.zip
即可开箱运行(见下方"最快上手")。
这一版的变化
算术/时间/随机数不再由模型硬算,改由 C 引擎的 tool 直接调用 CPU/SoC 运算器。
起因:用户实测上一版,模型对 59+1、445+15、84+6、5.3+4.1 全错(30M 背不动多位数算术)。
v3.14 把三个 tool 写进 C 引擎(feng_calc.c / feng_tools.c),板端与 PC 共用:
| tool | 触发示例 | 结果 |
|---|---|---|
| 算式 | 4854+4411、5.3+4.1、(3+4)*2 |
0.5 s 秒回,4854 加 4411 等于 9265。 |
| 时间 | 现在几点?、今天几号 |
SNTP 网络时间戳 → UTC+8 日历 |
| 随机数 | 给我个1到100的随机数 |
seed = 运行时间×1.54×1000,丢弃第一个随机数取第二个 |
训练数据里所有纯算式样本已被过滤(scripts/v3_14_build_noarith_mix.py,丢 3,484 条),
模型以后不再学算术。
GGUF 发行取消:llama.cpp 路径没有这些 tool,本包不再提供 GGUF;
PC 运行时请用仓库自带的 C 引擎(esp32s3-feng-llm/pc/pc_chat.c,本包根目录也附了一份)
或 Python 脚本(scripts/runtime_tools.py 已接入 chat_student.py / chat_multi.py)。
实测(全部有仓库内日志 / eval JSON 出处)
| 指标 | v3.13 | v3.14 |
|---|---|---|
| 算式/时间/随机数 | 模型硬算(多位数错) | tool 0.5s 全对 |
| 多轮记忆 24 题 | 21/24 | 24/24 |
| 范围 18 题 / 探针 42 题 | 10/10 | 42/42 | 10/10 | 42/42 |
| 身份 12 题 / 多轮 | 12/12 | 1.00 | 12/12 | 1.00 |
| 针检索·单类别 4k/8k/16k/32k | 28/29/29/27 = 113 | 28/28/25/27 = 108(底座换成算术前的 v3.9) |
| 针检索·多类别 | 108 | 107 |
包内结构
feng-30m-v3.14/
├── USAGE.md 使用说明(C 引擎 pc_chat / transformers / Python 脚本)
├── LICENSE Apache-2.0
├── pc_chat.c PC C 引擎聊天运行时(带 tool;完整工程在 esp32s3-feng-llm/)
├── MANIFEST.sha256 全文件 sha256 清单(2026-10-05 重打包)
├── weights/hf/ v3.14 权重(fp32 safetensors + 分词器 + chat template)
└── datasets/ 教师蒸馏数据(不含本地脚本生成数据)
2026-10-05 重打包:包内
USAGE.md/pc_chat.c更新到最新(C 引擎请用板端 QAT 权重或
附件feng-30m-c-engine-model-v3.16-embed.zip),新增MANIFEST.sha256;权重与数据集未变
(model.safetensors、teacher_distill.jsonl等哈希与本地源一致)。
最快上手(C 引擎,自带 tool)
# 1) 下载附件 feng-30m-c-engine-model-v3.16-embed.zip(已导出的 Q4+q2 双 QAT 模型,免装 torch)
# 想自己导:必须用【板端 v3.16-embed 权重包】的 weights/hf —— PC 的 v3.14 HF 权重没做量化感知训练,
# 导出给引擎会退化(同套 32 题矩阵实测 22/27 vs 27/27,见库内 logs/pc_kv_suite32_v3_14pc2_q2b8.txt)
# 2) 下载附件 feng-30m-v3.14-engine.zip,编译
.\build_pc_chat.ps1
.\pc_chat_q2b8.exe ..\feng-30m-c-engine-model
you> 4854+4411
[tool] 4854 加 4411 等于 9265。
you> 现在几点?
[tool] 现在是 2026年10月05日 01:24:15(周一,UTC+8)。边界与注意事项
- GGUF/llama.cpp 没有 tool,v3.14 起不再发行;历史 GGUF 包仍可下载但不推荐。
- 板端的时间 tool 需要宿主对时(脚本连接时自动发
\settime)。 - 记忆是上下文内记忆(2048 token KV),不是持久记忆。
- 代码与权重均为 Apache-2.0;身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」。
附件 feng-30m-v3.14-engine.zip(持续更新:现为 v3.17 引擎)
自包含的 PC C 引擎源码 + build_pc_chat.ps1(编译并跑三套单测)。最新一次刷新(v3.17)包含:
- 记忆 tool:
我叫小明,请记住/我最喜欢的颜色是蓝色/我住在成都/我养了一只乌龟
会被引擎记下;追问由引擎 0.5 s 确定性作答(12 题连续记忆 12/12、"你叫什么名字"永不串名);
\mem查看、\mem clear/\reset清空(只覆盖可枚举句式,未命中的追问仍交给模型);另支持通用键值(书/生日/家乡…,我最喜欢的书是《小王子》 → 我最喜欢什么书?,还支持列出(你还记得什么?)与遗忘(忘掉我的颜色/把记住的都忘掉,遗忘后追问统一答“我不记得了”、重新学习即恢复))。 - 全部推理优化(默认开启,32 题矩阵输出与优化前逐字相同):2048 上下文单次 forward
3.53 s → 2.22 s(-37%)、softmax 169→48 ms、prefill 跳过中间 token 的 lm head。 - 实测(干净解压 → 编译 → 单测):
pc_calc_test32 项、pc_tools_test53 项、pc_mem_test69 项全过;
时间 tool 支持"现在的时间戳是多少?"→ 原始 Unix 秒 + UTC+8。
附件 feng-30m-c-engine-model-v3.16-embed.zip
- C 引擎用的预导出模型(免装 torch):
model.bin(15,659,904 B,Q4 block-64)+tokenizer.bin- 导出元数据;权重为板端双 QAT 版
v3_16/board_p3。
- 导出元数据;权重为板端双 QAT 版
- 包内
README.txt有校验哈希与用法;验收:32 题矩阵 27/27 + 4/4、算术子集 21/21、
mem12 12/12、pc_checkargmax MATCH。
v3.13(PC 记忆版:长上下文 113 + 算术 274 + 记忆 21/24)
已被 v3.14 取代:算式/时间/随机数改由 C 引擎 tool 回答(0.5s 秒回)、记忆 24/24、GGUF 取消发行。
feng-30m v3.13 —— PC 记忆版(长上下文 + 算术 + 多轮记忆)
PC 端当前推荐版本。 板端请用 v3.13-embed。
本包只有 PC 权重(hf + GGUF)与蒸馏数据集,不含 ESP32 分区文件。
这一版做了什么
新增记忆评测(陈述事实 → 追问)后发现:v3.12 只能答对 5/24,大量回答
"我只能看到当前这段对话,之前的聊天我记不住。"。v3.13 用合成的 5,600 条记忆对话
(姓名/颜色/城市/宠物/食物/运动 + 多事实干扰)做末层微调,并与 27 题验收锚点、
算术网格、日常/安全硬锚点混训,把记忆拉起来的同时不掉其他能力。
实测(全部有仓库内日志 / eval JSON 出处)
| 指标 | v3.12 | v3.13 |
|---|---|---|
| 多轮记忆 24 题 | 5/24 | 21/24 |
| 针检索·单类别 4k/8k/16k/32k | 28/29/26/27 = 110 | 28/29/29/27 = 113(并列历史最高) |
| 针检索·多类别 | 108 | 108 |
| 算术网格 281 题 | 275 | 274 |
| 范围 18 题 / 探针 42 题 | 10/10 | 42/42 | 10/10 | 42/42(0 未命中) |
| 身份 12 题 / 多轮 | 12/12 | 1.00 | 12/12 | 1.00 |
记忆示例:我叫小明,请记住 → 好了,我记住了;我叫什么名字? → 你叫小明。;
我最喜欢的颜色是蓝色 → 你最喜欢蓝色。
包内结构
feng-30m-v3.13/
├── USAGE.md 完整使用说明(GGUF / transformers)
├── LICENSE Apache-2.0(代码与权重同许可)
├── weights/
│ ├── hf/ v3.13 完整权重(fp32 safetensors + 分词器 + chat template)
│ └── gguf/ Q4_K_M 23.7 MB / Q8_0 30.5 MB / f16 56.8 MB(chat template 已内嵌)
└── datasets/ 教师蒸馏数据(提示词与教师输出;不含本地脚本生成数据)
最快上手
llama-cli -m weights/gguf/feng-30m-Q4_K_M.gguf -p "你是谁?" --jinja -n 96 --temp 0
llama-cli -m weights/gguf/feng-30m-Q4_K_M.gguf -p "7减7等于几?" --jinja -n 32 --temp 0多轮对话请用配套脚本(保持历史):
python scripts/chat_student.py --model weights/hf --prompt "我叫小明,请记住。"
python scripts/chat_multi.py --model weights/hf --turns "我叫小明,请记住;我叫什么名字?"复现(仓库内脚本,完整链路见 CHANGELOG v3.13)
python scripts\v3_13_build_memory.py --out v3_13\memory.jsonl
python scripts\v3_6_sft_patch.py --init v3_12\arith2l3 --patch v3_13\mem_mix2.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 300 --identity-n 80 --out v3_13\mem_pc3 `
--epochs 2 --lr 1.2e-5 --train-last 2
python scripts\eval_memory.py --model v3_13\mem_pc3 --out eval\memory_v3_13pc3.json边界与注意事项
- 记忆是上下文内记忆:靠对话 KV,
\reset/断电重启/上下文写满后会忘;不是持久记忆。 - 记忆 21/24:复杂多事实与少见人名仍会错(属于 30M 容量上限)。
- 32k"文中没有"拒答 61/64 是已知平台;板端权重要用 v3.13-embed(本包没做 KV-QAT)。
- 训练数据只含教师蒸馏数据;代码与权重均为 Apache-2.0。
- 模型身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」;与任何模型厂商无隶属或背书关系。
v3.12(PC 版:算术 170→275/281、单类别检索 110、探针 42/42)
GGUF 已取消发行(v3.14 起):llama.cpp 没有 tool,用本包的 GGUF 时算术/时间/随机数会退化成模型硬算。PC 请改用 v3.14 的 C 引擎运行时。
PC 端已被 v3.13 取代(+多轮记忆 21/24、单类别检索 110→113、长上下文保持)。
feng-30m v3.12 —— PC 版:算术边界修复(末层微调,检索反而涨了)
这是 PC 端的当前推荐版本(长上下文 + 算术)。板端请用 v3.11。
本包只有 PC 权重(hf + GGUF)与蒸馏数据集,不含 ESP32 分区文件。
这一版修了什么
v3.11 给板端补齐了算术边界,但 PC 发布版 v3.9 自己也带着同样的空洞,而且更严重:
281 题算术网格只有 170/281——乘法只有 52/81,0 操作数与「结果 ≤0」的减法全错
(板端实测 0+5 → 10、7-7 → 1)。
修法(只动最后 2 层 + norm,共 4.02M / 29.43M 参数):
- 用 v3.11 生成的完整算术网格 + 验收锚点数据做第一轮末层微调 → 271/281;
- 定点第二轮:10 个漏题 ×30、
×1乘法族 + 加法对照、水的化学式 ×40、易抖锚点
→ 275/281、42 题探针 0 未命中。
实测(全部有仓库内日志 / eval JSON 出处)
| 指标 | v3.9(旧 PC 版) | v3.12 |
|---|---|---|
| 算术网格 281 题(加/减/乘,含 0 与负数) | 170 | 275(加 100/100、减>0 45/45、减=0 10/10、减<0 39/45、乘 81/81) |
| 针检索·单类别 4k/8k/16k/32k | 29/29/23/27 = 108 | 28/29/26/27 = 110 |
| 针检索·多类别 | 28/25/32/23 = 108 | 28/25/32/23 = 108 |
| 「文中没有」拒答(单/多) | 61/64 | 62/64 | 61/64 | 62/64 |
| 范围 18 题 / 探针 42 题 | 10/10 | 42/42 | 10/10 | 42/42(0 未命中 / 0 复读) |
| 身份 12 题 / 多轮 | 12/12 | 1.00 | 12/12 | 1.00 |
llama.cpp Q4_K_M 抽查:
7减7=0、1减4=-3、水的化学式是 H₂O。、身份自述全部正确。
16k 单类别从 23/32 修到 26/32;单类别历史最高仍是 v3.4 的 113/128(v3.12 = 110)。
包内结构
feng-30m-v3.12/
├── USAGE.md 完整使用说明(GGUF / transformers)
├── LICENSE Apache-2.0(代码与权重同许可)
├── weights/
│ ├── hf/ v3.12 完整权重(fp32 safetensors + 分词器 + chat template)
│ └── gguf/ Q4_K_M 23.7 MB / Q8_0 30.5 MB / f16 56.8 MB(chat template 已内嵌)
└── datasets/ 教师蒸馏数据(提示词与教师输出;不含本地脚本生成数据)
最快上手
llama-cli -m weights/gguf/feng-30m-Q4_K_M.gguf -p "你是谁?" --jinja -n 96 --temp 0
llama-cli -m weights/gguf/feng-30m-Q4_K_M.gguf -p "7减7等于几?" --jinja -n 32 --temp 0复现(仓库内脚本,完整链路见 CHANGELOG v3.12)
python scripts\v3_11_build_arith_patch.py --out v3_11\arith_patch2.jsonl
python scripts\v3_11_build_repair.py --suite-log logs\pc_kv_suite32_v3_10p3_q2b8.txt `
--misses eval\arith_v3_11pol4.json --mix --out v3_11\arith_repair.jsonl
python scripts\v3_6_sft_patch.py --init v3_9\stockfix2 --patch v3_11\arith_repair.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 150 --identity-n 80 --out v3_12\arith2l `
--epochs 3 --lr 3e-5 --train-last 2
python scripts\eval_arith.py --model v3_12\arith2l --out eval\arith_v3_12a2l.json
python scripts\v3_11_build_repair.py --suite-log logs\pc_kv_suite32_v3_10p3_q2b8.txt `
--misses eval\arith_v3_12a2l.json --miss-repeat 30 --pc-fix --out v3_12\pcfix2.jsonl
python scripts\v3_6_sft_patch.py --init v3_12\arith2l --patch v3_12\pcfix2.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 100 --identity-n 80 --out v3_12\arith2l3 `
--epochs 4 --lr 1.5e-5 --train-last 2边界与注意事项
- 本版没做 KV-QAT,不要拿它上板(板端 q2 矩阵只有 21/27);板端用 v3.11。
- 32k"文中没有"拒答 61/64 是已知平台(多轮专项训练未突破);32k 正样本单类别 27/32。
- 训练数据只含教师蒸馏数据;本地脚本生成数据不入包。代码与权重均为 Apache-2.0。
- 模型身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」;与任何模型厂商无隶属或背书关系。
v3.11(嵌入式版:算术边界 + Q4 权重/q2 KV 双 QAT)
GGUF 已取消发行(v3.14 起):llama.cpp 没有 tool(算式/时间/随机数),包里的 GGUF 只适合纯聊天。最新版见 v3.14 / v3.14-embed。
板端已被 v3.13-embed 取代(固件多轮上下文 + 跨轮记忆 6/6,矩阵/算术保持满分)。
feng-30m v3.11 —— 嵌入式版(算术边界修复 + Q4 权重/q2 KV 双 QAT)
PC 长上下文请继续用 v3.9;本版是 ESP32-S3 板端用的。
GitHub 的 Latest 仍保留 v3.9(PC 综合最好);板端下载用本包(v3.11 取代 v3.10)。
这一版修了什么
v3.10 的板端功能已经满分,但基础算术有硬缺口:旧 drill 只枚举了「加法 1..9×1..9、
减法结果 ≥1」,于是 0 操作数、a-a=0、a<b 的负数减法从来没进过训练集——
板端实测 7-7 → 4、1-4 → 正数、0+5 → 10。
新增 281 题算术网格评测(scripts/eval_arith.py)实测 v3.10 = 202/281,随后:
- 补完整 0..9 加减 / 1..9 乘网格,边界情况(0 操作数、结果 ≤0)加权 ×4;
- 从全通过的 27 题矩阵日志里抽「题目→通过回答」做验收锚点精修,矩阵拉回满分;
- 关键一步:权重 QAT——训练时用 STE 直接模拟导出器的 Q4 block-64(fp16 scale),
与已有的 q2 KV-QAT 一起做,让模型吃下板端「Q4 权重 + q2 KV」的联合量化误差。
实测(全部有仓库内日志 / eval JSON 出处)
| 指标 | v3.10 | v3.11 |
|---|---|---|
| q2 block8 32 题矩阵(2048 ctx,C 引擎) | 27/27 + 4/4 | 27/27 + 4/4 |
| int8 32 题矩阵 | 27/27 + 4/4 | 27/27 + 4/4 |
| 算术网格 281 题(PC bf16) | 202 | 277(加 100/100、乘 81/81) |
| C 引擎算术子集 21 题(Q4+q2,板端同口径) | — | 21/21(只做 KV-QAT 的中间版只有 12/21) |
| 板端默认 / 情绪日常 / 算术 10 题 | 10/10 | 10/10 | — | 10/10 | 10/10 | 10/10 |
| 范围 18 题 / 探针 42 题 / 身份 / 多轮 | 10/10 | 42/42 | 12/12 | 1.00 | 同 |
| 板端速度 | 1.80 tok/s | 1.81 tok/s |
| PC 针检索(取舍说明) | 单 107 | 多 94 | 单 106 | 多 90 |
板端算术抽查:
7减7=0、1减4=-3、3减5=-2、9加9=18、2减9=-7、7乘8=56全对。
PC 端 32k 弱于 v3.9(v3.11 的权重是为量化前向优化的):长文 PC 推理请用 v3.9。
包内结构
feng-30m-v3.11/
├── USAGE.md 完整使用说明(下载 / GGUF / transformers / 烧录)
├── LICENSE Apache-2.0(代码与权重同许可)
├── weights/
│ ├── hf/ v3.11 完整权重(fp32 safetensors + 分词器 + chat template)
│ ├── gguf/ Q4_K_M 23.7 MB / Q8_0 30.5 MB / f16 56.8 MB(chat template 已内嵌)
│ └── esp32/ model.bin 14.93 MB + tokenizer.bin 413 KB + 参考 logits
└── datasets/ 教师蒸馏数据(提示词与教师输出;不含本地脚本生成数据)
板端烧录(ESP32-S3-WROOM-2-N32R16V:32 MB Octal flash + 16 MB PSRAM)
idf.py -DFENG_USE_Q2_KV=ON build # q2 KV / 2048 上下文固件
idf.py -p COM20 flash
python -m esptool --chip esp32s3 -p COM20 -b 921600 write_flash 0x110000 weights\esp32\model.bin
python -m esptool --chip esp32s3 -p COM20 -b 921600 write_flash 0x1000000 weights\esp32\tokenizer.bin复现(仓库内脚本,完整链路见 CHANGELOG v3.11)
python scripts\v3_11_build_arith_patch.py --out v3_11\arith_patch2.jsonl
python scripts\v3_7_kv_qat.py --init v3_10\qat_pol3 --data v3_11\arith_patch2.jsonl `
--identity-n 100 --out v3_11\pol4 --epochs 2 --lr 1e-5 --batch 24 --max-len 1024
python scripts\eval_arith.py --model v3_11\pol4 --out eval\arith_v3_11pol4.json
python scripts\v3_11_build_repair.py --suite-log logs\pc_kv_suite32_v3_10p3_q2b8.txt `
--misses eval\arith_v3_11pol4.json --out v3_11\repair.jsonl
python scripts\v3_7_kv_qat.py --init v3_11\pol4 --data v3_11\repair3.jsonl `
--identity-n 100 --out v3_11\pol7 --epochs 4 --lr 3e-6 --batch 8 --max-len 2048
python scripts\v3_7_kv_qat.py --init v3_11\pol7 --data v3_11\arith_repair.jsonl `
--identity-n 100 --out v3_11\pol8 --epochs 2 --lr 8e-6 --batch 24 --max-len 1024 --wqat(repair3 / arith_repair 由 scripts\v3_11_build_repair.py 的 --surgical / --mix 生成。)
边界与注意事项
- 不要手动把 v3.11 和 v3.9/v3.10 做权重插值再上板:量化鲁棒性对回插极敏感(掺 20% v3.9 掉到 25/27)。
- 板端上下文是 2048(q2 KV,9.62 MB PSRAM);32k 只在 PC 上可用。
- 训练数据只含教师蒸馏数据(提示词与教师输出);本地脚本生成数据不入包。
- 模型身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」;与任何模型厂商无隶属或背书关系。
- 代码与权重均为 Apache-2.0。
v3.10(嵌入式版:q2 KV / 板端专用)
GGUF 已取消发行(v3.14 起):llama.cpp 没有 tool(算式/时间/随机数),包里的 GGUF 只适合纯聊天。最新版见 v3.14 / v3.14-embed。
已被 v3.11 取代(算术边界修复 + Q4 权重/q2 KV 双 QAT,板端 30/30、算术 21/21)。
feng-30m v3.10 —— 嵌入式版(ESP32-S3 板端专用)
PC 端请继续用 v3.9;本版是给板端的 q2 KV 量化感知版本。
GitHub 的 Latest 仍保留 v3.9(PC 综合最好),v3.10 是板端下载入口。
这是什么
v3.10 = v3.9/stockfix2 底座 + q2 block8 KV-QAT:
- 训练时把 K(RoPE 后)/V 按板端 q2 block8 方案量化再反量化(STE 直通梯度),
在 v3.7 的 5,516 条 QAT 数据上微调,并回放 4k/8k 检索窗口; - 用"取件码长文召回 + 股票拒答"专项数据各训一版,0.5/0.5 soup → q2 矩阵 27/27 + 4/4;
- 用 9,410 条日常/运算/定义数据做低 lr(5e-6 × 2 epochs)回补,把板端 3 处回答漂移修干净,
矩阵仍保持满分。
一句话:把 v3.7 的板端满分搬到 v3.9 的质量底座上。
实测(全部有仓库内日志 / eval JSON 出处)
| 指标 | 结果 |
|---|---|
| q2 block8 32 题矩阵(2048 ctx,C 引擎) | 27/27 + 4/4 |
| int8 32 题矩阵 | 27/27 + 4/4 |
| 板端默认问答 10 题 / 情绪日常 10 题 | 10/10 | 10/10 |
| 范围 18 题 | 10/10 |
| 日常对话探针 42 题 | 42/42(0 未命中、0 复读) |
| 身份 12 题 / 情绪 8 题 / 多轮 | 12/12 | 8/8 | 1.00 |
| 板端速度 | 1.80 tok/s(约 555 ms/token) |
| PC 针检索(附带说明) | 单类别 28/30/28/21 = 107;多类别 30/28/28/8 = 94 |
PC 端 32k 弱于 v3.9(单类别 21/32 vs 27/32):QAT 是为 2048 上下文的板端做的取舍,
长文 PC 推理请用 v3.9 的权重。
包内结构
feng-30m-v3.10/
├── USAGE.md 完整使用说明(下载 / GGUF / transformers / 烧录)
├── LICENSE Apache-2.0(代码与权重同许可)
├── weights/
│ ├── hf/ v3.10 完整权重(fp32 safetensors + 分词器 + chat template)
│ ├── gguf/ Q4_K_M 23.7 MB / Q8_0 30.5 MB / f16 56.8 MB(chat template 已内嵌)
│ └── esp32/ model.bin 14.93 MB + tokenizer.bin 413 KB + 参考 logits
└── datasets/ 教师蒸馏数据(提示词与教师输出;不含本地脚本生成数据)
板端烧录(ESP32-S3-WROOM-2-N32R16V:32 MB Octal flash + 16 MB PSRAM)
# 固件(q2 KV、2048 上下文)
idf.py -DFENG_USE_Q2_KV=ON build
idf.py -p COM20 flash
# 模型分区(换模型只需这两条;偏移与 partitions.csv 一致)
python -m esptool --chip esp32s3 -p COM20 -b 921600 write_flash 0x110000 weights\esp32\model.bin
python -m esptool --chip esp32s3 -p COM20 -b 921600 write_flash 0x1000000 weights\esp32\tokenizer.bin复现(仓库内脚本)
python scripts\v3_7_kv_qat.py --init v3_9\stockfix2 --data v3_7\qat_data.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 280 --identity-n 150 --out v3_10\qat_a `
--epochs 3 --lr 3e-5 --retr v3_8\retr --retr-n "4096:200:2,8192:60:1" --retr-lr 1e-5
python scripts\v3_7_kv_qat.py --init v3_10\qat_a --data v3_7\needle_qat.jsonl `
--out v3_10\qat_b --epochs 8 --lr 2e-5 --max-len 2048 --batch 8
python scripts\v3_7_kv_qat.py --init v3_10\qat_a --data v3_7\needle_stock_qat.jsonl `
--out v3_10\qat_c --epochs 8 --lr 2e-5 --max-len 2048 --batch 8
python scripts\soup_models.py --models "v3_10/qat_b,v3_10/qat_c" --weights "0.5,0.5" --out v3_10\qat_soup
python scripts\v3_7_kv_qat.py --init v3_10\qat_soup --data v3_10\chatfix_all.jsonl `
--identity-n 100 --out v3_10\qat_pol3 --epochs 2 --lr 5e-6 --batch 24 --max-len 1024边界与注意事项
- 不要自己把 v3.10 和 v3.9 做权重插值再上板:q2 抗性对回插极敏感——掺 20% v3.9 就掉到 25/27,
0.5/0.5 掉到 25/27 + 3/4(logs/pc_kv_suite32_v3_10e80_q2b8.txt、...s55...)。 - 板端上下文是 2048(q2 KV,9.62 MB PSRAM);32k 只在 PC 上可用。
- 训练数据只含教师蒸馏数据(提示词与教师输出);本地脚本生成的多轮/补丁/运算数据不入包。
- 模型身份:「我是 feng,一个由个人开发者 jiaheng 独立开发训练的 AI」;与任何模型厂商无隶属或背书关系。
- 代码与权重均为 Apache-2.0。
feng-30m v3.9 — 范围 10/10 + 单类别 108 + 多类别 108 + 对话 42/42(末层微调零代价修复)
GGUF 已取消发行(v3.14 起):llama.cpp 没有 tool(算式/时间/随机数),包里的 GGUF 只适合纯聊天。最新版见 v3.14 / v3.14-embed。
PC 端已被 v3.12 取代(算术 170→275/281、单类别检索 108→110、探针 42/42)。此版本仅作历史留存。
一句话:v3.8 的全面补强版——范围评测 8/10 → 10/10(股票拒答修好),
针检索保持 单类别 108 / 多类别 108,对话 42/42、身份 12/12、多轮 1.00 全部不退。
做法是末层微调:只训练最后 2 层 + norm,用 40 倍的股票拒答数据修行为——
上下文一个点都没掉(全参修复此前的代价是 3–5 个检索点)。
附件
feng-30m-v3.9-release.zip(227 MB,解压 257 MB):
feng-30m-v3.9/
├── README.md / USAGE.md / LICENSE
├── weights/hf/ v3.9 完整权重(fp32 safetensors + 分词器 + chat template)
├── weights/gguf/ Q4_K_M 23.7 MB / Q8_0 30.5 MB / f16 56.8 MB(chat template 已内嵌)
├── weights/esp32/ 板端 model.bin 14.93 MB + tokenizer.bin 413 KB + 参考 logits
└── datasets/ 蒸馏训练数据(教师输出与提示词)
数字(同协议实测)
| 指标 | v3.8 | v3.9 |
|---|---|---|
| 范围 18 题 | 8/10 | 10/10(股票拒答修好) |
| 针检索 单类别 4k/8k/16k/32k | 29/29/23/27 = 108 | 29/29/23/27 = 108 |
| 针检索 多类别 | 28/25/32/23 = 108 | 28/25/32/23 = 108 |
| 「文中没有」拒答(单/多) | 61/64 | 62/64 | 61/64 | 62/64 |
| 日常对话 42 题 | 42/42 | 42/42 |
| 情绪 8 / 多轮 / 身份 12 | 8/8 | 1.00 | 12/12 | 同 |
| C 引擎 vs torch(Q4) | 0.0000 | 0.0000(逐位一致) |
与历史版本对比:单类别最高仍是 v3.4 的 113/128(v3.9 为 108,配对检验不显著);
多类别 108/128 是历史最好;对话 42/42(v3.4 只有 27/42);范围 10/10(v3.4 为 9/10)。
嵌入式的取舍
v3.9 未做 KV-QAT:板端 q2 KV 下 32 题矩阵 21/27 + 召回 4/4,嵌入式仍推荐 v3.7
(q2 KV / 2048 ctx / 32 题矩阵 27/27 + 4/4 / 范围 10/10)。
复现
# v3.8 的上下文管线之后,只加一轮末层微调:
python scripts\v3_6_sft_patch.py --init v3_8\cr10 --patch v3_9\fix_stock.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 150 --identity-n 80 `
--out v3_9\stockfix2 --epochs 5 --lr 3e-5 --train-last 2
python scripts\eval_planA_scope.py v3_9\stockfix2 eval\v3_9_scope_sf2.json已知限制
- 单类别 16k 仍是弱项(23/32;历史最好 v3.4 = 27/32),30M 容量下暂未突破;
- 单类别总量 108 vs v3.4 的 113(差距不显著,但确实存在);
- 嵌入式请用 v3.7。
v3.19-embed(板端:留出 17→19,矩阵/召回/工具/记忆全保持)
feng-30m v3.19-embed —— 板端:留出 30 题 17→19,矩阵/召回/工具/记忆全保持
板端当前推荐版本。 在 v3.16-embed 基础上,用同批 440 条定向教师答案做
Q4 权重 + q2 KV 双 QAT(4 epoch / lr 6e-6)——六组配方里选中的是"双 QAT 强度刚好保住
27 题矩阵与长文召回"的那档(强 QAT 会掉 1 题矩阵,加 noarith 回放会掉 1 题召回,均留在
eval/、logs/ 里)。
实测(同协议)
| 指标 | v3.16-embed | v3.19-embed |
|---|---|---|
| PC 32 题矩阵(q2 block8) | 27/27+4/4 | 27/27+4/4 |
| 长文召回 4 题 | 4/4 | 4/4 |
| 算术子集 21 题 | 21/21 | 21/21 |
| HF 留出 30 题(开发集,strict-v5) | 17/30 | 19/30 |
| HF 记忆 24 题 | — | 24/24 |
| 板端实机工具(时间/随机数/算式) | 13/13 | 13/13(logs/board_tools_time_rand.txt) |
| 板端连续记忆 12 题 | 12/12 | 12/12(logs/board_v3_19b6_memory12.txt) |
| 7 轮换名身份序列 | — | 7/7(logs/esp32_multi.txt,需 --no-reset) |
| 32 轮连续压测(8 问循环 ×4) | — | 32/32 成功(logs/board_v3_19b6_stress32.txt,最深单轮 25.5 s) |
pc_check:argmax MATCH,max|diff|=2.66(纯 Q4 量化误差)。
包内容
weights/hf/—— v3.19-embed 完整权重(fp32 safetensors + 分词器 + chat template)weights/esp32/—— 可直接烧录的model.bin+tokenizer.bin(含参考 logits)datasets/—— 教师蒸馏数据(含 v3.19 定向数据)MANIFEST.sha256
烧录:model.bin → 0x110000、tokenizer.bin → 0x1000000(偏移以 partitions.csv 为准)。
不想装 ESP-IDF:下载本页附件 feng-30m-v3.19-embed-firmware.zip —— 预编译 v3.17 固件
(q2 KV / 2048 ctx + 四个 tool)+ 本版权重 + 哈希与烧录命令,esptool 一次烧完;
固件已在本机同款板卡实测(工具 13/13、记忆 12/12、身份 7/7)。
2026-10-05 刷新:固件新增序列数数 tool(板端实测 把 1 到 5 倒着数一遍 → 5、4、3、2、1。,
0.5 s 秒回;我从1数到100也数不完 这类陈述仍交给模型)。
并统一采样器(1.15 重复惩罚 + no-repeat 3-gram):板端 太阳是什么? 的复读从"太阳系×4"缩短到 ×2,
工具 13/13、身份序列引擎秒回保持。
另修记忆 tool 的陈述误答("我最喜欢的书是《小王子》"由模型自然回应,追问仍 0.5 s 由引擎作答);
板端记忆 12/12、工具 13/13 保持。
复现
python scripts\v3_7_kv_qat.py --init v3_16\board_p3 --data v3_19\patch_target.jsonl `
--mt v3_5d\mt_convs.jsonl --mt-n 300 --identity-n 80 --out v3_19\board6 `
--epochs 4 --lr 6e-6 --batch 24 --max-len 1024 --wqat
python esp32s3-feng-llm\tools\export_model.py --model v3_19\board6 --out esp32s3-feng-llm\model_export_v3_19b6留出 30 题是开发集(被多轮实验使用过),19/30 只作版本对比,不当无偏泛化分数。许可 Apache-2.0。
v3.16-embed(板端:修掉报名字后的身份串名,记忆/工具/矩阵全保持)
已被 v3.19-embed 取代
(留出 30 题 17→19,矩阵 27/27+4/4、召回 4/4、工具 13/13、记忆 12/12 全保持)。
修掉「报名字后的身份串名」:v3.15 修的是"闲聊几轮后问名字"的漂移;v3.16 修的是
用户先自报姓名再问身份的场景——「我叫小明,请记住」→「你叫什么名字?」之前会答
「我叫小明,由个人开发者 jiaheng 开发训练」(把用户的名字当成自己的),现在稳定答
「我叫 feng,由个人开发者 jiaheng 开发训练。」
结果(同协议实测)
| 指标 | v3.15-embed | v3.16-embed |
|---|---|---|
| 6 轮「报名字→问身份」序列 | 对 3/6 | 对 5/6 |
| 板端 12 题连续记忆 | 10/12 | 10/12(持平) |
| 板端 tool 专项(时间/随机数/算式) | 13/13 | 13/13 |
| PC 32 题矩阵(q2 block8) | 27/27 + 4/4 | 27/27 + 4/4 |
| PC 算术子集 | 21/21 | 21/21 |
| PC 多轮回归套件(固件同款采样) | 7/10 | 8/10 |
| PC 12 题连续记忆 | 12/12 | 12/12 |
残余(已记录):8 轮序列里「先问'我叫什么名字'→答你叫小明 → 紧接着问'你叫什么名字'」
仍会答「我叫小明」——30M 容量下"你我指代"的硬残余。
包内容
weights/hf/—— v3.16 完整权重(fp32 safetensors + 分词器 + chat template)weights/esp32/—— 可直接烧录的model.bin+tokenizer.bin(含参考 logits)datasets/—— 教师蒸馏数据(提示词与教师输出;本地生成的补丁数据不入包)
本页另有附件 feng-30m-v3.16-embed-firmware.zip(约 13 MB):预编译 v3.17 固件
(bootloader + 分区表 + app,q2 KV / 2048 ctx)+ 模型 + 哈希与烧录命令——
不用装 ESP-IDF,esptool 一次烧完;固件已在本机同款板卡实测(tool 专项 13/13)。
烧录:model.bin → 0x110000、tokenizer.bin → 0x1000000(偏移以 partitions.csv 为准)。
PC 用户想在 C 引擎里跑同一版双 QAT 权重:直接下载 v3.14 页的附件
feng-30m-c-engine-model-v3.16-embed.zip(已导出model.bin/tokenizer.bin,免装 torch)。
怎么做的(可复现)
# 1) 生成补丁数据(3350 条:报名字→问身份/问名字、双向问名、同类取新、记忆保护)
python scripts\v3_16_build_identity_memory_patch.py --out v3_16\patch3.jsonl `
--name-identity 450 --name-memory 400 --both-ways 600 --recency 600 --cross 350 `
--memory 700 --anchor 250
# 2) 从 v3.15 出发做 Q4 权重 + q2 KV 双 QAT(低 lr,保记忆)
python scripts\v3_7_kv_qat.py --init v3_15\board_ctxid4 --data v3_16\patch3.jsonl `
--identity-n 80 --out v3_16\board_p3 --epochs 1 --lr 1.5e-6 --batch 24 --max-len 2048 --wqat
# 3) 导出板端模型
python esp32s3-feng-llm\tools\export_model.py --model v3_16\board_p3 --out esp32s3-feng-llm\model_export_v3_16p3
# 4) 多轮回归(报名字→问身份/问名字、同类取新、12 题连续记忆)
esp32s3-feng-llm\pc\pc_mt_suite.exe esp32s3-feng-llm\model_export_v3_16p3另含本日全部推理优化(默认开启,32 题矩阵输出与优化前逐字相同):
2048 ctx 单次 forward 3534 → 2224 ms(-37%),softmax 169→48 ms,prefill 跳过中间
token 的 lm head。详见仓库 CHANGELOG.md 的 v3.15-embed 附录。
固件/引擎更新(v3.17,权重不变)
本包的权重仍是 v3.16-embed(未变)。仓库里的固件与 PC C 引擎已升级到 v3.17,
新增记忆 tool(与算式/时间/随机数同一哲学):
- 从
我叫X / 我最喜欢的颜色是Y / 我住在Z / 我养了W / 我的生日是…里抽事实; - 追问(
我叫什么名字?/我最喜欢什么颜色?/我住在哪里?/我养了什么?/你叫什么名字?)
由引擎 0.5 s 确定性作答——板端 12 题连续记忆 12/12、身份永不串名; - 还会列出(
你还记得什么?)与遗忘(忘掉我的颜色/把记住的都忘掉,遗忘后追问统一答
"我不记得了"、重学即恢复);\mem查看、\reset清空; - PC 侧同口径实现在
scripts/runtime_tools.py,PC 引擎附件
feng-30m-v3.14-engine.zip已同步刷新(v3.17)。
烧录:固件从仓库 esp32s3-feng-llm/ 编译(idf.py build),权重仍用本包
weights/esp32/(0x110000 model.bin / 0x1000000 tokenizer.bin)。