简介面向使用YOLO系列算法的计算机视觉学习者与开发者提供一套刀具检测目标检测任务数据集共包含1464张已标注图像。压缩包整体约38.15MB含2000个文件其中1281个XML标签文件、719个TXT标签文件TXT为YOLO格式每行记录类别索引及归一化后的中心坐标与宽高XML为VOC格式便于在主流标注工具和训练框架间切换。数据集已按训练集、验证集划分完毕并附带data.yaml配置文件可直接用于YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11等版本的模型训练与效果验证。文件名末尾还保留了部分类别名称方便按需筛选样本。目前已有116人学习/浏览适合目标检测入门者快速跑通流程也可为工业刀具识别、质检场景的开发者提供现成的训练数据与调优基础。1. 1464张带标签的刀具图像YOLO算法落地产线质检的起点工业质检场景里刀具检测是一个标准目标检测任务在CNC车间、自动化刀具库或质检台上用摄像头确认刀具的存在位置和状态。传统人工巡检效率低结果也因人而异YOLO算法配合一套带标签的数据集是目前落地最稳的路径——1464张图像每张都有边界框标签可以直接用来训练刀具检测模型部署到工控机或边缘设备上做实时识别。这篇文章适合两类人一类是刚接触目标检测、手上正好有个现成数据集想跑通全流程的开发者另一类是做视觉质检方案选型的技术工程师。我会从数据集结构讲到训练、避坑和部署把每个环节的细节都摊开讲。提示开训之前先确认标签粒度——这个数据集标的是整把刀具还是分开标了刀刃和刀柄。粒度决定模型输出什么也决定后续做磨损判断时下游算法拿到的框是什么。2. 解压后先别开训1464张图的结构、txt标签与对齐检查2.1 images与labels双目录是YOLO系列的标准走法拿到压缩包后先解压到本地工作目录unzip YOLO算法-刀具检测数据集-1464张图像带标签-刀.zip -d ./tool_dataset解压后你大概率会看到这套结构tool_dataset/ ├── images/ │ ├── tool_0001.jpg │ ├── tool_0002.jpg │ └── ... ├── labels/ │ ├── tool_0001.txt │ ├── tool_0002.txt │ └── ... ├── classes.txt └── data.yamlimages存原图labels存同名txt标签一一对应。这是YOLOv5到YOLOv8通用的组织方式也是目标检测数据集最主流的两种分发形式之一。另一类是VOC风格的xml标注但做YOLO训练几乎没人直接吃xml最后都要转成txt。所以判断一个数据集是不是YOLO格式就看两个东西有没有images和labels两个目录labels里的txt是不是每行都是五列数字。有个常见情况压缩包里套了一层同名目录解压出来实际路径变成tool_dataset/tool_dataset/images。路径多一层不影响训练但后面写data.yaml或划分脚本时容易绕晕建议先把内层目录整理出来mv tool_dataset/tool_dataset/* tool_dataset/ rmdir tool_dataset/tool_dataset然后做文件名对齐检查。图像和标签必须严格同名哪怕只有几张对不上都会在训练时报错或者被静默跳过。下面这个脚本我几乎每个数据集都会先跑一遍# check_alignment.py from pathlib import Path img_dir Path(tool_dataset/images) lbl_dir Path(tool_dataset/labels) imgs {p.stem for p in img_dir.glob(*.*) if p.suffix.lower() in (.jpg, .jpeg, .png, .bmp)} labels {p.stem for p in lbl_dir.glob(*.txt)} print(f图像数量: {len(imgs)}) print(f标签数量: {len(labels)}) print(f无标签的图像: {len(imgs - labels)}) print(f无图像的标签: {len(labels - imgs)}) if imgs - labels: print(以下图像缺少标签) for name in sorted(imgs - labels)[:10]: print(f {name})逻辑说明把两个目录下的文件名取成集合用集合相减找出两边对不上的部分。后缀过滤只保留常见的图像格式避免把缩略图或隐藏文件算进去。跑完如果输出无标签的图像: 0再进下一步。注意空文件也会被当成有标签。0字节的txt在集合检查里不报错但YOLO训练时会直接跳过它属于隐性问题2.3节会专门排查。2.2 一个txt文件一行为一个目标框坐标全是归一化相对值YOLO标签每行格式固定是五个数class_id x_center y_center width heightclass_id是类别序号从0开始后面四个数分别是目标框中心点的x、y坐标和框的宽高全部用归一化值表示即除以了图像自身宽高。举例一张1920×1080的图像里一把刀占左上角四分之一区域中心点在(480, 270)宽高分别是960和540那么这一行标签写出来就是0 0.25 0.25 0.5 0.5为什么YOLO用归一化坐标而不是像素坐标因为训练时会对图像做LetterBox缩放不管输入是800×600还是1920×1080最终都会统一到imgsz尺寸。归一化坐标在缩放过程中不需要换算直接乘以新的宽高就得到当前图像上的位置天然适配多分辨率输入。如果你之前接触过VOC格式做个对比会更直观对比项VOC xmlYOLO txt坐标形式左上角 右下角像素绝对值中心点 宽高归一化值存储格式XML节点纯文本行类别信息标签名如cutter类别序号如0二次编辑需解析XML直接用文本编辑器改从VOC转YOLO的换算公式是x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height这个数据集既然标明是YOLO格式labels里应该已经是转好的txt。但你要验证坐标范围——正常的五个数里后四个都应该在0到1之间class_id除外。如果出现负数或者大于1的值说明标注软件导出有问题或者中间有人手工改坏过格式这种样本进训练会直接污染loss。检查方法很简单遍历所有txt把每个数打印出来看极值就行。2.3 快速体检类别分布、每图目标数和空标签训练之前我习惯给每个数据集做一次体检就三个指标类别数量、每张图的平均目标数、空标签数量。一分钟跑完能看出数据集成色。# dataset_stats.py from pathlib import Path from collections import Counter lbl_dir Path(tool_dataset/labels) empty 0 obj_per_image [] class_count Counter() for txt in lbl_dir.glob(*.txt): lines [l.strip() for l in txt.read_text().strip().splitlines() if l.strip()] if not lines: empty 1 continue obj_per_image.append(len(lines)) for line in lines: class_count[int(line.split()[0])] 1 total_txt len(list(lbl_dir.glob(*.txt))) print(f标签文件总数: {total_txt}) print(f空标签文件数: {empty}) print(f每图目标数均值: {sum(obj_per_image) / len(obj_per_image):.2f}) print(f类别分布: {dict(class_count)})逻辑说明逐行读取每个txt跳过空行文件为空就计入空标签每张图的目标数记下来求均值class_id用Counter统计类别频次。跑完后重点看两个数——空标签占比和类别分布。空标签占比超过5%说明标注时有漏标或者标注中断。它带来的问题不是模型学到这里没刀而是模型没机会在这个背景上学到这里该有刀推理时同样的位置就会漏检。做法是把空标签文件挑出来用原图人工过一遍确认该有目标但漏标的要么补框要么干脆把这张图从训练集剔除。单类数据集相对省心类别分布只会有一行统计。但如果你后面自己扩展数据加了刀刃磨损或刀柄这些子类就要盯每类的目标数量级——某一类样本量低于总样本5%模型大概率学不好这一类后面避坑章节会展开讲。1464张图如果平均每张1到3个目标总量就在1500到4000个框之间这个规模训练一个单类YOLO检测器是够用的但如果目标再细分成多类就需要补充数据了。3. 数据切分与增强如何把1464张图喂给YOLOv83.1 按场景划分train/val而不是纯随机抽数据切分是训练前最容易做错的一步。很多人把1464张图按8:2随机一分为二看着比例没问题但刀具图像往往是一段段连续拍摄的同一把刀在相邻帧里位置、光照几乎一样。纯随机划分会把同一场景的近邻帧同时分进训练集和验证集验证指标虚高部署到真实产线立刻现原形。原因在于随机切分带来了信息泄漏验证集里出现了训练集的近亲样本。工业数据尤其明显一次采集经常是几十甚至上百张连拍。稳妥做法是先把图像按拍摄场景或文件命名前缀分组再对组做切分。比如文件名都是tool_0001.jpg这种递增编号可以每隔10张取2张做验证同一段连续帧只落在一个集合里# split_dataset.py import os import shutil from pathlib import Path src_img Path(tool_dataset/images) src_lbl Path(tool_dataset/labels) dst_train_img Path(tool_dataset/train/images) dst_train_lbl Path(tool_dataset/train/labels) dst_val_img Path(tool_dataset/val/images) dst_val_lbl Path(tool_dataset/val/labels) for d in [dst_train_img, dst_train_lbl, dst_val_img, dst_val_lbl]: d.mkdir(parentsTrue, exist_okTrue) # 按文件名序号做间隔采样每10张取2张做验证 for img_path in sorted(src_img.glob(*.jpg)): stem img_path.stem idx int(stem.split(_)[-1]) # 假设命名 tool_0001.jpg is_val (idx % 10) in (8, 9) img_dst dst_val_img if is_val else dst_train_img lbl_dst dst_val_lbl if is_val else dst_train_lbl shutil.copy(img_path, img_dst / img_path.name) shutil.copy(src_lbl / f{stem}.txt, lbl_dst / f{stem}.txt) print(ftrain: {len(list(dst_train_img.glob(*.jpg)))}) print(fval: {len(list(dst_val_img.glob(*.jpg)))})逻辑说明取文件名末尾的序号对10取模序号8和9进验证集其余进训练集。这样连续拍摄的10帧里只有第9、10帧做验证训练集里不会出现它们的近邻帧。如果你不知道序号对应的采集顺序这个脚本要先改成按拍摄时间或目录分组切记不要无脑随机。切分比例上1464张图建议按9:1或8:2都行验证集不少于100张。如果后续要做模型筛选再单独从训练集里切一小份做调参测试集别动验证集的边界。3.2 数据增强1464张图怎么发挥更大价值YOLOv8自带一套数据增强开启后每个epoch都会对图像做随机变换相当于变相扩充数据集。对刀具检测这类小目标多、背景偏工业风格的场景增强参数不能全开要按数据特点取舍。video games增强里最有用的是mosaic——把4张图拼成一张训练能显著提升模型对小目标的感知能力。但mosaic有个副作用拼接处会生成不自然的边缘如果刀具边缘本身清晰模型容易学到拼接缝这种假特征。建议保留mosaic但不开满ultralytics默认的mosaic1.0可以降到0.8左右。翻转要谨慎。刀具是有方向的车刀、铣刀的刃口朝向直接决定磨损判断逻辑。如果数据集里刀头既有朝左也有朝右开水平翻转没问题如果全是统一朝向装配的翻完就制造了一批现实中不存在的样本推理时反而把反方向的背景误检成刀。我的习惯是先用脚本统计标签中心点的x分布主峰明显偏向一侧就不开翻转分布均匀再开。HSV增强值得开。产线光照会变白天晚上、暖光冷光差异不小。hsv_h0.015, hsv_s0.7, hsv_v0.4是ultralytics默认值工业场景我会把hsv_v提高到0.5让模型对亮度变化更鲁棒。平移和缩放默认值也够用不要把translate开到0.2以上刀具检测中目标框偏移超过半个框模型会学到错误的位置先验。3.3 写data.yamlyolov8训练自己的数据集唯一入口yolov8训练自己的数据集最核心的就是把data.yaml写对。它告诉框架数据在哪、类别是什么。新建一个tool.yaml# tool.yaml path: ./tool_dataset # 数据集根目录 train: train/images # 训练图像目录相对path val: val/images # 验证图像目录相对path nc: 1 # 类别数量1类刀具 names: 0: 刀具三个字段最容易被坑path、train、val的写法。path写绝对路径最稳妥写相对路径必须以运行yolo命令的目录为基准别用~/开头ultralytics对波浪号展开有时候不认。train和val指向的是存放图像的目录不是图片文件列表。label位置不用单独声明框架会自动把images替换成labels去找同名txt。如果数据集作者已经在压缩包里放了data.yaml你也要对一遍nc和names确认和classes.txt一致。经常发生压缩包里data.yaml的names顺序和txt里class_id对不上的情况一旦错位训练出来的模型推理结果类别名就是错的这种错误隐蔽且致命。4. 用YOLOv8训练刀具检测模型最小可复现的命令与参数表4.1 环境准备ultralytics与PyTorch的版本匹配训练环境建议直接用ultralytics官方pip包它把数据加载、增强、训练、导出全封装好了不用自己拼代码。Python 3.9以上PyTorch 2.0以上CUDA版本跟着显卡驱动走。创建虚拟环境再安装python -m venv .venv source .venv/bin/activate pip install ultralytics安装完成后先验证GPU对框架可见python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))两个坑一是CPU环境也能跑但1464张图加上300个epochCPU训练时间不可接受至少需要一张8GB显存的卡二是如果显卡是30系或40系PyTorch版本别太老老版本对新一代架构的算子支持差训练时可能突然OOM或者卡死。装完库之后yolo命令就全局可用了命令行直接写参数。4.2 训练命令imgsz、epochs、batch怎么定训练命令可以极简yolo detect train datatool.yaml modelyolov8n.pt epochs300 imgsz640 batch16 device0跑之前把几个关键参数摸清楚参数建议值依据modelyolov8n.pt / yolov8s.ptn最快s精度高先试n跑通再换simgsz640刀具属于中等目标640够用太大反而慢epochs200~3001464张图不算多300内收敛batch按显存定8GB用816GB用1624GB用32device0单卡指定0多卡写0,1先说model。yolov8n.pt是个预训练权重不是完整模型定义框架会自动下载对应的yolov8n.yaml结构并加载COCO预训练权重做迁移学习。刀具检测和COCO里的物体差异很大但底层的边缘纹理特征仍然通用迁移学习能让loss起点比随机初始化更低。先用yolov8n.pt跑通再换yolov8s.pt或yolov8m.pt提精度是效率和效果最平衡的路线。batch是显存敏感项。16GB显存跑imgsz640, batch16比较稳妥如果训练中报CUDA out of memory优先把batch减半而不是改imgsz。因为imgsz减半会显著影响小目标检测能力batch减半只是多几个step不影响精度。1464张图的规模YOLOv8n在batch16、300个epoch下单卡大约1到2小时能跑完v8s大概是三到四倍耗时。4.3 训练过程的监控看loss曲线还是看mAP训练启动后ultralytics会在当前目录生成runs/detect/train/里面一堆曲线图和weights。很多人盯着loss曲线看其实训练中更该盯的是验证集上的mAP0.5和mAP0.5:0.95这两个指标它们每50个epoch刷新一次。以刀具检测为例mAP0.5更贴近真实使用——它只要求预测框和真实框的IoU超过0.5就算对。工业产线框定位允许一定误差0.5的阈值足够而mAP0.5:0.95是多个IoU阈值下的平均对框位置精度要求苛刻适合追求精细定位的场景比如后续要根据刀尖位置做磨损量化分析。两个指标差很多时说明模型位置精度不行优先检查标签质量而不是加数据。训练结束看runs/detect/train/weights/里面有best.pt和last.pt。best.pt是验证集mAP最高点的权重也是后续推理和部署的选择。last.pt只是训练最后一步的存档不一定比best好。另外看训练时长和loss收敛曲线如果loss在最后50个epoch几乎不变说明300够用甚至多了如果还在下降建议把epochs提到400。5. 刀具检测训练避坑清单五个会翻车的细节5.1 模型漏检刀具验证集mAP高实拍却找不到刀现象训练曲线正常验证集mAP0.5能到0.95但拿着best.pt对现场拍的新图推理刀具漏检严重置信度普遍低于0.3。原因现场光照和训练图像分布不一致典型的过拟合训练集风格。刀具金属表面反光强烈训练集曝光偏暗现场打光一强模型提取到的特征全变了。另一个常见原因是验证集本身和训练集太像场景多样性不足导致mAP虚高。解决数据层面采集现场不同角度、不同光照下的图像补充进训练集至少增加100到200张代码层面推理时把conf阈值从默认0.25降到0.15同时提高iou0.5让模型在低置信度下也能输出再靠后续的位置约束过滤。更多时候你需要同时做这两件事先让模型看得见再谈准确。5.2 训练loss正常但mAP卡在0.7上不去现象训练过程loss稳步下降但验证集mAP0.5卡在0.7左右不再上涨模型找得到刀具但框偏差大。原因标签框本身不精确。1464张图的标注如果是外包或自动标注产出的部分框可能比真实刀具大一圈或小一圈和实际位置偏离好几个像素。模型学的目标位置就是这批有偏的框自然到不了高mAP。解决抽查labels可视化把预测框画回原图上和后比较标注框与刀刃实际轮廓。有两种修复路径第一种是手动修正明显错框成本高但效果最直接第二种是训练时开启box_loss加权或改用giou损失变体用损失函数弱化个别脏标签的影响。我更建议先用可视化抽查100张图污染率超过10%就返工重标不超过就靠调损失继续训练。5.3 训练中途loss爆掉或变NaN现象训练跑到第几十个epoch时box_loss或cls_loss突然跳到几百曲线断崖式上涨控制台打印NaN。原因最常发生在学习了率设置过大加上batch里出现了异常样本的组合。其次数据集里有损坏的图像文件、标签坐标溢出大于1或小于0在某个batch被随机采样到梯度瞬间爆炸。解决第一检查有没有0字节或格式不完整的图片用Pillow批量验证一遍损坏就删掉第二回归一下坐标范围有超界标签就重置为合法值第三在训练命令里加optimizerSGD或降低lr0到0.001给优化器降速。三者同时做能覆盖绝大多数爆炸来源一旦loss恢复正常再逐步回调学习率。5.4 多类别场景下某一类刀具完全学不会现象如果你后续把数据集扩展成多类比如铣刀、车刀、钻头训练完发现某一类精度特别低recall接近0。原因类别不平衡或特征相似。1464张图里如果铣刀占了1000张、车刀占300张、钻头只有164张模型梯度基本被铣刀主导钻头这个类别学不到有效特征。更隐蔽的是车刀和铣刀在特定角度下外形相似模型分不清边界。解决先看类别分布表确认不平衡比例低于10%的类别考虑过采样把这部分图像在mosaic增强里多重复几次或对模型cls_loss做类别加权让少数类的分类损失占比更高。另一个实用技巧是把少数类的图像复制后做上下翻转、随机旋转再丢回训练集。手工造数据在精度要求高、样本量少的工业场景非常实用但注意不要让增强后的样本和真实拍摄风格相差太远。5.5 导出ONNX后精度下降推理结果对不上训练指标现象best.pt在PyTorch下推理没问题导出成ONNX部署到推理引擎后同类图像的检测框数量变少或置信度整体下降。原因ONNX导出时如果指定的imgsz和训练时不一致图像缩放后特征图分辨率变了。另外模型的BatchNorm算子在某些推理框架下融合精度下降。更常见的是训练时开了mosaic等增强模型对特定尺度敏感导出固定尺寸后恰好丢掉这一尺度。解决导出命令显式固定imgsz并且和训练参数保持一致。导出后再用Python加载ONNX跑一遍训练集里的图像对比输出框数量和坐标偏差。如果差异明显尝试导出为FP16精度而不是FP32某些GPU上FP16反而偏差更小。这个坑往往是最后一个踩的前面都顺利就在这翻车所以导出后的验证步骤一定要写进部署流程。6. 推理验证与部署技巧从best.pt到设备端实时检测6.1 用训练好的best.pt做一次完整的图片推理自检模型训练完别急着部署先在训练时没见过的图像上跑一次推理确认能用。最小化推理脚本如下# infer_check.py from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourcetest_images/, conf0.25, iou0.5, saveTrue, save_txtTrue, imgsz640, )参数说明source指向待测图像目录建议放一批现场实拍图而不是训练集conf0.25先用默认值如果漏检再往下调iou0.5是NMS的IoU阈值多个框重叠时保留置信度最高的saveTrue输出带框的标注图save_txtTrue同时输出标签文件方便后续量化对比。跑完看标注图里框是否贴合刀具轮廓、有没有把背景误检成刀。这一步也是模型能不能用的最直接验证。我习惯拿现场最恶劣的光照、最远距离的图像去试如果这都能稳定检出才考虑部署。实测发现1464张图训练出的YOLOv8n单模型在简单背景下通常够用但复杂产线里白班夜班光照交替建议用两个模型或者开启HSV增强重新训练一次再对比这属于典型的部署前血泪经验。6.2 导出ONNX并在工控机上用推理引擎跑起来训练完成后导出成ONNX是部署到工控机的常见做法。ONNX格式通用能被OpenVINO、TensorRT、ONNXRuntime等引擎加载丢掉PyTorch依赖yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640 opset12导出的best.onnx与配套的metadata.yaml放在同一目录OnnxRuntime加载时需要读取类别信息。部署端如果用了OpenVINO再转一步IR格式用TensorRT的话用trtexec从ONNX生成engine。两者都需要在目标机器上跑一遍验证输出和Python推理是否一致。部署时把推理封装成函数输入一帧返回检测框列表是设备端集成最省事的形态。建议在工控机上用ONNXRuntime做一次端到端延迟测试640×640输入、批量1普通工控机CPU大概20到50毫秒能到30FPS以上就是可用的。如果延迟过高优先把ONNX转成INT8精度量化代价是mAP损失0.5到1个点换取延迟减半这个取舍在实时产线上通常值得。部署上线后别忘了留一条回头路保留best.pt和训练时的args.yaml现场精度如果下滑随时能用旧权重回滚。这是我在连续三次惨痛教训后才养成的习惯——每次出问题都急着重训后来发现大部分是数据漂移不是模型退化。希望帮到你也祝你的刀具检测模型一次跑通。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
AI Agent实战:从核心架构到企业级Java落地方案 做AI agent方向有一阵子了,几乎每天都会被问到同一个问题:现在DeepSeek、GPT这类AI模型已经这么强了,为什么还要搞什么AI agent?这玩意儿到底是新瓶装旧酒,还是真值得重仓的方向?如果你也想把agent从概念落… · 2026/9/26 13:49:24
AI Coding改变软件开发:代码质量兜底与工作流重构实操 过去几个月,技术社区几乎被 AI Coding 刷屏:Cursor、GitHub Copilot、Claude Code,连同 vibe coding 这个新词一起,把许多开发者的心情搅得既兴奋又焦虑。作为在软件开发一线写了十几年代码的人,我的直接感受是&#x… · 2026/9/26 13:49:24
MariaDB二进制包systemd部署指南:国产系统适配实战 简介:本资源为MariaDB 10.6.8官方二进制发行版(Linux x86_64 systemd架构),专为Linux系统管理员、数据库运维工程师及后端开发者提供开箱即用的开源数据库部署方案,可无缝替代MySQL用于生产环境搭建、性能调优与高可用… · 2026/9/26 13:49:24
2026论文写作工具红黑榜:TaoToken统一Key接入AI写作工具怎么选?看完少走弯路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:28:09
AI Agent自我进化引擎GEPA:提示层进化机制与工程实践 1. 为什么“自我进化”是 AI Agent 落地的分水岭过去一年我经手过不少 AI Agent 项目,从简单的客服问答到复杂的多步骤任务编排,踩过的坑基本能写一本小册子。但真正让我意识到“Agent 和普通 LLM 调用是两码事”的,是第一次遇到同一个任务反… · 2026/9/26 14:28:09
Oracle 游标配 TaoToken:settings.json 骨架与报错排查 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:27:57
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46