news 2026/10/14 18:10:01

mini-AGI字节级分词器完全指南:256字节+9个结构标记如何读入任意数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mini-AGI字节级分词器完全指南:256字节+9个结构标记如何读入任意数据

【免费下载链接】mini-AGI

Continual learning model trained from scratch on 8GB VRAM laptop with batch-1 stream of data.

项目地址:https://gitcode.com/gh_mirrors/mini/mini-AGI
点击查看免费下载

mini-AGI是一个持续学习的字节级(byte-level)语言模型,它的分词器没有传统词表:整个"字母表"就是256 个字节值 + 9 个结构标记,合计 265 个符号。任何文件、任何语言、任何新数据类型都不需要重新建表——数据天然就能被模型读入。本文带你从零看懂这套字节级分词器的设计、编码过程,以及 9 个结构标记如何让对话、棋局和思考过程各就各位。

🧩 为什么放弃传统分词器:字节级设计的三个好处

传统 LLM 的分词器(BPE 等)需要先"拟合"一份词表:遇到词表外的字符就是 OOV(未登录词),换一类数据往往要重新建表。mini-AGI 把这条路整个砍掉了,核心设计在 minagi/tokenizer.py 的开头就写明了:

"The vocabulary is the 256 byte values plus a handful of structural markers. There is nothing to fall outside it."

由此带来三个直接好处:

  1. 不存在"未知字符"。任何文本按 UTF-8 展开都是 0–255 的字节,全部在表内,中文、emoji、代码、日志统统能读;
  2. 每个数字都是独立 token。这对算术能力很关键——模型能逐数字处理4917 + 388,而不是靠分词器把数字切碎或合并;
  3. 新数据类型不需要新词表。README.md 的原话:"The alphabet is the 256 byte values, so there is no tokenizer to fit and no data type that needs a new vocabulary."

代价是序列变长(一个字符一个 token)——但对一个逐字符推理、上下文 4,096 字符的模型来说,这本来就是它的工作方式。

模型一次读入一个字符(也就一个字节 token),左侧色块是它实际动用的专家计算量。

📦 词表构成:256 字节 + 9 个结构标记

词表只有两类符号,在 minagi/tokenizer.py#L24-L29 中定义:

类别符号ID 范围
字节全部 256 个 byte 值(UTF-8 编码后的原始字节)0–255
结构标记`

、、、、、、、、[END]` | 256–264 |

9 个结构标记的分工:

标记ID作用
`

/| 256 / 257 | "思考"开始与结束(scratchpad,推理语料用) | |/| 258 / 259 | 用户发言的开始与结束 | |/| 260 / 261 | 模型回复的开始与结束 | |/| 262 / 263 | 棋局开始与结束(如<g 1850 1-0> e4 e5 ...) | |[END]` | 264 | 文档结束 |

词表总大小size = 256 + 9 = 265,模型侧也按这个数字构建嵌入层:minagi/create.py#L67 中RecurConfig(vocab_size=265, ...),minagi/recur.py#L64 中nn.Embedding(265, d_model)。

🔍 编码与解码:bytes in, bytes out

ByteTokenizer的编码逻辑非常直白(minagi/tokenizer.py#L45-L52):

  1. 用正则扫描全文,先定位所有结构标记;
  2. 标记之间的普通文本按 UTF-8 编码,一个字节一个 token;
  3. 每个命中的标记整体替换为一个 ≥256 的 ID。

几个例子:

  • "Hi"→[72, 105](2 个 token);
  • "你好"→ 6 个字节 token(UTF-8 下每个汉字占 3 字节);
  • "<bot>\n你好"→[260, 10, ...]——<bot>只占 1 个位置。

解码是逆过程(minagi/tokenizer.py#L57-L70):0–255 的 ID 攒进字节缓冲区,遇到 ≥256 的 ID 就先把缓冲区还原成文本、再整体输出对应的标记字符串——所以<user>这样的边界在解码时永远不会被拆散。

绿色部分是模型自己写出的内容:每个字符(字节 token)都经过与"读"完全相同的前向路径。

💡 结构标记为什么必须是"单个 token"

这是字节级设计里最有取舍感的一点。代码注释(minagi/tokenizer.py#L20-L23)解释得很清楚:

</think>拼出来要 7 个字节、占 7 个位置,还得让模型去学这条字面字符序列;作为 1 个 token,它就是一个专门表示"正在思考"的嵌入——这才是它真正的含义。

三个实际收益:

  • 信号不需要拼写。标记不是模型在读的"文本",而是关于"模型在做什么"的信号;
  • 永远不会写一半。如果<bot>是 4 个字符,生成时可能只输出<bo就断开;作为单符号,输出要么完整、要么没有;
  • 节省上下文。一轮对话里<user>、</user>、<bot>、</bot>共占 24 个字节位置,现在只占 4 个 token。

模型自己的"自我说明书"也是这么描述的(corpora/self_knowledge.yaml#L500-L512):它们"是字母表中的单个符号,而不是拼写,所以我永远写不出半个标记"。

✅ 如何读入任意数据:零预处理

字节级词表最直接的回报是:文件本身就是模型能读的唯一格式。minagi/ingest.py#L1-L16 把这句话写成了模块注释——"没有要拟合的分词器、没有要建的语料、没有要重跑的预处理"。

实际使用就一条命令:

python3 train.py read ~/notes python3 train.py read ~/src ~/docs --passes 3 --save

读入时的规则(train.py#L593-L609):

  • 目录会递归遍历,node_modules、.git等目录被跳过;
  • 二进制文件靠内容判断而非扩展名:采样前 4096 字节,能按 UTF-8 解码且 >90% 可打印才算文本(minagi/ingest.py#L32-L50);
  • 文件从头读到尾,因为"文档是有顺序的";
  • 文件中若含<user>这类标记,会经由分词器编码成单个 ID,而不是被拆成 6–7 个字符(minagi/ingest.py#L128-L146)——普通文本两条路径结果完全一样。

训练面板上,模型就是对着语料不停读、不停学:

min-run 面板:把模型指向语料目录,它就持续读入并持续学习。

⚙️ 标记如何贯穿训练流水线

分词器不只是"入口",它决定了数据怎么落地、怎么被重放:

环节位置分词器的角色
语料生成corpora/chat.py#L44、corpora/chess_games.py#L108用<user>...<bot>包裹对话轮次、用<g>...</g>包裹棋局,再encode_batch成 uint16 的.bin流
语料落盘corpora/expand.py#L53-L64标记 ID ≥256,直接按 uint8 截断会悄悄变成控制字节、丢掉所有轮次边界;所以必须走tok.decode()还原成文本
运行时加载minagi/tokenizer.py#L82-L89load_tokenizer()读语料的meta.json:"tokenizer": "byte"就返回ByteTokenizer();旧语料才回退到 HuggingFacetokenizers的tokenizer.json
Web 服务serve.py#L145本地对话界面直接用ByteTokenizer()编解码你的消息

注意一个细节:标记 ID 以uint16存储(256–264 超出了 uint8 的范围),这也是每个语料目录的meta.json里要写明"tokenizer": "byte"的原因——它告诉下游"这份数据是字节级词表编码的,别按旧格式解析"。

📌 小结

  • mini-AGI 的分词器 =256 个字节 + 9 个结构标记 = 265 词表,定义在 minagi/tokenizer.py;
  • 字节级 → 没有未知字符、新数据零适配,python3 train.py read <目录>即读即学;
  • 9 个标记是"单符号信号":思考(</think>)、对话轮次(<user>/<bot>)、棋局(<g>)、文档结束([END]),各占 1 个 token、永不拆半;
  • 编码 UTF-8 字节 1:1、解码无损还原;标记以 uint16 存储并由meta.json声明,避免边界被截断丢失。

想动手验证:python3 -m corpora all --limit 5000建一个小语料,再python3 train.py read data/train,你就能亲眼看到"任意数据"如何不经过任何预处理进入模型。

【免费下载链接】mini-AGI

Continual learning model trained from scratch on 8GB VRAM laptop with batch-1 stream of data.

项目地址:https://gitcode.com/gh_mirrors/mini/mini-AGI
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

ESP32-S3+LVGL驱动1.69寸电容触摸屏:初始化、DMA与坐标映射全解

简介&#xff1a;面向嵌入式开发者的ESP32-S3图形界面驱动资源包&#xff0c;聚焦LVGL在1.69寸电容触摸屏上的落地&#xff1a;屏显部分采用ST7789显示控制器&#xff0c;触摸部分由CST816芯片实现&#xff0c;适合希望快速搭建物联网UI、学习LVGL移植或做屏幕驱动二次开发的工…

作者头像 李华
网站建设 2026/10/14 18:09:36

SQL聚合函数与GROUP BY分组查询详解:从COUNT到HAVING的完整实践

1. 聚合函数&#xff1a;SQL 里的"一键统计"到底是怎么算的先别急着上手写 GROUP BY&#xff0c;聚合函数是这一整套逻辑的基石。所谓聚合&#xff0c;就是把多行数据按照某种规则压缩成一行结果&#xff0c;最常见的五个函数是 COUNT、SUM、AVG、MAX、MIN。它们的输…

作者头像 李华
网站建设 2026/10/14 18:09:25

手写HTML5简历:语义化、响应式与打印友好的技术实践

1. 项目概述&#xff1a;为什么一份“手写”的HTML5简历&#xff0c;比PDF和Word更值得花时间折腾最近帮几位刚毕业的朋友改简历&#xff0c;发现一个特别有意思的现象&#xff1a;他们投递的岗位明明写着“前端开发”“UI设计”“数字营销”&#xff0c;可附件却清一色是Word或…

作者头像 李华
网站建设 2026/10/14 18:09:03

vSphere 7 上部署 Tanzu Kubernetes 集群:从 Supervisor 到 TKC 的完整实践

1. 为什么要在 vSphere 7 上跑 Tanzu Kubernetes 集群很多做企业级虚拟化的朋友&#xff0c;第一次听到“在 vSphere 上跑 Kubernetes”时&#xff0c;脑子里冒出来的第一个问题往往是&#xff1a;我直接开几台虚拟机装 kubeadm 不就行了吗&#xff0c;为什么还要折腾 Tanzu&am…

作者头像 李华
网站建设 2026/10/14 18:08:39

ISO/IEC 27002-2022 中文版深度解读:93项控制重构与落地映射指南

简介&#xff1a;ISO/IEC 27002-2022最新中文版是面向信息安全从业者、合规审计人员及ISMS建设团队的标准参考文档&#xff0c;针对2022年2月国际标准化组织发布的新版信息安全控制标准&#xff0c;提供中文试译稿&#xff0c;帮助组织在新环境下落地网络安全、数据安全治理与管…

作者头像 李华
网站建设 2026/10/14 18:07:55

探矿RAG文本清洗实战:从乱码到结构化知识库

直接开聊。这几年给矿区做数据整理&#xff0c;最崩溃的往往不是勘探取样那套流程&#xff0c;而是你攒了一堆钻孔编录、化验报告、储量估算说明&#xff0c;高高兴兴把它们塞进RAG知识库&#xff0c;结果检索一问三不知。不是模型不行&#xff0c;是你喂进去的文本本身就是一堆…

作者头像 李华