先把核心术语认清楚
先认词:这门课默认你理解集合、函数、图和概率,不默认你熟悉计算机缩写。先把下面的对象分开,再读生成流程。
Frontend / Backend · 前端 / 后端前端接收人的操作并显示结果;后端执行受控任务、读取数据并维护可信状态。
- 直觉
- 眼前的编辑框是前端,真正组织证据并启动模型调用的是工作台后端。
- 当前案例
- Cadenvo 业务后端管理训练数据;本仓库的工作台后端管理证据、生成任务和文件。两个后端不是同一个职责。
- 边界
- “后端”不一定在远方服务器上;这里也可以是你电脑上运行的 Python 服务。
Application Programming Interface (API) · 应用程序接口程序之间约定好的调用入口:提交什么,返回什么,失败怎样表达。
- 直觉
- 像一个带输入输出要求的函数入口,只不过调用可能跨进程或网络。
- 当前案例
- 浏览器请求生成提示词、确认提示词和生成图片,是三个不同的接口操作。
- 边界
- 接口存在只证明有这项约定,不证明当前身份已经成功调用。
Hypertext Transfer Protocol (HTTP) · 超文本传输协议浏览器与服务之间传递请求和响应的规则,包括方法、地址、状态码与正文。
- 直觉
- 它规定消息怎样送过去和答回来,不替你决定业务是否正确。
- 当前案例
- 读取任务状态通常用 GET;准备、修改、确认、生成等操作在本项目使用 POST。
- 边界
- 一次请求失败,不一定表示服务端任务从未执行,可能只是响应没有送回。
JavaScript Object Notation (JSON) · 对象表示法把记录、数组、字符串和数字写成可交换的文本;它是数据,不是自动执行的程序。
- 直觉
- 对象可理解为“字段名到值”的映射,数组是有顺序的值序列。
- 当前案例
- 后端把任务编号、状态、提示词正文和图片地址装进 JSON,浏览器解析后放进界面。
- 边界
- JSON 格式正确不代表字段值真实,也不代表用户有权限执行其中描述的操作。
Manifest · 项目清单明确登记项目有哪些角色、页面、层级、页面标识和设计建议的结构化文件。
- 直觉
- 它回答“当前到底在做哪一个页面”,避免模型或浏览器自行猜测项目结构。
- 当前案例
- workbench-project.json 是页面结构来源,生图任务要绑定对应的项目与页面。
- 边界
- 清单声明某个页面,不等于那个页面的业务功能已经实现。
API Contract / Runtime Evidence · 接口契约 / 运行证据契约写明允许的数据形状;运行证据记录某时、某身份、某次请求实际观察到什么。
- 严格定义
- OpenAPI Specification(开放接口描述规范)用于描述接口;JSON Schema(JSON 数据模式)用于表达字段、类型、枚举和约束。
- 当前案例
- 接口定义中有“发布”,与教练账号真的完成过一次发布,是两种证据。
- 边界
- 列表读取成功不能证明写操作可用;某个账号成功也不能推出所有角色都有权限。
PageContext · 页面上下文把当前页结构、接口契约、源码来源、截图观察和运行证据组织成可校验的任务输入。
- 直觉
- 不是把整个仓库塞给模型,而是为当前页准备一份带来源的资料包。
- 当前案例
- 同一份上下文产生面向图片、网页代码和交付记录的不同版本。
- 边界
- 资料包中存在某条记录,不代表该记录足以支持任意业务结论。
Projection · 数据投影按用途选择、删减或重组数据,保留当前任务需要的部分。
- 直觉
- 同一份记录,设计师看页面职责,代码生成器还需要字段与操作约束。
- 当前案例
- project_image 与 project_html 是两种任务投影,不是简单复制全部资料。
- 边界
- 这里是软件中的数据变换,不必是线性代数里的正交投影,也不保证无信息损失。
Prompt / Generative Model · 提示词 / 生成模型提示词描述任务与约束;生成模型根据这些输入提出文字、图片或代码候选。
- 直觉
- 提示词像任务单,模型像提出方案的执行者;任务单不是算法正确性的证明。
- 当前案例
- 本项目分别调用模型整理生图指令、生成设计图、生成网页代码。
- 边界
- 模型参数、训练过程和图像模型内部推理算法不在这条应用代码链里实现。
Hash / SHA-256 · 哈希摘要把一份输入映射为固定长度指纹,用于核对内容是否仍与之前绑定的一致。
- 严格定义
- SHA-256 属于 Secure Hash Algorithm 2(安全散列算法第二代),产生 256 位摘要。确定的输入字节产生确定的摘要。
- 当前案例
- 确认时记录提示词的完整摘要;生成前重新计算文件摘要,防止确认后换了内容。
- 边界
- 摘要不是加密,不证明文字为真,也不单独证明是谁批准的。碰撞并非数学上不可能,只是在适当假设下极难构造。
Finite State Machine (FSM) · 有限状态机用有限状态、事件和转换条件,明确什么操作此时允许发生。
- 直觉
- 草稿可以改;生成中的任务不能被当作普通草稿覆盖。
- 当前案例
- 提示词任务有 draft、confirmed、generating、generated、failed 等状态。
- 边界
- 前端按钮变灰只是交互提示,真正的合法转换还必须在服务端检查。
Optimistic Concurrency Control · 乐观并发控制提交修改时带上自己读到的版本;版本已变化,就拒绝覆盖别人较新的结果。
- 直觉
- 你读到第七版,不能在别人提交第八版后,仍把自己的第七版修改强行写回。
- 当前案例
- 工作流更新比较 revision 与清单摘要,再在锁保护下写入并递增版本。
- 边界
- 这是冲突检测,不是自动合并,也不是完整数据库事务。
HTML / CSS / JavaScript · 网页结构 / 样式 / 行为HTML 定义元素结构,CSS 规定视觉布局,JavaScript 响应操作并改变页面状态。
- 严格定义
- HTML 是 Hypertext Markup Language(超文本标记语言);CSS 是 Cascading Style Sheets(层叠样式表);JavaScript 是程序语言名称。
- 当前案例
- 网页生成阶段产出一份包含结构、内联样式和可选脚本的完整文档。
- 边界
- 一张 PNG 图片没有这些可执行交互;浏览器显示 HTML,也不意味着真实业务接口已经接通。
Artifact / Acceptance · 产物 / 验收接受产物是生成的文件;验收接受是依据标准和授权,对特定候选作出的决定。
- 直觉
- “有文件了”“文件能打开”“功能满足要求”“人同意交付”,是四种不同判断。
- 当前案例
- 图片摘要、尺寸、生成报告、人工选定记录与网页验收应分别保留。
- 边界
- 机器记录 confirmed 不能单独证明用户逐字读过;机器评审也不能冒充自然人的签署。
先学会读变量、字段和伪代码
后文不是要求你背一串函数名。这一页先给出读代码需要的最小约定;七个阶段再解释每个真实函数的职责。数学符号、教学伪代码与真实源码会分别标明。
建议学习安排,不是实测试读时长
全课建议安排 75–100 分钟:术语与本页预备 15 分钟,七阶段源码追踪 35–45 分钟,独立作答 10–15 分钟,核对答案与迁移判断 15–25 分钟。已经熟悉网络和并发基础的读者,可以先读阶段三至六,再回看阶段一、二、七。
程序中的名字怎么读
Variable(变量)是给当前值起的名字;Function(函数)接收输入并执行一段规则,圆括号中的值是参数。f(x) 表示调用 f 并传入 x,不是把两个字母相乘。Object(对象或记录)把字段名与值对应起来;job.id 表示读取 job 记录的 id 字段。Array(数组)是一组有顺序的值。字段名不规定真伪,仍需校验内容。
在本课的 Python 风格伪代码中,= 表示把右侧结果赋给左侧变量,== 才是比较两个值是否相等;在数学公式中,等号表示数学等式。assert 条件 表示条件不成立就停止并报错。AND 或数学符号 ∧ 表示条件必须同时成立;OR 或 ∨ 表示至少一个成立。true / false 表示真 / 假,代码注释不是运行步骤。
| 字段或状态 | 在本课里读作什么 |
|---|---|
pageId、manifestId | 页面标识、项目清单标识:区分当前究竟在处理哪个页面、哪个项目。标识不是页面标题。 |
jobId、job.id | 任务标识。请求参数可能叫 jobId,返回的 job 对象内部字段叫 id;它们是不同消息中的字段位置。 |
prompt、promptDigest | 提示词正文、供界面辨认的提示词摘要。显示用的摘要前缀不能替代服务端保存的完整确认摘要。 |
confirmedPromptSha256、confirmedDigest | 前者是保存的完整提示词确认指纹;后者是某些公开响应中的确认摘要表示。后文的数学变量 d 专指完整的确认摘要。 |
pageContextId、consumerSurfaceDigest | 页面上下文身份、当前生成消费者所依赖输入的指纹。后者用于判断生成依据是否已经变化,不是生成图片的指纹。 |
revision、selectionEpoch | 工作流版本号、浏览器刷新批次号。前者用来发现提交冲突;后者用来辨认迟到响应,不承担业务授权。 |
status | 任务状态字段;值不是随意的文案,而会影响下一步操作是否允许。 |
draft → confirmed → generating → generated / failed | 提示词任务的草稿、已确认、生成中、已生成或失败。这里只给主线,实际允许转换由服务端函数检查。 |
queued、running、completed | HTML 任务的排队、运行、完成。它们不是“业务已验收”的同义词。 |
operationId、httpStatus、referencesDigest | 接口操作标识、HTTP 响应状态码、参考资料指纹。相同字段名可能出现在不同消息中,要同时看其所属记录。 |
后文公式的符号预备
第一组:E 是全部待处理证据,e 是其中一条证据,p 是当前页面;Bound(e,p) 表示该证据确实绑定到当前页,Valid(e) 表示相应校验通过,Ep 是筛出的页面证据集合。∈ 表示属于集合,花括号表示集合。这些是教学谓词,不是声称源码有同名函数。
第二组:N 是递归遍历的输入节点数,K 是收集到的不同字段数量,T 是该段数据处理时间,O(…) 表示随规模增长的上界量级,log 表示对数。这个估计只讨论局部遍历与排序,不包含外部模型和网络等待。
第三组:H 是 SHA-256 哈希函数,P 是待校验的提示词文件字节,d 是确认时记录的完整摘要,s 是任务状态。在后面的生成流程模型里,C 表示页面上下文,P 表示提示词文本,I 表示设计图,W 表示网页代码,V 表示浏览器可见画面;文本 P 编码为具体文件字节后才能计算摘要。变量名相同,不意味着可以忽略文本与字节的区别。
伪代码中的函数名是解释,不是让你直接运行的脚本
context、source、draft、checked_draft 分别表示上下文、组装后的模型输入、模型草稿、通过检查的草稿。build_page_context 是真实源码中的上下文构造函数;教学写法中省略了它的完整参数。
deterministic_template 表示按固定模板组装,budgeted_projection 表示在预算内选择数据,text_model 表示调用文本模型,validate_output 表示输出检查,current_input_digest 表示重新读取当前输入指纹,save_draft 表示保存草稿。这组别名是为了把机制分开,不是仓库中可复制调用的完整函数列表。context.input_digest 也属于教学化字段别名。
这套系统到底在做什么
先校正仓库定位:Cadenvo_Frontend 是前端开发工作台,而不是训练业务前端本体。业务后端提供训练业务的契约与运行材料;这个工作台把材料变成页面设计和实现任务。不能因为仓库名字带 Frontend,就把其中的 Python 服务误认成浏览器代码。[S1]
| 层 | 真正负责什么 | 不应该混入的职责 |
|---|---|---|
| 训练业务后端 | 训练数据、身份、业务操作及其接口 | 不能用工作台生成的视觉图证明业务上线 |
| 工作台 Python 后端 | 证据、上下文、提示词、生成任务、文件与版本 | 不等于在本地训练了图像模型 |
| 工作台浏览器前端 | 发请求、编辑提示词、显示状态、选定候选、预览网页 | 不是收到提示词后就自己进行模型推理 |
| 外部模型执行链 | 提出文字、图像、网页代码候选 | 不能替代业务事实、权限检查和最终验收 |
证据范围:本课核查固定提交 0b4fedc57e8297b78beb2013a5cf2c30c2b6fa3e 的相关函数与前端调用。标为“源码事实”的内容来自该版本;公式和伪代码是“教学抽象”;“改进建议”不是现有功能声明。此次课程分析没有启动你的本机 Codex、调用付费生图通道,或替业务系统做线上功能验收。
阅读安排:先用约十五分钟建立知识地图,再沿七个阶段读源码;最后用故障题检验自己能否区分输入错误、版本错误、模型错误与浏览器错误。前置复习可看软件工程两小时入门。完整的建议活动分配见前面的读码预备页,时长不是实测数据。
概念关系与最小知识闭包
两张知识图,不要混用
| 分类关系:它属于什么 | 在本项目中的内容 |
|---|---|
| 上位:软件系统与人工智能应用工程 | 组织程序、数据、外部模型与人的决策 |
| 当前:有证据约束的内容生成流水线 | 输入治理、模型调用、任务状态与产物接收 |
| 组成部分:数据处理、通信、并发控制、生成、验收 | 页面投影、HTTP、摘要、状态机、图片与代码生成 |
| 并列:模型训练与浏览器渲染引擎 | 本仓库调用模型和使用浏览器,并未实现它们全部内部算法 |
学习依赖图:记录与函数 → JSON 和接口 → 页面上下文与投影 → 文件字节与摘要 → 状态和版本 → 多阶段生成 → 浏览器与交付验证。箭头表示“理解右边需要左边”,不是“右边属于左边”。图论、操作系统、网络、数据库和软件工程在这里汇合,并不是只学一门“大模型课”就能覆盖。
先补齐五个基础动作
序列化(Serialization)把内存中的对象变成文本或字节;反序列化再把它读回对象。JSON 是本项目常用的交换格式。进程(Process)是正在执行的程序实例,线程(Thread)是进程里的执行路径;Python 可以启动 Codex 子进程,也可以用线程管理网页生成任务。渲染(Rendering)是浏览器把文档结构和样式计算成可见画面,不是让模型猜下一份内容。
异步(Asynchronous)表示调用者不必占住当前执行路径等待全部工作完成。JavaScript 的 Promise 表示一个以后完成或失败的结果,await 让当前异步函数等待它,并不等于给浏览器启动了一个模型进程。轮询(Polling)则是隔一段时间主动查询任务状态;它与保持一个较长的请求等待响应是两种做法。[D1]
一个贯穿全课的比方:建筑项目
把项目清单想成“要建哪些房间”,把接口契约想成设计标准,把运行证据想成有日期和测量人的现场勘测报告。工作台先为当前房间整理资料,再请设计者写任务单;人看过任务单后得到效果图,选定方案后再生成施工图。浏览器只是会议室里的展示屏和操作台,不会因为显示了效果图就自动盖出房子。
映射关系是:房间清单对应 Manifest,勘测与规范对应不同证据类型,当前房间档案对应 PageContext,任务单对应提示词,效果图对应图像候选,施工图对应网页代码,交付检查对应验收。比方的边界:模型可能误读资料,网页代码也不是实体建筑;最重要的是“规范、观察、方案、实现、接受”属于不同证据阶段,而不是机械类比它们的材料。
七阶段生成链路:沿源码追一次请求
源码阅读路线:证据 → 压缩 → 提示词 → 前端与确认 → 生图 → 网页生成 → 并发与交付。
| 阶段 | 输入 → 输出 | 执行主体 |
|---|---|---|
| 1. 组织证据 | 页面清单、契约、观察 → 带来源的页面上下文 | 工作台后端 |
| 2. 选择与压缩 | 完整上下文 → 当前任务需要的有限输入 | 确定性数据变换 |
| 3. 编写生图指令 | 模板与证据 → 可编辑中文提示词 | 后端调用文本模型,再校验 |
| 4. 保存与确认 | 用户看到的正文 → 服务端绑定的已确认版本 | 浏览器发请求,后端检查并持久化 |
| 5. 生成设计图 | 已确认提示词 → 图片、报告、摘要 | 后端调用图像生成通道 |
| 6. 生成网页 | 选定图片、上下文、参考 → 网页代码候选 | 另一项 Codex 任务 |
| 7. 接收与显示 | 通过当前输入检查的文件 → 受管网页与预览 | 后端接收文件,浏览器渲染 |
阶段一:先决定“什么材料有资格进入当前页”
源码事实:build_page_context 读取页面片段,选择当前页对应的接口,规范化源码、截图和运行记录。运行包必须绑定当前页;包和其中的声明不能引用当前页面接口集合之外的操作。它保留来源类别与冲突,而不是把所有内容压成一段没有出处的聊天文字。[S2]
这首先是集合筛选与关系连接问题。页面集合、接口集合、证据集合分别用标识关联;“有同名字段”不等于“属于同一业务对象”。假设两个页面都出现“状态”,筛选时必须带着页面、操作与证据来源,而不能只搜索这个词。
用前面已经定义的 E、e、p、Bound 与 Valid,可写成下面的教学模型:
这里 E 是待处理证据集合,p 是当前页面,Bound 表示来源与页面绑定成立,Valid 表示对应校验通过,E 的下标 p 表示筛选后的页面证据。这是解释用的集合表达,不是声称源码恰好实现了这两个同名函数。
随后,project_image、project_html 和 project_delivery 分别生成图像输入、实现输入和交付摘要。图像侧不必拿全部实现细节;网页代码侧保留更丰富的页面、接口、事实和冲突信息。源类别仍在,不能把“契约说有这个字段”升级成“线上已经存在这条用户数据”。[S2]
阶段二:把材料压进预算,不是随意截断
源码事实:page_context_prompt_evidence 先按固定字段组织输入,再计算序列化文本长度。当前 MAX_EVIDENCE_CHARS 是 8000。这里限制的是 Python 字符串长度,不是 8000 个模型词元,也不是 8000 字节。[S3]
词元(Token)是模型处理文本时使用的编码单位,可能对应一个词、一段词或其他文本片段。中文字符数、UTF-8 编码字节数与模型词元数之间没有固定的一比一关系。因此这项限制控制了工程输入大小,但不是精确的模型上下文额度控制。
| 逐级处理 | 保留与舍弃 | 为什么这样做 |
|---|---|---|
| 完整结构优先 | 保留接口、运行观察、覆盖状态、源码和视觉来源 | 预算足够就不先丢信息 |
| 压缩接口模式 | 摘要化字段、枚举、约束、参数,并保留模式摘要 | 减少重复、冗长的定义 |
| 观察记录改成元组表 | 列名列一次,每条记录只保存相同顺序的值 | 少重复键名,仍能解释每列含义 |
| 接口索引与词汇表 | 保留操作索引,合并部分字段信息,声明省略 | 进一步压缩,承认细节损失 |
| 精简操作元组与来源 | 保留方法、路径、认证要求及必要引用 | 优先维持操作身份,不伪造完整模式 |
| 仍然超预算 | 拒绝生成,要求收窄当前页责任映射 | 不让截断后的半份证据冒充完整资料 |
例如把三条记录都写成 {"operationId":...,"httpStatus":...},会重复键名。元组表改为一次声明列名,再存三行值;这是数据表示优化,不需要神经网络。另一方面,删除部分枚举和参数是真正的信息损失,不能一概叫“无损压缩”。
计算机基础:compact_openapi_prompt_contract 递归遍历对象与数组,再排序字段集合。递归就是函数处理子结构时调用自身;集合负责去重。若输入有 N 个节点、收集 K 个不同字段,在通常集合操作成本假设下,遍历加排序可理解为:
T 是这部分处理时间,O 表示随输入规模增长的量级;它不包含模型推理、文件读取或网络等待,不能拿来声称整条生成链“线性时间”。
阶段三:确定性模板 + 模型改写 + 输出检查
源码事实:prompt_for 把页面标题、角色、层级、建议、证据和约束放入固定模板。compile_prompt_with_codex 再调用本机 Codex,把它整理为用户能逐字审阅的中文生图指令。最后 validate_generated_prompt 检查文本,阻止一部分英文技术标识、路径和内部语法进入用户可见正文。[S4]
这是三个不同算子:拼模板是确定性变换,模型改写是候选生成,检查器是接收条件。三者分开,才能判断出了什么问题。字段选错要回到证据层;模型把只读权限写成发布能力,要检查提示与语义验证;正文夹带内部标识,则属于输出约束问题。
规范化(Normalization)把输入改成统一形式。这里的字符规范化有助于识别一些外观不同而含义相近的字符;它和“把敏感字段随便删掉”不是一回事。正则表达式是描述字符匹配规则的方式,擅长找某类文本模式,但不能证明一句中文业务陈述有充分证据。
# 教学伪代码;变量和函数别名已在读码预备页解释。
context = build_page_context(page_id)
source = deterministic_template(page, budgeted_projection(context))
draft = text_model(source)
checked_draft = validate_output(draft)
# 模型运行期间来源也可能变化,因此返回后还要重新比较输入身份。
assert current_input_digest() == context.input_digest
save_draft(checked_draft)本项目在提示词生成前取输入快照,模型返回后再次读取项目、页面消费摘要和证据文件记录,发现变化就拒绝把旧答案登记为新任务。这个设计是为了处理“模型在想的时候,世界已经变了”,而不是为了让模型每次输出相同内容。[S4]
不要硬套检索术语:检索增强生成(Retrieval-Augmented Generation,RAG)通常指先检索相关材料,再把检索结果交给模型。本课核查的主链以明确的页面绑定、接口映射和证据筛选为核心;没有据此证明它使用向量数据库、向量相似度检索或专门训练的页面模型。可以称它为证据驱动的上下文组织,不必给未实现的机制贴标签。
阶段四:提示词怎样从后端来到前端,又怎样被用于生成
源码事实:app.js 的 preparePrompt 向 /api/prompts/prepare 发送包含 pageId 的请求,等待后端返回任务对象。public_job 暴露可显示的状态、提示词、摘要、当前页面与任务标识等字段。浏览器解析 JSON 后更新自己的状态,再把正文放进编辑器。[S4][S5]
因此传输的不是“模型脑子”,也不是自动执行的提示词。可以把它看作远程函数调用:输入一个页面编号,得到一个任务记录。正文进入文本框,状态决定按钮和提示信息;后端才保存权威的任务文件。
// 教学化的消息示例;值是占位符,不是运行记录。
{
"job": {
"id": "example-job",
"pageId": "example-page",
"status": "draft",
"prompt": "围绕当前训练页,呈现证据允许的内容……",
"promptDigest": "摘要显示前缀"
}
}当前界面有一个容易讲错的细节:独立的确认按钮已经不是必经界面。用户点击“生成视觉候选”时,ensureConfirmedPrompt 会在需要时先保存正文,再调用确认接口,随后才调用生图接口。已经确认且未修改时可复用确认。接口层的“保存 → 确认 → 生成”没有因此消失。[S5]
浏览器 工作台后端
点击生成视觉候选
├─ POST /api/prompts/update → 保存当前正文,状态回到草稿
├─ POST /api/prompts/confirm → 比较文件摘要,记录确认摘要
└─ POST /api/image2/generate → 重新检查确认与当前输入,启动生图
收到任务与候选地址 ← JSON 响应
更新界面、展示候选提示词编辑采用防抖(Debouncing):输入暂停约一秒再保存,避免每个按键都发请求;切走前也尝试补存。这是减少重复操作的调度办法,不是数据库事务,也不保证突然断电前的最后一个字一定写入。
服务端确认会记录完整的 SHA-256。设 P 为当前提示词文件字节,d 为确认时保存的摘要,那么生图至少必须满足:
H 是 SHA-256 函数,s 是任务状态,confirmed 表示已确认。还要额外验证页面消费来源仍有效,不能只检查这一个等式。界面显示的短摘要只是给人辨认;不是把内部比较也缩短成同样长度。这个协议绑定“生成使用哪一版”,但单凭机器状态无法证明人真的逐字阅读。[S4][S6]
阶段五:设计图怎样生成,失败怎样切换
源码事实:generate 在全局生成锁中检查当前输入、确认状态和提示词摘要。它先探测并尝试原生生图通道;遇到该路径的错误后,清理输出,再尝试已配置的 Sub2API 桥接通道。桥接是把一种调用方式转换到另一条服务接口的适配层,不是本项目新增了一种图像生成模型。[S6]
这属于顺序故障切换(Sequential Failover),不是两个模型并行比赛。原生路径成功就无需等待后备;走到后备时,前面已耗去的时间不会自动消失。两个通道还可能共享上游故障,因此不能不加假设地把它们当作相互独立。
候选接收检查实际文件、PNG 图像格式及尺寸、成功报告和文件摘要。PNG 是 Portable Network Graphics(便携式网络图形),是一种图像文件格式。失败时清掉不完整候选,避免失败的旧图仍被当作成功结果展示。[S6]
这里的应用代码可以证明“调用哪条路径、检查了哪些结果”,不能回答外部图像模型每一层网络怎样计算。文本模型可以抽象为从条件分布提出文字候选;图像模型也可抽象为根据输入提出图像候选。不能只凭一个服务接口,就断言其内部必定采用某种训练配方或生成架构。
通信方式也要如实区分:提示词准备和生图在当前前端都是等待 POST 响应的路径;HTML 生成另有持久化任务与后台执行。JavaScript 使用 await,并不能把整条链描述成统一消息队列,更不能凭空说它采用服务器事件流或双向推送。[S5][S6][S7]
阶段六:图片不会自己变成网页,而是又启动一次代码生成
源码事实:视觉方案选定并获准进入 HTML 阶段后,launch_replica / create_replica_job 创建任务记录,并在线程中执行 run_replica_job。输入包括选定图片、当前页的 HTML 投影、参考资料;编辑任务还会带上现有 HTML 与用户修改要求。[S7]
后端把选定图片以图像输入交给 Codex,并要求在隔离的任务目录里产出完整网页。接收前再次检查页面消费来源、参考资料摘要和所选候选身份。这样模型执行期间发生的页面变化或重新选图,不会被旧任务直接覆盖到新版本上。[S7]
用读码预备页已经定义的 C、P、I、W、V,表达三次生成与一次显示:
C = 当前页面上下文
P = 文本模型(模板 + 图片任务所需的上下文)
I = 图像模型(已确认的 P)
W = 代码模型(已选定的 I + 网页任务上下文 + 修改要求)
V = 浏览器渲染(W)C、P、I、W、V 分别表示上下文、提示词、图像、网页代码和可见画面。前面三次生成依赖模型提出候选;最后一次由浏览器解释具体代码。I 好看,不能推出 W 正确;W 能打开,也不能推出真实业务已经接通。
HTML 生成不是复制一张图的像素,而是重新构造元素结构、尺寸布局和交互代码。把它类比为“从视觉目标反推实现”更准确。但当前源码并没有实现一个可证明最优的布局求解器,也没有保证设计图与网页逐像素一致。
normalized_html 检查字符串、大小,以及是否出现文档类型或 html 标记。这是基础完整性检查,不是完整语法解析,更不是脚本安全审计或功能正确性证明。save_html 还核对当前上下文后保存文件与元数据;这些检查不能被包装成“自动生成的网页已经安全上线”。[S8]阶段七:状态、版本与浏览器显示为何必须分开控制
| 层次 | 源码中的防错机制 | 主要防什么 |
|---|---|---|
| 提示词任务 | 草稿 → 确认 → 生成中 → 已生成或失败;改正文会清除旧确认 | 用未确认或被替换的正文生成 |
| 页面来源 | consumerSurfaceDigest 与当前消费输入比较 | 拿旧接口、旧证据或旧页面定义生成新版本 |
| 工作流决定 | 清单摘要、revision、候选身份共同核对 | 两个人同时操作时旧决定覆盖新决定 |
| 浏览器切页 | selectionEpoch 递增,完成时检查页面与批次 | 较慢的旧页面响应干扰当前显示 |
| HTML 接收 | 任务结束后在锁内重查来源与选择 | 模型长时间执行后把过时结果写回 |
批次号(Epoch)在这里是前端为刷新操作递增的编号。你先打开甲页再打开乙页,甲页请求最后才回来时,旧刷新不能据此宣称当前乙页已刷新完。它解决的是响应顺序,不是业务权限。服务器的版本控制仍然必要。[S5]
锁(Lock)让特定临界区同一时刻只由允许的执行者进入;临界区就是不能相互穿插执行的共享状态读写片段。乐观版本比较判断“你读的版本是否仍有效”,锁保护“比较与更新之间不被另一条本进程执行路径插入”。不要把 Python 进程内的锁直接当成多台服务器共同持有的分布式锁。[S7]
原子替换(Atomic Replacement)把临时文件写好后替换目标,让读者尽量看到一份完整旧文件或完整新文件,而不是半份文本。项目使用这种方式写 JSON 和受管内容。但 HTML 与元数据是两个文件,分别替换不等于跨文件的完整事务;原子可见性也不等于已经保证断电后的持久性。[S8][D2]
还有一个细节:生图主函数在启动时检查输入,后续选用候选时又会检查来源;本课没有把它说成“每次模型完成后都在同一处立即重查”。HTML 接收路径确有结束后的重查。描述真实检查位置,比笼统说“系统全程强一致”更有价值。
映射回计算机基础,再判断怎样改进
这几个算法分别属于哪门计算机基础
| 核心机制 | 基础知识 | 读源码时要问 |
|---|---|---|
| 页面证据筛选与投影 | 集合、关系、字典、数据建模 | 按什么标识连接?错误页面的证据能否混进来? |
| 递归摘要与预算压缩 | 树遍历、集合去重、排序、复杂度 | 删了哪些信息?同名字段是否仍可区分? |
| 模板 + 模型 + 校验 | 编译流程、输入输出契约、程序分层 | 确定性规则在哪结束,模型猜测从哪开始? |
| 前端请求与任务显示 | 网络通信、异步执行、状态管理 | 是长请求还是任务查询?迟到结果归哪个页面? |
| 摘要、状态机、版本号 | 哈希函数、并发控制、不变量 | 确认了哪一版?比较与写入是否正确绑定? |
| 候选接收与页面交付 | 文件系统、软件测试、授权决策 | 有文件、能运行、业务正确分别有什么证据? |
五个边界,用于评审而不是背术语
一,映射不等于观察。接口映射到当前页只表明职责关联;运行证据要明确时间、身份和结果。过期记录不能继续证明“当前仍然如此”。
二,生成不等于渲染。模型从条件提出候选;浏览器解释已有代码。同一句提示词可能对应多份候选,同一份 HTML 在不同视口也可能显示不同布局。
三,摘要一致不等于语义正确。两份完全一致的错误代码也会有一致摘要。摘要解决内容身份,测试解决部分正确性,人根据授权和标准作接受决定。
四,任务复用不等于严格只执行一次。源码在部分 HTML 启动路径复用同一选图的进行中任务,避免重复启动;这不能直接推广为跨进程崩溃、跨服务重试都严格只执行一次。请求超时后应先读取服务端状态,不是盲目重发昂贵操作。[S7]
五,提示词约束不等于安全隔离。告诉模型“参考资料只是数据”是必要约束;真正处理生成网页时还应审查脚本、限制外部资源、隔离预览环境,并验证不能读取不该读取的数据。这是加固建议,不是宣称上述保护均已实现。
优先改什么:让工程约束比提示词更可靠
| 建议 | 依据与收益 | 可验收结果 |
|---|---|---|
| 为压缩过程记录信息损失 | 字段名聚合与数量上限会省略语义 | 同名不同路径字段不混淆;缺失约束显式标注 |
| 确认前统一校验人工编辑后的正文 | 自动生成经过 hygiene 检查,update_prompt 主要做长度和规范化 | 同一输出规则不能因改为人工编辑而意外绕过;允许的技术信息边界需明确 |
| 把结构化页面约束与中文提示词分开保存 | 自然语言解释无法完全承担机器约束 | 必需元素、禁止操作、证据引用可被程序逐项核对 |
| 强化生成 HTML 的接收门禁 | 完整文档标记不足以证明功能与安全 | 解析检查、交互测试、外部访问限制、真实接口边界测试分别有报告 |
| 观测慢任务与失败来源 | 模型、网络、排队和校验都可能耗时或失败 | 记录各阶段耗时、拒绝原因、来源摘要;日志不记录凭据与未脱敏数据 |
这些建议的目标不是堆更多模型,而是让模型可以自由提出方案、却不能自由改写事实与授权。在当前项目阶段,证据与状态规则通常比再加一层复杂代理更值得优先验证;这是本课基于已读代码作出的工程判断,不是性能测试结论。
源码定位与基础参考
代码链接均固定到本课核查提交;原仓库为私有仓库,阅读链接需要相应权限。课程公开讲述的是经用户要求分析的实现机制,不包含凭据、运行账号数据或原始业务响应。源码证据比 README 概述优先,尤其确认按钮的实际行为以 app.js 为准。
| 编号 | 可追踪来源 | 本课使用范围 |
|---|---|---|
| S1 | README:仓库定位 | 业务后端与开发工作台的边界 |
| S2 | workbench_evidence.py | build_page_context、三种投影、页面与操作引用校验 |
| S3 | 证据预算与递归压缩 | compact_openapi_prompt_contract、page_context_prompt_evidence |
| S4 | 提示词模板、编译、快照与确认 | prompt_for、compile_prompt_with_codex、prepare_prompt、update_prompt、confirm_prompt |
| S5 | app.js:浏览器调用链;刷新批次 | 保存、自动确认、生图请求、失败后状态恢复与切页控制 |
| S6 | generate | 全局锁、确认摘要、原生优先、后备切换与候选验证 |
| S7 | 工作流与 HTML 任务 | 版本比较、人工选图、线程任务、结束后的输入重查 |
| S8 | HTML 基础检查与保存 | normalized_html、save_html 与文件级写入边界 |
| D1 | MDN:使用 Fetch | 请求、Promise、响应处理与状态检查 |
| D2 | Python:os.replace | 成功替换的原子性与文件系统边界 |
现在把它当成一道题
场景题:一次生成过程里,四种“看似成功”发生了冲突。你正在为甲页修改提示词。旧版本已经确认,随后正文被改;另一位同事更新了页面所依赖的接口材料。你切到乙页,甲页较慢的请求才返回。与此同时,两位评审都拿着工作流第七版选择不同图片,第一位已经提交成功。最后,浏览器提示某次生图请求超时,但服务器上的图片和成功报告实际上已经写出。
请写一份处理决定:正常界面点击生成,与绕过界面直接调用旧任务生图,有何区别?哪些旧结果需要失效,哪些只是不能影响当前显示?第二位评审能否直接覆盖?遇到请求超时应先查什么?即使最终 HTML 文件写出,还缺哪三类交付证据?
要求按“输入事实 → 状态或不变量 → 允许动作 → 不能声称的结论”作答,不要只写“加锁、重试、重新生成”。
分级提示与实际答案
提示一 · 方向
先区分五个对象:提示词正文、页面消费来源、当前显示页面、评审版本、服务器任务。它们没有共用一个“成功”开关。先判断每个对象的身份是否仍然是你当时读到的那个。
提示二 · 结构
正常生成按钮会先保存并确认当前正文,但不能因此跳过页面来源检查。旧页面响应是否可更新当前显示,看批次与页面;评审是否可提交,看 revision 与候选身份;请求超时是否等于任务失败,要读服务端任务记录。
提示三 · 接近答案
把每个决定绑定到具体条件:提示词文件摘要等于确认摘要;任务的页面消费摘要等于当前摘要;提交的工作流版本等于当前版本;浏览器当前页与响应所属页一致。最后再问:报告通过证明的是文件身份,还是运行功能?
答案 · 实际处理决定
提示词:仅修改正文且来源仍有效时,正常界面的生成操作会保存并重新确认当前版本,再生成;不是任何编辑都必须另开任务。但是在本题中,页面依赖材料已经变化,旧任务不能仅靠重新确认正文继续使用,应基于新上下文重新准备提示词。直接调用仍带旧确认的任务,更不能绕过文件摘要与来源检查。
切页:甲页的任务归属仍是甲页;迟到响应不能因为最后抵达就覆盖乙页的显示。检查页面标识与刷新批次,保留正确归属,不把“当前不显示”误判为服务器任务必须取消。
并发评审:第一位从第七版提交后版本已增加,第二位的第七版提交应被拒绝。第二位需要刷新、重新看当前候选与决定,再明确提交,而不是强制覆盖。锁与版本比较承担不同职责。
超时:先查询服务端任务状态,核对图片文件、成功报告、摘要与来源是否仍有效。请求响应丢失不等于任务没有完成,盲目重新生成可能重复付费或产生另一候选。文件已存在也不能越过后续的来源有效性检查。
交付:至少还要分别取得浏览器渲染与交互证据、真实接口和权限边界的功能证据、对特定候选的有权人工接受。基础 HTML 标记检查、相同摘要和一次成功生图报告,都不能替代这三类证据。