本项目是面向语音识别文本后处理、审讯笔录整理与字幕规范化场景的 ITN(逆文本归一化)工具:把口语化数字按规则转成书面格式,例如幺幺零→110、二零零八年八月八日→2008年8月8日、百分之三十→30%、两点零二分→2:02。转换依据用户提供的《ITN 数字转化需求规格说明》(评审版,共 22 章)。核心目标:做成零安装、双击即用的单文件网页;规则作为输入,由智能体理解并执行,规则更新无需改代码;转换结果高亮标出所有变化,拿不准的片段先不转、事后在疑问清单提出;结果可直接再编辑;并支持长期纠错记忆。功能上分六块:①转换规则——内置完整 ITN 规格,可导入导出、随意修改;②待转换文档——支持粘贴、文件导入、内置示例,时间戳说话人结构原样保留,并记住导入文件名;③转换结果——黄色高亮已转换片段(悬停看原文与规则)、红色虚线标存疑、疑问清单、变更记录表,结果可就地编辑,附原始 JSON 便于调试;④纠错记录——把模型漏转或转错的标准永久保存,每次转换自动注入提示词作补充标准,持续提高正确率;⑤接口设置——支持 OpenAI 兼容与 Anthropic 原生双模式,Base URL、Key、模型、max_tokens 均可配,含强制 JSON 输出与可配置的非思考模式(三种写法一键填充);⑥导出分享——导出自动命名为「原名_e2e.扩展名」,单文件可分发给同事或部署到内网 http。业务流程:配置接口并测试连接→载入或编辑规则与文档→组装提示词(系统约束+规则+纠错记录+文档)→流式调用→解析 JSON→渲染高亮与疑问→完整性自检→审阅、纠错、导出。支持多标签页并行:每个标签页是独立实例,可配不同模型或思考方式同时转换,互不干扰;注意避免多标签页同时猛点,以免触发中转限流。
整体架构上,本项目用 LLM 智能体替代传统"写死的正则规则引擎":规则作为输入交给模型理解执行,把"规则调整"从改代码变成改文本。应用形态为单文件自包含的 index.html,样式(CSS3 flex/grid)、内置默认数据(以 text/plain 脚本块内嵌规格与示例)、主逻辑(一个 IIFE)全部内聚,无框架、无构建、无外部依赖,file:// 双击即用,天然可分发给同事或部署到内网 http。技术栈为原生 HTML5+CSS3+JavaScript(ES5 语法配合 async/await,兼容 2017 年后现代浏览器);状态用 localStorage 持久化(设置、规则、文档、纠错记录、导入文件名,全部 try/catch 降级);网络用 fetch,默认流式(stream:true 经 ReadableStream 解析 SSE),并带网络自动重试;文件用 FileReader、Blob、a download;结果用 contenteditable 编辑。核心难点与解法:①模型输出不规范——设计 segments+doubts 结构化 JSON 契约,并用自研多候选 JSON 提取器(对每个花括号起点做平衡扫描、逐个 JSON.parse)兼容围栏、前置文字、字符串内花括号等;②中转兼容性差——请求按"完整→去 response_format→去非思考参数"逐级降级重试,且 max_tokens 始终保留;③思考型模型把额度烧在思考上导致截断——检测 finish_reason=length 自动翻倍 max_tokens 重试;④思考模型只输出思考无正文(中转翻译缺陷)——自动从 reasoning_content 找回 JSON,再失败自动去掉非思考参数重试,并明确引导换用不默认思考的模型;⑤长生成被网关空闲超时掐断(Failed to fetch)——流式让连接持续有数据并配合网络重试;⑥模型偶发只输出部分内容——结果长度不足原文 60% 时弹黄色警告提示重新转换;⑦非思考模式写法各异——做成可配置参数并内置三种预设;⑧长期纠错记忆——通过注入提示词实现;⑨分享与多标签页——单文件加每标签页独立实例,Safari 以 file:// 打开时 localStorage 不可用也做了降级;⑩发布前用无头浏览器实际打开页面,并编写 Node 模拟测试逐一验证解析、重试与降级逻辑。