今天做了什么
新建notebooks/chapter2/transformers基础.ipynb:markdown 先把 BertTokenizer 的职责写清楚(切 token、查 vocab 映射 id、补[CLS]/[SEP]/[PAD]、生成 attention_mask 与 token_type_ids),代码里用load_dotenv()取HUGGINGFACE_TOKEN、把HF_ENDPOINT指到hf-mirror.com,再from_pretrained("bert-base-chinese")拉下分词器。智能体发展史.ipynb从空文件变成了有代码。真正的大件在notebooks/chapter2/my_news_cls/:config.json(BertForSequenceClassification,id2label体育/财经/旅游)、21128 词表的tokenizer.json、409 MB 的model.safetensors(约 102 M 参数,fp32)——一个三分类中文新闻模型的整模型落盘。(torch基础.ipynb也被重存了一次,内容与 10-10 复盘里那版一致,只是输出刷新。)
优点
- 镜像和 token 都走环境变量。
HF_ENDPOINT=hf-mirror.com在国内是刚需,HF_TOKEN从.env读而不是写死在 cell 里,.gitignore也已经把.env挡掉了——这条链是通的。 - 模型目录是自解释的。权重、config、tokenizer 三样落在同一目录,换台机器
from_pretrained(".../my_news_cls")就能推理,不用回头翻"当初用的哪个分词器"。 config.json里显式写了id2label/label2id(0 体育、1 财经、2 旅游),没留默认的LABEL_0/1/2。分类模型上线最容易翻车的点就是预测出LABEL_1却没人知道它是什么,这一步提前填了。
不足
- 凭据链还留着一个脆点。
os.environ["HF_TOKEN"] = os.environ.get("HUGGINGFACE_TOKEN")
在.env少了HUGGINGFACE_TOKEN时不是降级成匿名访问,而是把HF_TOKEN设成None、
直接抛TypeError(实测:os.environ[x] = None→TypeError: str expected, not NoneType)。
改成判空后再赋值,换台机器才不会栽在这行上。 my_news_cls/还没进.gitignore。现在一个git add -A就会把 409 MB 权重提上去,
加一条*.safetensors就够了。- 目录清单漏了
tokenizer_config.json(367 字节)。它决定from_pretrained("./my_news_cls")
加载哪个 tokenizer 类、特殊 token 怎么处理,既然卖点是"目录自解释",就该列全。 - 小字:复盘里 token 变量名两处写法不同(
HUGGINGFACE_TOKEN/HF_TOKEN),其实代码里是一次
显式映射、不算错,只是读起来像两套变量,统一一下说法。
明天怎么改
- 修掉凭据链的脆点:
.env少了HUGGINGFACE_TOKEN时,现在是HF_TOKEN=None直接抛TypeError。改成先判空:_hf_token=os.environ.get("HUGGINGFACE_TOKEN")if_hf_token:os.environ["HF_TOKEN"]=_hf_token .gitignore加一行,别让 409 MB 权重进仓库:# .gitigonremy_news_cls- 目录清单补全:把
tokenizer_config.json也写进my_news_cls/的说明里(它决定from_pretrained("./my_news_cls")加载哪个 tokenizer 类)。 - cell 2 给个可见输出:末尾加
print(tokenizer),顺便把TqdmWarning的噪音压掉。
一句话
今天把 bert-base-chinese分词器和三分类模型整目录落盘并跑通了,明天只剩给凭据赋值加个判空、把权重挡在 git 之外这两件小事。