首页/新闻资讯/正文详情

从N-gram到Transformer:语言模型概率建模与PPL评估

发布时间:2026/11/3 23:09:43 来源:云帆数科 栏目:资讯中心
从N-gram到Transformer:语言模型概率建模与PPL评估
简介这份入门向PDF文档面向刚开始接触大语言模型的学习者与开发者围绕LLM背景、语言模型基本定义和评估指标展开帮助读者建立从概率建模到预训练模型的概念框架。文档共1个PDF文件压缩包约3.24MB体量轻便适合作为课程预习、概念梳理或面试复习的参考资料。内容按照大语言模型背景、语言模型简介、语言模型评估指标等模块组织并延伸至语言模型发展阶段、N-gram的计数示例与优缺点、神经网络语言模型的输入输出结构及特点兼顾定义、公式直觉与典型模型举例。已有129人学习说明其对零基础入门具有一定参考价值。读者可借此理清LLM与语言模型的关系理解P(S)计算、马尔科夫假设、数据稀疏、词向量与softmax预测等关键知识点为后续阅读论文和动手实践打底。1. 一段话的概率语言模型到底在算什么把一句人话丢给语言模型它还给你的不是释义而是一个 0 到 1 之间的数字。这个数字就是 P(S)——这个句子作为“人话”出现的概率。语言模型的所有能力本质上都是这个打分动作的副产品分数高的词接着写分数低的词换一个。搞懂这件事你就不会被“大语言模型会思考”这类说法带偏。所谓大语言模型通行的口径是把参数量超过 10B 的那一档单独拎出来叫 LLM可它干的事和三十年前那个只会数词的模型没有本质区别差别只在打分函数的形状。为什么这个看似贫瘠的定义能撑起对话、翻译、写代码答案藏在“怎么算这个概率”里而每一次算法换代都是在回答同一个问题历史信息该怎么表示。2. 链式法则与 N-gram为什么“数数”注定撑不住长句子2.1 从 P(S) 到条件概率连乘链式法则把问题拆碎了想直接数出一个句子的概率是最朴素的想法语料库里总共 N 个句子某个序列出现 n 次那 P(S)n/N。这个估计量的预测能力几乎为零——只要这个句子没在语料里逐字出现过概率就是 0而自然语言的句子组合是无穷的绝大多数合法句子永远不会被逐字命中。概率论给了另一条路。链式法则把联合概率拆成条件概率的连乘P(W1, W2, …, Wn) P(W1) · P(W2|W1) · P(W3|W1,W2) · … · P(Wn|W1,…,Wn-1)拆完之后问题从“数整个句子”变成“数每个词在给定前文时的出现”看起来可做了。但代价立刻显现最后一项的条件是前面全部 n-1 个词这个条件组合的数量随 n 指数增长。词表大小 V 若是 10 万n3 时条件组合就有 10^10 量级n5 直接到 10^20语料里根本凑不出这么多计数。链式法则把“无法估计”从句子级推到了词级没有真正解决问题。提示链式法则是恒等变形不引入任何近似。后面所有语言模型的分歧都发生在“怎么近似这个条件概率”这一步上。2.2 马尔可夫假设把无穷长的历史砍到 n-1 个词N-gram 的做法是加一个马尔可夫假设一个词出现的概率只与它前面有限的 n-1 个词有关更早的历史一律视为无关。unigram词与周围词独立P(Wi) 只看自己bigram只看前一个词P(Wi|Wi-1)trigram只看前两个词P(Wi|Wi-1,Wi-2)。三元模型的写法就是 P(Wi|Wi-2,Wi-1) C(Wi-2,Wi-1,Wi) / C(Wi-2,Wi-1)即三个词连续出现的次数除以两个词连续出现的次数。这个假设把参数空间从指数级压到了可控范围——bigram 的参数总量是 V²trigram 是 V³虽然还是很大但至少能用计数估出来而且每个参数都有明确的语料统计含义可解释性极强。代价同样直白第 n 个词之前的信息全部丢弃。句子越长被丢掉的上下文越多模型对长距离依赖代词指代谁、主语是谁完全无感。这是设计上的硬取舍不是实现没写好。2.3 计数实现bigram 参数怎么算出来拿一个小语料把流程走一遍比看公式直观。假设词表是 {我, 想, 去, 打, 吃, 篮球, 晚饭}语料只有两句“我 想 去 打 篮球”“我 想 去 吃 晚饭”。from collections import Counter, defaultdict corpus [ 我 想 去 打 篮球.split(), 我 想 去 吃 晚饭.split(), ] # 1) 统计二元组出现次数 C(Wi-1, Wi) 与单元组次数 C(Wi-1) bigram_cnt Counter() unigram_cnt Counter() for sent in corpus: for i, w in enumerate(sent): unigram_cnt[w] 1 if i 0: bigram_cnt[(sent[i - 1], w)] 1 # 2) 最大似然估计P(Wi | Wi-1) C(Wi-1, Wi) / C(Wi-1) def bigram_prob(w_prev, w, vocab_size7): # 加一平滑分子 1分母 V避免未见组合概率为 0 return (bigram_cnt[(w_prev, w)] 1) / (unigram_cnt[w_prev] vocab_size) # 3) 给整句打分链式连乘取对数防止下溢 import math def score(sent): logp 0.0 for i, w in enumerate(sent): p unigram_cnt[w] / sum(unigram_cnt.values()) if i 0 else bigram_prob(sent[i-1], w) logp math.log(p) return logp # 4) 预测下一个词把词表里每个词代进去取概率最大的 cands [篮球, 晚饭] print({c: round(bigram_prob(打, c) if c 篮球 else bigram_prob(吃, c), 3) for c in cands}) print(log P(我想去打篮球) , round(score(我 想 去 打 篮球.split()), 3)) print(log P(我想去吃晚饭) , round(score(我 想 去 吃 晚饭.split()), 3))几个参数值得说清楚。vocab_size是词表大小加一平滑的分母要加上它否则所有条件概率之和不为 1平滑强度可以调加 0.1 就是更温和的平滑。打分一律在对数域做因为十几个小于 1 的数连乘很快会掉到浮点下溢log相加等价且稳定。第四步是生成式用法的雏形把候选词逐个代入条件位置比概率大小——模型并不知道“打”后面该接什么它只是算出“打篮球”比“打晚饭”分数高因为前者在语料里出现过。这就是全部机制。2.4 稀疏与参数空间N-gram 的两个死结第一个死结是参数空间。n 每加一参数量乘一个 V。V10 万时trigram 已经是 10^15 量级实际语料根本覆盖不了所谓“训练”只是把绝大多数参数留在了零附近。第二个死结是数据稀疏而且它比参数空间更致命。自然语言的长尾极重大量合法词对在语料里从未共现最大似然估计直接给 0一旦链式连乘里出现一个 0整句概率归零。OOV未登录词问题更是雪上加霜测试集里一个新词整个模型无从下手。平滑技术加一、Kneser-Ney 之类能把这些零抬起来一点但它只是把概率质量从高频组合匀给低频组合模型并不知道“篮球”和“足球”是同类词——在计数的视角里这是两个毫无关系的离散符号。注意N-gram 的泛化能力差根子不在平滑做得好不好而在离散符号之间没有“距离”这个概念。这个判断是后面所有神经网络路线的出发点。3. 神经网络语言模型把离散词表换成连续向量3.1 从 one-hot 到词向量为什么连续表示能救稀疏要打破稀疏得让模型有能力说“篮球和足球长得像”。做法是给每个词配一个低维稠密向量 C(w) ∈ R^mm 通常取几十到几百所有词向量拼成一个 V×m 的矩阵这个矩阵本身就是可训练参数。一旦词变成了向量“相似”就有了数学含义两个词的向量夹角小、距离近模型在“篮球”上学到的模式会自动往“足球”上泛化一点因为它们在参数空间里共享邻域。那些从未在语料中共现过的组合也能分到一个非零的概率稀疏问题被从表示层面缓解了而不是靠平滑这种补丁。参数量也随之下降。N-gram 的 trigram 要 V³ 个参数词向量版本是 V×m 的词表加上隐层和输出层的权重规模线性于 V 而非指数于 V。这笔账很划算代价是模型不再可解释——你没法再指着某个参数说“这是‘我 想’的次数”。3.2 三层结构拆解拼接层、tanh 隐层、softmax 输出这条路线上的经典结构只有三层但每一层都在解决一个具体问题。import numpy as np V, m, n, H 10000, 128, 3, 256 # 词表 / 词向量维度 / 窗口长度 / 隐层宽度 # 参数初始化实际训练时用更小的随机数 C np.random.randn(V, m) * 0.01 # 词向量矩阵 W1 np.random.randn((n - 1) * m, H) * 0.01 b1 np.zeros(H) W2 np.random.randn(H, V) * 0.01 b2 np.zeros(V) def forward(ctx_ids): ctx_ids: 前 n-1 个词的 id长度 n-1返回下一个词上的概率分布 # 第一层查表 首尾拼接得到 (n-1)*m 维向量 x x np.concatenate([C[i] for i in ctx_ids]) # 第二层全连接 tanh把拼接向量压成隐表示 h np.tanh(x W1 b1) # 第三层输出 V 维 logitssoftmax 归一化成概率 logits h W2 b2 logits - logits.max() # 减最大值防 exp 溢出 p np.exp(logits) / np.exp(logits).sum() return p, h def loss_and_grad(ctx_ids, target_id): p, h forward(ctx_ids) loss -np.log(p[target_id] 1e-12) # 交叉熵正确词概率的负对数 return loss参数和层的对应关系C是词向量表训练完就是那批“词的坐标”第一层没有可训练参数只是查表和拼接把 n-1 个词压成一个定长向量第二层W1、b1加tanh负责非线性变换tanh把值压到 (-1,1)比 sigmoid 中心化更好第三层W2、b2输出 V 个未归一化的 logitssoftmax把它变成概率分布概率最大那一维就是预测的下一个词。这套结构的精妙之处在于它把“语言模型”和“词向量”绑成了一个任务为了预测下一个词准确模型被迫学出有语义结构的向量空间。词向量不是额外目标是副产品。3.3 训练目标交叉熵、困惑度以及它们为什么是一回事训练用的损失是交叉熵对每个位置取正确词的预测概率取负对数再在整个语料上平均。这个平均值有一个专门的名字——困惑度Perplexity, PPLPPL exp( (1/N) · Σ -log P(Wi | 上下文) )它和交叉熵是同一个量的两种写法一个是 exp 前、一个是 exp 后。困惑度的物理含义很直观模型在预测下一个词时平均还在多少个候选词之间犹豫。PPL1 表示每次都押中PPLV 表示完全瞎猜均匀分布。所以 PPL 越低模型对语料的拟合越好。但这里有个容易踩的坑PPL 是在“给定上下文预测下一个词”这个任务上算的它衡量的是概率建模的质量不是任务效果。一个 PPL 更低的模型在下游分类或问答上未必更好因为下游任务关心的是特定输出空间的判别不是全词表的分布拟合。这个区别后面第 5 章还会展开。3.4 天花板定长窗口与梯度消失神经网络版的语言模型解决了稀疏和泛化但留了两个新问题。一是窗口仍然是固定的。输入就是前 n-1 个词的拼接第 n 个词以外的信息一律看不到——这跟 N-gram 是同一个病只是换了个更聪明的表示方式。想扩大窗口就得加大 n拼接向量线性变长第一层到隐层的参数量跟着涨而模型并没有学会“该看多远”。二是深层化困难。想靠堆全连接层提升表达能力tanh的导数是 1 - tanh²在饱和区接近 0层数一多梯度就衰减到传不回去。当时能训的深度非常有限隐层通常就一两层。这两个限制指向同一个需求模型需要一种机制能在预测某个词时按需去历史里取信息而不是把所有历史压成一个定长向量。这就是注意力要解决的问题。4. Transformer 与预训练范式语言模型为什么突然“会做事”了4.1 自注意力把“记住历史”换成“查询历史”自注意力的思路转换很关键不再尝试把前 n-1 个词压成一个向量而是让每个位置自己决定该看哪些位置。每个位置的向量被投影成三份Query我要找什么、Key我是什么、Value我能提供什么。第 i 个位置用它的 Q 去和所有位置的 K 做点积得到一组相关性分数softmax 归一化后作为权重对所有 V 加权求和就得到这个位置的新表示。公式是 softmax(QKᵀ/√d_k)·V。除以 √d_k 不是玄学。点积的方差随维度 d_k 线性增长维度一大分数就会拉开到 softmax 的饱和区梯度接近 0。除以 √d_k 把方差拉回 1 附近让 softmax 工作在梯度健康的区间。这是典型的实现细节决定训练能不能收敛的例子。结构上的好处任意两个位置之间的路径长度都是 1不像循环网络要一步步传。长距离依赖不再是“记忆力”问题而是“检索”问题。4.2 预训练 微调两种下游用法大规模无标注文本上先训一个通用模型再往具体任务上迁移这个范式把语言模型从“一个模型”变成了“一个底座”。下游用法有两种区别在于预训练权重动还是不动。第一种是特征提取冻结预训练模型的全部参数把它的隐层输出当作特征喂给一个小的任务模型。好处是便宜一个底座能服务很多任务缺点是底座没有被任务数据适配过上限受限于预训练学到的表示。第二种是全参微调在预训练权重的基础上用任务数据继续训练所有参数一起更新。效果好得多代价是每个任务都要存一份完整副本显存和存储开销随任务数线性增长。两种用法的共同前提是预训练阶段学到的表示必须足够通用。这就把问题推到了目标函数的设计上——用什么任务预训练决定了模型最后擅长什么。4.3 自回归与双向目标函数决定能力边界同样是预训练掩码方式不同模型的能力形状完全不同。import numpy as np def causal_mask(seq_len): 因果掩码位置 i 只能看到 i 的位置上三角置为 -inf mask np.triu(np.ones((seq_len, seq_len)), k1) return np.where(mask 1, -np.inf, 0.0) def bidirectional_mask(seq_len, pad_len0): 双向掩码所有位置互相可见只屏蔽 padding mask np.zeros((seq_len, seq_len)) if pad_len: mask[:, -pad_len:] -np.inf return mask def masked_softmax(scores, mask): scores: (seq_len, seq_len) 注意力分数mask 加到分数上再过 softmax scores scores mask scores scores - scores.max(axis-1, keepdimsTrue) # 数值稳定 e np.exp(scores) return e / e.sum(axis-1, keepdimsTrue) S np.random.randn(4, 4) print(np.round(masked_softmax(S, causal_mask(4)), 3))因果掩码把上三角设成负无穷softmax 之后那些位置的权重严格为 0位置 i 就看不到 i 之后的任何词。这对应自回归语言建模给定前文预测下一个词训练和推理的行为完全一致所以它天然适合生成。双向掩码允许每个位置看到全句对应“挖掉一个词让模型填”的填空式目标表示能力更强但它无法直接用于逐词生成——因为训练时它看过“未来”推理时没有未来可看。这个差异不是实现选择是数学约束。选哪个掩码等于选了模型擅长表示还是擅长生成。后来的路线基本是拿自回归解码器做主干再用指令微调和对齐把“会续写”变成“会按人的意图回答”。4.4 规模10B 这条线前后发生了什么参数量往上堆性能并不是线性的而是近似幂律损失随参数量、数据量、算力按对数线性下降。真正让人意外的是能力形态的变化——参数规模到千亿级之后模型表现出了不更新权重也能完成任务的能力给几个示例放在上下文里它就能照着做权重一个都没动。这被称为上下文学习。这件事的意义在于它把“适配一个新任务”的成本从训练微调、标注数据、算力降到了推理写几行示例。一个小模型也能被微调得很好但它很难靠示例临时学会一个新格式规模带来的不是单纯的分数提升而是使用方式的改变。同时代价也很明确参数量大意味着显存、带宽、推理延迟全面吃紧训练一次的成本以千万计而且模型可能生成有害或有偏见的内容需要额外做对齐。注意把“超过 10B 才算大语言模型”当成硬标准会导致误判。这条线是社区为了区分能力档位划的经验线不是一个有理论断点的阈值7B 和 13B 的差别往往比 13B 和 70B 的差别更取决于数据质量。5. 避坑与常见问题入门时最容易搞混的几件事5.1 现象PPL 一路下降下游任务指标却不动甚至变差原因是优化目标和业务目标不是一回事。PPL 衡量的是全词表分布拟合而下游任务只关心特定输出空间。模型把大量概率质量分配给了语气词、标点这些高频但任务无关的 tokenPPL 好看了判别能力没提升。解决方式是分两段看预训练阶段盯 PPL 和验证集损失确认模型确实在学语言下游阶段换成任务指标准确率、F1、EM不要拿 PPL 当验收标准。如果两者背离优先信任务指标。5.2 现象某个正常句子算出来概率为 0或者直接报 OOV原因是最大似然估计遇到未见组合计数为 0链式连乘把整句打成 0OOV 则是测试期出现了词表外的词查表直接失败。解决上分两层概率层面加平滑加一、回退、插值保证任何组合都有非零概率词表层面改进分词用子词切分把未登录词拆成已知片段从根上减少 OOV。注意平滑强度要调加得太多会把分布抹平PPL 反而变差。5.3 现象训练几个 step 后 loss 变成 NaN原因几乎总是 softmax 里的 exp 溢出。logits 数值一大exp 直接上溢成 inf除法得到 NaN反向传播时梯度也跟着炸。解决办法是减最大值算 softmax 前先减去 logits 的最大值数学上等价数值上把 exp 的参数压到 0 以下。混合精度训练时还要注意把 softmax 和归一化放在 fp32 里算。这个操作几乎所有框架内部都做了但你自己手写实现时忘了就会翻车。5.4 现象训练 loss 很好一推理就胡言乱语原因是训练和推理的掩码或位置编码不一致。比如训练时用了因果掩码推理时却让模型看到了后续 token或者位置编码的最大长度没对齐超出部分被截断。排查顺序是先确认推理时喂进去的 mask 形状和训练一致再检查位置编码是否按实际长度生成而不是固定长度最后对比同一批输入在训练模式和推理模式下的输出分布差异大就说明前两步有问题。这类 bug 不会报错只会让指标莫名其妙地差属于典型的黑匣子问题。5.5 现象换了更大的模型效果反而下降原因是数据质量和词表不匹配。大模型对数据噪声更敏感同样的脏数据在小模型上被容量限制掩盖了在大模型上被完整学进去另外不同模型的分词器不同同一段文本切出来的 token 数可能差 30%直接比较损失或 PPL 是没有意义的。解决方式是先统一评估口径用同一分词器、同一份验证集、同一套指标重新算基线再检查训练数据的去重和过滤。跨模型比 PPL 之前先确认两边的词表大小和切分方式否则数字看着可比实际不可比。6. 评估指标背后的取舍为什么困惑度不能当唯一尺子入门阶段最容易形成的误解是把困惑度当成语言模型的“分数”。它确实是个好指标不需要标注、算得快、和训练损失一一对应适合在训练过程中盯收敛。但它的适用边界很清楚——它衡量的是模型对某个语料分布的概率拟合程度而这个分布是由分词器和语料本身定义的。换成任务视角指标就得换。分类看准确率和 F1抽取式问答看 EM 和 F1生成看 BLEU、ROUGE 这类 n-gram 重叠指标对话和指令遵循基本只能靠人工或模型评审。每一类都有各自的失效场景BLEU 对同义改写极其苛刻人工评审成本高且难复现模型评审又可能带位置偏见。指标衡量什么适用阶段主要失效场景交叉熵 / PPL全词表分布拟合预训练、收敛监控与下游任务效果脱钩准确率 / F1特定输出空间的判别分类、抽取类别不平衡时失真BLEU / ROUGE与参考文本的 n-gram 重叠翻译、摘要同义改写判低分人工 / 模型评审整体可用性与对齐对话、指令遵循成本高、主观性强这张表想说的不是“多测几个指标”而是每个指标都在回答一个不同的问题混用会把结论带偏。我在实际项目里踩过最深的坑是拿预训练验证集上的 PPL 去决定要不要停止训练结果模型在验证集上表现一路向好接上下游任务才发现格式遵循能力在某个 checkpoint 之后开始退化——原因很简单语料里格式化文本占比太低PPL 对这个能力根本不敏感。从那以后我每次评估模型都强制走一遍“双口径”一边是概率口径损失、PPL用来判断训练是否健康一边是任务口径挑 50 到 200 条真实样本人工看输出用来判断能不能用。两边的结论不一致时永远信任务口径。如果你刚接触这一块把第 2 章那段 bigram 计数代码亲手跑一遍再把它改成神经网络版本、算出同一个句子的 PPL你会对“指标是怎么来的”有完全不同的体感——这份入门资料里把四个阶段的演进串成了一条线顺着这条线把每一步的评估方式对上比记住任何结论都管用。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

TLB、Cache与页式存储协同机制解析
TLB、Cache与页式存储协同机制解析

1. 题目背景与核心考点剖析这道2010年计算机组成原理的考研真题,考察的是存储系统中TLB、Cache和Page三者之间的协同工作机制。在实际计算机体系结构中,这三层存储结构的交互直接影响了程序执行效率,也是计算机组成原理课程中的重点难点内容。… · 2026/11/3 23:09:43

GPT-6 Sol 与 GPT-6.1 性价比选型:单位任务成本与混合路由
GPT-6 Sol 与 GPT-6.1 性价比选型:单位任务成本与混合路由

上周有个做数据管道的同行甩给我一张月度账单截图,说同样的活儿,他把模型从旧版换到最新版之后,费用涨了将近三倍,效果却没感觉好多少。我让他把调用日志发过来一看,问题特别典型:八成以上的请求都是"… · 2026/11/3 23:08:43

SQLAlchemy ORM实战:Python数据库操作与性能优化
SQLAlchemy ORM实战:Python数据库操作与性能优化

1. Python数据库操作利器:SQLAlchemy ORM深度解析作为一名长期使用Python进行Web开发的工程师,我深刻体会到数据库操作在项目中的重要性。SQLAlchemy作为Python生态中最强大的ORM工具之一,几乎成为了中大型项目的标配。今天我将分享在实际项目… · 2026/11/3 23:08:43

【研发类-测试开发Skills】deployment-validation-config-validate 技能
【研发类-测试开发Skills】deployment-validation-config-validate 技能

配置管理专家,专注于验证、测试和确保应用程序配置的正确性。创建全面的验证模式,实施配置测试策略。 ⚠️ 风险等级:关键 - 此技能涉及关键操作,请格外谨慎使用。 技能概述 deployment-validation-config-validate 技能是配置… · 2026/11/4 12:05:57

OCPP1.6 StartTransaction 启动充电失败全场景排查
OCPP1.6 StartTransaction 启动充电失败全场景排查

OCPP1.6 StartTransaction 启动充电失败全场景排查 标签:java websocket OCPP1.6 充电桩 CSMS StartTransaction 充电事务 简介:鉴权通过、枪也插上了,用户点"开始充电",平台却怎么都不开账,这是联调里最让人… · 2026/11/4 12:05:57

【Linux操作系统】进程篇(七):环境变量:程序运行时的那些信息,到底从哪里来?
【Linux操作系统】进程篇(七):环境变量:程序运行时的那些信息,到底从哪里来?

一、先认识环境变量:它到底是什么? 先建立一个流程接下来细节理解 我们平时使用 Linux 的时候,经常会输入各种命令,比如: ls pwd gcc这些命令都可以直接运行。但是,当我们自己写了一个 C 语言程序&#xff… · 2026/11/4 12:05:57

Agent 开发核心知识点:从 Chatbot 到会干活的模型
Agent 开发核心知识点:从 Chatbot 到会干活的模型

前言Chatbot 只会聊天,Agent 会调用工具、拆解任务、自己纠错。这一波 AI 应用落地的核心就是 Agent。这篇不讲虚的,讲清楚 Agent 的循环结构、Function Calling 的机制和工程上必须处理的问题。一、Agent 的组成 一个 Agent 通常包含四部分:… · 2026/11/4 12:05:57

超立方体Ramsey|H11-D141~D145|超立方体Ramsey形式化审计:多尺度归纳基座闭合、七项参数全支付与G3/G4范围验收
超立方体Ramsey|H11-D141~D145|超立方体Ramsey形式化审计:多尺度归纳基座闭合、七项参数全支付与G3/G4范围验收

超立方体Ramsey|H11-D141~D145|超立方体Ramsey形式化审计:多尺度归纳基座闭合、七项参数全支付与G3/G4范围验收 专栏:ER-03 攻坚日志|Valhalla-MathBounty-Forge 版本:v1.0.0|Lean4.32 隔离编译… · 2026/11/4 12:05:57

大模型小白入门:揭秘ChatGPT如何预测下一个字,收藏这篇轻松上手!
大模型小白入门:揭秘ChatGPT如何预测下一个字,收藏这篇轻松上手!

本文用7张示意图,深入浅出地解析了大语言模型(LLM)的技术链条。核心在于,LLM通过不断预测下一个字元来运作,从将语言数字化、预训练到生成回答,再到指令微调和人类反馈强化学习,最终形成强大的语… · 2026/11/4 12:04:56

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码