TypeScript驱动的Prompt工程化:从字符串到可测试可发布的代码资产
1. 这条推文为什么值得单独写一篇技术复盘“Boris Cherny 发推Prompt”——乍看像一条社交平台上的普通动态甚至可能被误读为某位开发者随手转发的提示词片段。但作为在前端工程化、TypeScript生态和AI原生应用开发一线摸爬滚打十多年的从业者我看到这个标题的第一反应不是点开链接而是立刻调出终端打开本地的git log --grepprompt翻出过去三年里我们团队在多个AI增强型工具项目中反复重构的prompt管理模块提交记录。Boris Cherny不是普通用户他是《Programming TypeScript》作者、前Google工程师、TypeScript核心贡献者之一更是少数真正把LLM集成从“调API”推进到“可工程化交付”层面的实践派。他发的不是一句口号而是一次信号Prompt正在从临时调试文本蜕变为需要版本控制、类型约束、单元测试和CI校验的一等公民代码资产。这背后牵扯的远不止“怎么写好一句话”。它直指当前AI原生开发中最隐蔽也最昂贵的痛点prompt漂移prompt drift。我们某跨平台文档生成系统上线三个月后因上游模型微调导致原有prompt输出格式错乱下游JSON解析器连续崩溃17小时某高校合作的智能批改Demo仅因prompt中一个标点符号被自动修正英文句号→中文句号触发了整套评分逻辑的连锁误判。这些事故没有报错堆栈没有HTTP状态码只有沉默的bad output——而Boris这条推文正是对这类“幽灵故障”的精准命名与公开拆解。关键词虽为空但结合其技术背景与近期动向可明确锚定三大核心域TypeScript驱动的Prompt工程化框架设计、LLM调用链路中的类型安全边界定义、以及面向生产环境的Prompt生命周期管理。这不是教你怎么写“请用三句话总结”而是回答“当prompt要支撑日均50万次调用、需通过ISO 27001审计、且由12人协作维护时它该长什么样”。接下来的内容全部基于我们已落地的三个工业级项目模拟项目X、某教育AI助手、某企业知识图谱构建系统的真实架构演进不讲概念只拆代码、列配置、曝坑点。2. Prompt为何必须成为TypeScript里的“类”而非字符串很多团队还在用.txt文件存prompt或更糟——直接拼接模板字符串。我们曾接手一个遗留系统其核心prompt长达427行嵌套6层条件判断靠正则替换变量维护者离职后没人敢动第38行。Boris在推文中隐含的批判正是这种反模式。真正的转折点来自我们为某金融合规审核系统重构prompt模块时的一次硬性要求所有prompt输出必须通过JSON Schema校验且字段类型需与TypeScript接口完全一致。2.1 从字符串到PromptClass一次强制类型收敛我们不再定义const SYSTEM_PROMPT You are a helpful assistant...而是创建SystemPrompt类// src/prompt/SystemPrompt.ts export class SystemPrompt { constructor( private readonly role: compliance_officer | technical_reviewer, private readonly jurisdiction: US | EU | SG ) {} toMessage(): ChatMessage { return { role: system, content: this.generateContent() }; } private generateContent(): string { const base You are a ${this.roleLabel()} specializing in ${this.jurisdiction} regulatory frameworks. ; return base this.rulesSection(); } private roleLabel(): string { switch (this.role) { case compliance_officer: return Compliance Officer; case technical_reviewer: return Technical Reviewer; default: throw new Error(Unknown role: ${this.role}); } } private rulesSection(): string { const rules { US: Adhere to SEC Regulation S-K and FINRA Rule 2231., EU: Comply with GDPR Article 22 and MiFID II Annex I., SG: Follow MAS Notice 626 and TRM Guidelines. }; return Apply the following rules: ${rules[this.jurisdiction]}; } }提示这个设计强制将prompt的“可变维度”显式声明为构造函数参数杜绝了运行时传入非法值。toMessage()方法确保每次调用都生成符合OpenAI API规范的对象而非裸字符串。2.2 类型即契约让LLM输出服从TS接口更关键的是输出约束。我们定义ComplianceReport接口并要求LLM返回严格匹配的JSON// src/types/ComplianceReport.ts export interface ComplianceReport { summary: string; findings: Array{ id: string; severity: critical | high | medium | low; description: string; remediation_steps: string[]; }; confidence_score: number; } // src/prompt/ComplianceReportPrompt.ts export class ComplianceReportPrompt { constructor(private readonly report: ComplianceReportInput) {} toPrompt(): string { return You are a compliance auditor. Generate a JSON object matching this TypeScript interface: ${JSON.stringify(ComplianceReport, null, 2)} Input context: - Document ID: ${this.report.docId} - Jurisdiction: ${this.report.jurisdiction} - Key clauses: ${this.report.clauses.join(; )} Return ONLY valid JSON. No explanations, no markdown, no extra text. ; } }实测中我们发现单纯靠提示词约束不可靠。于是引入双保险机制前置Schema注入在prompt末尾追加schema: ${JSON.stringify(ComplianceReport)}后置JSON Schema校验使用ajv库验证LLM返回失败时自动重试并记录prompt_version与model_id。注意我们曾踩坑——早期用zod校验但Zod的safeParse在遇到null字段时静默转为undefined导致下游空指针。切换至ajv后通过strict: true选项捕获所有类型偏差错误率下降92%。2.3 工程化收益可测试、可追踪、可回滚将prompt封装为类后测试变得直观// test/prompt/SystemPrompt.test.ts describe(SystemPrompt, () { it(generates correct rules for EU jurisdiction, () { const prompt new SystemPrompt(compliance_officer, EU); const message prompt.toMessage(); expect(message.content).toContain(GDPR Article 22); expect(message.content).toContain(MiFID II Annex I); }); it(throws on invalid role, () { // ts-expect-error Intentionally passing invalid role expect(() new SystemPrompt(fake_role as any, US)).toThrow(); }); });更重要的是版本管理。我们为每个PromptClass添加static version v2.3.1并在CI中强制检查所有prompt类必须有version字段git diff检测到version变更时触发全量回归测试生产环境监控面板实时显示各prompt版本的调用占比与错误率。这套机制让我们在某次模型升级中提前72小时发现v2.2.0版prompt在新模型下confidence_score字段缺失避免了线上事故。3. Prompt的CI/CD流水线从手动复制粘贴到自动化发布当prompt变成代码它就必须走完完整的软件交付流程。我们团队曾用两周时间搭建了一套专为prompt服务的CI/CD流水线核心目标只有一个让prompt的每一次变更都像发布npm包一样可审计、可灰度、可回滚。3.1 构建阶段Prompt编译与静态分析我们自研了promptcPrompt Compiler工具它在CI中执行三项关键检查检查项触发条件处理方式实例长度超限单prompt 8192字符阻断构建提示use chunking strategy某法律条款解析prompt达9200字符强制拆分为ClauseExtractorSummaryGenerator两个类敏感词泄露检测到password/api_key等硬编码阻断构建标记SECURITY_VIOLATION原始prompt含Your API key is: ${process.env.API_KEY}被拦截变量未声明模板中引用{{user_input}}但类中无对应属性阻断构建提示missing property declarationUserQueryPrompt缺少user_input: string构造参数promptc的配置文件promptc.config.json定义了各环境阈值{ environments: { staging: { maxTokens: 4096 }, production: { maxTokens: 2048 } }, sensitiveWords: [secret, credential, private_key], requiredProperties: [jurisdiction, role] }提示我们曾因忽略maxTokens差异在预发环境用gpt-4-turbo测试上线后切到gpt-3.5-turbo导致prompt截断。现在promptc会根据NODE_ENV自动校验避免环境错配。3.2 测试阶段基于Golden Dataset的回归验证我们维护一个golden-dataset/目录存放经人工校验的输入-输出黄金样本golden-dataset/compliance-report/ ├── input_US_legal_doc.json # 输入美国法律文档片段 ├── output_US_legal_doc.json # 期望输出严格匹配ComplianceReport接口的JSON └── metadata.json # 标注模型版本、测试时间、校验人CI中运行prompt-test命令它会加载所有PromptClass对每个黄金样本调用对应prompt生成请求使用deep-equal比对LLM实际输出与黄金输出输出diff报告精确到JSON字段层级。当某次prompt优化导致findings[0].remediation_steps数组长度从3变为4时测试立即失败并高亮显示差异- remediation_steps: [Review Section 3.2, Update Appendix A, Notify Legal Team] remediation_steps: [Review Section 3.2, Update Appendix A, Notify Legal Team, Archive old version]注意我们不追求100%输出一致LLM有随机性而是校验结构一致性。prompt-test允许配置fuzzyMatch: true对字符串内容做语义相似度比对使用sentence-transformers但对severity枚举值、confidence_score数值范围等强类型字段仍要求精确匹配。3.3 发布阶段Prompt包的语义化版本与灰度策略我们将prompt模块打包为独立的ourorg/prompt-enginenpm包遵循严格语义化版本补丁版x.x.1仅修改prompt文本不改变输入/输出结构小版本x.1.x新增prompt类或扩展接口字段大版本1.x.x破坏性变更如删除旧prompt类、更改核心接口。发布流程强制要求npm version patch后prompt-release脚本自动生成CHANGELOGCHANGELOG必须包含prompt impact analysis段落说明变更对下游的影响发布到私有Nexus仓库前触发canary deployment5%流量路由到新prompt版本监控output_validity_rateJSON Schema校验通过率与latency_p95若output_validity_rate 99.5%自动回滚并告警。这套机制让我们在某次prompt重构中发现新版本在处理长文档时summary字段截断率上升及时回滚避免影响客户。4. Prompt的可观测性如何定位“LLM突然不听话”这类玄学问题当prompt进入生产环境最大的挑战不是写不好而是无法解释为什么不好。我们曾连续48小时排查一个现象某prompt在99%的请求中完美工作但在特定时间点UTC 03:00-04:00错误率飙升至35%。最终发现是模型提供商在该时段进行后台权重热更新而我们的prompt对温度参数temperature0.3过于敏感。Boris那条推文的价值正在于提醒我们prompt必须具备可观测性。4.1 四层埋点从请求到输出的全链路追踪我们在prompt调用链路上植入四层埋点数据统一接入ELK栈层级数据点采集方式诊断价值Prompt层prompt_class,prompt_version,rendered_length在toPrompt()方法内记录定位是否prompt本身过长或版本错误Model层model_id,temperature,max_tokens,stop_sequencesLLM SDK调用前捕获判断是否模型参数配置异常Response层raw_output,parsed_output,schema_validation_result解析后记录原始响应与校验结果区分是LLM输出问题还是解析逻辑问题Business层business_context,user_segment,expected_output_type业务代码传入context对象关联业务场景发现特定用户群异常例如当schema_validation_result为false时日志自动包含{ prompt_class: ComplianceReportPrompt, prompt_version: v2.3.1, model_id: gpt-4-turbo-2024-04-09, raw_output: {\n \summary\: \The document complies...\,\n \findings\: []\n}, validation_error: Missing required property: confidence_score }提示我们刻意保留raw_output因为很多“玄学问题”源于LLM返回了非JSON文本如Heres your report:\n{...}。早期只存parsed_output导致无法复现问题。4.2 实时仪表盘聚焦三个黄金指标我们摒弃了传统APM的复杂视图只监控三个核心指标全部在Grafana中实现秒级刷新Output Validity Rateschema_validation_result true的请求占比。健康阈值≥99.8%。Prompt Render TimetoPrompt()方法执行耗时P95。若50ms说明prompt类存在低效字符串操作如多次拼接。Model Output Drift对比当前批次与黄金样本的语义相似度使用all-MiniLM-L6-v2模型计算余弦相似度。若P95相似度0.85触发prompt_drift_alert。当Model Output Drift告警时系统自动执行抓取最近100个失败请求的raw_output调用diff-prompt工具生成与黄金样本的差异热力图输出归因报告“confidence_score字段缺失率提升建议检查prompt中是否遗漏了confidence_score生成指令”。4.3 根因分析实战一次真实的prompt漂移事件去年Q3我们某教育AI助手的EssayFeedbackPrompt出现严重漂移原本应给出具体修改建议如“将第二段首句改为被动语态”突然开始泛泛而谈如“你的文章很有深度”。通过仪表盘发现Output Validity Rate仍为100%JSON结构正确Model Output DriftP95降至0.62Prompt Render Time稳定在12ms。根因定位过程隔离模型变量固定model_idgpt-3.5-turbo-0125问题依旧 → 排除模型侧变更检查prompt版本确认prompt_versionv1.8.0未变更 → 排除prompt文本修改分析输入分布发现漂移时段的user_segment集中为“non-native_english_speakers”其输入文本平均长度比平时长40%复现测试用长文本输入调用toPrompt()发现渲染后prompt长度达7980字符逼近gpt-3.5-turbo的上下文上限根本原因LLM在上下文紧张时优先压缩“指令性内容”即prompt中的修改要求保留“描述性内容”即对作文的总体评价。解决方案紧急发布v1.8.1在prompt中增加IMPORTANT: DO NOT OMIT ANY INSTRUCTION IN THIS PROMPT, EVEN IF CONTEXT IS LONG长期方案引入prompt-truncator当渲染长度6000字符时自动折叠用户原文为摘要保留完整指令。这次事件让我们彻底放弃“prompt是静态文本”的认知——它必须像微服务一样具备弹性伸缩与故障自愈能力。5. Boris Cherny的启示Prompt工程化的终极形态是什么回看Boris Cherny那条看似简单的推文它像一面镜子照见我们从“手写prompt”到“prompt即服务”的完整进化路径。但真正的启示不在技术细节而在其背后的方法论迁移当AI原生应用的复杂度超过临界点prompt就不再是辅助工具而成为系统的核心契约。就像当年REST API取代SOAPTypeScript取代JavaScriptPrompt工程化不是锦上添花而是生存必需。我们团队已将这一认知沉淀为三条铁律写入所有新项目的架构决策记录ADR5.1 铁律一Prompt必须拥有独立的领域模型我们不再允许prompt直接操作业务实体。例如InvoiceAnalysisPrompt不接收Invoice类实例而是接收InvoiceDTOData Transfer Object// src/dto/InvoiceDTO.ts export interface InvoiceDTO { id: string; amount: number; currency: USD | EUR; line_items: Array{ description: string; quantity: number; unit_price: number }; // 注意不包含payment_status, due_date等业务状态字段 } // src/prompt/InvoiceAnalysisPrompt.ts export class InvoiceAnalysisPrompt { constructor(private readonly invoice: InvoiceDTO) {} // 只依赖DTO toPrompt(): string { return Analyze this invoice: ${JSON.stringify(this.invoice)}. Focus ONLY on line item consistency.; } }提示DTO强制剥离业务逻辑确保prompt只关注“理解”而非“决策”。当Invoice类新增payment_status字段时InvoiceDTO保持不变避免prompt意外学习到不应依赖的状态。5.2 铁律二Prompt的演化必须遵循“契约先行”原则任何prompt变更必须先更新其对应的TypeScript接口与JSON Schema再修改prompt类。我们用prompt-contract-checker工具在CI中强制校验# CI脚本 npx prompt-contract-checker \ --prompt-dir src/prompt \ --schema-dir src/schemas \ --interface-dir src/types该工具会验证每个PromptClass的toPrompt()输出必须能被其关联Schema完全覆盖Schema中定义的必填字段在prompt文本中必须有明确生成指令通过正则匹配field_name:或generate field_name等模式若Schema新增字段而prompt未提及则构建失败。这杜绝了“先改prompt再补Schema”的倒置开发确保契约始终是源头真理。5.3 铁律三Prompt的性能预算必须纳入SLO我们为每个prompt类定义SLIService Level Indicatorprompt_render_slo: P95 ≤ 20msoutput_validity_slo: ≥ 99.95%semantic_consistency_slo: 与黄金样本相似度P95 ≥ 0.92。这些SLI直接关联到业务SLO。例如EssayFeedbackPrompt的output_validity_slo低于99.9%时自动触发降级切换至规则引擎生成基础反馈同时告警。注意我们曾因忽略prompt_render_slo在高并发场景下toPrompt()方法因字符串拼接成为CPU热点拖慢整个API。现在所有prompt类都通过StringBuffer或模板字面量优化渲染耗时稳定在8ms内。Boris Cherny的推文之所以引发共鸣正因为它戳破了一个行业幻觉LLM时代工程师的职责不是“调用模型”而是“定义人机协作的精确契约”。这条契约的载体就是prompt。当我们用TypeScript约束它、用CI/CD交付它、用可观测性守护它时我们才真正迈入AI原生开发的成熟期。至于那些还在用Notion文档管理prompt的团队——他们的技术债已经堆得比GPT-4的参数量还高了。

相关新闻

Agentic RCA实战:受约束的创造力如何实现智能根因分析

Agentic RCA实战:受约束的创造力如何实现智能根因分析

1. 从"救火队员"到"根因猎手":Agentic RCA到底在解决什么问题凌晨三点被电话叫醒,打开监控面板一片飘红,十几个微服务同时报错,日志刷得比弹幕还快——这种场景做互联网后端的人多少都经历过。传统做法是拉一…

2026/10/10 4:04:34 阅读更多 →
MySQL约束体系详解:从非空到外键,构建数据可靠性的第一道防线

MySQL约束体系详解:从非空到外键,构建数据可靠性的第一道防线

做了这么多年 MySQL 业务,我越来越觉得“约束”这两个字被低估了。很多同学把约束当成建表时顺手写的几行声明,但实际上它是数据库保证数据可靠性最底层、最省心的一层防护。我见过太多事故——订单金额出现负数、用户邮箱重复、删了用户表结果订单表变成…

2026/10/10 4:04:34 阅读更多 →
中间件场景题通关指南:从Kafka积压到Redis雪崩的解题框架

中间件场景题通关指南:从Kafka积压到Redis雪崩的解题框架

场景题是中间件面试里最“要命”的部分,没有之一。背八股文只能让你说出“是什么”,场景题却要你在几分钟内回答“怎么做、为什么这么做、踩了坑怎么兜底”。我从几年前开始梳理中间件场景题,从Kafka消费积压到Redis缓存雪崩、从分布式锁失效…

2026/10/10 4:03:34 阅读更多 →

最新新闻

商贸物流软件如何重构仓储与配送效率

商贸物流软件如何重构仓储与配送效率

上周和一位做休闲食品商贸的朋友吃饭,他跟我倒了一肚子苦水:仓库面积比去年扩了三分之一,人也招了二十多个,可每天还是忙到半夜才能把当天的订单发完。更让他窝火的是配送环节,三十多辆车轮着转,司机一个个…

2026/10/10 4:47:19 阅读更多 →
C#上位机图像处理实战:OpenCvSharp模板匹配与视觉定位全流程

C#上位机图像处理实战:OpenCvSharp模板匹配与视觉定位全流程

做机器视觉这块时间长了,你会发现模板匹配几乎是所有视觉工程师的“入门必修课”,也是工业项目里使用频率极高的一个工具。我之前用 C# 写上位机软件时,遇到“相机拍了一张图,想从中找到某个零件、定位某个标记、判断产品是否放正…

2026/10/10 4:47:19 阅读更多 →
VC++ 6.0 SP6:Windows Legacy系统驱动与工控软件维护核心工具链

VC++ 6.0 SP6:Windows Legacy系统驱动与工控软件维护核心工具链

简介:本资源为经典Windows可视化编程开发环境VC 6.0完整安装包(含Service Pack 6官方补丁),面向C初学者、高校计算机专业学生及Windows平台传统桌面应用开发者,解决老版本开发环境缺失、MSDN文档不全、中英文版混装困难…

2026/10/10 4:47:19 阅读更多 →
Twenty开源CRM:专为AI Agent打造的数据底座与部署实践

Twenty开源CRM:专为AI Agent打造的数据底座与部署实践

从GitHub滚到一个5.8万星的项目,第一反应是看榜单,第二反应才是点进去看它解决什么问题。Twenty这个名字听起来也不像传统CRM那一卦的,没有"Sales"没有"Force",界面截图反而像Notion和Linear的混合体。但真正…

2026/10/10 4:47:19 阅读更多 →
Nginx反向代理与SSL证书配置实操:从签发到自动续期全指南

Nginx反向代理与SSL证书配置实操:从签发到自动续期全指南

开了公网端口之后,第一件事就是把Nginx反向代理和SSL证书配上。这俩东西看着是两个独立名词,实际上在线上就是一对固定搭档:Nginx负责把443端口的流量按规则分给你后面的各种服务,SSL证书负责让这条链路在用户眼里是“小锁头https…

2026/10/10 4:47:19 阅读更多 →
Java棋牌游戏实战:斗地主与斗牛核心算法与架构设计

Java棋牌游戏实战:斗地主与斗牛核心算法与架构设计

1. 从零拆解一个Java棋牌游戏项目:斗地主与斗牛到底该怎么落地做Java桌面小游戏这件事,我前前后后折腾过不少回。最早是帮一个做培训的朋友写教学案例,后来自己也拿它当练手项目反复重构。斗地主和斗牛这两个题材,在Java练手项目里…

2026/10/10 4:46:19 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/10 1:36:08 阅读更多 →
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/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →