从Vibe Coding到SDD:AI时代规范驱动开发实践指南
1. 从“感觉对了”到“目标明确”为什么Vibe Coding在AI时代行不通了最近在技术社区和项目实践中一个词被反复提及——“Vibe Coding”。直译过来是“氛围感编程”听起来很酷但实际体验过的开发者尤其是尝试用AI辅助编程的朋友多半会苦笑。它描述的是一种状态你打开编辑器启动AI编程助手输入一个模糊的需求比如“帮我写一个用户登录功能”然后就开始和AI进行一场漫长的、基于“感觉”的对话。你不断调整提示词AI不断生成代码你感觉“氛围对了”就继续感觉“不对”就重来。整个过程缺乏明确的目标和验证标准最终产出的代码质量高度依赖你和AI的“默契”与“运气”。这种开发模式在小型脚本或探索性原型中或许能快速出活但一旦涉及稍具规模的、需要维护的工程项目其弊端就暴露无遗。代码结构混乱、边界条件缺失、测试覆盖率低、与原始需求偏差越来越大……你会发现花在“调教”AI和“感觉”代码上的时间远远超过了直接手写。这本质上是一种“需求模糊”和“过程失控”的体现。而与之形成鲜明对比的是另一个开始被频繁讨论的概念SDDSpec-Driven Development规范驱动开发。尤其在AI编程的语境下SDD的价值被急剧放大。它不是什么全新的、颠覆性的方法论而是将软件工程中久经考验的“先设计后实现”思想与强大的AI代码生成能力相结合形成的一套高效、可控的工作流。简单说SDD的核心是“用精确的规范Specification来驱动AI生成代码并用同一份规范来验证生成结果”。为什么这很重要因为AI无论是Cursor、GitHub Copilot还是DeepSeek本质上是一个极其强大但“盲从”的执行者。你给它模糊的指令它只能给出模糊的、可能南辕北辙的结果。你给它精确、无歧义的蓝图它才能高效、准确地为你搭建出稳固的建筑。SDD就是为AI绘制这张精确蓝图的方法。本文将深入拆解SDD是什么它如何工作以及你该如何在自己的项目中实践它从而真正将AI编程助手从“一个有点聪明的代码补全工具”升级为“一个可靠、可控的工程伙伴”。2. 拆解SDD不止于“写注释”而是定义可执行的契约很多人初次听到“Spec-Driven”会联想到“写详细的注释”或者“先写设计文档”。这没错但不够本质。在AI编程的上下文中SDD的“规范Spec”有着更具体、更可操作的内涵。我们可以将其理解为一份机器可读或至少是AI可精确理解的、对代码行为的强制性描述。它不仅仅是给人看的文档更是给AI的“开发任务书”和“验收标准”。2.1 SDD的核心构成输入、输出、行为与约束一份有效的SDD规范通常会明确以下几个维度这与编写一个高质量函数或API文档的思路一脉相承但要求更为严格和形式化接口签名Interface Signature这是最基础的部分。函数/方法的名称、参数名称、类型、是否可选、默认值、返回值类型。例如对于一个“用户注册”功能SDD会明确规定async def register_user(username: str, email: str, password: str) - Dict[str, Any]。功能描述Functional Description用自然语言清晰描述这个代码单元要做什么。避免使用“处理数据”、“进行验证”这类模糊词汇而应使用“验证邮箱格式是否符合RFC 5322标准”、“将用户密码使用bcrypt算法加盐哈希后存储”等具体描述。前置条件与后置条件Preconditions Postconditions前置条件调用此代码前必须满足的条件。例如“username长度必须在3-20个字符之间”、“email在数据库中不存在”。后置条件代码执行成功后必须达到的状态。例如“在users表中创建一条新记录其status字段为‘pending_verification’”、“向email发送一封包含验证链接的邮件”。边界条件与异常处理Edge Cases Exception Handling明确列出所有可能的异常情况和处理方式。这恰恰是Vibe Coding最容易遗漏的部分。SDD需要你提前思考如果username已存在应该抛出UsernameAlreadyExistsError。如果数据库连接失败应该抛出DatabaseConnectionError并记录日志。如果密码强度不符合策略应该返回一个包含具体错误信息的验证失败对象而不是抛出异常。示例Examples提供输入输出的具体例子。这对于AI理解复杂逻辑至关重要。例如输入username“alice”, email“aliceexample.com”, password“SecurePass123!”期望输出{“user_id”: 123, “status”: “pending_verification”, “message”: “注册成功请查收验证邮件”}2.2 SDD与TDD的异同互补而非对立看到这里有经验的开发者可能会想到TDDTest-Driven Development测试驱动开发。它们确实有相似之处都强调“先定义期望后实现代码”。但它们的侧重点和产出物不同特性TDD (测试驱动开发)SDD (规范驱动开发)主要产出物自动化测试用例通常为单元测试结构化的、人类和AI可读的规范描述驱动对象驱动的是代码的实现过程通过测试红绿循环推进。驱动的是AI的代码生成过程以及后续的人工实现逻辑。表达形式代码测试断言。结合了自然语言、类型注解、示例和结构化注释如OpenAPI Spec、JSDoc/TSDoc。阶段更贴近具体实现细节是开发循环中的一环。更贴近需求和设计可以发生在编写任何测试或代码之前。与AI的交互AI可以根据测试用例生成通过测试的代码但测试用例本身可能不够“描述性”。AI直接根据丰富的规范描述生成符合所有约束的代码框架甚至完整实现。它们的关系是互补的。一个理想的工作流可以是SDD - AI生成代码骨架 - TDD细化 - 人工审查与集成。先用SDD明确“要做什么”和“做成什么样”让AI生成主体代码然后针对一些复杂逻辑用TDD来驱动和完善细节实现最后人工把关。SDD为TDD提供了更清晰、更全面的上下文。提示你可以把SDD看作是为AI编写一份详细的“产品需求说明书PRD”而TDD则是基于这份PRD编写的“质量检测用例QC Case”。先有PRD才能有针对性且高效的QC。3. 实战将SDD融入你的AI编程工作流理论说再多不如动手实践。下面我将以一个具体的场景——开发一个简单的“待办事项TodoAPI服务”——来演示如何将SDD应用于实际使用Cursor或任何支持类似功能的AI编程助手进行开发。我们的目标是创建一个包含创建、读取、更新、删除待办事项的RESTful API。我们将聚焦于“创建待办事项”这个端点。3.1 第一步在代码之前先写“规范注释”不要直接打开AI聊天框说“帮我写一个创建todo的API”。而是在你计划放置代码的文件例如app.py或routes/todo.py中先写下SDD风格的规范注释。这种注释格式可以借鉴OpenAPI或JSDoc但用清晰的自然语言书写同样有效。# app.py # SDD for: POST /api/todos - Create a new Todo item # # Interface: # Endpoint: POST /api/todos # Request Body (JSON): # - title: string, required, length between 1 and 200 characters. # - description: string, optional, max length 1000 characters. # - completed: boolean, optional, defaults to False. # Response (JSON, 201 Created): # - id: integer, the unique ID of the created todo. # - title: string. # - description: string or null. # - completed: boolean. # - created_at: string (ISO 8601 timestamp). # - updated_at: string (ISO 8601 timestamp). # # Functional Description: # 1. Validate the incoming JSON request body against the schema above. # 2. If validation fails, return a 400 Bad Request with clear error messages. # 3. Generate a unique ID for the new todo (e.g., auto-increment from database). # 4. Set created_at and updated_at to the current UTC time. # 5. Persist the new todo item to a database (conceptual, assume a db module exists). # 6. Return the created todo object with status code 201. # # Preconditions: # - The request must have Content-Type: application/json. # # Postconditions: # - A new todo record exists in the persistent storage. # - The response body matches the created record exactly. # # Edge Cases Errors: # - 400: Missing title field, or title is empty/too long. # - 400: description exceeds 1000 characters. # - 500: Database connection or write failure (log the error, return generic 500). # # Example Request: # POST /api/todos # {title: Learn SDD with AI, description: Write a blog post about it.} # # Example Response (201): # { # id: 42, # title: Learn SDD with AI, # description: Write a blog post about it., # completed: false, # created_at: 2023-10-27T10:30:00Z, # updated_at: 2023-10-27T10:30:00Z # } # # [The implementation should be generated below this comment.]3.2 第二步使用AI基于规范生成代码现在将光标放在规范注释下方激活你的AI编程助手在Cursor里你可以用CmdK打开Chat模式或者直接用CmdL对选中区域进行指令操作。你可以直接输入指令“根据上面的SDD规范实现这个POST端点。”由于规范已经极其详细AI如Cursor集成的Claude或GPT-4几乎能生成完美的第一版代码。它知道需要导入什么如json,datetime知道要定义请求模型可能会用到Pydantic知道要处理验证和错误。生成的代码会紧密贴合你的规范。# 假设AI生成如下代码基于Flask框架示例 from flask import Flask, request, jsonify from datetime import datetime, timezone import logging app Flask(__name__) logging.basicConfig(levellogging.INFO) # 假设有一个简单的内存存储或数据库接口 todos_storage [] current_id 1 app.route(/api/todos, methods[POST]) def create_todo(): Create a new Todo item based on SDD specification above. # 1. Validate Content-Type if not request.is_json: return jsonify({error: Content-Type must be application/json}), 400 data request.get_json() # 2. Validate request body title data.get(title) description data.get(description, ) completed data.get(completed, False) # Validation logic if not title or not isinstance(title, str): return jsonify({error: Field title is required and must be a string}), 400 if len(title) 1 or len(title) 200: return jsonify({error: Field title must be between 1 and 200 characters}), 400 if description and (not isinstance(description, str) or len(description) 1000): return jsonify({error: Field description must be a string and not exceed 1000 characters}), 400 if not isinstance(completed, bool): return jsonify({error: Field completed must be a boolean}), 400 # 3. Generate ID and timestamps global current_id todo_id current_id current_id 1 now datetime.now(timezone.utc).isoformat() # 4. Create todo object new_todo { id: todo_id, title: title, description: description if description else None, completed: completed, created_at: now, updated_at: now } # 5. Persist (in-memory for demo) try: todos_storage.append(new_todo) # In real scenario: db.session.add(...); db.session.commit() except Exception as e: logging.error(fFailed to persist todo: {e}) return jsonify({error: Internal server error}), 500 # 6. Return response return jsonify(new_todo), 2013.3 第三步审查与迭代让规范与代码同步进化生成代码后不要直接接受。将生成的代码与你的SDD规范逐条对比审查接口签名路由、方法、请求/响应格式对吗功能描述验证逻辑、ID生成、时间戳、持久化步骤都实现了吗前置/后置条件Content-Type检查了吗记录确实保存了吗边界条件所有错误情况都处理了吗返回的HTTP状态码和错误信息符合规范吗示例用规范中的示例请求测试一下可以手动或用AI生成一个测试请求看响应是否匹配你可能会发现一些细微的偏差比如AI可能用了datetime.utcnow()已弃用而不是datetime.now(timezone.utc)或者错误信息格式不够清晰。这时你可以直接手动修正。或者将不符合规范的地方指给AI看“这里的时间戳生成应该使用timezone.aware的datetime请修正。” 让AI自己改。这个过程本身就是对SDD规范的强化和确认。经过几轮这样的“生成-审查-修正”循环你最终得到的代码其质量和对需求的符合度将远高于Vibe Coding模式下产出的代码。更重要的是这份SDD规范留在了代码中成为了永久的、最准确的文档任何后来者包括未来的你或其他AI都能立刻理解这个接口的完整契约。4. 进阶SDD工具与模式从函数到系统当你习惯了为单个函数或API端点编写SDD后可以将其扩展到更复杂的场景和更高的抽象层次。4.1 利用现有规范格式对于API开发你可以直接使用OpenAPI Specification (Swagger)作为你的SDD。工具如FastAPI能直接从OpenAPI规范通过Pydantic模型和装饰器生成交互式文档并保证实现与规范一致。你可以先编写或让AI帮助你起草OpenAPI YAML/JSON文件然后基于此生成服务器桩代码和客户端SDK。这是SDD在API领域的完美实践。对于前端组件你可以使用Storybook或类似工具通过.stories.js文件来定义组件的各种状态Props、交互这本身就是一种视觉和交互层面的SDD。你可以要求AI根据这些Story定义来生成或完善组件代码。4.2 设计复杂的多步骤流程Agent场景SDD的思想在构建AI Agent时尤为重要。一个Agent通常需要执行一系列步骤来完成复杂任务。Vibe Coding在这里的失败是灾难性的——你会得到一个行为不可预测的“黑盒”。正确的做法是为Agent定义清晰的工作流规范或决策链Chain-of-Thought规范。例如一个“数据分析Agent”的SDD可能如下Agent: Data Analysis Reporter Input: A dataset (CSV file path) and a analysis question. Output: A markdown report with insights. Specification: 1. Step 1 - Data Loading Validation: * Input: File path. * Action: Load CSV, check encoding, detect delimiter. * Success Criteria: DataFrame loaded without error. Basic info (shape, columns) logged. * Error Handling: If file not found or malformed, abort and report error. 2. Step 2 - Data Profiling: * Input: Loaded DataFrame. * Action: Generate summary statistics (mean, median, std, etc.) for numeric columns. Count unique values for categorical columns. Identify missing values. * Output: A structured profiling dictionary. 3. Step 3 - Question-Specific Analysis: * Input: Profiling data, original question. * Action: Based on keywords in question (e.g., trend, correlation, top N), execute appropriate analysis (time series plot, correlation matrix, grouping). * Output: Analysis results (plots data, tables). 4. Step 4 - Report Synthesis: * Input: Profiling dict, analysis results. * Action: Format the findings into a coherent markdown report with sections: Overview, Data Profile, Analysis Results, Conclusions. * Output: Final markdown string.然后你可以将这个规范交给AI让它生成一个框架性的Python类其中每个步骤对应一个方法方法的输入输出和职责都已明确。你甚至可以用这个规范去配置像LangChain、Hermes Agent这样的框架将每个步骤映射到具体的工具Tool或LLM调用上。4.3 SDD在团队协作与代码审查中的价值当团队都采用SDD时协作效率会大幅提升。需求澄清在动手写代码前针对一个模块先写出SDD并让同事或AI评审。这能提前发现需求理解不一致的地方避免后期返工。这比评审代码本身更早、成本更低。代码审查审查者不再需要费力猜测“这段代码到底想干什么”。他可以直接对照SDD规范检查实现是否满足了所有条款。审查焦点从“代码风格好不好看”转移到“契约履行得完不完整、正不正确”这更有价值。知识传承新成员接手模块时最权威的文档就是代码里的SDD注释和与之完全匹配的实现 onboarding成本极大降低。5. 避坑指南实践SDD时常见的误区与应对策略转向SDD的过程不会一帆风顺以下是一些常见的坑和我的应对建议误区一认为写SDD浪费时间不如直接写代码。应对对于简单、熟悉的任务直接写可能更快。但对于任何稍有复杂度、或需要AI辅助、或需要团队协作的任务前期在SDD上花的10分钟常常能节省后期1小时的调试、重构和沟通成本。尤其是使用AI时没有SDD的“直接写”很容易变成低效的Vibe Coding。误区二规范写得太模糊和没写一样。应对使用具体、可验证的语言。避免“处理错误”要写“捕获ValueError异常记录错误日志到app.log并向用户返回{“error”: “Invalid input”}和400状态码”。用示例来锚定模糊概念。误区三规范与代码不同步久而久之规范失效。应对将SDD注释紧贴在实现的代码上方。任何代码修改必须先更新其上的SDD注释。可以把这作为代码提交前的一条硬性检查规则。利用工具如pydocstyle、TSDoc linter进行基础检查。误区四试图为每一行代码都写规范过度工程化。应对SDD适用于有明确接口和契约的单元如公共函数、API端点、组件、模块接口。对于内部实现的私有辅助函数可以根据复杂度决定是否需要简明的SDD。把握“公开接口必须写复杂逻辑建议写简单实现可以不写”的原则。误区五完全依赖AI生成规范自己不思考。应对AI可以帮你起草和润色规范但业务逻辑、边界条件和核心约束必须由你开发者来定义和输入。你可以对AI说“我要一个创建用户的端点需要验证邮箱唯一性和密码强度。请帮我起草一份SDD。”然后你再去审查和补充AI起草的规范。记住你才是系统设计的负责人AI是强大的辅助执行者。从Vibe Coding到Spec-Driven Development本质上是从“凭感觉与AI共舞”到“用蓝图指挥AI施工”的思维转变。它不消灭创造性而是将创造性聚焦在更高层次的设计和规范制定上将重复性、细节性的编码工作可靠地委托给AI。在AI编程能力日新月异的今天掌握SDD就是掌握了让AI真正为你所用、提升工程确定性和质量的关键技能。下次当你启动Cursor或Copilot时不妨先停下来问自己一句“这件事的精确规范是什么” 把这规范写下来你会发现你和AI的协作将进入一个全新的、高效而可控的维度。

相关新闻

Nginx 从入门到实践:部署、配置、反向代理与负载均衡全解

Nginx 从入门到实践:部署、配置、反向代理与负载均衡全解

一、Nginx 核心特点 事件驱动模型(epoll/kqueue):异步非阻塞 I/O,单进程可处理万级并发,内存占用极低。轻量:CPU/内存消耗小,配置简洁。多角色:Web 服务器、反向代理、负载均衡、HT…

2026/10/5 4:12:47 阅读更多 →
小滴课堂资源分享工业级PaaS云平台+SpringCloudAlibaba综合项目课程

小滴课堂资源分享工业级PaaS云平台+SpringCloudAlibaba综合项目课程

SpringCloudAlibaba 项目实战,解锁 PaaS 云平台开发能力 在云原生浪潮席卷软件行业的今天,企业对后端开发工程师的要求早已不再局限于"能写业务接口"。越来越多的企业开始要求开发者具备微服务架构设计、容器化部署、线上治理和故障排查的综合…

2026/10/4 7:26:51 阅读更多 →
模型服务部署开发短记:GPU 配置怎样核验

模型服务部署开发短记:GPU 配置怎样核验

模型服务部署开发短记:GPU 配置怎样核验 模型服务的关键不是先堆组件,而是先确认模型版本、显存申请和副本调度这条链路由谁维护、何时算完成。题目中的“生产部署拓扑与环境配置治理”只在这条边界内展开。 模型服务部署与 GPU 资源弹性伸缩方案&#x…

2026/10/5 5:52:01 阅读更多 →

最新新闻

职场送礼预算有限?五款高颜值水杯选品与实用攻略

职场送礼预算有限?五款高颜值水杯选品与实用攻略

“预算有限,但要送得有面子”这件事,基本上每个职场人都绕不过去。逢年过节、项目收官、出差归来,总得给同事带点手信,给领导表表心意。送太贵的心疼钱包,送太便宜的又怕拿不出手,水杯这种品类反而成了最优…

2026/10/13 4:53:16 阅读更多 →
VirtualBox CPU Manager中MSR模块深度解析

VirtualBox CPU Manager中MSR模块深度解析

1. 为什么深入CPU Manager中的MSR模块是VirtualBox源码分析的分水岭在VirtualBox源码分析的整个学习路径中,前11讲大多围绕设备模拟、内存管理、虚拟机生命周期控制等“看得见、摸得着”的模块展开——比如VMM(Virtual Machine Monitor)初始化…

2026/10/13 4:53:16 阅读更多 →
电力物资招标中标候选人公示怎么看?投标策略与评标机制深度解读

电力物资招标中标候选人公示怎么看?投标策略与评标机制深度解读

一份省级电网公司2026年第一批物资招标中标候选人公示,放在电力招标圈里算不上大新闻,但每次出来都值得认真看一遍。电力物资招标是观察电网一年投资方向最直接的窗口,候选人名单背后藏着设备选型偏好、供应商格局变化和采购策略调整。这篇文…

2026/10/13 4:53:16 阅读更多 →
信号与系统多普勒大作业:从傅里叶变换到频谱分析的完整实现

信号与系统多普勒大作业:从傅里叶变换到频谱分析的完整实现

简介:面向西电通信工程学院学生的信号与系统大作业资源,聚焦多普勒效应在通信系统中的原理推导、信号建模与仿真分析,适合正在完成同类课程设计,或希望结合实际问题巩固信号处理知识的本科学习者。压缩包共六个文件,包…

2026/10/13 4:53:16 阅读更多 →
VirtualBox CPUID虚拟化原理与动态映射机制解析

VirtualBox CPUID虚拟化原理与动态映射机制解析

1. 为什么CPUID是虚拟化CPU管理的“第一道门”在VirtualBox源码里翻到CPUM模块时,很多人会下意识跳过CPUMR3CpuId这类函数,觉得“不就是读个CPU型号和特性吗?调用一下cpuid指令完事”。我第一次也是这么想的——直到在某次跨平台兼容测试中&a…

2026/10/13 4:53:16 阅读更多 →
大角几何Beta版:函数可视化教学回归动态变化本源

大角几何Beta版:函数可视化教学回归动态变化本源

第一次打开大角几何Beta版的时候,我其实是带着一点怀疑的。教了十几年函数,我见过的“可视化教学工具”少说也有七八种,玩法无非是把黑板上的静态图像搬到屏幕上,颜色丰富一点、拖动流畅一点,本质上还是展示一个结果。…

2026/10/13 4:52:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →