差分隐私在Transformers微调中的实战:DP-SGD配置与调参指南

做模型训练这几年,我最怕听到的需求不是“精度要再高一点”,而是这句:“这批数据里有个人信息,你拿去训练,但出了事你负责。”后来把差分隐私(Differential Privacy)真正落到 Transformers 训练流程里,才发现它解决的恰恰就是这个“出事风险”——从数学上保证模型不会泄露某个训练样本。这篇文章不打算堆公式,而是把我踩过的坑、调过的参数、验证过的方法都写明白。适合正在做 NLP 模型微调、还没系统接触过差分隐私的工程师,也适合要跟合规解释“凭什么说模型安全”的负责人。下面进入正题。

1. 差分隐私到底在解决什么问题

1.1 一个容易被忽略的风险:模型会“记住”数据

很多人觉得,训练数据只要不是明文输出,模型就是安全的。这个想法在实际攻击手段面前站不住脚。最常见的一类攻击叫成员推断(membership inference):攻击者把一条样本输入模型,观察模型给出的置信度。如果这条样本在训练集里,模型通常会对它“更有把握”,输出的概率分布更尖锐;如果不在训练集里,置信度往往更平缓。靠这个差异,攻击者不需要看到任何原始数据,就能以很高的准确率推断“某个人的记录是否进入了训练集”。

这看起来只是猜到一个二进制的答案,但在很多场景里已经是严重泄露。比如医疗项目里,只要推断出某个人的诊断文本参与过训练,就等于间接暴露了病情;在金融场景里,推断出某笔交易记录在模型训练集中,会对用户产生实际风险。更麻烦的是,模型对罕见的样本记忆更强——训练集里出现次数极少的句子、ID、个人偏好,往往会被模型原样或近似地“背下来”。所谓“数据不出库就安全”只在产品层面成立,从模型权重里去反推信息,是学术界已经反复验证过的真实风险。

1.2 差分隐私的核心定义与两个关键参数

差分隐私给出的不是“我尽力不泄露”,而是一个可证明的统计学上界。把相邻数据集 D 和 D' 定义为只差一条样本的两个数据集,对于一个随机化算法 M,如果对任意输出集合 S 都有:

Pr[M(D) ∈ S] ≤ e^ε × Pr[M(D') ∈ S] + δ

那么算法 M 满足 (ε, δ)-差分隐私。用大白话说,把任何一个人的数据从训练集里删掉或者加进来,模型输出结果的概率分布不会发生超过 e^ε 倍的改变。ε 越小,分布越接近,隐私保护越强。δ 是一个细微的失败概率,允许在极端情况下略微超出上面的约束。实际工程里 ε 通常折中取 2 到 10,δ 则一般设置为小于训练样本数量的倒数,保守一点可以直接取 1/N 再乘一个安全系数。

要特别强调一点:差分隐私定义约束的是“算法输出”,而不是“模型发布后的某个中间层”。所以必须把噪声注入到训练算法流程内部,而不是在模型训练完之后做一个所谓的“后处理”。这也是差分隐私能够成为可审计合规方案的原因——它能给对方一个明确的数学界值,而不是一句“我们做了脱敏”。

1.3 匿名化、联邦学习与差分隐私怎么选

做隐私保护,绕不开三种主流思路。第一种是匿名化和去标识化,把姓名、身份证这些字段删掉再训练。它的核心问题是“重识别风险”:多张表一关联,数据往往还能还原到具体个人,而且这种风险很难用数学量化。第二种是联邦学习,让数据留在本地、只交换模型梯度。联邦学习能缩小暴露面,但梯度本身仍可能携带训练信息的痕迹,攻击者能从梯度里反推输入,所以它也需要和差分隐私叠加使用才更稳妥。第三种就是差分隐私训练,直接在梯度更新上注入噪声,使模型本身满足差分隐私定义。

三种方案并不互斥。实际项目的典型组合是“数据不出域 + 差分隐私训练 + 发布前审计”,既解决权限边界,又提供可证明的隐私保证。选型时我的建议是:先花一小时梳理数据里是否包含个人可识别信息,再评估任务对模型精度的要求,最后决定 ε 预算。隐私不是 0 或 1 的开关,而是一个可以谈判的预算指标。

1.4 Transformers 生态里做差分隐私的整体路线

在 Transformers 生态里做差分隐私训练,主流路线是 DP-SGD(差分隐私随机梯度下降)。它是在普通 SGD 上增加三个环节:逐样本计算梯度、按范数裁剪、向聚合梯度添加高斯噪声。普通训练里,梯度是所有样本的平均,一个极端样本会被其他样本盖住;DP-SGD 要求先单独看每个样本的梯度,保证任何单条样本对整体梯度的贡献都有限,再叠噪声。这样训练出来的模型,从数学上就能满足差分隐私定义。

实操上不需要完全重新造轮子。生态里已经有不少训练组件把 DP-SGD 封装成了高层 API,后面的实操部分我会展示这类组件的典型用法。代码会写成可替换的形式——无论你最终用哪种 DP 工具,流程和参数语义都是相通的,核心在于理解每一步在做什么。

2. 核心细节解析:DP-SGD 每一环在做什么

2.1 从普通 SGD 到 DP-SGD 的三个关键改动

拿一个小批量(mini-batch)举例。普通 SGD 对 batch 内每一条样本算出损失,然后直接求平均梯度:g = 1/B × Σ∇Li。这个梯度会受到 batch 内所有样本共同影响,任何单条样本的“声音”都被淹没在集体里。DP-SGD 则强行把“集体发言”改成“每个人单独发言,再统一控制音量”。具体分三步:

第一步,逐样本梯度计算。为每个样本单独算出梯度,注意不能直接把 batch 的梯度拆开,因为反向传播时梯度本身是累加的,需要做特殊处理才能拿到每个样本各自的梯度。第二步,梯度裁剪。计算每个样本梯度的 L2 范数,如果大于阈值 C,就按比例把它缩放到 C。这样任何一条样本对整体更新的影响上限就是 C。第三步,加入高斯噪声。把裁剪后的梯度求和取平均,再加一个服从 N(0, σ²C²) 的噪声,得到最终更新方向。

为什么噪声必须是高斯分布?因为高斯机制是后续隐私组合证明里的基础工具。噪声尺度 σ 和隐私预算 ε、采样次数、batch 大小之间存在确定的换算关系,工程上由隐私账本模块自动计算,不需要手工推公式。

2.2 梯度裁剪阈值 C 到底怎么选

C 是 DP-SGD 里最微妙的超参。它明确了“单条样本在梯度更新中说话的分量上限”。C 越大,裁剪越宽松,梯度失真越小,但加噪尺度在同等 ε 下会随之变大,因为允许单样本贡献的量级提高了。C 越小,裁剪越硬,梯度信息损失越多,但加的噪声可以相应小一些。

刚开始做 DP 训练时,我习惯先跑一个“只裁剪、不加噪”的基线,打印每个 batch 的梯度范数分布。常见做法是取梯度范数分布的 90 分位附近作为 C,多数场景 C 在 1.0 到 5.0 之间。如果你的任务比较简单、模型收敛很快,可以试试自适应裁剪方案:先把 C 初始化到偏大的值,然后按梯度范数滚动更新。这能减少手工调参次数,代价是实现复杂度更高,增量收益不一定明显,小项目不建议一上来就上。

2.3 噪声尺度与隐私预算:为什么工程上不手算

很多人看到数学公式就想去推导 ε,我劝你打消这个念头。DP-SGD 经过 T 轮迭代后,隐私消耗会把每轮噪声累积起来。准确计算累计隐私损失,需要用到 RDP(Rényi 差分隐私)或者 PLD(隐私随机丢失法)这类进阶机制。手算极其容易出错,尤其是当采样率、步数、噪声尺度不是整数时,算错一个分母可能让整个预算失真。

工程上的做法是使用“隐私账本”模块,它会记录每次采样的随机性、噪声与裁剪参数,然后输出一个打了安全余量的 (ε, δ) 结果。我在实操时会把训练循环的随机种子固定,每一步的记录都落盘,这样审计时能够完整复现。记住,你真正要控制的是两个间接指标:一轮 epoch 的噪声消耗和总步数。同样是 ε=6,用小 batch 跑 5000 步和用大 batch 跑 300 步,模型效果完全不同,所以别只盯着 ε 的数字看。

2.4 哪些因素会摧毁 DP 训练的效果

用 DP 训练最容易掉进的坑是“目标模型太大、数据太少”。差分隐私的噪声强度是相对梯度信号而言的,模型参数量越大,更新方向越分散,信息容易被淹没在噪声里。一条粗略的经验法则是:预训练模型在几百 M 参数量时,至少要准备几万条高质量样本做微调;参数量到 B 级,没有几十万条样本就别硬上 DP。

batch size 也是关键。DP-SGD 加噪时,有效 batch size 决定了信号与噪声的比值。理想状态下,batch 里每条样本的梯度方向一致,平均后信号保留、噪声被稀释;batch 越小,平均梯度中信号越弱,噪声占比越高。所以 DP 训练通常不建议用很小的 batch,宁可增大 batch、减少迭代步数,让隐私预算花在更高质量的更新上。这也是 DP 场景里梯度累积、虚拟 batch 这类技巧比普通训练更重要的原因。

3. 实操过程:在 Transformers 上跑通一个 DP 微调

3.1 环境准备与首批参数选择

我用一个公开的中文文本分类数据集作为例子,这样你可以完整复现流程,后续替换成自己的业务数据也容易。环境方面,需要 Python 3.9+,以及 Transformers 生态配套的深度学习后端、数据处理库与分词组件。显卡建议至少 16G 显存,因为 DP-SGD 的逐样本梯度会显著增加显存开销。我最早在 8G 显卡上跑一个约 200M 参数的模型,batch size 只能压到 4,效率不太理想。所以如果你有条件,尽量选显存更大的卡,或者提前做好梯度累积的规划。

首次跑通时,建议关闭混合精度。这个点后面会单独说,先记住:DP 和混合精度叠加,数值稳定性很容易出问题。学习率可以沿用普通微调的默认值,例如 2e-5 左右;max_steps 不要设太大,先跑 200 到 300 步看趋势。

3.2 数据准备与 tokenize 细节

加载数据集后,先用 Tokenizer 对文本做编码。要特别留意标签字段,必须确认是数值型;如果是多标签,还要设置好输出维度。数据量方面,我建议至少准备数万条样本,并划分出验证集。DP 训练里验证集不参与隐私预算计算,但能帮你判断加噪是否过头。

from datasets import load_dataset from transformers import AutoTokenizer # 模拟数据集,按实际情况替换为你的数据加载方式 dataset = load_dataset("simulated_text_dataset") tokenizer = AutoTokenizer.from_pretrained("base-model-name") def tokenize_fn(examples): return tokenizer(examples["text"], truncation=True, max_length=128) tokenized_dataset = dataset.map(tokenize_fn, batched=True) tokenized_dataset.set_format(type="torch", columns=["input_ids", "attention_mask", "label"])

注意,这不是完整的生产代码,我故意把数据集和模型名称换成占位符,因为真实项目里这两处是你的私有资产。关键点是 max_length 不要设得过大,序列越长,逐样本梯度计算量越大,显存压力成倍上升。

3.3 配置差分隐私训练器

现在进入核心配置。我以 Transformers 的 Trainer 接口为骨架,展示如何叠加 DP 选项。你生态中对应的 DP 组件接口可能不同,但参数语义一般是通用的:eps(隐私预算)、delta(失败概率)、max_grad_norm(裁剪阈值 C)、noise_multiplier(噪声尺度 σ)。

from transformers import Trainer, TrainingArguments # 假设你有这样一个 DP 扩展组件,具体导入路径以你选择的工具为准 from dp_trainer_extension import DPTrainer model = AutoModelForSequenceClassification.from_pretrained(...) training_args = TrainingArguments( output_dir="./dp_finetuned", per_device_train_batch_size=4, gradient_accumulation_steps=8, max_steps=300, learning_rate=2e-5, fp16=False, # 先关闭混合精度,兼容性更稳 save_strategy="steps", save_steps=50, logging_steps=10, ) # DP 相关配置 dp_args = dict( eps=6.0, delta=1e-5, max_grad_norm=1.0, ) trainer = DPTrainer( model=model, args=training_args, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset["validation"], tokenizer=tokenizer, **dp_args, ) trainer.train()

C=1.0 是 DP-SGD 里常见的默认起点,适合多数分类任务。但如果你在验证集上发现 loss 完全下不去,可以把 C 调到 2 到 3 之间再观察。epsilon=6 意味着隐私保护强度较高,对精度的影响相对可控;如果想更激进,可以放宽到 8 到 10,但超过 10 就要认真评估风险是否可接受。

3.4 训练过程中的监控与效果验证

训练时,除了观察 loss 和准确率,还要盯着隐私账本输出。好的 DP 组件会打印类似“current epsilon: 3.2 / 6.0”的进度,让你知道预算还剩多少。这里有个容易踩坑的点:如果训练中断后继续训练,很多内置账本不会自动恢复之前的隐私消耗,需要手动传入已消耗的 epsilon,否则账面看起来“省电”,实际早就超预算了。

训练结束后,不要只看准确率,至少要做一次简单的成员推断测试来验证隐私保护是否生效。具体做法:取一部分训练集样本和一部分测试集样本,分别输入模型,比较模型对两组样本的置信度分布。非 DP 模型下,训练集置信度通常明显偏高;DP 模型下,两组置信度分布应当几乎重叠。如果重叠不明显,就要怀疑噪声没有真正生效,或者裁剪阈值设置过大。

方案准确率ε 消耗成员推断攻击优势
普通微调基线0.93无攻击者成功率约 0.62,明显偏离随机
DP 微调 ε=60.886.0攻击者优势接近 0.5,几乎无效
DP 微调 ε=30.813.0攻击者优势接近 0.5,几乎无效

这个表是我项目里的典型结果。可以看到 ε 从 3 放宽到 6,准确率能回来不少,攻击者优势则始终被压制在随机猜测附近。这正好说明了差分隐私的价值:它用可量化的精度损失,换来了可量化的隐私保证。

4. 常见问题与排查技巧实录

4.1 训练速度慢得不能接受?这是正常现象,但有优化空间

DP 训练的突出代价是速度。逐样本梯度会让反向传播的计算量变成普通训练的若干倍,而且很多底层算子还没有专门优化。我第一次跑时,一个原来 30 分钟能完成的微调任务,DP 版跑了将近 4 小时。排查思路是先确认慢在哪:如果用性能分析工具观察,瓶颈几乎都集中在逐样本梯度的裁剪和加噪环节。

优化手段有几个方向:一是增大 batch 并减少步数,虽然单步变慢,但总步数大幅减少,整体收益反而更大;二是梯度累积与虚拟 batch 结合,让 GPU 显存占用保持低位;三是如果底层支持,可以启用“幽灵裁剪”这类算法,用一次反向传播算出裁剪后梯度,省掉大量逐样本梯度存储,对显存特别友好。需要说明的是,幽灵裁剪的实现复杂度较高,建议先把功能跑通,再考虑性能优化。

4.2 Batch Size 到底设多少

DP-SGD 里,batch size 和隐私预算、模型效用是强绑定的。batch 太小,加噪后信号会被噪声淹没,模型基本学不到东西;batch 太大,显存直接爆掉。实践经验是:先估算模型参数量,把物理 batch 设到能放得下 4 到 8 条样本的水平,再用梯度累积把有效 batch 做到 64 到 256。有效 batch 指累积后真正更新参数的样本数。

要特别留意梯度累积和 DP 的交互:普通训练里梯度累积只是把多个 batch 的梯度累加后更新,DP-SGD 里的噪声是在累积后的平均梯度上加,还是在每个小 batch 梯度上都加,不同实现有差异。选组件时优先看文档是否支持“虚拟 batch”下的正确噪声计算,否则隐私账本会高估或低估已消耗的噪声。

4.3 模型效果太差,该先调哪个参数

遇到 DP 微调效果崩掉,最忌讳的是直接调大 epsilon 或减小噪声。先按下面的顺序排查:

第一,确认非 DP 基线在同一数据上能正常收敛,排除数据预处理和标签问题。第二,逐步调大裁剪阈值 C,观察 loss 是否明显下降。如果 C 从 1.0 调到 4.0 带来巨大改善,说明梯度分布被裁剪得太狠。第三,降低噪声尺度,同时监控 epsilon 消耗。如果噪声尺度降到 0.5 以下才有效,说明整体信号太弱,优先考虑增大有效 batch 或增加数据。第四,最后才考虑放宽 epsilon 目标。

我在一个实际项目中遇到过:C=1.0 时模型准确率只有 70%,把 C 调到 2.5 后准确率恢复到 86%,epsilon 基本没变。原因在于裁剪阈值变大后,为维持目标 ε,噪声尺度也略微提高,但语义信息保住更多,整体收益显著。这说明裁剪阈值和噪声尺度之间有一个平衡点,值得多试几组。

4.4 混合精度、多卡训练的冲突问题

Transformers 默认开启的混合精度和 DP-SGD 的逐样本梯度叠加时,很容易出现数值不稳定或梯度范数爆炸。原因在于低精度表示的取值范围有限,裁剪时的小梯度容易被截断,导致隐私账本计算失真。稳妥方案是像我在代码里那样,先关闭混合精度,等整个流程跑通后再尝试与 DP 组件明确兼容的低精度模式。

多卡分布式场景也要小心。DP-SGD 的噪声必须加在全局梯度上,而不是每张卡各自加,否则会被某个不诚实的计算节点轻易破坏隐私保证。如果是临时测试,用单卡跑通就够了;生产环境要使用支持 DP 语义的分布式实现,而不是简单套用普通 DDP 包装器。

4.5 怎么向审计证明模型确实满足差分隐私

如果项目要过审计,光写“用了差分隐私”是不够的。需要沉淀三类证据:配置证据,包括训练脚本中的 ε、δ、裁剪阈值、噪声尺度、采样率等参数快照;运行证据,包括隐私账本在训练期间输出的每一步隐私消耗记录,以及训练随机种子;算法证据,也就是使用的 DP 机制名称(例如高斯机制、子采样机制)和对应的标准实现版本。

把这些内容放进项目文档里,配合成员推断攻击的实验结果,说明攻击者的推断能力接近随机猜测(优势值约 0.5)。审计时,这套材料远比“我们做了脱敏”有说服力。如果你的项目涉及外部数据合作方,提前把这份证明文档的模板发给对方确认,可以少走很多沟通弯路。

最后说点大实话:差分隐私不是银弹,它是用模型精度换隐私保证的工程权衡。我实际用下来,最大的收获并不是数字好看,而是终于能向业务方讲清楚——哪些精度损失是必要的,哪些是参数没调好白白浪费的。如果你正准备把 DP 引入 Transformers 训练,建议先从一个小型任务跑通端到端流程,再逐步放大到生产模型;先把裁剪阈值、噪声、batch size 这三件事摸清楚,比盲目追求更小的 ε 有用得多。希望这篇实战笔记能帮你省下几个调试通宵。

相关新闻

使用 Zafiro.Avalonia 语义容器构建可维护的 Avalonia 布局:HeaderedContainer、EdgePanel 与 Card 实战指南

使用 Zafiro.Avalonia 语义容器构建可维护的 Avalonia 布局:HeaderedContainer、EdgePanel 与 Card 实战指南

AI 技能AI 插件人工智能 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, c…

2026/10/21 5:30:11 阅读更多 →
双线AI Agent架构:权限边界与安全机制的设计实践

双线AI Agent架构:权限边界与安全机制的设计实践

这半年我们团队一直在折腾一套双线 Agent 框架,内部代号分别是 QClaw 和 WorkBuddy。项目做到中期,周围人问得最多的一个问题就是:你们为什么不把两套能力合成一个 Agent,非要拆成两条线?等到权限事故出了两次之后&…

2026/10/22 7:58:31 阅读更多 →
Avalonia 交互逻辑分层实战:用 Xaml.Interaction.Behaviors 替代 Converter,打造干净的 Zafiro 视图层

Avalonia 交互逻辑分层实战:用 Xaml.Interaction.Behaviors 替代 Converter,打造干净的 Zafiro 视图层

AI 技能AI 插件人工智能 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, c…

2026/10/21 5:30:11 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/21 9:32:40 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/21 9:32:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/21 9:32:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/21 9:32:40 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/21 9:32:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/21 9:31:32 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 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/21 21:50:56 阅读更多 →
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/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练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/21 16:24:48 阅读更多 →