Skip to content

Releases

feng-30m 4.0 / 4.0-embed

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 17 Oct 12:26

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 权重 + tokenizer
  • feng-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)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 18:59

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.safetensors sha256 C70200C3…,与上一版一致)。

  • 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 取消)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 07:43

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_test 32 项、pc_tools_test 53 项、pc_mem_test 69 项全过;
    时间 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。
  • 包内 README.txt 有校验哈希与用法;验收:32 题矩阵 27/27 + 4/4、算术子集 21/21、
    mem12 12/12、pc_check argmax MATCH。

v3.13(PC 记忆版:长上下文 113 + 算术 274 + 记忆 21/24)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 05:43

已被 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)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 04:54

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 参数):

  1. 用 v3.11 生成的完整算术网格 + 验收锚点数据做第一轮末层微调 → 271/281;
  2. 定点第二轮: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)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 04:40

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,随后:

  1. 补完整 0..9 加减 / 1..9 乘网格,边界情况(0 操作数、结果 ≤0)加权 ×4;
  2. 从全通过的 27 题矩阵日志里抽「题目→通过回答」做验收锚点精修,矩阵拉回满分;
  3. 关键一步:权重 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 / 板端专用)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 03:38

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:

  1. 训练时把 K(RoPE 后)/V 按板端 q2 block8 方案量化再反量化(STE 直通梯度),
    在 v3.7 的 5,516 条 QAT 数据上微调,并回放 4k/8k 检索窗口;
  2. 用"取件码长文召回 + 股票拒答"专项数据各训一版,0.5/0.5 soup → q2 矩阵 27/27 + 4/4;
  3. 用 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(末层微调零代价修复)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 01:55

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,矩阵/召回/工具/记忆全保持)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 19:00

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(板端:修掉报名字后的身份串名,记忆/工具/矩阵全保持)

Choose a tag to compare

@jiaheng0815 jiaheng0815 released this 04 Oct 14:17

已被 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)。