FlashHead: Efficient Drop-In Replacement for the Classification Head in Language Model Inference
论文笔记:FlashHead: Efficient Drop-In Replacement for the Classification Head in Language Model Inference
元信息
| 项目 | 内容 |
|---|---|
| 机构 | Chalmers University of Technology, embedl AB |
| 日期 | March 2026 |
| 项目主页 | HuggingFace Collection |
| 对比基线 | Vocabulary Trimming, SVD-Softmax, Fast Graph Decoder |
| 链接 | arXiv / Code (HuggingFace models) |
一句话总结
将语言模型的分类头重构为基于球面聚类的两阶段检索问题,无需训练即可实现最高 1.75x 推理加速且精度无损。
核心贡献
分类头即检索: 首次将 LM classification head 的 token 预测系统性地重构为 信息检索 问题,通过 球面 K-Means 聚类 embedding 矩阵实现两阶段候选筛选
硬件友好的等大小聚类: 强制等大小聚类约束,使 cluster-to-token 映射可存为 dense tensor,用简单模运算替代 ragged gather,显著降低 GPU 延迟
无训练即插即用: 完全 training-free 的 drop-in 替换方案,在 Llama-3.2/Gemma-3/Qwen-3 上验证,分类头参数减少 87.4%、INT4 推理加速最高 1.75x
问题背景
要解决的问题
语言模型的 classification head(将隐藏向量映射到词表大小的 logits)在小型语言模型中占据高达 60% 参数量和 50% 推理计算量
随着 LLM 向边端设备部署(edge AI),分类头成为推理延迟的主要瓶颈
词表规模持续增长(Llama-3.2 的词表为 128,256),进一步加剧了这一问题
现有方法的局限
Vocabulary Trimming: 按频率裁剪词表,但限制了词表覆盖范围,对稀有/跨语言 token 鲁棒性差(XNLI Top-1 仅 0.51)
SVD-Softmax: 低秩分解加速 softmax,但采样仅在粗近似步骤后进行,高似然 token 之外的概率不可靠(BBH 从 0.38 暴降至 0.13)
Fast Graph Decoder: ANN 搜索替代分类头,但只输出 top-k 候选集,无法建模完整概率分布,不支持概率采样
上述方法(除 Vocabulary Trimming 外)都是在 Transformer 之前的 RNN 时代提出的
本文的动机
分类头本质上是在高维空间中做 最近邻搜索(hidden vector 与所有 token embedding 的内积)
通过 信息检索 中的 multi-probe 策略,可以用远少于全词表的计算量找到最可能的 token
球面聚类后,先对少量聚类中心打分(粗筛),再对候选 token 精确计算(精排),实现两阶段加速
方法详解
整体架构
FlashHead 将稠密分类头 替换为两阶段检索流程:
- Stage 1(粗筛): 计算 hidden vector 与 个聚类中心 的 logits → 选出 个最相关聚类
- Stage 2(精排): 仅对选出聚类中的 个 token 计算精确 logits → 输出 next token
- 计算量: 从 降至 ,其中 ,
核心模块
模块1: 等大小球面 K-Means 聚类
设计动机: 利用 球面 K-Means(基于余弦相似度而非欧氏距离)对 embedding 矩阵 进行离线聚类
等大小约束: 强制每个聚类包含恰好 个 token
- 使 cluster-to-token 映射 可存为 dense tensor
- 通过简单 模运算 实现高效内存访问,无需 ragged gather
- 实验证明等大小聚类同时提升精度(BBH 0.371 → 0.381)和速度(TPOT 0.520 → 0.320 ms)
具体实现:
- 1,000 次迭代内收敛
- Llama-3.2(128K 词表、8,016 聚类)在 A40 GPU 上需约 4 小时
- 聚类结果语义连贯(如 “change/Change/changing” 聚为一簇、“USB/UART/PWM” 聚为一簇)
模块2: Multi-Probe 检索
设计动机: 不同于传统方法只选单个最近聚类,FlashHead 同时探测数百到数千个聚类,通过 multi-probe retrieval 扩大候选覆盖
贪心模式(greedy decoding): 选 centroid logits 最高的 个聚类
采样模式(probabilistic sampling): 基于 softmax 缩放的 centroid logits,通过 无放回采样 选取 个聚类中心
- 统一了 top-token 检索和概率采样,无需学习 层次化分解
模块3: 选择性量化
设计动机: 两阶段结构天然支持 混合精度 策略
具体实现:
- Stage 1(聚类中心打分): 可用 INT4 量化,因为只是粗筛
- Stage 2(token 精确计算): 保持高精度(BF16),自然修正 Stage 1 的量化误差
- 结果: 量化后 BBH 仅从 0.381 微降至 0.379(对比 baseline INT4 的 0.369),TPOT 从 0.320 降至 0.258 ms
模块4: Monte Carlo 概率估计
设计动机: FlashHead 无法一次性计算全词表概率分布,需要通过 Monte Carlo 估计 进行多次采样来逼近完整分布
具体实现: 用于似然评估任务(如 HellaSwag、BoolQ),通过多次独立聚类采样估计每个 token 的边际概率
- 在 10,000 次采样后收敛(BoolQ 的 s.e. < 0.005)
关键公式
公式1: 稠密分类头
含义: 标准分类头将隐藏向量映射到词表大小的 logit 向量
符号说明:
- : token embedding 矩阵, 为词表大小, 为隐藏维度
- : 最后一层的隐藏向量
- : logit 向量
公式2: 贪心解码
含义: 选择 logit 最大的 token 作为下一个生成的 token
公式3: 温度采样
含义: 通过温度缩放 softmax 概率分布后进行随机采样
符号说明:
- : 温度参数,控制分布的尖锐程度
- : 归一化概率向量
公式4: 球面 K-Means 目标函数
含义: 最小化每个 token embedding 与其所属聚类中心的负余弦相似度之和
符号说明:
- : 第 个聚类包含的 token 索引集合
- : 第 个 token 的 embedding 向量
- : 第 个聚类中心(L2 归一化后)
- : 聚类总数
公式5: 聚类中心更新
含义: 聚类中心为组内 embedding 均值的 L2 归一化
符号说明:
- : L2 范数
公式6: 计算复杂度对比
含义: FlashHead 将复杂度从词表大小 降低为聚类数 与探测数 的线性组合
符号说明:
- : 词表大小(如 128,256)
- : 隐藏维度(如 2,048)
- : 聚类数(如 8,016)
- : 探测数/probe 数(如 512)
- : 每个聚类的 token 数
公式7: 边际概率估计
含义: 通过 次独立采样估计 token 在给定 hidden vector 下的边际概率
符号说明:
- : 第 次采样选中的聚类子集
- : Monte Carlo 采样次数(实验中使用 10,000)
- : 在给定聚类子集 下 token 的条件概率
关键图表
Figure 1: FlashHead 算法流程 / Stage 1 & Stage 2
{:width 600}{:width 600}
{:width 600}{:width 600}
说明: FlashHead 算法的两阶段流程。Stage 1 将 hidden vector 与聚类中心矩阵 做内积,筛选出 个最相关聚类(greedy 或 sampling)。Stage 2 从选中聚类中 gather 对应 token embedding ,计算精确 logits 后输出 next token。图中对比了贪心选择(确定性)和概率采样(随机性)两种模式。
Figure 2: Monte Carlo 估计收敛曲线
{:width 600}{:width 600}
说明: Monte Carlo 估计器在 BoolQ 和 HellaSwag 数据集上的收敛行为。横轴为采样次数,纵轴为评估指标。5 次独立聚类实验的平均值(阴影区域为 ±1 标准误差)。约 10,000 次采样后达到稳定收敛,标准误差小于 0.005。
Table 1: LM Benchmark 评估(Llama-3.2-1B-Instruct)
| Method | MMLU-Pro | HellaSwag | IFEval | BoolQ | BBH | TruthfulQA | GSM8K |
|---|---|---|---|---|---|---|---|
| Baseline | 0.18 | 0.59 | 0.45 | 0.69 | 0.38 | 0.36 | 0.46 |
| Vocab. Trimming | 0.18 | 0.53 | 0.35 | 0.65 | 0.37 | 0.36 | 0.46 |
| SVDSoftmax | 0.16 | 0.44 | 0.44 | 0.69 | 0.13 | 0.36 | 0.26 |
| FGD | — | N/A | 0.32 | N/A | — | 0.42 | — |
| FlashHead | 0.18 | 0.59 | 0.45 | 0.69 | 0.38 | 0.36 | 0.46 |
说明: FlashHead 在所有 7 个基准上与 baseline 完全匹配,而竞争方法在多个指标上有显著下降(SVDSoftmax 的 BBH 从 0.38 降至 0.13,Vocab Trimming 的 HellaSwag 从 0.59 降至 0.53)
Table 2: Top-k 命中率(c=8016, p=512)
| Method | Top-1 Alpaca | Top-1 MATH-Hard | Top-1 XNLI | Top-3 Alpaca | Top-3 MATH-Hard | Top-3 XNLI |
|---|---|---|---|---|---|---|
| Baseline | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
| Vocab. Trimming | 0.99 | 0.99 | 0.51 | 1.00 | 1.00 | 0.69 |
| SVDSoftmax | 0.94 | 0.96 | 0.96 | 0.99 | 0.99 | 0.99 |
| FlashHead | 1.00 | 1.00 | 0.97 | 1.00 | 1.00 | 1.00 |
说明: FlashHead 的 Top-1 命中率在英文数据集上达到 100%,多语言 XNLI 为 97%。Vocab Trimming 在 XNLI 上 Top-1 仅 51%,暴露了频率剪裁对跨语言场景的致命缺陷
Table 3: GPU 延迟(ms)— Llama-3.2-1B
| Method | TPOT ↓ | TPOT (BF16) ↓ | TPOT (INT4) ↓ |
|---|---|---|---|
| Baseline | 1.94 | 7.69 | 3.60 |
| Vocab. Trimming | 1.07 (1.81×) | 6.82 (1.13×) | 2.73 (1.32×) |
| SVDSoftmax | 0.61 (3.18×) | 6.36 (1.21×) | 2.27 (1.59×) |
| FGD | N/A | N/A | N/A |
| FlashHead | 0.40 (4.85×) | 6.15 (1.25×) | 2.06 (1.75×) |
说明: FlashHead 在分类头延迟(TPOT)上实现 4.85× 加速,端到端 INT4 推理加速 1.75×。FGD 因依赖 CPU 索引结构无法在 GPU 上运行
Table 4: 跨模型性能与延迟
| Model | BBH ↑ | TPOT ↓ | TPOT (BF16) ↓ | TPOT (INT4) ↓ |
|---|---|---|---|---|
| Llama-3.2-1B | 0.38 → 0.38 | 1.94 → 0.40 (4.9×) | 7.69 → 6.15 (1.2×) | 3.60 → 2.06 (1.8×) |
| Llama-3.2-3B | 0.57 → 0.57 | 2.13 → 0.68 (3.1×) | 18.60 → 17.15 (1.1×) | 7.11 → 5.66 (1.3×) |
| Llama-3.1-8B | 0.71 → 0.70 | 2.72 → 1.21 (2.2×) | OOM | 13.55 → 12.04 (1.1×) |
| Qwen-3-1.7B | 0.45 → 0.45 | 1.61 → 0.45 (3.6×) | 9.97 → 8.81 (1.1×) | 4.85 → 3.69 (1.3×) |
| Gemma-3-270M | 0.27 → 0.27 | 0.99 → 0.37 (2.7×) | 2.52 → 1.90 (1.3×) | 2.38 → 1.76 (1.4×) |
| Gemma-3-1B | 0.38 → 0.38 | 1.66 → 0.52 (3.2×) | 6.77 → 5.63 (1.2×) | 4.12 → 2.98 (1.4×) |
说明: 在 6 个不同模型上验证,BBH 精度几乎无损(8B 模型微降 0.01)。小模型受益最大(Gemma-3-270M 分类头参数占比高达 62.7%)
Table 5: 分类头量化影响
| Method | Precision | BBH ↑ | GPU TPOT ↓ |
|---|---|---|---|
| Baseline | BF16 | 0.381 | 1.433 |
| Baseline | INT4 | 0.369 | 0.486 |
| FlashHead | BF16 | 0.381 | 0.320 |
| FlashHead | INT4 | 0.379 | 0.258 |
说明: FlashHead 的两阶段结构使其对量化更鲁棒——INT4 量化后 BBH 仅下降 0.002(baseline 下降 0.012)
Table 6: 等大小 vs. 不等大小聚类
| Method | BBH ↑ | GPU TPOT ↓ |
|---|---|---|
| 不等大小聚类 | 0.371 | 0.520 |
| 等大小聚类 | 0.381 | 0.320 |
说明: 等大小聚类约束不仅提升了 GPU 效率(1.63×),还意外提高了精度(+0.01 BBH),因为避免了超大聚类的内部混杂
Table 7: 聚类数与探测数的 trade-off
| #Clusters | #Probes | Top-1 Alpaca | Top-1 MATH | Top-1 XNLI | TPOT ↓ | TPOT (BF16) ↓ | TPOT (INT4) ↓ |
|---|---|---|---|---|---|---|---|
| Baseline | - | 1.00 | 1.00 | 1.00 | 1.94 | 7.69 | 3.60 |
| 4,008 | 128 | 0.99 | 0.99 | 0.93 | 0.18 (10.78×) | 5.93 (1.30×) | 1.84 (1.96×) |
| 4,008 | 256 | 0.99 | 0.99 | 0.95 | 0.33 (5.88×) | 6.08 (1.26×) | 1.99 (1.80×) |
| 4,008 | 512 | 1.00 | 1.00 | 0.97 | 0.58 (3.34×) | 6.33 (1.21×) | 2.24 (1.61×) |
| 8,016 | 128 | 0.98 | 0.99 | 0.93 | 0.12 (16.17×) | 5.87 (1.31×) | 1.78 (2.02×) |
| 8,016 | 256 | 0.99 | 1.00 | 0.96 | 0.17 (11.41×) | 5.92 (1.30×) | 1.83 (1.97×) |
| 8,016 | 512 | 1.00 | 1.00 | 0.97 | 0.40 (4.85×) | 6.15 (1.25×) | 2.06 (1.75×) |
| 16,032 | 128 | 0.99 | 1.00 | 0.96 | 0.21 (9.24×) | 5.96 (1.29×) | 1.87 (1.92×) |
| 16,032 | 256 | 0.99 | 0.99 | 0.97 | 0.28 (6.93×) | 6.03 (1.28×) | 1.94 (1.86×) |
| 16,032 | 512 | 1.00 | 1.00 | 0.99 | 0.30 (6.47×) | 6.05 (1.27×) | 1.96 (1.84×) |
说明: 默认配置 c=8,016, p=512 在精度和效率间取得最佳平衡。更多聚类(16,032)可在 XNLI 上达到 0.99 Top-1 但分类头加速反而略降
Table 8: CPU 延迟与参数量
GPU 延迟(同 Table 3)已在上方展示
CPU 延迟(ms):
| Method | TPOT ↓ | TPOT ↓ |
|---|---|---|
| Baseline | 15.92 | 85.75 |
| Vocab. Trimming | 7.74 (2.06×) | 77.56 (1.11×) |
| SVDSoftmax | 30.94 (0.51×) | 100.77 (0.85×) |
| FGD | 4.74 (3.36×) | 74.56 (1.15×) |
| FlashHead | 3.73 (4.27×) | 73.55 (1.17×) |
说明: FlashHead 在 CPU 上同样表现最优。值得注意的是 SVDSoftmax 在 CPU 上反而比 baseline 更慢(0.51×),而 FGD 在 CPU 上得以发挥(3.36× 加速)
参数量:
| Method | Params ↓ | Params ↓ |
|---|---|---|
| Baseline | 263M | 1.236B |
| Vocab. Trimming | 131M | 1.104B |
| SVDSoftmax | 59M | 1.032B |
| FGD | 0.79M | 974M |
| FlashHead | 33M | 1.006B |
说明: FlashHead 将分类头参数从 263M 压缩至 33M(-87.4%),总模型参数减少约 18.6%
Table 9: 跨模型详细基准精度
| Model | Method | MMLU-Pro | BBH | TruthfulQA | IFEval | GSM8k |
|---|---|---|---|---|---|---|
| Llama-3.2-3B | Baseline | 0.31 | 0.57 | 0.57 | 0.57 | 0.77 |
| Llama-3.2-3B | FlashHead | 0.31 | 0.57 | 0.58 | 0.56 | 0.77 |
| Llama-3.1-8B | Baseline | 0.41 | 0.71 | 0.62 | 0.53 | 0.85 |
| Llama-3.1-8B | FlashHead | 0.41 | 0.70 | 0.62 | 0.52 | 0.85 |
| Qwen-3-1.7B | Baseline | 0.38 | 0.45 | 0.47 | 0.24 | 0.13 |
| Qwen-3-1.7B | FlashHead | 0.38 | 0.45 | 0.47 | 0.25 | 0.12 |
| Gemma-3-1B | Baseline | 0.15 | 0.38 | 0.31 | 0.55 | 0.42 |
| Gemma-3-1B | FlashHead | 0.15 | 0.38 | 0.31 | 0.49 | 0.39 |
| Gemma-3-270M | Baseline | 0.09 | 0.27 | 0.31 | 0.32 | 0.02 |
| Gemma-3-270M | FlashHead | 0.09 | 0.27 | 0.32 | 0.30 | 0.02 |
说明: 跨模型家族验证,绝大多数指标保持一致。Gemma-3-1B 在 IFEval(0.55→0.49)和 GSM8k(0.42→0.39)上有轻微下降
Table 10: 聚类鲁棒性(5 次独立运行)
| Metric | Mean ± SD |
|---|---|
| MMLU-Pro | 0.181 ± 0.001 |
| BBH | 0.377 ± 0.004 |
| TruthfulQA | 0.363 ± 0.002 |
| IFEval | 0.452 ± 0.003 |
| GSM8K | 0.465 ± 0.003 |
说明: 5 次不同随机种子的聚类结果高度一致,标准差极小,证明方法对聚类初始化不敏感
Table 11: 各方法超参数
| Method | 关键超参数 |
|---|---|
| Baseline (Llama-3.2-1B) | num_hidden_layers: 16, hidden_size: 2048, vocab_size: 128256 |
| Vocab. Trimming | vocab_size: 64,000 (按频率裁剪) |
| SVDSoftmax | window: 256, top_n: 12,000 |
| Spherical K-Means | n_clusters: 8,016 |
| Fast Graph Decoder | K: 384, ef_search: 300, index_M: 40 |
Table 12: 使用的数据集
| 数据集 | 来源 | 用途 |
|---|---|---|
| Alpaca | tatsu-lab/alpaca | Top-k 命中率评估 |
| MATH-Hard | lighteval/MATH-Hard | Top-k 命中率评估 |
| XNLI | facebook/xnli | 跨语言 Top-k 评估 |
| MMLU-Pro | TIGER-Lab/MMLU-Pro | LM 基准评估 |
| HellaSwag | Rowan/hellaswag | LM 基准评估 |
| IFEval | google/IFEval | 指令跟随评估 |
| BoolQ | google/boolq | LM 基准评估 |
| BBH | BIG-Bench-Hard | LM 基准评估 |
| TruthfulQA | TruthfulQA | LM 基准评估 |
Table 13: Token 聚类示例(8,016 聚类中的 10 个)
| Cluster ID | 代表 Token |
|---|---|
| 661 | change, Change, _change, .change, CHANGE, changing… |
| 1593 | javax, .junit, javafx, TestBed, JUnit… |
| 3824 | district, disturbing, distress, distortion, distraction… |
| 4336 | UART, USB, usb, PWM, USART, uart… |
| 4584 | done, Done, dice, _done, DONE, undone… |
| 5065 | pictureBox, ToolStrip, menuStrip… |
| 5251 | pack, Pack, PACK, packs, pak… |
| 7376 | acceleration, accelerate, accelerated, accelerator… |
| 7656 | check, Check, checks, checking, CHECK… |
说明: 聚类结果在语义和形态上高度连贯。例如 cluster 661 聚集了 “change” 的各种变体,cluster 4336 聚集了嵌入式硬件接口协议
实验
数据集
| 数据集 | 特点 | 用途 |
|---|---|---|
| MMLU-Pro | 多学科选择题 (5-shot) | 知识评估 |
| HellaSwag | 常识推理 (0-shot) | 语言理解 |
| IFEval | 指令跟随 (0-shot) | 指令对齐 |
| BoolQ | 是/否问答 (0-shot) | 阅读理解 |
| BBH | BIG-Bench 难题 (3-shot) | 推理能力 |
| TruthfulQA | 真实性评估 (0-shot) | 事实准确性 |
| GSM8K | 小学数学 (0-shot) | 数学推理 |
| Alpaca / MATH-Hard / XNLI | — | Top-k 命中率评估 |
实现细节
聚类算法: 球面 K-Means,等大小约束,1,000 次迭代
默认配置: c=8,016 聚类, p=512 探测
聚类耗时: Llama-3.2(128K 词表)在 A40 GPU 上约 4 小时(一次性离线)
存储开销: 聚类中心矩阵 + C2T 映射(可忽略)
Monte Carlo 采样: 10,000 次(用于 likelihood-based 评估任务)
硬件: NVIDIA A40 GPU
评估框架: LM Evaluation Harness
可视化结果
聚类在语义空间中形成连贯的 token 组(同词根不同形态聚在一起)
Monte Carlo 估计器在 ~10,000 次采样后稳定收敛,标准误差 < 0.005
INT4 量化几乎不影响 FlashHead 精度,因 Stage 2 的高精度计算自然修正 Stage 1 的量化噪声
批判性思考
优点
真正的 drop-in 替换: 无需重训练、无需修改模型架构,只需离线聚类一次即可永久使用
精度保持优异: 在所有 7 个基准上与 baseline 完全匹配,远超 SVDSoftmax(BBH 0.13)和 Vocab Trimming(HellaSwag 0.53)
GPU + CPU 双端优化: 不像 FGD 只能在 CPU 上运行,FlashHead 在 GPU 和 CPU 上都是最优
理论扎实: 从信息检索角度切入,multi-probe 策略有理论支撑(Multi-Probe LSH)
工程完整度高: 等大小聚类的 dense tensor 设计体现了对 GPU 计算特性的深入理解
局限性
无闭式全词表概率分布: 需要 Monte Carlo 估计,在 likelihood-based 评估任务上引入额外计算
对大模型收益递减: 8B 模型的端到端加速仅 1.13×(INT4),因为分类头占比随模型增大而降低
聚类离线成本不低: 128K 词表需 4 小时 A40 GPU 时间,换模型需要重新聚类
XNLI 多语言场景 Top-1 略降: 0.97 虽然接近但不是 1.00,跨语言 token 的聚类效果可能不如单语言
缺少 batch inference 评估: 所有实验都是 batch_size=1,batch 场景下的加速效果未知
潜在改进方向
投机解码集成: 作者提到这是未来方向,FlashHead 的粗筛可作为 draft model 的轻量替代
自适应探测数: 根据隐藏向量的分布特征动态调整 ,简单 token 用少探测、困难 token 用多探测
跨模型聚类迁移: 不同模型但共享词表时(如 Llama 家族),能否复用聚类结果
与 KV Cache 压缩联合优化: 结合 SnapKV / StreamingLLM 等 KV cache 压缩方法实现全链路加速
可复现性评估
- 代码开源(HuggingFace 模型集合)
- 预训练聚类结果可用
- 训练细节完整(聚类超参数、评估设置全部公开)
- 数据集可获取(全部为公开基准)
关联笔记
基于
Multi-Probe LSH: FlashHead 的 multi-probe 检索策略借鉴了 Lv et al. (2007) 的 Multi-Probe LSH
Spherical K-Means: 核心聚类算法,基于 Dhillon & Modha (2001)
对比
SVD-Softmax: 低秩分解方法,FlashHead 在精度和 GPU 速度上全面超越
Fast Graph Decoder: ANN 搜索方法,仅支持 top-k 输出,无法概率采样
Vocabulary Trimming: 频率剪裁方法,跨语言鲁棒性差
方法相关
classification head: 本文优化的目标模块
Spherical K-Means: 核心聚类方法
Monte Carlo 估计: 全词表概率逼近方法
混合精度: 两阶段选择性量化策略
信息检索: 问题重构的理论基础
硬件/数据相关
edge AI: 目标部署场景
MMLU: 代表性评估基准之一
速查卡片
FlashHead: Efficient Drop-In Replacement for the Classification Head in Language Model Inference
- 核心: 将分类头重构为两阶段球面聚类检索,training-free drop-in 替换
- 方法: 等大小球面 K-Means 聚类 embedding → multi-probe 检索 → 选择性量化
- 结果: 分类头参数 -87.4%,INT4 推理加速 1.75×,7 个基准精度无损
- 代码: HuggingFace Collection
笔记创建时间: 2026-03-24