【LLM Tokenizer】Unigram 分词:反向裁剪的概率模型

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

BPE 和 WordPiece 都是"搭积木":从最小的字符或字节出发,一块块往上垒,直到词表够大。

​ Unigram 恰好相反,它是"剪枝"——从一棵枝繁叶茂的候选树开始,一轮轮剪掉对整体贡献最小的枝条,直到只留下最有价值的那些。

在这里插入图片描述

​ 这个方向上的反转不只是形式上的不同,它带来了一个 BPE 和 WordPiece 都不具备的能力:同一段文本可以有多种合法的切分方式,每种切分都有明确的概率。这让 Unigram 成为三种子词算法中理论框架最自洽的一个。

​ 如果你用过 T5、ALBERT 或 XLNet,你已经在用 Unigram 了。这篇文章带你搞清楚它的原理、实现和独特优势。

一、核心思想:从大到小

1.1 方向反转

  • 先回顾一下 BPE 和 WordPiece 的思路:

    • BPE:初始词表 = 256 个字节 → 每轮合并频率最高的 pair → 词表逐步增大
    • WordPiece:初始词表 = 基础字符集 → 每轮合并 PMI 最高的 pair → 词表逐步增大

    可以看到,两者都是自底向上的构建过程。

  • Unigram 走了相反的路:

    初始词表 = 一个巨大的候选集 → 每轮删掉对似然损失最小的子词 → 词表逐步缩小

    ​ 初始候选词表通常是目标大小的 2~10 倍,包含所有单字符加上从语料中提取的高频子串。然后一轮一轮地"修剪",每轮裁掉 10%~20% 的子词,直到词表缩小到目标大小。

在这里插入图片描述

​ 可以看到,左右两条路径方向相反,但终点相同:都是达到目标词表大小。BPE/WordPiece 每轮只加 1 个子词,需要成千上万轮迭代;Unigram 每轮批量裁掉 10%~20%,收敛快得多。更关键的区别在于"凭什么决定加谁/删谁":BPE 看频率,WordPiece 看 PMI,而 Unigram 看的是删掉某个子词后,整个语料的似然损失有多大—这是一个全局的评估标准,也正是它理论上更自洽的根源。

1.2 为什么要反过来

​ 一个自然的问题:好端端的为什么要反过来?自底向上不是挺好的吗?

​ 反向裁剪有一个核心优势:它天然维护了一个概率模型。在 Unigram 的框架中,词表中每个子词都有一个明确的概率值,任何一种切分方式的概率就是各子词概率的乘积。这意味着:

  1. 编码时,可以用动态规划找到全局最优切分(而非 BPE 的贪心重放或 WordPiece 的贪心最长匹配)
  2. 训练时,有一个清晰的优化目标:最大化语料的似然
  3. 裁剪时,有一个明确的标准:删掉对似然影响最小的子词

​ 整个框架在概率论上是自洽的。而 BPE 和 WordPiece 本质上是启发式算法——它们没有一个全局的优化目标,只是每一步做局部最优的选择。

1.3 "Unigram"这个名字

​ 如果你学过 NLP 基础,“Unigram"这个词大概率是在 N-gram 语言模型里第一次见到的。N-gram 是一种经典的语言模型,用来预测"下一个词是什么”。

  • 常见的N-gram策略:

    • Unigram(一元):假设每个词独立出现,P(w1,w2,...,wn)=∏P(wi)P(w_1, w_2, ..., w_n) = \prod P(w_i)P(w1​,w2​,...,wn​)=∏P(wi​)
    • Bigram(二元):假设每个词只依赖前一个词
    • Trigram(三元):假设每个词依赖前两个词
  • 但 N-gram 和分词器是两个不同层次的东西

    • 分词器解决"怎么切":把文本切成什么样的 token

    • N-gram 解决"切完之后怎么建模":用 token 序列来预测概率。

      它们是上下游关系:先 tokenize,再用 N-gram 建模。

​ Unigram 分词算法假设子词之间完全独立。也就是说每个单词的概率与其前面的任何单词的概率都无关,它只取决于该词在训练文本中所有词出现的频率比例。因此,训练模型实际上就是计算训练文本中所有一元词的这些频率比例。

​ Unigram 分词的巧妙之处在于,它把语言模型的思想反过来用到了分词这一步。用一个 unigram(一元)语言模型来决定"怎么切"。具体来说,它假设子词之间完全独立,这就是概率论中事件独立性的直接应用:独立事件的联合概率等于各自概率的乘积,即 P(A∩B)=P(A)×P(B)P(A \cap B) = P(A) \times P(B)P(A∩B)=P(A)×P(B)。所以一个切分的概率就是各子词概率的乘积,不考虑子词之间的顺序关系。这个假设虽然简单(甚至有些粗糙),但在实践中效果很好,而且让计算变得非常高效。

​ 所以"Unigram 分词"这个名字不只是借了个术语,它是真的把一元语言模型的概率框架下沉到了分词阶段,用概率来指导切分。

二、训练过程详解

2.1 整体流程

​ Unigram 的训练用的是 EM 算法(Expectation-Maximization),交替执行两个步骤:

  • E 步:在当前词表下,估计每个子词的概率

  • M 步:评估每个子词的"重要性",删掉最不重要的那些

    重复直到词表缩小到目标大小。

​ 先看个全貌:训练从一个超大候选词表出发,E 步估概率、M 步裁词表,循环往复直到词表缩到目标大小。下面逐步展开每个环节。

在这里插入图片描述

2.2 初始化:构造候选词表

​ 训练的第一步是构造一个足够大的初始候选词表。

  • 常见做法:

    1. 收集语料中所有单字符(保证任何文本都能被表示)
    2. 提取所有出现过的子串(长度不超过某个上限,比如 16)
    3. 按频率取 top-N 作为初始候选
  • 或者更实用的做法:

    先用 BPE 训练一个大词表,把 BPE 产生的所有子词作为 Unigram 的初始候选。SentencePiece 库的实现就用了这种方式。

  • 初始词表大小通常是目标的 2~10 倍。比如目标 32,000 个子词,初始候选可能有 100,000~300,000 个。

2.3 E 步:估计子词概率

​ 假设当前词表是固定的。对语料中的每个词,用 Viterbi 算法找到最优切分,然后统计每个子词在所有最优切分中的出现次数。

​ 子词 xix_ixi​ 的概率为:
P(xi)=count(xi)∑jcount(xj) P(x_i) = \frac{\text{count}(x_i)}{\sum_j \text{count}(x_j)} P(xi​)=∑j​count(xj​)count(xi​)​
​ 其中,xix_ixi​ 是词表中的某个子词,count(xi)\text{count}(x_i)count(xi​) 是它在所有最优切分中出现的总次数,分母 ∑jcount(xj)\sum_j \text{count}(x_j)∑j​count(xj​) 是所有子词出现次数的总和。

​ 直觉上很好理解:一个子词被用得越多,说明它在当前词表下越"有用",分到的概率就越大。这其实就是最朴素的最大似然估计(MLE),用频率来近似概率。

2.4 M 步:裁剪词表

​ 这是 Unigram 训练的核心。我们需要回答:如果从词表中去掉某个子词,语料的整体似然会下降多少?

​ 语料的似然定义为:
L=∑s∈corpuslog⁡P(x∗∣s) \mathcal{L} = \sum_{s \in \text{corpus}} \log P(\mathbf{x}^* | s) L=s∈corpus∑​logP(x∗∣s)
​ 从里往外拆这个公式:x∗\mathbf{x}^*x∗ 是句子 sss 在当前词表下的最优切分(概率最大的切法),P(x∗)P(\mathbf{x}^*)P(x∗) 是这种切分的概率(按 Unigram 假设就是各子词概率的乘积)。加 log⁡\loglog 是因为概率连乘容易数值下溢,取对数后乘积变成求和,计算更稳定。最外层 ∑s∈corpus\sum_{s \in \text{corpus}}∑s∈corpus​ 对语料中所有句子求和,因为我们要评估的是词表对整个语料的表现,不是单句。

​ 所以 L\mathcal{L}L 的含义就是:用当前词表去切整个语料,每句话都取最优切法,把所有概率(取对数后)加起来。这个值越大,说明当前词表越好。

​ 有了这个"词表好不好"的度量,裁剪的思路就很自然了。对词表中的每个子词 xix_ixi​,算一下去掉它后似然下降多少:
ΔL(xi)=L−L∖xi \Delta\mathcal{L}(x_i) = \mathcal{L} - \mathcal{L}_{\setminus x_i} ΔL(xi​)=L−L∖xi​​
​ 其中 L∖xi\mathcal{L}_{\setminus x_i}L∖xi​​ 是去掉 xix_ixi​ 后,重新对语料做最优切分得到的似然。ΔL(xi)\Delta\mathcal{L}(x_i)ΔL(xi​) 越小,说明去掉 xix_ixi​ 对整体影响越小,这个子词越"不重要"。

​ 然后按 ΔL\Delta\mathcal{L}ΔL 从小到大排序,删掉排在前面的 10%~20% 的子词。但有一条铁律:单字符子词永远不删——它们是兜底的,保证任何文本都能被编码。

2.5 训练示例

​ 用一个具体例子走一遍。假设语料只有两个词:

Corpus出现次数
“low”5
“lower”3
(1)初始化: 构造候选词表(包含所有子串):
长度候选子词个数
单字符l, o, w, e, r5
双字符lo, ow, we, er4
三字符low, owe, wer3
四字符lowe, ower2
五字符lower1

​ 去重后大约 13 个候选子词。假设目标词表大小为 8。

(2) 第一轮E步:估计子词概率

​ 用当前词表对每个词做最优切分,统计子词概率。

​ 初始时每个子词还没有概率,先用均匀分布:每个子词概率 P=1/15P = 1/15P=1/15。

​ 然后用 Viterbi 找最优切分。因为概率都一样,Viterbi 会倾向于用尽量少的子词来切(fewer tokens = fewer probabilities multiplied = higher total probability)。所以:

"low"   → ["low"]         (1 个 token,概率 = 1/15)
"lower" → ["lower"]       (1 个 token,概率 = 1/15)

为什么不切成 ["l", "o", "w"]?因为 3 个 token 的概率是 (1/15)3(1/15)^3(1/15)3,远小于 1 个 token 的 1/151/151/15。

​ 之后统计每个子词的出现次数,计算概率 P(xi)=count(xi)/∑count(xj)P(x_i) = \text{count}(x_i) / \sum \text{count}(x_j)P(xi​)=count(xi​)/∑count(xj​)。

子词出现次数概率
low55/8 = 0.625
lower33/8 = 0.375
其余 13 个00
(3) 第一轮M 步:评估每个子词的重要性。
  • 首先,先来计算当前的语料似然:
    L=∑log⁡P(x∗) \mathcal{L} = \sum \log P(\mathbf{x}^*) L=∑logP(x∗)
    代入可得:
    L=5×log⁡(0.625)+3×log⁡(0.375)=5×(−0.47)+3×(−0.98)=−5.29 \mathcal{L} = 5 \times \log(0.625) + 3 \times \log(0.375) = 5 \times (-0.47) + 3 \times (-0.98) = -5.29 L=5×log(0.625)+3×log(0.375)=5×(−0.47)+3×(−0.98)=−5.29

  • 然后逐个评估。

    • 先看那些概率为 0、当前切分没用到的子词(如 ower、lo、lowe 等):

      去掉它们后,最优切分不变,似然不变,所以 ΔL=0\Delta\mathcal{L} = 0ΔL=0。这些子词是裁剪的首选目标。

    • 再看关键子词:

      • 去掉 lower:"lower" 无法用一个 token 表示,退化为 ["low", "er"]。重新算概率和似然,ΔL\Delta\mathcal{L}ΔL 会有明显下降
      • 去掉 low:"low" 退化为 ["l", "o", "w"],"lower" 也受影响。ΔL\Delta\mathcal{L}ΔL 下降更大
      • 去掉单字符 l、o 等:铁律单字符永远不删
  • 按 ΔL\Delta\mathcal{L}ΔL 从小到大排序,删掉损失最小的(这一轮主要是那些出现次数为 0 的子词)。假设裁掉 20%(3 个),删掉 ower、lowe、owe,词表从 15 缩到 12。

​ 之后,按照(2)-(3)继续迭代: 新一轮 E 步用缩小后的词表重新跑 Viterbi、重新估概率,M 步再裁一批……循环往复,直到词表缩到目标大小 8。

三、编码:Viterbi 最优切分

3.1 所有切分都是候选

​ 这是 Unigram 和 BPE/WordPiece 最根本的区别。

​ BPE 对 tokenization 只有一种确定的编码结果:按合并规则顺序重放。WordPiece 也是类似,贪心最长匹配只有一条路径。但 Unigram 认为所有可能的切分方式都是候选,每种都有概率:

"tokenization" 的可能切分:
  ["token", "ization"]        → P = P(token) × P(ization)
  ["token", "iz", "ation"]    → P = P(token) × P(iz) × P(ation)
  ["to", "ken", "ization"]    → P = P(to) × P(ken) × P(ization)
  ["t", "o", "k", "e", "n", "i", "z", "a", "t", "i", "o", "n"]
                               → P = P(t) × P(o) × ... × P(n)
  ...(还有很多)

​ 编码时选概率最大的那个。但关键是:次优切分也是有意义的,这一点在后面的 Subword Regularization 中会派上大用场。

3.2 概率计算

​ 给定一个词 sss 和一种切分 x=(x1,x2,...,xn)\mathbf{x} = (x_1, x_2, ..., x_n)x=(x1​,x2​,...,xn​),切分概率为:
P(x)=∏i=1nP(xi) P(\mathbf{x}) = \prod_{i=1}^{n} P(x_i) P(x)=i=1∏n​P(xi​)
​ 这就是 Unigram(一元模型)假设的体现,子词之间完全独立,联合概率等于各子词概率的乘积。

​ 编码时要找概率最大的切分:
x∗=arg⁡max⁡xP(x)=arg⁡max⁡x∑i=1nlog⁡P(xi) \mathbf{x}^* = \arg\max_{\mathbf{x}} P(\mathbf{x}) = \arg\max_{\mathbf{x}} \sum_{i=1}^{n} \log P(x_i) x∗=argxmax​P(x)=argxmax​i=1∑n​logP(xi​)
​ 取对数后,乘积变成加法。问题就变成了:在所有合法切分中,找到对数概率之和最大的那个。这是一个标准的最短路径(最长路径)问题,Viterbi 动态规划可以高效求解。

3.3 Viterbi 动态规划

​ 以 "lower" 为例,假设词表和对数概率为:

"l": -3.5, "o": -3.6, "w": -4.5, "e": -3.2, "r": -4.0
"lo": -2.8, "ow": -3.0, "we": -3.1, "er": -2.5, "low": -1.8
"owe": -2.6, "wer": -2.7, "lower": -1.2, "lowe": -2.0
  • 动态规划的核心思路:

    从左到右扫描每个位置,对于每个位置,往回看所有能到达它的子词,选得分最高的那条路径。
    每一步的得分=前一个位置的最优得分+当前子词的对数概率 \text{每一步的得分} = \text{前一个位置的最优得分} + \text{当前子词的对数概率} 每一步的得分=前一个位置的最优得分+当前子词的对数概率

  • 位置 0(起点): 还没开始切,得分为 0。
    score[0]=0.0 \text{score}[0] = 0.0 score[0]=0.0

  • 位置 1(覆盖 “l”): 只有一种方式到达——从位置 0 出发,用子词 "l":
    score[1]=score[0]+log⁡P("l")=0.0+(−3.5)=−3.5 \text{score}[1] = \text{score}[0] + \log P(\text{"l"}) = 0.0 + (-3.5) = -3.5 score[1]=score[0]+logP("l")=0.0+(−3.5)=−3.5

  • 位置 2(覆盖 “lo”): 有两种方式到达:

    从哪来用什么子词计算得分
    位置 1“o”−3.5+(−3.6)-3.5 + (-3.6)−3.5+(−3.6)-7.1
    位置 0“lo”0.0+(−2.8)0.0 + (-2.8)0.0+(−2.8)-2.8

    选最大的:score[2]=−2.8\text{score}[2] = -2.8score[2]=−2.8(来自 "lo")

  • 位置 3(覆盖 “low”): 有三种方式到达:

    从哪来用什么子词计算得分
    位置 2“w”−2.8+(−4.5)-2.8 + (-4.5)−2.8+(−4.5)-7.3
    位置 1“ow”−3.5+(−3.0)-3.5 + (-3.0)−3.5+(−3.0)-6.5
    位置 0“low”0.0+(−1.8)0.0 + (-1.8)0.0+(−1.8)-1.8

    选最大的:score[3]=−1.8\text{score}[3] = -1.8score[3]=−1.8(来自 "low")

  • 位置 4(覆盖 “lowe”): 列举主要候选:

    从哪来用什么子词计算得分
    位置 3“e”−1.8+(−3.2)-1.8 + (-3.2)−1.8+(−3.2)-5.0
    位置 2“we”−2.8+(−3.1)-2.8 + (-3.1)−2.8+(−3.1)-5.9
    位置 1“owe”−3.5+(−2.6)-3.5 + (-2.6)−3.5+(−2.6)-6.1
    位置 0“lowe”0.0+(−2.0)0.0 + (-2.0)0.0+(−2.0)-2.0

    选最大的:score[4]=−2.0\text{score}[4] = -2.0score[4]=−2.0(来自 "lowe")

  • 位置 5(覆盖 “lower”): 列举主要候选:

    从哪来用什么子词计算得分
    位置 4“r”−2.0+(−4.0)-2.0 + (-4.0)−2.0+(−4.0)-6.0
    位置 3“er”−1.8+(−2.5)-1.8 + (-2.5)−1.8+(−2.5)-4.3
    位置 2“wer”−2.8+(−2.7)-2.8 + (-2.7)−2.8+(−2.7)-5.5
    位置 0“lower”0.0+(−1.2)0.0 + (-1.2)0.0+(−1.2)-1.2

    选择最大的:score[5]=−1.2\text{score}[5] = -1.2score[5]=−1.2(来自 "lower")

  • 最优切分:回溯路径,位置 5 直接来自位置 0,所以整个词不切,保留["lower"]。此时,对数概率 -1.2。如果词表中没有 "lower",次优路径是位置 5 来自位置 3、位置 3 来自位置 0,即 ["low", "er"],对数概率 −1.8+(−2.5)=−4.3-1.8 + (-2.5) = -4.3−1.8+(−2.5)=−4.3。

四、三种编码策略的对比

BPEWordPieceUnigram
策略合并规则重放贪心最长匹配Viterbi 最优切分
搜索方式逐条应用规则从左到右,每次选最长动态规划,全局搜索
最优性局部(取决于规则顺序)局部(贪心不保证全局最优)全局最优
需要的信息有序合并规则表词表集合词表 + 概率字典
确定性确定确定可确定可随机

​ 最后一行是 Unigram 最独特的地方,编码可以是随机的。这是因为 Unigram 维护了完整的概率分布,所以编码时有两种选择:

  • 确定性:用 Viterbi 找概率最大的切分,每次结果一样
  • 随机:按概率分布随机采样一种切分,同一段文本每次可能切出不同结果

​ 而BPE 和 WordPiece 做不到随机。它们的编码规则是固定的(合并规则重放 /贪心最长匹配),同一段文本只有唯一的切法。Unigram 因为有概率模型,所有切分方式都有概率,才能做到"随机采样"。

​ 后面,就引出了 Subword Regularization。

五、Subword Regularization:独特的数据增强

5.1 一种输入,多种切分

​ BPE 和 WordPiece 的编码是确定性的:同一段文本,每次编码结果完全一样。但 Unigram 维护了完整的概率分布,除了最优切分,其他切分也有概率。

​ 比如 "unigram" 可能有这些切分:

["uni", "gram"]      → 概率 0.42
["u", "ni", "gram"]  → 概率 0.31
["uni", "g", "ram"]  → 概率 0.18
["u", "n", "i", "gram"] → 概率 0.05
...

​ Kudo(2018)提出的 Subword Regularization 利用了这一特性:训练下游模型时(比如翻译模型),不总是用概率最大的切分,而是按概率分布随机采样一种切分方式。

5.2 为什么有效

​ 同一句话在不同 epoch 中可能被切成不同的子词序列:

Epoch 1: "unigram" → ["uni", "gram"]
Epoch 2: "unigram" → ["u", "ni", "gram"]
Epoch 3: "unigram" → ["uni", "gram"]
Epoch 4: "unigram" → ["uni", "g", "ram"]

​ 这相当于一种数据增强,模型看到了同一语义内容的不同 token 表示。效果类似于图像中的随机裁剪、翻转:让模型不依赖某种特定的"切法",而是学到更鲁棒的表示。

​ Kudo 的实验表明,Subword Regularization 在低资源翻译任务上能带来显著提升(1~2 BLEU)。在数据量大的场景下提升较小,但也不会伤害性能。

六、Unigram 在实际模型中的应用

6.1 SentencePiece

​ 前面讲的都是 Unigram 的算法原理,但实际使用时你不需要自己实现它。Google 开源的 SentencePiece 是目前最主流的子词分词工具库,可以理解为"分词器的工厂":你给它语料,它帮你训练出一个分词器。

​ SentencePiece 解决了一个传统分词工具的痛点:语言无关性。传统的 BPE/WordPiece 实现通常需要先按空格把文本切成词,再对每个词做子词切分。这对英文没问题,但中文、日文这类没有空格分隔的语言就麻烦了。SentencePiece 的做法是把空格也当作普通字符(用 ▁ 替换),直接在原始文本上训练,不需要预先分词,对所有语言一视同仁。

​ SentencePiece 同时支持 BPE 和 Unigram 两种模式,Unigram 算法的提出者 Kudo 本人就是 SentencePiece 的作者:

模型SentencePiece 模式
T5Unigram
ALBERTUnigram
XLNetUnigram
LLaMABPE
MistralBPE

6.2 为什么 T5 选了 Unigram

​ T5(Text-to-Text Transfer Transformer)选择 Unigram 有几个原因:

  1. 多语言支持:T5 的 mC4 数据集覆盖 101 种语言,Unigram + SentencePiece 的语言无关性正好适合
  2. Subword Regularization:T5 在训练时利用了随机采样切分,增强了模型的鲁棒性
  3. 概率框架:Unigram 的全局最优切分在 seq2seq 任务中表现稳定

6.3 为什么 LLM 时代 BPE 更流行

​ 尽管 Unigram 理论上更优美,但在当下的 LLM 赛道上,BPE 是绝对主流。

  1. 工程简洁性:BPE 的合并规则就是一个有序列表,Unigram 需要维护概率字典 + EM 迭代 + Viterbi
  2. 确定性编码:LLM 推理需要确定性,Subword Regularization 在推理时反而是负担
  3. 字节级兜底:BPE 从字节出发永远不会 OOV,Unigram 需要单字符兜底(实践中差别不大)
  4. 生态惯性:GPT 系列奠定了 BPE 的主导地位

七、总结

7.1 核心要点

  1. Unigram 是唯一的"自顶向下"子词算法——从大词表开始裁剪,而非从小词表开始合并
  2. 训练用 EM 算法:E 步估计子词概率,M 步裁掉对似然损失最小的子词
  3. 编码用 Viterbi 动态规划,在所有可能的切分中找全局最优,而非贪心的局部最优
  4. 独有的 Subword Regularization:同一文本可以有多种切分,训练时随机采样相当于数据增强
  5. “Unigram”= 一元模型:假设子词独立,切分概率 = 各子词概率的乘积

7.2 三种算法速查对比

维度BPEWordPieceUnigram
训练方向自底向上(合并)自底向上(合并)自顶向下(裁剪)
选择标准频率最高的 pairPMI 最高的 pair删除后损失最小的子词
编码策略合并规则重放贪心最长匹配Viterbi 最优切分
编码确定性确定确定可确定可随机
理论框架启发式启发式概率模型(EM + Viterbi)
代表模型GPT、LLaMABERTT5、ALBERT、XLNet

​ Unigram 是三种子词算法中理论最自洽的一个。它用概率模型统一了训练(EM)、编码(Viterbi)和数据增强(随机采样),整个框架在数学上一气呵成。但在工程实践中,"够好且简单"的 BPE 赢得了 LLM 时代的主流地位——这也许是软件工程中"简单胜于完美"的又一个例证。

船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统 船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。 阅读详情

相关推荐

AI 应用开发:四维架构落地实战——以 HR Agent 为例拆解感知·推理·记忆·执行【意图路由、规划编排、长期记忆、工具执行、面试题】

本文基于四维架构(感知·推理·记忆·执行),以HR Agent为例,系统拆解大模型应用从“聊天”到“生产可用”的落地路径。通过Spring AI实现意图路由、规划编排、RAG检索与工具调用,结合真实踩坑复盘,揭示架构化设计对安全、成本与可维护性的关键价值,为AI Agent工程化提供可复用的实战框架。

王大师企业官方博客 157

【LLM开发】Unigram算法

参考书籍:Unigram 算法是一种基于概率的子词分词方法,与BPE算法、WordPiece算法不同,其核心思想是通过逐步删减初始大词汇表优化分词结果。

可爱满分的博客 1159

OMNeT++入门指南:从tictoc1到tictoc18的实例解析与实战演练

本文是OMNeT++网络仿真框架的入门实战指南,详细解析了从tictoc1到tictoc18的经典示例。内容涵盖OMNeT++的下载安装、核心三文件(.ned, .cc, .ini)的编写、模块化建模、自定义消息、数据统计与可视化,以及参数化批量仿真等核心技能,帮助读者从零开始掌握这一强大的网络仿真工具。

weixin_29228781的博客 329

Happy-LLM 实战:从零搭建并训练一个 2 亿参数的 LLaMA2 大模型

本篇技术指南完整复现 Happy-LLM 项目第五章的实战路径:先用 PyTorch 从零实现一个与 LLaMA2 同构的 Decoder-only Transformer(本项目命名为 "Tiny-K"),再训练一个 BPE 子词 Tokenizer,最后依次完成数据下载、预训练(Pretrain)与指令微调(SFT),并封装文本生成与模型导出能力。读完本文,你将掌握 RMSNorm、GQA、R

gitblog_00824的博客 1023

Cisco三层交换机的详细配置

** 本文适用于新手小白以及微微基础的同学来用于参考,实验是在Cisco Packet Tracer Student 进行,实验最终效果如图所示,所有命令配置与图中的一致。 使用到的机器型号为:五台电脑,一台服务器,三个普通交换机(2960型号),一个三层交换机(3560-24PS),两台普通服务器(2811) 文章目录一、什么是三层交换机二、配置交换机步骤1.配置二层交换机2.配置三层交换机3.配置两台路由器以及最后一台电脑 一、什么是三层交换机 1.三层交换机 = 三层路由+二层交换机 2.工作在

真正的大师,永远都怀着一颗学徒的心。 4万+

点云PCL库学习-双目图像转化为点云PCD并显示

文章目录 双目视觉模型 代码实现 总结 参考文章 一、双目视觉模型 和RGBD相机主动发射光线实现测距不同,双目测距原理通过配置立体摄像头(通常由左眼相机和右眼相机两个水平放置的相机组成)来获取一对同一场景中的二维图像,再基于同一空间点在两个坐标系下的视差来计算深度。双目测距的示意图和数学表达式如下所示: 双目相机的成像示意图 上述示意图描述了一个空间点在左右两目相机中位置之间的成像关系,根据相似三角形原理可得: 其中,f和b分别为相机焦距和双目相机基线,d为空间点在两个坐标系下

weixin_41957687的博客 6948

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 248

数学不好是原罪——高等数学笔记(汇总版)

这是本人之前考研的高数手写笔记,工科学硕数一考了146(满分150),笔记有一定参考价值,欢迎大家收藏借鉴。

xuuyann 5万+

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

VScode+MPLAB AI助手:Microchip MCU开发全流程实战解析

本文详细解析了如何使用VScode搭配MPLAB AI助手进行Microchip MCU开发的完整流程。从环境配置、工程创建到代码生成与调试,全面介绍了AI助手在提升开发效率、优化代码和故障排除方面的实际应用,为嵌入式开发者提供了一套高效的开发解决方案。

hh234的博客 1131

YOLOv11涨点改进 | 全网创新首发、主干改进篇 | CVPR 2025 | RAVLT主干让 YOLOv11 更加强大!通过增强线性注意力机制,特别在小目标和复杂背景的检测上表现突出

本文提出RAVLT主干网络,通过改进YOLOv11的空间特征建模能力,显著提升小物体和复杂背景检测性能。RAVLT采用秩增强线性注意力(RALA)机制,在保持线性计算复杂度的同时解决传统线性注意力低秩问题。RALA通过增强KV缓冲区和输出特征矩阵的秩,提高特征多样性和建模能力。实验表明,RAVLT在ImageNet-1k上达到84.4% Top-1准确率,仅需2600万参数和4.6GFLOPs,性能优于现有线性注意力模型。文章详细介绍了RAVLT模块结构、实现原理及在YOLOv11中的集成方法,包含四种主干

Ai缝合怪、助力小伙伴高效发论文 639

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 509

AI在电商中的搜索优化

自拟标题 《AI技术助力电商搜索优化:深度解析一线大厂面试题及算法编程实践》 概述 随着人工智能技术的不断发展,AI在电商搜索优化中的应用日益广泛。本文将围绕“AI在电商中的搜索优化”这一主题,介绍国内头部一线大厂如阿里巴巴、百度、腾讯、字节跳动等在面试中常见的AI相关面试题和算法编程题,并提供详尽的答案解

AI天才研究院 913

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 211

YOLO26原创自研: 魔改Bottleneck,具备多尺度和特征通道融合的结构

魔改Bottleneck,具备多尺度和特征通道融合的结构,该模型在检测准确性方面都取得了良好的效果,尤其在缺陷检测方向。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 317

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ChatGPT、Perplexity、Gemini 与 AI Overviews 引用对比:谁的引用更可信

AI 引擎的引用机制差异很大:ChatGPT 以行内引用加 Sources 列表呈现来源,Perplexity 几乎逐句可溯源,Gemini 在回答中内嵌相关来源链接,AI Overviews 则把多源聚合答案与来源列表一起放在搜索结果顶部。本文从引用透明度、来源偏好、可干预性 3 个维度对比这 4 个引擎,并给出 GEO 的 3 点启示,帮企业在多引擎环境下提升被引用的概率。

淡然一笑 的专栏 78

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 564

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 290

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 648

抽象主义人工智能和生命体AI的内在联系

彭军辉提出“抽象主义人工智能”作为第四大AI范式,批判符号主义、连接主义、行为主义剥离生命本体的误区,确立“智能是现象,生命是本体”的核心公理。主张原生智能必须依附具备存续诉求的生命本体,提出“生命体AI理论”,构建七层演化阶梯与自闭环工程框架,强调智能不可跳过底层存续机制直接模拟语言。该体系为生成式AI提供科学边界,推动从“仿真表象”向“原生智能”的范式跃迁,开辟硅基人工生命新赛道。

抽象主义人工智能和生命体AI 70

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 343

AI作图软件技术选型:从4个技术维度出发的实测对比

AI作图软件技术选型:从4个技术维度出发的实测对比

Vbaoke的博客 209

【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点

之前的文章介绍了和,本文主要介绍AI Agent的测评、可观测等知识。

256

Docling 原理解读:是什么、为什么、怎么样

从论文视角拆解 Docling 的整体架构、DoclingDocument 数据模型、PDF 预处理、版面分析、OCR、TableFormer 双解码器、阅读顺序与装配流程,并解释版面框与 OCR 框的区别。

PLANTTHESON的博客 322

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程,跟着博主一起来还原整个过程。

夜郎King的博客 4720

影视场景怎么用AI生成3D镜头预演?从概念图、场景白模到网页审片

概念图有氛围,不代表能直接用于镜头预演。本文围绕剧本拆镜、资料与尺度假设、场景白模、机位走位、动作节拍和网页审片,介绍 AI 生成 3D 场景的预演流程。通过稳定对象与相机编号、统一镜头表、意见关联版本和三轮审核,让讨论落到具体镜头,同时明确白模与网页预演不能替代真实场地勘景及现场安全判断。

Solange__的博客 548
上一篇: 【LLM Tokenizer】WordPiece 分词:BERT 背后的子词算法
下一篇: 在 macOS 上用 Matplotlib 正确显示中文字体(无需额外安装字体)
未收敛
博客等级 码龄11年 3316粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未收敛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值