ALBERT命名实体识别实战:从模型选型到部署优化
1. 为什么命名实体识别值得单独拿出来讲命名实体识别Named Entity Recognition简称 NER算是 NLP 里最接地气的任务之一。你平时用到的信息抽取、知识图谱构建、智能客服工单分类、简历解析、合同关键条款提取底层都绕不开它。说白了NER 干的事就是在一段文本里把人名、地名、机构名、时间、金额这类有明确指向的片段圈出来并打上类别标签。我最早做 NER 的时候用的是 BiLSTM-CRF那会儿还得自己写 batch 生成器、手撸 CRF 层训练一个模型动辄大半天。后来 BERT 出来大家一窝蜂换成 BERTCRF 或者 BERTSoftmax效果确实上去了但代价是显存吃紧、推理慢尤其是想部署到边缘设备或者做高并发在线服务时那个参数量真的让人头疼。直到 ALBERT 出现我才觉得这事有了个比较舒服的平衡点——它用参数共享和矩阵分解把参数量砍掉一大截但语义表达能力并没有明显缩水拿来跑 NER 这种序列标注任务非常合适。这篇内容我打算把用 ALBERT 做命名实体识别这件事从头到尾拆一遍。不是那种跑个 demo 就完事的教程而是把数据准备、标签体系设计、模型结构选型、训练调参、推理部署、踩坑排查这些环节都讲透。适合已经了解 Transformer 基础、想动手做一个能落地 NER 系统的朋友也适合之前只用过 BERT 想换 ALBERT 试试水的人。读完你应该能自己搭出一套可用的 NER 流程并且知道每个环节为什么这么设计。2. 整体方案设计与技术选型思路2.1 为什么是 ALBERT 而不是 BERT 或 RoBERTa先说结论如果你的场景对推理延迟和显存占用敏感同时标注数据量不算特别大ALBERT 往往是性价比最高的选择。原因得从它的三个核心改动说起。第一个是词嵌入矩阵分解。BERT-base 的词表是 30522隐藏层维度 768光 embedding 矩阵就是 30522×768 约 2300 万参数。ALBERT 把这个矩阵拆成 30522×128 和 128×768 两个小矩阵相乘参数量直接降到原来的零头。对 NER 来说词嵌入层其实不需要那么高的独立维度因为很多语义信息是在后面的 Transformer 层里学到的。第二个是跨层参数共享。BERT-base 有 12 层每层都有独立的注意力参数和前馈网络参数。ALBERT 让这 12 层共享同一套参数相当于把 12 层的参数量压缩成 1 层。这个改动对 NER 的影响需要实测——有些任务上共享会略微掉点但 NER 这种偏底层的序列标注任务共享带来的损失通常很小甚至因为正则化效果反而更稳。第三个是句间顺序预测SOP替代了 BERT 的下一句预测NSP。NSP 任务后来被证明作用有限SOP 让模型判断两句话的先后顺序对语义连贯性的建模更有帮助。对 NER 来说这个改动影响不大但整体预训练质量提升了下游自然受益。我做过一组对比在同样的中文 NER 数据集上BERT-base 大概 1.1 亿参数ALBERT-base 只有 1200 万左右推理速度快了将近 3 倍F1 只掉了不到 1 个点。这个 trade-off 在工程上太划算了。2.2 标签体系怎么设计才不给自己挖坑很多人一上来就急着调模型结果标签体系没设计好后面返工成本极高。NER 的标签体系核心就两件事实体类别和标注格式。实体类别要根据你的业务来定。通用场景一般是 PER人名、LOC地名、ORG机构名、MISC其他专有名词。但实际业务里往往更细比如电商场景要标品牌、型号、价格、促销词医疗场景要标症状、药品、检查项、剂量。我的建议是先做加法再做减法初期把能想到的类别都列上标注一批数据看看分布把样本极少比如少于 50 个的类别合并或砍掉否则模型根本学不好还会干扰其他类别。标注格式主流是BIO和BIOES两种。BIO 用 B-X 表示实体开头、I-X 表示实体内部、O 表示非实体。BIOES 多了 E-X实体结尾和 S-X单字实体。理论上 BIOES 信息更丰富但对标注一致性要求更高。我实测下来如果标注团队不是特别专业BIO 反而更稳因为边界歧义少。下面是个 BIO 的例子张 B-PER 三 I-PER 在 O 北 B-LOC 京 I-LOC 上 O 班 O注意标签体系一旦定下来训练集、验证集、测试集必须严格一致。我见过有人中途加了一个类别结果旧数据没重标模型直接学崩。2.3 模型结构ALBERT 后面接什么ALBERT 本身输出的是每个 token 的上下文向量要变成序列标注结果后面得接一个解码层。常见有三种接法解码方式优点缺点适用场景Softmax 直接分类简单、快不考虑标签间约束实体边界清晰、类别少CRF 层考虑标签转移约束训练慢、实现复杂边界模糊、类别多BiLSTMSoftmax增强序列建模参数变多、变慢长文本、依赖强我的经验是中文 NER 用 ALBERTSoftmax 通常就够了因为 ALBERT 本身的注意力机制已经捕捉了足够的上下文再加 CRF 提升有限反而拖慢训练。但如果你的实体边界经常出现B 后面直接跟 B这种非法转移那加 CRF 还是值得的。CRF 的核心作用是学习标签转移矩阵比如它知道B-PER 后面大概率跟 I-PER 或 O不太可能跟 I-LOC。3. 核心细节解析与实操要点3.1 数据预处理别小看这一步数据预处理看着简单但坑最多。中文 NER 第一个问题就是分词还是字级别。BERT/ALBERT 的中文词表是按字切的所以最自然的做法是字级别标注每个汉字对应一个标签。这样避免了分词错误传播但缺点是序列变长计算量增加。如果你非要用词级别那就得处理一个词对应多个字但只有一个标签的对齐问题。常见做法是把词的标签赋给词的第一个字其余字用特殊标记或者忽略。我试过效果不如纯字级别除非你的分词器特别准。第二个坑是标签对齐。用 HuggingFace 的 tokenizer 时它可能会把某些字符拆成 subword或者加 [CLS]、[SEP]。你需要保证标签序列和 token 序列严格对齐。下面是一段我常用的对齐逻辑def align_labels_with_tokens(labels, word_ids): new_labels [] current_word None for word_id in word_ids: if word_id ! current_word: current_word word_id label -100 if word_id is None else labels[word_id] new_labels.append(label) elif word_id is None: new_labels.append(-100) else: label labels[word_id] # 如果是 B- 开头后续 subword 改成 I- if label % 2 1: label 1 new_labels.append(label) return new_labels这里的-100是 PyTorch 的 ignore_index表示这个位置不计算 loss。label % 2 1是在判断是不是 B- 标签假设标签编码是 O0, B-X1, I-X2 这种交替排列如果是 B- 且后面还有 subword就改成 I-。实操心得预处理完一定要抽样检查几条把 token、label、原始文本对照着看。我踩过一次坑标签整体偏移了一位训练 loss 死活降不下去查了半天才发现是 tokenizer 的add_special_tokens参数搞的鬼。3.2 学习率与优化器的选择ALBERT 微调时学习率是最关键的参数之一。BERT 系模型微调常用 2e-5 到 5e-5ALBERT 因为参数共享梯度累积方式不同我实测下来1e-5 到 3e-5比较稳。太大容易震荡太小收敛慢。优化器用 AdamW 基本是标配权重衰减设 0.01。这里有个细节bias 和 LayerNorm 的参数不要加权重衰减这是 BERT 论文里的做法实测确实更稳。HuggingFace 的 Trainer 默认帮你处理了但如果你自己写训练循环记得分组no_decay [bias, LayerNorm.weight] optimizer_grouped_parameters [ { params: [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], weight_decay: 0.01, }, { params: [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], weight_decay: 0.0, }, ]学习率调度用线性预热线性衰减。预热比例设 0.1也就是前 10% 的步数学习率从 0 线性升到峰值后面线性降到 0。这个策略对 Transformer 系模型几乎万能。3.3 批次大小与序列长度的权衡ALBERT 参数量小显存占用低所以你可以用比 BERT 更大的 batch。但 batch 不是越大越好。我做过实验batch 从 16 加到 64F1 先升后降32 左右是个甜点。太大 batch 会导致梯度估计不准泛化变差。序列长度方面中文 NER 的句子通常不会太长但如果你处理的是长文档就得考虑截断策略。ALBERT 的最大长度是 512超出的部分要么截断要么用滑动窗口。滑动窗口的做法是把长文本切成有重叠的片段分别预测后再合并。重叠部分用投票或者取置信度最高的结果。def sliding_window(text, window_size510, stride128): chunks [] start 0 while start len(text): end min(start window_size, len(text)) chunks.append((start, end, text[start:end])) if end len(text): break start stride return chunks注意滑动窗口合并时边界处的实体容易被切断。我的做法是如果某个实体跨越了两个窗口优先保留在第一个窗口里的完整预测或者用两个窗口的预测做交集。4. 完整实操流程与关键环节实现4.1 环境准备与依赖安装先把环境搭起来。我习惯用 conda 建独立环境避免版本冲突。conda create -n albert_ner python3.9 conda activate albert_ner pip install torch2.0.1 transformers4.35.0 seqeval1.2.2 pip install datasets2.14.0 accelerate0.24.0这里重点说下seqeval它是专门做序列标注评估的库能算实体级别的 precision、recall、F1比 token 级别的准确率靠谱得多。因为 NER 关心的是整个实体对不对而不是单个 token 对不对。4.2 数据集加载与标签映射假设你已经有一份标注数据格式是每行字 标签句子之间空行分隔。先写个加载函数def load_data(file_path): sentences [] labels [] sent [] label [] with open(file_path, r, encodingutf-8) as f: for line in f: line line.strip() if not line: if sent: sentences.append(sent) labels.append(label) sent [] label [] else: parts line.split() sent.append(parts[0]) label.append(parts[1]) if sent: sentences.append(sent) labels.append(label) return sentences, labels然后构建标签映射表。把所有出现过的标签收集起来排序后建立 id 到 label 的双向映射。排序是为了让 B- 和 I- 的 id 有规律方便前面说的 subword 对齐逻辑。all_labels sorted(set(l for label_seq in labels for l in label_seq)) label2id {l: i for i, l in enumerate(all_labels)} id2label {i: l for l, i in label2id.items()}4.3 模型定义与训练配置用 HuggingFace 的AlbertForTokenClassification最省事它已经帮你在 ALBERT 后面接好了分类头。from transformers import AlbertForTokenClassification, AlbertTokenizer model_name albert-base-v2 tokenizer AlbertTokenizer.from_pretrained(model_name) model AlbertForTokenClassification.from_pretrained( model_name, num_labelslen(all_labels), id2labelid2label, label2idlabel2id )训练参数我一般这么设training_args TrainingArguments( output_dir./albert_ner, learning_rate2e-5, per_device_train_batch_size32, per_device_eval_batch_size64, num_train_epochs10, weight_decay0.01, warmup_ratio0.1, lr_scheduler_typelinear, evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelf1, fp16True, )fp16True在支持 Tensor Core 的显卡上能提速不少但要注意有些老显卡不支持会报错。如果不支持就关掉。评估指标用 seqeval 的 F1import numpy as np from seqeval.metrics import f1_score, classification_report def compute_metrics(eval_pred): predictions, labels eval_pred predictions np.argmax(predictions, axis2) true_preds [ [id2label[p] for p, l in zip(pred, label) if l ! -100] for pred, label in zip(predictions, labels) ] true_labels [ [id2label[l] for p, l in zip(pred, label) if l ! -100] for pred, label in zip(predictions, labels) ] return {f1: f1_score(true_labels, true_preds)}4.4 训练过程监控与早停训练时重点盯三个东西loss 曲线、验证集 F1、学习率变化。正常情况下 loss 应该在前 1-2 个 epoch 快速下降然后缓慢收敛。如果 loss 一直不降先检查标签对齐如果 loss 震荡厉害调小学习率如果验证集 F1 早早到顶然后下降说明过拟合了减少 epoch 或者加 dropout。我一般设num_train_epochs10配合load_best_model_at_endTrue让 Trainer 自动保存验证集 F1 最高的那个 checkpoint。这样即使后面过拟合了最终用的还是最好的模型。实操心得ALBERT 因为参数共享训练初期收敛可能比 BERT 慢一点别急着调参多等一两个 epoch。我有次以为学习率设错了结果第三个 epoch 突然就降下来了。4.5 推理与后处理训练完就是推理。单条文本的预测流程def predict(text, model, tokenizer, id2label): inputs tokenizer(text, return_tensorspt, truncationTrue, max_length512) with torch.no_grad(): outputs model(**inputs) logits outputs.logits preds torch.argmax(logits, dim2)[0].cpu().numpy() tokens tokenizer.convert_ids_to_tokens(inputs[input_ids][0]) result [] for token, pred in zip(tokens, preds): if token in [[CLS], [SEP], pad]: continue result.append((token, id2label[pred])) return result后处理主要是把 token 序列合并成实体。遍历标签序列遇到 B-X 就开一个新实体遇到 I-X 就追加到当前实体遇到 O 就结束当前实体。这里要注意处理非法序列比如 I-X 前面没有 B-X那就把它当成 B-X 处理或者直接丢弃。def extract_entities(tokens, labels): entities [] current None for token, label in zip(tokens, labels): if label.startswith(B-): if current: entities.append(current) current {type: label[2:], text: token} elif label.startswith(I-) and current and current[type] label[2:]: current[text] token else: if current: entities.append(current) current None if current: entities.append(current) return entities5. 常见问题与排查技巧实录5.1 训练 loss 不下降怎么办这是最常见的问题按下面顺序排查排查项可能原因解决方法标签对齐token 和 label 错位抽样打印对照学习率太大或太小试 1e-5、2e-5、5e-5数据质量标注错误多人工抽查 100 条类别不平衡O 标签占比过高加类别权重或重采样模型加载预训练权重没加载上检查 from_pretrained 返回值我遇到过一次loss 卡在 0.7 左右不动查了半天发现是标签映射表里 B 和 I 的顺序搞反了导致模型学的是错的转移模式。所以标签映射建好后一定打印出来看一眼。5.2 验证集 F1 远低于训练集典型的过拟合。ALBERT 虽然参数少但在小数据集上照样会过拟合。对策有几个加 dropoutALBERT 默认 hidden_dropout_prob0可以调到 0.1、减小模型用 albert-base 而不是 large、数据增强同义词替换、实体替换、早停。数据增强这块我常用的是实体替换把句子里的实体随机换成同类型的其他实体比如张三在北京上班换成李四在上海上班。这样既增加了数据多样性又不会破坏标签结构。5.3 实体边界识别不准边界问题通常有两种表现实体被截断北京大学只识别出北京和实体被合并张三和李四识别成一个 PER。前者多半是标注不一致导致的检查训练集里同类实体的标注是否统一。后者往往是模型对连接词不敏感可以在数据里多加入一些包含连接词的样本。还有一个技巧是后处理规则如果两个相邻的同类实体之间只隔了一个和、与、、这类词可以考虑合并。但规则别写太复杂否则误伤率很高。5.4 推理速度慢怎么优化ALBERT 本身已经很快了如果还嫌慢可以试这几招量化用torch.quantization把 FP32 转 INT8速度能再快一倍、ONNX 导出用torch.onnx.export导出后用 ONNX Runtime 推理、批处理把多条请求攒成一个 batch、蒸馏用大模型教一个小模型。我实测 ONNX Runtime 在 CPU 上比原生 PyTorch 快 2-3 倍GPU 上差距小一些。如果部署环境是 CPU强烈建议走 ONNX。5.5 常见问题速查表现象最可能原因快速验证方法lossnan学习率过大或数据有脏值调小 lr检查数据F1 为 0标签映射错误打印 id2label显存溢出batch 太大或序列太长减 batch加梯度累积推理结果全是 O模型没训练好或加载错检查 checkpoint 路径实体类型混淆类别定义模糊重新审视标签体系6. 一些让效果再上一层楼的技巧6.1 用领域数据继续预训练如果你的业务领域和通用语料差异大比如医疗、法律、金融直接微调 ALBERT 效果可能一般。这时候可以用领域语料做继续预训练Continue Pre-Training让模型先适应领域词汇和表达再微调 NER。这一步成本不高但提升往往很明显。我做过一个医疗 NER继续预训练后 F1 涨了 4 个点。继续预训练用 MLM 任务就行把领域文本喂进去让模型预测被 mask 的字。注意学习率要小1e-5 左右训练 1-2 个 epoch 就够多了反而会灾难性遗忘。6.2 多模型融合如果对精度要求极高可以训几个不同随机种子的 ALBERT推理时对 logits 取平均。或者 ALBERT 和 BERT 各训一个融合输出。融合通常能涨 1-2 个点但推理成本翻倍看业务能不能接受。6.3 主动学习减少标注成本标注数据永远不够主动学习是个好思路。先用少量数据训一个初始模型用它预测未标注数据挑出置信度最低的那批让人工标注再重新训练。这样每一轮标注都能带来最大收益。我试过用主动学习比随机标注省了大概 40% 的标注量达到同样的 F1。具体做法是用模型输出的 softmax 概率算每个样本的熵或者最小置信度排序后取 top-K 送标。注意要加一些随机性避免总是挑同一类样本。6.4 处理嵌套实体标准 BIO 标注没法处理嵌套实体比如北京大学附属医院里北京大学是 ORG附属医院也是 ORG 的一部分。如果业务有嵌套需求得用多层标注或者指针网络。多层标注就是每个类别单独训一个二分类模型判断每个 token 是不是该类实体的开始和结束。指针网络则是直接预测实体的起止位置对。这两种方案都比 BIO 复杂但能处理更复杂的结构。我个人在实际操作中的体会是ALBERT 做 NER 最大的优势不是精度碾压而是工程上的平衡——它让你在有限的算力下能跑更多的实验、更快的迭代。NER 这个任务数据质量和标签体系的重要性远大于模型选择。我见过太多人花大力气调模型结果数据里一堆标注错误最后效果还不如老老实实把数据清洗一遍。所以如果你刚开始做先把标签体系定清楚标个几百条高质量数据再上 ALBERT效果不会差。后面想再提升就往领域预训练和数据增强上使劲这两块的投入产出比最高。

相关新闻

langgraph4j执行图原理:超级步调度、状态快照与条件路由实践

langgraph4j执行图原理:超级步调度、状态快照与条件路由实践

langgraph4j的执行图(ExecutionGraph)是整个Agent框架真正让图"动起来"的核心发动机。前两篇我们聊了StateGraph怎么把节点和边组织成一幅静态蓝图,也拆了状态通道和快照机制,这次我把编译后生成的那张执行图彻底翻一遍…

2026/10/14 12:31:38 阅读更多 →
skin界面库资源包解析与换肤引擎接入实战指南

skin界面库资源包解析与换肤引擎接入实战指南

简介:这份资源面向使用 MFC 开发 Windows 桌面程序的 C 开发者,尤其是希望摆脱默认控件朴素外观、为应用快速添加换肤能力的中级开发者。包内围绕皮肤界面库的集成与使用展开,涵盖库文件引入、皮肤资源导入、原生控件替换以及运行时初始化应用…

2026/10/14 12:30:36 阅读更多 →
PIPE 4.3实用指南:Petri网建模、分析与避坑

PIPE 4.3实用指南:Petri网建模、分析与避坑

简介:PIPE4.3是一款基于Petri网的图形化建模与仿真分析软件,面向并发系统、分布式系统及流程建模的研究人员和工程开发者,能够帮助用户绘制Petri网模型、配置标记与变迁规则,并进行动态模拟和模型一致性检查。包内共2384个文件&am…

2026/10/14 12:30:36 阅读更多 →

最新新闻

浏览器多开怎么设置独立 IP?Profile、代理与核验流程

浏览器多开怎么设置独立 IP?Profile、代理与核验流程

浏览器多开不会自动让每个窗口拥有不同的公网 IP。想让不同浏览器环境使用不同出口,需要分别配置获授权的代理或网络线路,再从各个环境实际访问网络进行核验。要先分清两件事:Profile 隔离浏览器数据,代理配置影响网络出口。**它们…

2026/10/14 19:11:22 阅读更多 →
PS5 Chiaki 串流多账号切换导致控制器失灵的故障排查与解决方案

PS5 Chiaki 串流多账号切换导致控制器失灵的故障排查与解决方案

在使用 Chiaki 串流 PS5(或配合自动化脚本挂机)时,部分拥有大小号/多区服账号的玩家可能会遇到一个极其隐蔽且容易误导排查方向的控制失效问题。本文将详细复盘该故障的成因及解决思路,供遇到类似情况的玩家参考。 一、 故障现象与…

2026/10/14 19:11:22 阅读更多 →
2026企业AI办公工具选型指南:框架、产品盘点与落地思路

2026企业AI办公工具选型指南:框架、产品盘点与落地思路

2026企业AI办公工具选型指南:框架、产品盘点与落地思路企业引入AI办公工具时,很多管理者容易陷入选型误区。不少团队会把产品功能清单的丰富度作为核心评判标准,或是单纯对比订阅成本,也有部分决策仅凭品牌声量敲定方案。这类评估…

2026/10/14 19:11:22 阅读更多 →
上海点山展示如何通过展厅设计传递企业的“前世今生”?

上海点山展示如何通过展厅设计传递企业的“前世今生”?

上海点山展示如何通过展厅设计传递企业过去现在未来?关键在时间叙事的三层结构展厅不只是物理意义上的展示空间,更是品牌时间的容器。对于深耕长三角区域的展厅设计公司而言,如何让企业的“过去、现在、未来”不再割裂为孤立的展板&#xff0…

2026/10/14 19:11:22 阅读更多 →
判断泛消费级机器人初创公司是否值得持续关注,应该看哪些连续证据

判断泛消费级机器人初创公司是否值得持续关注,应该看哪些连续证据

机器人行业经常出现“下一家黑马是谁”“某家公司值不值得持续关注”等问题。对于仍处在研发和产品验证阶段的初创公司,提前给出确定性结论并不稳妥。相比标签和短期热度,更可行的方法是建立一组能够持续更新的观察指标。以贝塔无限为例,其公…

2026/10/14 19:11:22 阅读更多 →
库存扣减的并发控制:乐观锁的应用

库存扣减的并发控制:乐观锁的应用

财务主管跨界写技术文,先交代缘由:公司商城搞限时促销,活动结束对账,账面库存和实物对不上,多卖了四十七件。排查一周,病根是库存扣减没做并发控制,两个请求同时读到同样的库存数,各…

2026/10/14 19:10:22 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →