Bert预训练模型fine-tune实战:文本相似度计算与工程落地
简介这份资源面向自然语言处理方向的开发者与学习者聚焦Bert预训练模型在文本相似度任务上的fine-tune实践适合已具备一定深度学习基础、希望动手跑通中文语义匹配流程的中高级读者。包内共50个文件以30个Python源码为主辅以13个pyc编译文件、2个txt说明、2个csv数据集、1个json配置及index、meta索引文件压缩包约2.77MB整体结构紧凑便于快速定位训练与测试入口。资源基于蚂蚁金服文本匹配数据在chinese_data目录中提供中文语料可通过run_classifier_modify2脚本完成fine-tune再用run_classifier_class进行效果测试覆盖从数据加载、模型微调到相似度评估的完整链路。目前已有480人学习下载读者可借此理解Bert在下游语义匹配任务中的改造方式、分类器调整思路与中文数据适配细节并对照源码复现实验、排查训练中的常见问题。1. 从一份 Bert 预训练模型 fine-tune 项目说起文本相似度到底该怎么落地电商客服每天要处理上万条“这双鞋偏码吗”和“鞋子尺码准不准”这类问法不同、意思几乎一样的问题。如果靠关键词匹配维护规则的人迟早崩溃靠通用大模型 API成本和延迟又扛不住。Bert 预训练模型 fine-tune 计算文本相似度这条路径解决的正是这种“语义等价但字面不同”的判定问题拿一个已经在大规模语料上学过语言规律的 Bert 当底座用你自己业务里的句子对做微调让它输出一个相似度分数或“相似/不相似”的判断。它适合谁手里有几百到几万条标注句对、想在自己机器上跑一个可控、可解释、成本固定的相似度服务的工程师。不适合谁一条标注数据都没有、指望开箱即用就精准的场景——那种情况先去做数据模型救不了你。下面按“先立住原理、再动手复现、最后讲坑”的顺序拆开讲代码基于 HuggingFace 的 transformers 生态这是目前最主流、最不容易翻车的做法。2. 先搞清楚 Bert 做相似度有哪几条技术路线选错了后面全白干2.1 三种主流建模范式与它们的适用边界用 Bert 算文本相似度不是只有一种做法。从业者常走的路有三条选型错了后面调参调到怀疑人生也没用。第一条是句向量 余弦相似度。把两句话分别喂进 Bert取[CLS]位置的输出或对所有 token 做平均池化得到两个固定维度向量再算余弦值。优点是推理时可以预先算好库里的向量建索引线上只算 query 一次速度快。缺点是原生 Bert 的句向量语义表达能力一般直接拿[CLS]做相似度效果经常不如预期这也是后来 Sentence-Bert 出现的原因。第二条是交互式Cross-Encoder分类。把两句话拼成[CLS] 句子A [SEP] 句子B [SEP]一起送进 Bert让模型在注意力层里充分交互最后接一个二分类头输出相似/不相似。精度通常最高因为两句话的每个词都能互相“看见”。代价是没法预计算每来一个 query 都要和候选集逐条拼对推理候选多时延迟爆炸。第三条是双塔 交互的折中或者直接用 Sentence-Bert 这类专门为句向量优化的结构。工程上常见做法是召回阶段用句向量快速筛出 Top-K 候选精排阶段用 Cross-Encoder 对这 K 条打分。这套“召回精排”是搜索和相似度系统的标准架构。路线精度推理速度能否预建索引典型场景句向量余弦中快能海量候选召回Cross-Encoder 分类高慢不能Top-K 精排、小规模判定召回精排高可控能生产级相似度服务2.2 为什么 fine-tune 是绕不开的一步预训练 Bert 学的是通用语言规律它不知道你业务里“退款”和“退货”算不算一回事“确认收货”和“已签收”在你的口径下是不是同义。fine-tune 的本质是拿你标注的句对去调整模型参数让它的输出分布对齐你的业务判断标准。具体到相似度任务fine-tune 通常做的是构造正负样本对正样本是语义相似的句子对负样本是不相似的。用 Cross-Encoder 时就是一个二分类任务标签 0/1用句向量时常用对比学习损失让相似句对向量靠近、不相似句对向量远离。数据量上几百到几千对就能看到明显提升上万对效果更稳。这里有个血泪经验负样本的质量比数量更重要。随机采的负样本太容易区分模型学不到细粒度边界必须掺入“难负样本”——字面很像但语义不同的句子对。2.3 数据准备句对格式与标注口径动手前先把数据格式定死。推荐用三列 TSV 或 JSONLsentence_a、sentence_b、label。label 用 0/1 二值最省事如果要做相似度回归可以用 0~5 的连续分但标注一致性会难很多新手建议先做二分类。标注口径必须写清楚文档否则不同标注员对“相似”的理解不一致模型学出来就是个四不像。常见做法是给几个边界例子完全同义算 1部分重叠但意图不同算 0反义算 0。下面是一个最小数据样例。{sentence_a: 这双鞋偏码吗, sentence_b: 鞋子尺码准不准, label: 1} {sentence_a: 什么时候发货, sentence_b: 多久能到, label: 1} {sentence_a: 怎么退款, sentence_b: 怎么退货, label: 0} {sentence_a: 有优惠吗, sentence_b: 能便宜点吗, label: 1}第三行“退款”和“退货”在很多业务里是两回事标 0 是刻意的用来教模型区分细粒度差异。数据准备好后按 8:1:1 切训练/验证/测试切分时注意别让同一句话的变体同时出现在训练和测试里否则指标虚高。3. 用 HuggingFace 跑通 Cross-Encoder 相似度微调从环境到训练3.1 环境与依赖的最小安装先确认显卡和 CUDA 版本再装对应版本的 PyTorch这一步装错后面全是玄学报错。常见做法是先建虚拟环境再按官方命令装 torch最后装 transformers 和 datasets。python -m venv venv source venv/bin/activate # 按你的 CUDA 版本去 PyTorch 官网选对应命令这里以 cu121 为例 pip install torch --index-url https://download.pytorch.org/whl/cu121 pip install transformers datasets scikit-learntransformers负责模型和分词器datasets负责数据加载scikit-learn用来算评估指标。版本上不用追最新transformers 4.x 的任一较新小版本都够用关键是 torch 和 CUDA 匹配。装完跑一句python -c import torch; print(torch.cuda.is_available())输出 True 才算过关。3.2 数据加载与分词把句对喂成模型要的形状Cross-Encoder 的输入是拼接后的序列分词时要用text和text_pair两个参数让分词器自动插入[SEP]。最大长度设 128 通常够用句子特别长再往上调但注意显存。from datasets import load_dataset from transformers import AutoTokenizer # 假设数据是 jsonl 格式字段为 sentence_a / sentence_b / label dataset load_dataset(json, data_files{train: train.jsonl, valid: valid.jsonl}) tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) def tokenize_fn(example): # text_pair 会自动处理 [SEP] 拼接不要手动拼字符串 return tokenizer( example[sentence_a], example[sentence_b], truncationTrue, max_length128, paddingmax_length, ) tokenized dataset.map(tokenize_fn, batchedTrue) tokenized tokenized.rename_column(label, labels) tokenized.set_format(typetorch, columns[input_ids, attention_mask, token_type_ids, labels])truncationTrue保证超长句被截断而不是报错paddingmax_length让一个 batch 内长度一致。token_type_ids是 Bert 用来区分两句话的段标记Cross-Encoder 必须保留。rename_column是因为 HuggingFace 的 Trainer 默认认labels这个字段名不改会报 key 错误。3.3 训练脚本与关键超参设置用AutoModelForSequenceClassification加载 Bert 并接一个二分类头num_labels2。训练用 Trainer 封装省去手写循环。from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer from sklearn.metrics import accuracy_score, f1_score import numpy as np model AutoModelForSequenceClassification.from_pretrained(bert-base-chinese, num_labels2) def compute_metrics(eval_pred): logits, labels eval_pred preds np.argmax(logits, axis-1) return {accuracy: accuracy_score(labels, preds), f1: f1_score(labels, preds)} args TrainingArguments( output_dir./bert-sim, learning_rate2e-5, # fine-tune 常用 1e-5 ~ 5e-5太大灾难性遗忘 per_device_train_batch_size32, per_device_eval_batch_size64, num_train_epochs3, # 小数据集 2~4 轮多了过拟合 weight_decay0.01, eval_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelf1, warmup_ratio0.1, # 前 10% 步数预热稳定训练 logging_steps50, ) trainer Trainer( modelmodel, argsargs, train_datasettokenized[train], eval_datasettokenized[valid], compute_metricscompute_metrics, ) trainer.train()learning_rate是 fine-tune 最敏感的参数2e-5 是安全起点loss 震荡就降到 1e-5。num_train_epochs别贪多验证集 F1 开始掉就停。warmup_ratio对 Bert 这种大模型很关键没有预热前期容易训崩。load_best_model_at_endTrue配合metric_for_best_modelf1保证最后留下的是验证集最好的那版而不是最后一轮的。3.4 推理与相似度打分训练完保存模型推理时对每个句对做一次前向取 softmax 后 label1 的概率作为相似度分数。import torch import torch.nn.functional as F model.eval() def similarity(a, b): inputs tokenizer(a, b, return_tensorspt, truncationTrue, max_length128, paddingTrue) inputs {k: v.to(model.device) for k, v in inputs.items()} with torch.no_grad(): logits model(**inputs).logits # label1 的概率即相似度 return F.softmax(logits, dim-1)[0][1].item() print(similarity(这双鞋偏码吗, 鞋子尺码准不准)) # 期望接近 1 print(similarity(怎么退款, 怎么退货)) # 期望偏低paddingTrue在推理时按 batch 内最长补齐即可不用固定 128。分数阈值不要拍脑袋定 0.5要在测试集上画 P-R 曲线按业务对准确率和召回率的偏好选阈值。客服场景宁可漏判也别误判阈值就调高些。4. 句向量方案与召回精排候选上万条时怎么不卡死4.1 用 Sentence-Bert 思路产出可索引的句向量Cross-Encoder 精度高但没法预建索引候选上万条时逐条打分延迟不可接受。这时用句向量方案把库里所有句子预先编码成向量存进 FAISS 之类的索引线上只编码 query 一次做近似最近邻检索。原生 Bert 的[CLS]向量做相似度效果一般常见做法是用 Sentence-Bert 的对比学习目标微调或者直接用现成的中文句向量模型。如果坚持自己 fine-tune用MultipleNegativesRankingLoss这类对比损失让 batch 内其他样本充当负样本。from sentence_transformers import SentenceTransformer, InputExample, losses from torch.utils.data import DataLoader model SentenceTransformer(bert-base-chinese) train_examples [ InputExample(texts[这双鞋偏码吗, 鞋子尺码准不准]), InputExample(texts[什么时候发货, 多久能到]), ] train_dataloader DataLoader(train_examples, shuffleTrue, batch_size32) train_loss losses.MultipleNegativesRankingLoss(model) model.fit(train_objectives[(train_dataloader, train_loss)], epochs3, warmup_steps100) model.save(./bert-sim-st)InputExample只给正样本对MultipleNegativesRankingLoss会自动把同 batch 内其他句子的向量当负样本所以 batch_size 越大负样本越多效果通常越好但显存也涨。这是句向量微调和 Cross-Encoder 最大的思路差异前者靠对比学习拉近拉远后者靠分类头直接判。4.2 召回精排的两级架构与阈值联动生产系统里两级架构的参数要联动调。召回阶段用句向量取 Top-KK 一般设 50~200太小会漏掉正确候选太大精排压力大。精排阶段用 Cross-Encoder 对这 K 条打分再按阈值过滤。import faiss import numpy as np # 建索引把所有库句编码后归一化用内积等价余弦 corpus [这双鞋偏码吗, 什么时候发货, 怎么退款, 有优惠吗] emb model.encode(corpus, normalize_embeddingsTrue) index faiss.IndexFlatIP(emb.shape[1]) index.add(np.array(emb)) def recall(query, topk50): q model.encode([query], normalize_embeddingsTrue) scores, idx index.search(np.array(q), topk) return [(corpus[i], s) for i, s in zip(idx[0], scores[0]) if i ! -1]normalize_embeddingsTrue让向量单位化内积就等于余弦相似度省一次除法。IndexFlatIP是精确检索库大了换成 IVF 或 HNSW 做近似检索用一点召回率换速度。召回阈值可以设低些比如 0.6保证不漏精排再用 Cross-Encoder 的分数卡最终判定两级阈值分开调别用同一个数。4.3 难负样本挖掘让模型学会区分“像但不是”随机负样本太简单模型学不到边界。常见做法是用训练好的召回模型对每个正样本去库里找分数较高但实际不相似的句子作为难负样本加入训练。这个流程可以迭代训一版 → 挖难负样本 → 再训一版。# 伪代码示意对每个 query 召回 Top-K排除正样本后取高分者作难负样本 hard_negatives [] for q, pos in positive_pairs: candidates recall(q, topk20) for sent, score in candidates: if sent ! pos and score 0.7: # 分数高但不是正样本就是难负样本 hard_negatives.append((q, sent, 0))阈值 0.7 是经验值太低挖出来的还是简单负样本太高可能把潜在正样本误当负样本。挖完要人工抽查一批确认没标错。这一步很费人力但效果提升往往比调参明显属于值得投入的环节。5. 避坑与排查fine-tune 相似度模型最常见的 5 个翻车现场5.1 训练 loss 下降但验证 F1 不动甚至掉现象训练集 loss 一路降验证集 F1 卡在 0.6 左右不动或者先升后降。原因通常是过拟合或学习率过大。小数据集上 Bert 参数量远大于样本量几轮就记住训练集了。解决先降学习率到 1e-5再减 epoch 到 2加weight_decay数据量实在少就冻结 Bert 底部几层只训顶部。判断依据是看训练和验证 loss 的差距差得越大越是过拟合。5.2 相似度分数普遍偏高阈值怎么调都不对现象随便两句话打分都 0.8 以上阈值设 0.9 还是误判一堆。原因多半是负样本太简单模型没学到区分能力输出分布挤在高分区。解决掺难负样本重训或者检查标签是不是正负比例严重失衡比如 9:1失衡时用class_weight或对负样本过采样。另一个隐蔽原因是分词后token_type_ids没传两句话被当成一句话模型根本分不清边界。5.3 推理时单条和批量结果不一致现象一条条推理分数正常凑成 batch 后分数变了。原因通常是 padding 方式不同或者忘了model.eval()导致 dropout 还在生效。解决推理前必须model.eval()并用torch.no_grad()padding 统一用paddingTrue动态补齐。如果用了半精度推理还要注意某些算子对 batch 内 padding 位置的处理差异必要时固定max_length补齐。5.4 中文分词与最大长度截断把关键信息切掉现象长句相似度判断总是不准短句正常。原因max_length128对中文大约 128 个字长句尾部被截断而关键差异往往在句尾。解决先统计你数据里句长的分布按 95 分位设max_length别盲目用默认 512 浪费显存也别用 64 截掉一半。中文 Bert 按字分词一个字一个 token估算比英文直观。5.5 上线后效果比离线测试差一截现象离线测试 F1 0.9上线一周发现误判明显变多。原因通常是训练测试数据同分布但线上 query 分布漂移了或者离线测试集切分时泄漏了。解决切数据时按时间或按业务线切别随机切上线后埋点收集 badcase定期回流重训。相似度模型不是训完就一劳永逸业务话术在变模型得跟着迭代。6. 把相似度模型用稳的几个进阶习惯第一永远留一个规则兜底。模型再准也有翻车的时候对“退款”“投诉”这类高风险意图加一层关键词硬规则模型分数和规则冲突时以规则为准。这不是不信任模型是给业务留后悔药。第二阈值按业务分层。同一个模型客服自动回复场景阈值可以低些0.7涉及资金操作的场景阈值要高0.9。别指望一个全局阈值打天下把阈值做成配置项按场景注入。第三监控分数分布而不只是准确率。线上每天统计相似度分数的直方图如果分布整体偏移说明输入数据变了模型该重训了。这比等业务方投诉要早得多。第四小模型蒸馏。如果线上 QPS 高Cross-Encoder 扛不住可以用大模型给无标注数据打伪标签蒸馏到一个更小的模型比如 4 层 Bert 或 TinyBert精度掉一点但延迟降一大截。蒸馏时温度设 2~4软标签比硬标签信息量大。验证模型是否真的可用我一般会做两件事一是构造一批“对抗样本”就是字面极像但语义不同的句子对看模型会不会被骗二是拿线上真实 badcase 做回归测试集每次重训都跑一遍确保老问题不复发。这套习惯坚持下来模型迭代才有据可依而不是每次凭感觉调参。我自己踩过最深的坑是早期图省事用随机负样本训了一版就上线结果“怎么退款”和“怎么退货”被判成相似客服直接把退款流程发给了要退货的用户投诉了一周。从那以后我定了个规矩没有难负样本的训练集不上线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

深入解析TCP-RDT2.2:用UDP实现可靠数据传输的核心机制

深入解析TCP-RDT2.2:用UDP实现可靠数据传输的核心机制

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

2026/10/9 1:14:52 阅读更多 →
Error Prone 的 UnnecessarySemicolon 检查:消除 Java 代码中无意义的分号

Error Prone 的 UnnecessarySemicolon 检查:消除 Java 代码中无意义的分号

静态分析代码质量开发工具 【免费下载链接】error-prone Catch common Java mistakes as compile-time errors 项目地址: https://gitcode.com/gh_mirrors/er/error-prone 点击查看 免费下载 导读 UnnecessarySemicolon 是 Google Error Prone 静态分析工具内置的…

2026/10/9 1:14:52 阅读更多 →
51单片机计算器实战:矩阵键盘+LCD1602从仿真到实物

51单片机计算器实战:矩阵键盘+LCD1602从仿真到实物

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

2026/10/9 1:14:52 阅读更多 →

最新新闻

Notepad++下载安装

Notepad++下载安装

概述 notepad是可高亮的记事本。 下载 链接:notepad下载 打开链接,选择下载 会跳出三个网盘,选择其中一个,此处我选择夸克,然后转存的网盘 在网盘中将安装包下载到本地,得到压缩包 安装 新建一个文件…

2026/10/9 2:42:43 阅读更多 →
Flagsmith 自托管监控指标全解析:Prometheus `/metrics` 指标目录与源码级解读

Flagsmith 自托管监控指标全解析:Prometheus `/metrics` 指标目录与源码级解读

后端前端 【免费下载链接】flagsmith Flagsmith is an open-source feature flag platform with remote config, experimentation, and self-hosted or cloud deployment options. 项目地址: https://gitcode.com/gh_mirrors/fl/flagsmith 点击查看 免费下载 Flags…

2026/10/9 2:42:43 阅读更多 →
jstips 系列第 10 期:徹底掌握 JavaScript 物件屬性檢查——`in` 運算子與 `hasOwnProperty` 的深度差異

jstips 系列第 10 期:徹底掌握 JavaScript 物件屬性檢查——`in` 運算子與 `hasOwnProperty` 的深度差異

教程 【免费下载链接】jstips This is about useful JS tips! 项目地址: https://gitcode.com/gh_mirrors/js/jstips 点击查看 免费下载 本文對應 jstips 倉庫第 10 期技巧(繁體中文版:_posts/zh_TW/javascript/2016-01-10-check-if-a-prope…

2026/10/9 2:42:43 阅读更多 →
.NET Core 8 CORS配置指南:从原理到避坑实践

.NET Core 8 CORS配置指南:从原理到避坑实践

1. 为什么.NET Core 8里的CORS还是这么容易踩坑前后端分离已经成为标配,前端跑在localhost:5173,后端跑在localhost:5000,接口一调就报错。浏览器控制台红通通一片:Access to XMLHttpRequest at http://localhost:5000/api/values…

2026/10/9 2:42:43 阅读更多 →
Windows 11与Ubuntu双系统互传文件全攻略:5种方案详解

Windows 11与Ubuntu双系统互传文件全攻略:5种方案详解

如果你的电脑装了Windows 11和Ubuntu Linux双系统,你一定遇到过这种场景:在Windows里下了一个安装包,重启到Ubuntu发现还得再下载一遍;在Ubuntu里渲完的视频,想拷到Windows这边剪辑,U盘插来插去、格式还不认…

2026/10/9 2:42:43 阅读更多 →
磐时出席 2026中国汽车工程学会底盘集成技术分会学术年会

磐时出席 2026中国汽车工程学会底盘集成技术分会学术年会

让智能底盘的“安全兜底”被认真看见 9月20日-22日,由先进越野系统技术全国重点实验室、中国汽车工程学会越野车技术分会及底盘集成技术分会联合主办的2026中国汽车工程学会越野车技术分会第十八届学术年会暨2026先进越野系统科学与技术年会、2026中国汽车工程学会…

2026/10/9 2:41:42 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →