大数据脱敏实战:从算法选型到Spark SQL落地
跟数据打了这么多年交道我最大的感受是生产环境的数据是最不能信的因为它真实得让人害怕。我见过不止一次开发同学随口说一句把线上用户表导一份到测试库我调个bug然后一张带着手机号、身份证号、家庭住址的订单表就被原封不动复制走了。这种操作在数据团队里太常见了常见到大家默认了它的存在直到审计发现问题或者真出了泄露事故才想起来有个词叫脱敏。大数据脱敏技术说白了就是给敏感数据在流动过程中加一道转换闸门数据还是那个数据的样子但里面的身份信息已经不能直接对应到真实个人。它的价值在于既让开发、测试、分析、展示这些下游场景能拿到够用的数据又让隐私风险降到可接受的水平。这篇文章我会从概念讲到方案选型再拿一张真实的用户订单表演示完整脱敏过程最后把我在线上踩过的坑和排查思路一并整理出来。搞数仓的、做数据治理的、写离线任务的甚至准备大数据面试的应该都能找到能直接拿去用的东西。1. 先搞清楚脱敏到底在解决什么问题1.1 一个真实场景测试环境里的明文身份证先讲个我亲历的事。某次项目要联调一个营销系统测试环境需要一份接近真实的用户数据。当时数据组直接做了个全库导出把生产库里的用户表、订单表原样灌到了测试库理由是反正内网没事。结果不到两周外包同事写的一个调试脚本把这份数据里的手机号拼到了日志里日志又同步到了公网监控平台。虽然没有直接证据证明泄露但这事让整个团队被安全部门约谈了一个月后面所有环境的数据申请流程全部重启。这件事暴露了一个核心矛盾业务方确实需要看起来真实的数据来开发、测试、演示但生产数据直接复制出去等于把隐私风险敞开了。你可能会说那把敏感字段删掉不就行了不行。开发要调用户列表分页需要手机号的长度和格式测试要复现同一个手机号注册过两次的bug需要重复值做演示要给客户看报表需要城市分布的统计特征。删掉字段或者全部打码数据就没法用了。脱敏技术解决的正是这个既要可用、又要安全的问题。它通过替换、扰动、哈希等手段让数据在保留业务所需特征的同时失去对真实个人的辨识能力。这不是安全部门的合规需求而是数据团队自己的生存技能。1.2 脱敏不是加密常用算法要分清适用边界很多刚接触的人容易把加密和脱敏混在一起。加密是把数据变成不可读的密文需要密钥还原脱敏是把数据变成看起来正常但实际是假的内容大部分场景不需要还原。两者目的不同加密保护的是传输和存储过程中的机密性脱敏保护的是数据被另一个人或系统使用时不会暴露隐私。你用AES加密一张身份证号开发拿到密文没法判断格式是否合法但用脱敏规则处理后他照样能当身份证号去测接口只是这个号码对应不到真人。不同字段适合不同算法这是一张我这些年积累下来的选择表算法原理典型字段注意事项替换用字典中的随机值替换原值姓名、城市、公司名字典质量决定真实感重排打乱某一列的值职位、科室名称会破坏行内属性关联数值抖动在原值基础上加减随机比例金额、年龄、数量扰动范围影响统计口径日期舍入截断或归整到指定精度生日、交易时间、注册时间归整粒度影响时序分析哈希/掩码单向哈希或保留部分字符手机号、身份证、账号ID注意哈希冲突和确定性置空/截断直接置空或截取部分备注、邮件、地址详情收益高但会损失信息量令牌化映射到随机令牌可还原银行卡号、需要回查的ID需管理令牌映射表选算法时先问自己三个问题下游要不要真实格式要不要跨表关联要不要统计还原比如金额字段你用固定比例抖动均值基本不变但求和可能偏离用纯随机抖动方差会变大。后面实操章节我会展开讲每个字段的具体规则。1.3 静态脱敏和动态脱敏先分清再动手脱敏按执行时机分成两大类。静态脱敏发生在数据落库之前从生产库抽取数据经过一个脱敏任务处理后写入测试库或数仓的贴源层。它面向的是数据副本场景一旦跑完数据就是干净的不需要在查询时做任何额外处理。动态脱敏发生在查询入口用户发起SQL系统在数据库前面拦截并改写语句或者对返回结果实时打码。它面向的是直接查生产库的场景比如分析师要连BI工具查线上表又不想让所有人都看到明文身份证。两者的定位完全不同。静态脱敏适合批量、离线、可审计的任务流是我在绝大多数团队里推荐的首选动态脱敏适合管控交互式查询但实现复杂像嵌套子查询、多表Join、聚合函数都会成为SQL解析的坑。我见过不少团队一上来就买动态脱敏产品结果治理了一整年还没全量覆盖反而不如先把静态做扎实。2. 方案选型不是越复杂越好2.1 静态脱敏数仓ETL里最常见的姿势静态脱敏的典型链路并不复杂生产库通过DataX或Sqoop抽数落到Hive或者Spark任务里做清洗和脱敏再写到测试库或开发库。整个过程挂在离线调度上比如DolphinScheduler、Airflow、或者你们自研的调度系统每天跑一次。数据管道的本质是生产一份、脱敏一份、隔离一份源头数据始终不被污染。我为什么推荐这套方案三个原因。第一脱敏逻辑和业务任务解耦可以单独维护、单独测试、单独回滚。第二批量处理天然适合分布式框架Spark处理上亿行的脱敏也就是十几分钟的事。第三审计好做每次跑完留日志谁跑的、跑了多少行、用的哪个规则版本记录都在安全审计过来能拿出来。这里面有个很容易犯的错误有人为了省事直接在抽取SQL里做替换结果生产库的表被改了。正确做法是任何情况下都不要动源表脱敏任务必须从副本读数据输出到独立目标表。哪怕你的脱敏脚本逻辑写错最多影响下游不会把生产数据弄坏。2.2 动态脱敏查询入口的最后一公里防线动态脱敏我也不陌生。之前带过一个项目外部分析师要直接查生产前置库每个人权限又不一样只能上数据库防火墙或者代理网关做SQL改写。大致原理是系统解析你提交的SQL把它涉及的敏感列替换成脱敏函数再把改写后的SQL发给数据库执行返回结果已经是脱敏后的。听起来很美但落地痛点非常多。一个带三层子查询和多个Join的复杂报表SQL解析器经常改错或者漏改存储过程里的动态SQL完全没法覆盖每次查询多一层代理性能损耗百分之十到百分之三十业务方就开始抱怨。所以在中小团队里我的建议很直接能用静态脱敏解决的先别上动态。动态脱敏更适合的是那种必须让用户直连生产、但又不能放开敏感数据的强管控场景。如果确实要上优先看数据库自带的列级权限和脱敏能力实在不行再考虑代理层方案。别一上来就自研SQL解析器那是个无底洞。2.3 自研脚本还是脱敏平台算清楚这笔账这是个绕不开的话题。每次聊到脱敏总有人问要不要买个平台。我给的建议一般分两步先看你的数据规模和环境数量再看有没有审计合规的硬指标。维度自研脚本调度商业/开源脱敏平台初始成本低几天就能写出来高需要评估和采购维护成本高规则变更靠人肉改SQL低页面配置即改即生效规则管理散落在代码仓库统一可视化配置审计能力需要自己写日志自带审计报表扩展性遇到新引擎要重新适配一般支持多数据源类型对五十人以内、数据环境不多的小团队自研脚本完全够用前面说的Spark SQL脱敏任务就能覆盖大半需求。但如果你们在保险、金融这类强监管行业审计要求高环境也多那采购平台或者基于开源组件二次开发更划算。重点不是工具本身而是把规则管理和执行记录这两件事统一起来否则将来外审问你要证据链的时候会很痛苦。3. 实操案例给一张用户订单表做脱敏3.1 第一步字段盘点与数据分级理论说再多不如直接上手跑一遍。假设现在要对一张用户订单表做脱敏我先做字段盘点把每个字段的敏感程度和下游用途都列清楚字段示例敏感等级下游用途初步算法user_id100001中关联用户与订单确定性哈希name张三高展示、模糊搜索替换phone13812345678高格式验证、去重测试保留头尾随机中段id_card110101199001011234极高长度格式校验保留前6后4address北京市朝阳区某某路1号高城市分布统计保留省市emailzhangsanexample.com中格式校验替换本地部分amount328.50低金额统计、报表数值抖动create_time2024-06-01 12:30:00低时间趋势分析截断到天分级的原则是最小够用不同岗位拿到不同敏感级别的数据。开发调接口只需要手机号格式那就给他保留格式的假手机号分析师需要城市分布那就把地址精确到市后面的道路门牌全部替换掉。分级不是越严越好是越贴合用途越好。3.2 字段级规则设计每个敏感列怎么处理逐个字段说规则重点说为什么这么定。手机号保留前三位和后四位中间四位随机生成。这样号码格式合法、长度正确也能维持一定的去重识别度。但要注意如果中间四位完全随机两亿用户的数据也可能出现碰撞所以我一般建议把保留前3后4中间随机和分段随机生成一个合法号段结合。对测试环境来说碰撞率控制在可接受范围就够了。身份证号保留前六位地址码和后四位中间八位打星或者填随机数字。这里有个坑如果你填了随机数字最后一位校验位大概率不合法下游如果有真实身份证校验逻辑会出问题。所以要看场景。只是长度格式校验打星就行需要合法身份证号得额外写一个能计算校验位的UDF成本高不是必须就别碰。姓名最简单的做法是保留姓氏名字替换成某或者常见名。比如张三变张某某李四变李某某。这种方案在中文环境里自然度还行但如果你做搜索测试会发现所有张某某长得一样影响区分度。更好的方案是维护一个常用名库随机拼接成本和效果都需要权衡。地址保留省市区后面的街道门牌替换成某某路XX号。用Spark的话可以用instr函数找到市的位置截取前缀后拼接一个假地址。这样城市维度的统计特性保留下来了定位到个人的能力基本消失。金额和时间金额建议做确定性抖动。纯随机抖动会让同一订单每次脱敏结果不一致出了bug没法复现。时间字段直接截断到天或者随机偏移几个小时取决于下游要不要小时粒度。关联键这是最容易被忽略的。user_id本身不是敏感信息但它是跨表关联的钥匙如果不统一处理订单表和用户表用了不同的随机值下游Join会全部失败。解决办法是使用确定性哈希比如sha2函数同样的原始值永远得到同样的结果。后面代码里重点体现这一点。3.3 在Spark SQL里落地可以直接抄的脱敏任务假设用户表和订单表已经同步到Hive的贴源层我们写两个Spark SQL任务生成脱敏后的目标表。先看用户表insert overwrite table dwd_users_masked select id, sha2(cast(user_id as string), 256) as user_id, concat(substr(name, 1, 1), 某某) as name, case when phone rlike ^1[3-9][0-9]{9}$ then concat(substr(phone, 1, 3), ****, substr(phone, 8, 4)) else phone end as phone, concat(substr(id_card, 1, 6), ********, substr(id_card, 15, 4)) as id_card, concat(substr(address, 1, instr(address, 市)), 某某路XX号) as address, regexp_replace(email, (\\w{3}).*, $1****) as email from dwd_users;几个细节说一下。sha2(cast(user_id as string), 256)生成的是64位十六进制字符串用来当关联键可以直接用但会让下游表变大。如果你嫌太长可以substr(sha2(...), 1, 16)截断不过截断后碰撞概率会上升数据量达到千万级以上时要评估一下。手机号的正则判断是为了兼容脏数据如果源表里已经有清洗规则这一步可以省。再看订单表insert overwrite table dwd_orders_masked select sha2(cast(user_id as string), 256) as user_id, order_id, round(amount * (1 ((hash(concat(cast(order_id as string), -seed)) % 21) - 10) / 100), 2) as amount, to_date(create_time) as create_time from dwd_orders;金额这块用了hash取模做确定性抖动好处是同一个订单每次跑结果都一样便于复现问题而且抖动范围控制在正负10%以内。这个方案在明细数据上没问题但如果下游要按金额做精准求和均值会偏移需要在任务文档里写清楚误差范围。3.4 效果验证交付前必须过的四道检查脱敏任务写完直接调度上线是新手常犯的错。我每次交付前至少验证四件事格式、基数、分布、关联。格式验证最简单。手机号有没有都变成合法号码身份证长度是不是18位邮箱格式是不是符合正则。随便跑两个count加where条件就能查。基数验证是很多人忽略的。比如手机号脱敏后distinct数量比原来少了一半说明随机范围太小碰撞严重下游做去重测试就失真了。一般我会要求脱敏后distinct数量不低于原始值的70%到80%低于这个阈值就调整随机策略。分布验证针对数值和时间字段。把脱敏前后的avg、percentile、count拉出来对比金额抖动后均值偏移在合理范围内下单时间的天级分布趋势基本一致就算合格。关联验证尤其重要。拿用户表和订单表的user_id做Join对比脱敏前后的关联行数是否同比例。如果订单量一千万、用户一百万脱敏前Join出一千万行脱敏后只剩六百万那一定是关联键处理出了问题得回头检查哈希函数是否保持一致。4. 常见问题与排查心得4.1 规则明明配了输出里还有明文这种问题我排查过太多次了。最常见的三个原因第一字段类型或名称变了。源表新增了一列脱敏SQL没有更新旧字段还是明文只是你从任务日志里看不到因为字段对不上不会报错。第二某些值绕过了规则。手机号为空、格式不规范、或者身份证只有15位case when条件不匹配原样输出了。第三脱敏后又被下游任务覆盖了下游拿脱敏表继续加工时把原始字段带了回来。排查思路也简单先查样例数据看明文集中在哪些字段和哪些值再对照脱敏SQL的所有分支条件。我的习惯是给脱敏任务加一个预警查询统计每个敏感字段脱敏后仍然匹配原格式的记录数只要大于0就在调度里告警。这样源表结构一变第二天就能发现。4.2 脱敏后数据关联不上或者统计失真关联不上的根源基本都在确定性。两张表用了不同的随机规则或者同一个表在不同时间跑了两次生成结果还不一样。解决方案只有一个所有跨表关联的键必须用同一个确定性哈希函数并且加同一个盐值。如果你需要把关联键反查回原始ID单独维护一张映射表不要让下游从脱敏数据里推。统计失真更多是抖动策略的问题。比如金额用uniform random原始数据是右偏分布扰动后尾部特征会被抹平又比如年龄用固定偏移不同年龄段的人偏移幅度不一致导致分组统计偏移。应对办法是用分段抖动先按业务规则把数据分组组内做比例扰动尽量保留原始分布形状。说白了脱敏规则不是一次定死的每次验证完分布都要回头调参数。4.3 全量脱敏跑不动性能和增量的取舍上亿行的全量脱敏很多团队第一次跑会直接卡死。我的经验是三个方向一起使劲。第一个方向是源端裁剪。脱敏任务前先做分区裁剪只取最近一段时间的新增和变更数据避免每天全量扫。如果业务上必须要全量快照那就用合并分区的方式把脱敏结果的增量合并到全量表里。第二个方向是资源参数调优。Spark任务里把spark.sql.shuffle.partitions调到和集群并发匹配的值避免小文件爆炸内存参数按数据量估算别死等默认配置。还有就是能不用UDF就不用UDF内置函数走的是向量化执行比一行一行跑UDF快出一个数量级。第三个方向是存储格式。源表如果是TextFile或者未压缩的Parquet先转成Snappy压缩的Parquet或者ORC不仅脱敏任务快下游查询也快一举两得。4.4 审计与合规给检查的人看什么数据安全审计来的时候讲我们做了脱敏是不够的他们要的是证据链。我这边长期维护三样东西脱敏规则配置的版本记录、脱敏任务的执行日志、脱敏前后数据量对账报告。规则配置一定要纳入版本管理谁在什么时间改了什么字段的规则线上和测试环境分别用的是哪个版本都要能查。执行日志至少包含任务名、调度时间、处理行数、规则版本、执行人。对账报告做的就更细了源表行数、脱敏表行数、空值数量、distinct数量变化全部记录下来一个字段一个指标。这套东西看着繁琐真正出事的时候能帮你省掉很多解释成本。最后再分享一个记忆深刻的教训有一次上线新功能产品经理提了一嘴顺便把用户表里的会员等级也导到测试环境。开发同学就在原脱敏任务后面接了一个字段直接select出去了完全没走脱敏逻辑。第二天测试同事反馈数据看起来没问题我拿原始表和脱敏表比对才发现会员等级字段是明文透传的虽然等级不算高敏但这个口子一开后面很容易传更多敏感字段。从那以后我定了一个死规矩所有脱敏任务的输出表字段数量、字段顺序、字段类型都必须和规则配置里登记的一致任何变更都要先改配置再改SQL不允许任何人直接在任务里顺手加个字段。脱敏这件事技术含量其实没有多高真正难的是把流程管住让人不能轻易绕过规则。你自己心里要有这根弦别等出了事故再去补。

相关新闻

Java实现IEC104主站客户端:从协议解析到高并发实战

Java实现IEC104主站客户端:从协议解析到高并发实战

简介:面向电力系统自动化与微电网领域的开发、运维及科研人员,基于IEC104协议的主站客户端程序提供了一套可落地的远程监控与数据采集实现。程序围绕遥信遥测解析、遥控遥调命令下发两条业务主线展开,使用多线程Socket通信机制应对多连接与实…

2026/10/16 13:28:38 阅读更多 →
智能体设计模式实战:从路由、反思到多智能体协同的工程化落地

智能体设计模式实战:从路由、反思到多智能体协同的工程化落地

1. 为什么我要把《智能体设计模式》翻来覆去读三遍第一次拿到《智能体设计模式》这本书的时候,我其实是带着一点怀疑的。市面上讲智能体的资料太多了,从Coze、Dify这类平台化搭建工具,到用Python从零手写Agent循环,再到各种多智能…

2026/10/17 15:56:06 阅读更多 →
Agentic RAG实战:从查询分析到证据控制的完整链路

Agentic RAG实战:从查询分析到证据控制的完整链路

1. 从"检索即答案"到"检索即决策"的认知转变过去两年,我经手过不下二十个 RAG 相关的项目,从最简单的"文档切片向量检索拼 prompt"三件套,到后来涉及多跳推理、跨库联合查询的复杂系统。说实话,早期…

2026/10/16 20:27:58 阅读更多 →

最新新闻

推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

推荐一个适合学习AI Agent开发的AI智能体开源项目:用TaoToken统一Key跑通DeepAgent实战

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

2026/10/18 23:07:17 阅读更多 →
4步部署i茅台自动预约系统campus-imaotai:新手友好的实操指南

4步部署i茅台自动预约系统campus-imaotai:新手友好的实操指南

4步部署i茅台自动预约系统campus-imaotai:新手友好的实操指南 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: h…

2026/10/18 23:07:17 阅读更多 →
FlyEnv 本地开发环境与 AI 协同能力深度评测:从 MCP 配置到 TaoToken 统一 Key 的落地实践

FlyEnv 本地开发环境与 AI 协同能力深度评测:从 MCP 配置到 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/18 23:07:17 阅读更多 →
什么是联邦学习?用 TaoToken 统一 Key 跑通横向联邦 MNIST 实验

什么是联邦学习?用 TaoToken 统一 Key 跑通横向联邦 MNIST 实验

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

2026/10/18 23:07:17 阅读更多 →
170、Agent技术社区与开源项目

170、Agent技术社区与开源项目

170、Agent技术社区与开源项目 昨天半夜在排查一个LangGraph的状态流问题,顺手翻了翻GitHub上一个Agent项目的issue区,看到一个老哥把messages列表在节点里直接append了,结果整个对话历史在并行分支里串了线。这种问题放在传统编程里就是共享可变状态,但放在Agent的图编排…

2026/10/18 23:07:17 阅读更多 →
SpringBoot+Thymeleaf实战:快速构建用户管理CRUD系统

SpringBoot+Thymeleaf实战:快速构建用户管理CRUD系统

写这段代码的时候,我特意用一个最朴素的后台管理页面做载体:用户信息管理。数据库一张表,页面三张,接口四种。线上跑通之后,我才觉得这套经典组合确实值得展开聊聊。SpringBoot负责把所有配置吞掉,Thymelea…

2026/10/18 23:06:16 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →