从RNN到Transformer:注意力机制原理、实现与工程实践全解析
1. 为什么还要重新梳理注意力机制做序列建模的朋友大概率都有过这种体验面试被问到“Attention 到底怎么算的”脑子里能浮现出公式但真让你从 RNN 一路讲到 Transformer把每一步的动机、每个矩阵的形状、每个设计取舍说清楚就开始卡壳。我自己带过几个做 NLP 和时序预测的新人发现一个普遍现象——大家会调nn.MultiheadAttention会背“Attention is All You Need”但中间那段从循环网络到自注意力的演进逻辑是断的。这篇总结就是冲着这个断层来的。它不打算写成教科书而是按一个从业者的视角把注意力机制从最早挂在RNN上的辅助模块到彻底抛弃循环结构的Transformer这条主线上的关键节点、核心公式、工程实现和踩坑经验完整串一遍。核心关键词就三个注意力机制、RNN、Transformer。读完你应该能做到手推一遍加性注意力和点积注意力的计算、说清楚为什么自注意力能并行而 RNN 不能、理解多头和位置编码各自解决什么问题、并且能自己从零写一个可用的单头注意力模块。适合谁看如果你已经会用 PyTorch 或 TensorFlow 搭基本的序列模型但对注意力的理解停留在“会调用 API”的层面这篇就是给你补中间那层。如果你是完全的新手建议先把 RNN 的基本前向传播搞明白再回来不然第 2 章会有点吃力。下面我按“设计思路 → 核心细节 → 实操实现 → 问题排查”的顺序展开中间会穿插大量我实际写代码时踩过的坑。2. 从 RNN 到注意力的整体设计思路拆解2.1 循环网络到底卡在哪里先回到问题的起点。RNN处理序列的方式是逐步递推第 t 步的隐藏状态 $h_t$ 由当前输入 $x_t$ 和上一步的 $h_{t-1}$ 共同决定公式大致是 $h_t \tanh(W_{xh}x_t W_{hh}h_{t-1} b)$。这个结构天然适合序列因为它在时间维度上共享参数理论上能建模任意长度的依赖。但工程上它有两个致命问题。第一是串行计算要算 $h_t$ 必须先算完 $h_{t-1}$这意味着一个长度为 1000 的序列前向传播就得老老实实走 1000 步GPU 的并行能力完全用不上。第二是长距离依赖衰减信息要从第 1 个词传到第 1000 个词中间经过 999 次非线性变换和矩阵乘法梯度要么爆炸要么消失。LSTM 和 GRU 用门控机制缓解了这个问题但没有根治——它们只是让信息衰减得慢一点路径长度依然是 O(n)。我做过一个对比实验用 LSTM 做长文档的关键信息抽取序列长度超过 300 之后模型对开头部分的注意力权重几乎降到噪声水平。这不是调参能解决的是结构决定的。2.2 注意力机制的核心直觉注意力机制换了个思路与其让信息沿着时间步一步步传递不如让每个位置直接看到所有其他位置然后根据相关性决定“看谁多一点”。这就像你在读一句话时理解某个代词指代谁不需要从第一个字逐个回忆而是眼睛一扫直接定位到最相关的名词。用从业者的话说注意力做的是一次加权求和给定一个查询Query拿它去和一组键Key算相似度得到权重再用这些权重对一组值Value加权平均。公式就是那个经典的 $\text{Attention}(Q,K,V) \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$。这个操作的最大好处是路径长度变成 O(1)——任意两个位置之间都是一步直达同时整个计算可以写成矩阵乘法完美适配 GPU。2.3 为什么演进路线是“先挂载、后独立”理解这条演进线很关键。最早的注意力是挂在 RNN 上的用于机器翻译的编码器-解码器结构解码器每一步生成词时去“查询”编码器所有时间步的隐藏状态决定当前该关注源句的哪个部分。这时候注意力是个补丁主干还是 RNN。到了Transformer作者干脆问了一句既然注意力已经能建模全局依赖那 RNN 的循环结构还有必要吗答案是没有。于是把循环彻底删掉只保留注意力加前馈网络配合位置编码补回顺序信息。这一步是质变——模型从串行变成全并行训练速度提升一个数量级也才有了后来大规模预训练的基础。所以整条线的逻辑是RNN 提供序列建模但受限于串行和衰减 → 注意力作为补丁解决对齐问题 → 发现注意力本身足够强 → 抛弃 RNN 得到 Transformer。下面几章就按这个逻辑逐个拆。3. 核心细节解析与实操要点3.1 加性注意力与点积注意力怎么选注意力最早有两种打分方式。加性注意力Bahdanau 注意力用一个小型前馈网络算相似度$score(q,k) v^T \tanh(W_q q W_k k)$。点积注意力Luong 注意力直接算内积$score(q,k) q^T k$。两者的取舍很实际。加性注意力在 query 和 key 维度不同时也能用表达能力强一点但多了一层网络计算慢。点积注意力可以用矩阵乘法一次性算完效率高得多但要求 query 和 key 维度一致且维度很大时内积数值会爆炸所以后来加了缩放因子 $\frac{1}{\sqrt{d_k}}$。我实测下来的经验是维度小于 64 时两者效果差不多维度上去之后点积注意力明显更快效果也不输。所以现代实现基本都用缩放点积注意力。这里有个容易忽略的点——缩放因子不是随便加的假设 q 和 k 的每个分量独立同分布、均值 0 方差 1那么内积的方差就是 $d_k$除以 $\sqrt{d_k}$ 才能把方差拉回 1避免 softmax 进入饱和区导致梯度消失。这个推导面试常问值得记牢。3.2 自注意力Query、Key、Value 从哪来在编码器-解码器注意力里Query 来自解码器Key 和 Value 来自编码器三者来源不同。而自注意力Self-Attention里Q、K、V 全部来自同一个输入序列只是经过三组不同的线性变换 $W_Q$、$W_K$、$W_V$ 投影得到。为什么要三组不同的变换如果直接用输入本身算内积那“自己和自己”的相似度永远最大模型学不到有用的关系。用三组可学习矩阵相当于让模型自己决定“我该用什么特征去查询、用什么特征被查询、以及被查询到之后该输出什么信息”。这是自注意力能建模语法和语义关系的根本原因。实操中一个关键细节是掩码Mask。做自回归生成时第 t 个位置不能看到 t 之后的位置否则就是作弊。实现上是在 softmax 之前把未来位置的分数设成一个极大的负数比如 -1e9softmax 之后这些位置权重就趋近于 0。这个操作叫 causal mask写错了模型会“偷看答案”训练 loss 掉得飞快但推理时完全崩掉是新手最常踩的坑之一。3.3 多头注意力为什么要拆成多个头单个注意力头只能学到一种“关注模式”。多头注意力把 $d_{model}$ 维的 Q、K、V 切成 h 份每份独立做注意力最后拼接再投影。比如 $d_{model}512$、h8每个头处理 64 维。这么做的直觉是不同的头可以关注不同类型的关系。有的头可能专门盯语法主谓关系有的头盯指代有的头盯位置邻近。我做过注意力权重的可视化确实能看到不同头呈现出明显不同的模式有的甚至呈现出类似句法树的形状。这里有个参数选择的经验每个头的维度 $d_k d_{model}/h$ 一般保持在 64 左右。太小了单个头表达力不够太大了头数就少多样性下降。所以常见配置是 512/8、768/12、1024/16。另外注意多头虽然把维度拆了但总计算量和单头全维度差不多因为每个头维度小了头数多了乘起来抵消。3.4 位置编码没有循环怎么知道顺序自注意力有个“先天缺陷”——它对输入是置换不变的。你把序列打乱注意力算出来的结果只是跟着打乱模型本身感知不到顺序。但语言是有顺序的“狗咬人”和“人咬狗”完全不同。位置编码就是来解决这个的。原始 Transformer 用的是正弦余弦编码偶数维用 $\sin(pos/10000^{2i/d})$奇数维用 $\cos(pos/10000^{2i/d})$。选这个函数是有讲究的——它能让模型通过线性变换表达相对位置即 $PE(posk)$ 可以写成 $PE(pos)$ 的线性函数这对建模“相隔 k 个位置”这种关系很友好。现在更流行的是可学习位置编码和旋转位置编码RoPE。可学习编码简单直接但外推到训练时没见过的长度会失效。RoPE 通过旋转矩阵把位置信息编码进 Q、K 的内积里外推性更好是目前大模型的主流选择。选型上我的建议是序列长度固定且不长用可学习需要外推或长度变化大上 RoPE。4. 实操过程与核心环节实现4.1 从零实现缩放点积注意力先上最核心的代码。下面是一个带掩码的缩放点积注意力用 PyTorch 写我加了详细注释你可以直接抄。import torch import torch.nn as nn import math def scaled_dot_product_attention(q, k, v, maskNone): q: (batch, heads, seq_len_q, d_k) k: (batch, heads, seq_len_k, d_k) v: (batch, heads, seq_len_k, d_v) mask: (batch, 1, seq_len_q, seq_len_k) 或可广播的形状 d_k q.size(-1) # 1. 算分数Q 和 K 的转置做矩阵乘 scores torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k) # 2. 加掩码未来位置设成极小值 if mask is not None: scores scores.masked_fill(mask 0, -1e9) # 3. softmax 归一化dim-1 是对 key 维度 attn torch.softmax(scores, dim-1) # 4. 加权求和 output torch.matmul(attn, v) return output, attn这段代码有几个细节值得说。第一transpose(-2, -1)交换的是最后两个维度因为前面还有 batch 和 heads 维不能简单用.T。第二masked_fill里用的是 -1e9 而不是负无穷因为负无穷在某些实现里会产生 NaN。第三softmax 的dim-1一定要对要对 key 那一维归一化让每个 query 对所有 key 的权重和为 1写错维度结果完全不对。4.2 搭一个完整的多头注意力模块单头只是零件实际用的是多头。下面这个模块把线性投影、分头、注意力、拼接、输出投影串起来。class MultiHeadAttention(nn.Module): def __init__(self, d_model512, num_heads8, dropout0.1): super().__init__() assert d_model % num_heads 0, d_model 必须能被 num_heads 整除 self.d_model d_model self.num_heads num_heads self.d_k d_model // num_heads # Q、K、V 三组投影一次算完再切分 self.w_q nn.Linear(d_model, d_model) self.w_k nn.Linear(d_model, d_model) self.w_v nn.Linear(d_model, d_model) self.w_o nn.Linear(d_model, d_model) self.dropout nn.Dropout(dropout) def forward(self, q, k, v, maskNone): batch_size q.size(0) # 1. 线性投影并分头(B, L, d_model) - (B, h, L, d_k) q self.w_q(q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) k self.w_k(k).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) v self.w_v(v).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) # 2. 缩放点积注意力 out, attn scaled_dot_product_attention(q, k, v, mask) # 3. 拼接多头(B, h, L, d_k) - (B, L, d_model) out out.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model) # 4. 输出投影 out self.w_o(out) return self.dropout(out), attn这里最容易出错的是view和transpose的顺序。view(batch, -1, num_heads, d_k)把最后一维拆成(num_heads, d_k)然后transpose(1, 2)把 heads 维换到前面。拼接时反过来先transpose(1, 2)再contiguous().view。contiguous()不能省因为 transpose 之后内存不连续直接 view 会报错或者得到错误结果。我第一次写的时候就是漏了这个模型能跑但结果全错debug 了大半天。4.3 位置编码的实现与选择正弦位置编码的实现很简洁但有个维度对齐的坑。class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len5000): super().__init__() pe torch.zeros(max_len, d_model) position torch.arange(0, max_len).unsqueeze(1).float() div_term torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] torch.sin(position * div_term) pe[:, 1::2] torch.cos(position * div_term) pe pe.unsqueeze(0) # (1, max_len, d_model) self.register_buffer(pe, pe) def forward(self, x): # x: (B, L, d_model)直接相加 return x self.pe[:, :x.size(1)]注意register_buffer的用法——位置编码不是可学习参数但需要跟着模型搬到 GPU 上用 buffer 注册最合适既不会被优化器更新又能随.to(device)自动迁移。另外pe[:, 0::2]和pe[:, 1::2]分别填偶数和奇数维这个切片别写反否则 sin 和 cos 的位置就错位了。4.4 训练配置的关键参数模型搭好只是开始训练配置同样决定成败。下面这张表是我在几个中等规模任务上总结的常用配置供参考。参数常用值说明d_model512太小表达力不足太大显存吃紧num_heads8配合 d_model保证 d_k64d_ff2048前馈层中间维度一般是 d_model 的 4 倍dropout0.1序列任务上 0.1 到 0.3 都常见warmup_steps4000学习率预热步数防止早期震荡优化器Adambeta(0.9, 0.98)eps1e-9学习率策略逆平方根lr d_model^-0.5 * min(step^-0.5, step*warmup^-1.5)这个学习率公式是原始论文里的看着复杂其实逻辑是前 warmup 步线性增长之后按步数的 -0.5 次方衰减。我试过直接用固定学习率前期 loss 震荡很厉害加了 warmup 之后稳定很多。warmup 对 Transformer 特别重要因为自注意力的梯度在初始化阶段比较敏感。5. 常见问题与排查技巧实录5.1 训练不收敛的排查顺序Transformer 训练不收敛是高频问题我按排查优先级整理成一张表遇到问题从上往下查。现象可能原因排查方法loss 一直是 nan学习率太大 / mask 用了 -inf降 lrmask 改 -1e9loss 不降位置编码没加 / 维度写错打印输入输出形状loss 降但推理崩causal mask 写反或没加检查 mask 方向收敛极慢没 warmup / 初始化不当加 warmup用 Xavier 初始化显存爆batch 太大 / 没释放中间变量梯度累积检查 attn 是否 detach其中causal mask 写反是最隐蔽的。正确的 mask 是一个下三角矩阵位置 (i,j) 为 1 表示 i 可以看 jji。如果你写成了上三角模型就变成只能看未来训练 loss 会异常高且不降。我建议写完 mask 后打印出来看一眼形状和 0/1 分布对不对比盲目调参高效得多。5.2 注意力权重可视化能告诉你什么训练完之后把注意力权重画出来是很有价值的诊断手段。正常情况下你会看到一些头呈现出对角线条纹关注邻近位置一些头呈现出垂直条纹关注某个固定位置如句首还有一些头呈现出块状结构关注短语内部。如果所有头的权重都接近均匀分布说明模型没学到东西可能是学习率不对或者数据有问题。如果某个头权重全是 0可能是那个头的投影矩阵初始化到了死区。我遇到过一次8 个头里有 3 个权重几乎恒定后来发现是 dropout 加在了注意力权重上且比例过高调低之后恢复正常。5.3 长序列的内存优化技巧自注意力的计算复杂度是 $O(n^2)$序列一长显存就顶不住。几个实用的优化方向梯度检查点用时间换空间前向不存中间激活反向重算显存能省 50% 以上代价是训练慢 20% 左右。混合精度训练用 fp16 或 bf16显存直接减半配合 loss scaling 保证数值稳定。分块注意力把长序列切块块内做完整注意力块间做稀疏连接适合超长文档。FlashAttention现在 PyTorch 2.0 的scaled_dot_product_attention已经内置了优化实现直接调用比自己手写快好几倍强烈建议用。我实测下来同样一个 4096 长度的序列手写注意力显存占用 12G换成 PyTorch 内置的 flash 实现只要 4G 左右速度还快 2 到 3 倍。所以除非你要改注意力结构否则优先用官方实现。5.4 几个反直觉的实操心得最后分享几个我踩坑之后才明白的点。第一注意力不是越多头越好。我试过把头数从 8 加到 16参数量上去了效果反而略降因为每个头维度变小表达力被稀释。第二位置编码不一定要可学习。在很多任务上固定的正弦编码和可学习编码效果差不多但前者不增加参数、外推性更好。第三残差连接和层归一化的顺序有讲究。原始论文是 Post-LN先加残差再归一化后来大家发现 Pre-LN先归一化再加残差训练更稳定尤其是深层模型现在基本是 Pre-LN 的天下。还有一个关于初始化的细节Transformer 的权重初始化不能随便用默认值。原始论文用的是 Xavier 均匀初始化配合特定的缩放。如果你发现模型训练初期 loss 波动大先检查初始化很多时候问题就出在这。我自己习惯在__init__里手动遍历所有 Linear 层做 Xavier 初始化几行代码的事但能省掉很多调参时间。这条从 RNN 到 Transformer 的演进线本质上是一次“用更简单的结构换更强的并行性和更短的依赖路径”的取舍。理解了每个设计背后的动机再去看现在各种变体——稀疏注意力、线性注意力、状态空间模型——你会发现它们都是在同一个权衡空间里找不同的点。把基础打牢后面看什么都快。

相关新闻

RAG工程实践:从向量检索到大模型回答的完整链路

RAG工程实践:从向量检索到大模型回答的完整链路

先说个我自己的体会。接触AI Agent有一段时间之后,你会发现一个很尴尬的卡点:模型本身再聪明,它对你手头那堆私有资料、最新文档、历史工单是"一无所知"的。靠纯提示词硬灌,塞不了几千字;靠微调,…

2026/10/17 15:01:40 阅读更多 →
codex针对java+vue的Prompt提示词:用TaoToken统一Key跑通前后端联调

codex针对java+vue的Prompt提示词:用TaoToken统一Key跑通前后端联调

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

2026/10/17 15:00:39 阅读更多 →
Oracle 11g 升级 19C 实战避坑:DBUA 报错、RMAN 恢复与时区版本全解析

Oracle 11g 升级 19C 实战避坑:DBUA 报错、RMAN 恢复与时区版本全解析

简介:这份Oracle 11g到19C数据库升级详尽指导手册,面向具备一定运维能力的数据库管理员(DBA)及运维工程师,聚焦利用DBUA工具将11g单机数据库安全迁移至19C的完整流程。内容涵盖前期备份与恢复、升级路线选择、环境说明…

2026/10/17 15:00:39 阅读更多 →

最新新闻

深入理解 DOM NodeList:从基础到实战

深入理解 DOM NodeList:从基础到实战

1. 什么是 NodeListNodeList 是 DOM 中一个非常重要的集合类型,它表示一组节点的集合。当我们使用 document.querySelectorAll() 或 element.childNodes 等 API 时,返回的结果就是 NodeList。NodeList 与数组(Array)有相似之处&am…

2026/10/17 15:59:20 阅读更多 →
实测10款AI论文工具:从开题到答辩的辅助指南

实测10款AI论文工具:从开题到答辩的辅助指南

又到了一年论文季,后台和私信里全是问“有哪些真正能用的AI论文工具”的同学。去年我帮实验室带过不少本科生的毕业论文,自己也踩过不少坑。市面上的所谓“AI论文网站”鱼龙混杂,有真能提效的,也有纯粹割韭菜的。这篇东西不整虚的…

2026/10/17 15:59:20 阅读更多 →
Qt5兼容QFTP移植包:工业现场FTP文件传输实战方案

Qt5兼容QFTP移植包:工业现场FTP文件传输实战方案

简介:本资源是面向Qt初学者与跨平台开发者的QT5环境下FTP功能实现方案,解决QT5官方移除QFTP模块后无法直接使用FTP客户端API的实践难题。压缩包共8个文件(25KB),含4个C源文件(cpp)、3个头文件&a…

2026/10/17 15:59:20 阅读更多 →
华为云鲲鹏ECS三节点Hadoop集群搭建与OBS存储接入实战

华为云鲲鹏ECS三节点Hadoop集群搭建与OBS存储接入实战

简介:实验报告以华为云鲲鹏云环境为依托,完整记录在ECS与OBS上搭建Hadoop集群的全过程,面向高校大数据课程、云计算实训及刚接触分布式平台的初学者。内容从购买弹性云服务器和对象存储服务入手,详细说明AK/SK认证密钥获取、多节点…

2026/10/17 15:59:20 阅读更多 →
自适应滑模控制MATLAB仿真:抖振抑制与收敛性验证

自适应滑模控制MATLAB仿真:抖振抑制与收敛性验证

简介:本资源是一套面向控制工程专业学生与研究人员的自适应滑模控制MATLAB仿真实践包,聚焦空中机械臂等非线性不确定系统的鲁棒控制问题,适用于具备基础自动控制与MATLAB编程能力的学习者。压缩包共12个文件(7个m脚本实现控制器设…

2026/10/17 15:59:20 阅读更多 →
CSAPP第三版实验全攻略:从环境搭建到六大Lab避坑指南

CSAPP第三版实验全攻略:从环境搭建到六大Lab避坑指南

简介:《深入理解计算机系统》第三版配套实验包是一份面向计算机系统学习者的实践资源,适合正在阅读原书或准备系统掌握底层原理的读者。实验包围绕书中经典实验展开,覆盖汇编语言、内存管理、缓存模拟、进程控制、编译器构造与安全攻防等核心…

2026/10/17 15:58:19 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →