Skip to content

Commit 6d98e01

Browse files
committed
解决ai生图同质化严重问题
1 parent 15c0ea4 commit 6d98e01

10 files changed

Lines changed: 74 additions & 22 deletions

‎client/electron/resources/content-generation/受限HTML生成规范.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,11 @@
4848

4949
占比按本轮实际新增图片张数计算:单张图片和图片表格各 1 张,三列图片 3 张,四宫格 4 张。原方案图片不计入分子或分母,即使 data-yb-generation="aiImage" 也不视为本轮 AI 生图。60% 是主 Agent 统筹的整体规划目标,不是上限,不要求精确命中,也不要求每个小节分别达到该比例;保持既定布局名额,不额外加图凑比例。暂停重试沿用本轮安排,已完成的新图计入本轮统计;局部生成只统计本轮新增图片,单节修改不追补全文比例。
5050

51+
AI 图片画面差异化:每张新增 AI 图片确定画面类型(对照表中的 AI 类型)、主体、视角景别(特写、中景、全景、鸟瞰、轴测、剖切等)和画面形式(见下方 AI 生图工具的 style)。全文 AI 图片在这四个维度上分散,避免多数图片都表现人员在工位或现场作业;管理、值守、协同类内容可改为表现设备实物、系统构成、空间全貌、作业对象细节或成果状态,相邻小节不重复相同组合。同一图组使用同一画面形式,全文按内容选用多种画面形式。该要求只约束画面内容,不改变 AI 占比和布局名额。
52+
5153
批量正文生成的新增布局名额由正文编排决策.json 的 image_layout_quota 提供:total_groups 为本轮总组数,single、imageText、threeImages、fourImages 分别为单张图片、图片表格、三列图片、四宫格的组数。主 Agent 在并发写作前统一分配到本轮目标小节,并在各节写作要求中明确布局、组数及每张图的表达目的、图片类型和生成方式(aiImage/htmlImage/mermaid)。并发写作模型只执行本节分配,不自行改变生成方式,不自行承担或重新分配全局名额,也不独立承担 AI 图片占比目标;未分配布局的小节不新增配图。布局名额仅用于本轮批量生成,后续单节修改按用户要求执行,不重新分配全文名额。
5254

53-
image_needed 表示本节是否进入新增配图范围:为 false 时不新增图片;为 true 时可承接主 Agent 分配的布局。image_suitability_score 为 0~10 分的配图适配评分,用于选择更合适的布局承接小节,不用于取消本轮名额。可在适合的小节安排多组,不要求每个入选小节恰好一组,不设每节图片张数上限。单张图片与图片表格可依据说明文字的必要性互换,两者合计组数保持不变;三列图片和四宫格按分配组数执行,不自行拆成单张。组内图片围绕共同主题表达不同信息,避免重复。布局与生成方式分别判断,AI、HTML、Mermaid 仍遵守类型开关和对照表。
55+
image_needed 表示本节是否进入新增配图范围:为 false 时不新增图片;为 true 时可承接主 Agent 分配的布局。image_suitability_score 为 0~10 分的配图适配评分,用于选择更合适的布局承接小节,不用于取消本轮名额。可在适合的小节安排多组,不要求每个入选小节恰好一组,不设每节图片张数上限。单张图片与图片表格可依据说明文字的必要性互换,两者合计组数保持不变;三列图片和四宫格按分配组数执行,不自行拆成单张。组内图片围绕共同主题表达不同信息,避免重复;组内 AI 图片至少在主体或视角景别上明显不同,按步骤拆分时同时变换景别和主体(如作业全景、部件特写、终端或仪表特写、完成状态),不能同一场景同一构图只换动作。布局与生成方式分别判断,AI、HTML、Mermaid 仍遵守类型开关和对照表。
5456

5557
并发正文写作阶段只生成分配的新增图片布局和受限 HTML 结构,填写生成类型、用途说明、替代文本及必要图注,暂不填写图片资源引用。主 Agent 在当前会话内生成图片后调用 apply-section-images 批量回填工具返回的 asset_ref;已有原图直接使用提供的资源引用。暂停或失败重试沿用本轮名额,已完成布局计入完成数量,仅补未完成部分。全部并发写作及配图结束后,由主 Agent 核对新增布局名额、图组内容、图片引用及生成方式分布,再进入字数检查;AI 占比是规划目标,不因比例偏差新增失败条件或额外加图。
5658

@@ -62,7 +64,7 @@ image_needed 表示本节是否进入新增配图范围:为 false 时不新增
6264
- data-yb-generation 按对照表填写:ai 对应 aiImage,html 对应 htmlImage,mermaid 对应 mermaid;统一调用 generate-section-images,kind 分别填 ai、html、mermaid。新增图片的类型与实际调用的生成工具一致;原图按上述规则使用 aiImage,不触发生图。
6365
- data-yb-size 表示图片画框比例:square 为 1:1 方形,wide 为 3:2 横向,tall 为 3:4 纵向,panorama 为 16:9 横向;这是正文排版画框,不是生图服务的 size 参数。
6466
- data-yb-fit="contain" 保持原图比例、完整显示、不裁剪;data-yb-fit="cover" 铺满画框,比例不一致时会裁剪。省略时 Word 转换默认按 cover 处理。流程图、信息图及需要完整保留的原方案图片应明确使用 contain;实景示意图仅在允许裁剪边缘时使用 cover。
65-
- 每个 figure 必须包含且仅包含一个非空的 template[data-yb-role="prompt"]。新增图片的模板应说明表达目的、主要对象及其关系,必要时说明图中文字或数据;不得嵌入绘图源码。原图模板填写复用说明。所有 figure 包含一个 img,带非空 alt;独立图和图组内的图带 figcaption。
67+
- 每个 figure 必须包含且仅包含一个非空的 template[data-yb-role="prompt"]。新增图片的模板应说明表达目的、主要对象及其关系,必要时说明图中文字或数据;不得嵌入绘图源码。AI 图片模板按主体、可见元素、视角景别与构图、环境光线正向描述画面,写出区分本图的具体视觉元素,并注明画面形式名称;不虚构的范围是数值、型号、品牌、单位名称和可读文字,设备外形、材质、空间、光线等示意性细节应具体描述,不堆叠否定约束。原图模板填写复用说明。所有 figure 包含一个 img,带非空 alt;独立图和图组内的图带 figcaption。
6668
- 配图块之间用正文衔接,不连续堆图。不要照抄模板示例的配图内容。
6769

6870
```html
@@ -97,7 +99,7 @@ image_needed 表示本节是否进入新增配图范围:为 false 时不新增
9799

98100
本轮全部待生成 AI、HTML、Mermaid 图片通过 generate-section-images 的 images 一次混合提交,不按章节、类型或固定小批次拆分,单张也用一项数组。每项填写清单 image_id、kind(ai/html/mermaid)和 prompt。程序同时向既有生图及文本队列提交任务,超限自动排队;每张源码完成后立即进入对应本地渲染队列,不等待其他源码或 AI 图片。逐项报告进度,整批结束后返回 results;按 image_id 对应正文图片,检查 status、stage、error、source_file 和 asset_ref,按工具说明处理未成功项。success 图片直接回填,error/cancelled 表示失败或未完成;不能把已保存源码当成图片生成完成。
99101

100-
- AI 生图:kind=ai,size 必填,逐图读取对应 figure 的 data-yb-size,按 square=1:1、wide=3:2、tall=3:4、panorama=16:9 选择匹配的具体生图尺寸;当前金龙 gpt-image-2-1k 的 tall 使用已验证的 768x1024。可选 style、title;不能把 tall 等画框名称当作尺寸,不得省略 size 或统一沿用默认方图;prompt 同步保留相同的比例与横向/竖向构图要求。尺寸被服务端拒绝时按失败结果修正该项,不通过省略尺寸重试。返回像素可能由服务端调整,不要求与请求像素完全相等。返回的 asset_ref 已指向当前工作区内的图片副本。
102+
- AI 生图:kind=ai,size 必填,逐图读取对应 figure 的 data-yb-size,按 square=1:1、wide=3:2、tall=3:4、panorama=16:9 选择匹配的具体生图尺寸;当前金龙 gpt-image-2-1k 的 tall 使用已验证的 768x1024。style 必填,按模板注明的画面形式选择:realistic_photo=写实摄影(现场、作业、环境)、product_shot=设备特写摄影(实物、部件细节)、architectural_render=建筑/场地效果图(效果图、园区、空间全貌)、3d_render=三维模型渲染(设备、系统立体构成)、isometric_illustration=轴测插画(场景布局、系统空间关系)、cutaway_illustration=剖视透视插画(剖视图、物理结构、原理)、exploded_view=爆炸分解图(组件构成、装配关系)、line_drawing=技术线稿(工艺、结构、操作要点)、flat_illustration=扁平矢量插画(概念图、对比示意);prompt 不写与 style 冲突的风格,品牌、水印和无关文字的限制由程序统一追加。可选 title 填写简短图名。不能把 tall 等画框名称当作尺寸,不得省略 size 或统一沿用默认方图;prompt 同步保留相同的比例与横向/竖向构图要求。尺寸被服务端拒绝时按失败结果修正该项,不通过省略尺寸重试。返回像素可能由服务端调整,不要求与请求像素完全相等。返回的 asset_ref 已指向当前工作区内的图片副本。
101103
- HTML/Mermaid:kind=html/mermaid,HTML 另填与正文画框一致的 frame_size。prompt 提供图片类型、表达目的、准确内容和数据,不能只给文件路径或要求模型自行检索;并发模型没有主会话上下文。源码独立保存为图片/下的新文件,随后自动转图。有 source_file 的失败或未完成项直接修复、转图,不重新生成源码;无源码的失败项才重新提交生成。
102104

103105
- HTML 图片修复:首次生成已自动转图;需要按工具反馈重试转图时,将待修复 HTML 文件放入 images 数组,一次调用 render-html-image。每项必填 image_id、source_file 和 frame_size;source_file 为源码相对路径,frame_size 与正文对应 figure 的 data-yb-size 一致。源文件可包含 html/head/body、style、div、SVG 等绘图结构,与受限正文分开;不依赖外部资源。生成前按画框比例确定固定设计尺寸:square=1240×1240、wide=1240×827、tall=1240×1653、panorama=1240×698。以 body 为画布,程序统一设置宽高及四周40px内边距,边距包含在上述尺寸内;例如 square 的内容区域为1160×1160。保留 body 的 Flex/Grid 布局,不额外包一层画布或重复添加外层边距。标题区和主体区共同利用内部空间,主体使用 Flex/Grid 分配剩余高度,卡片、节点及图形均衡分布,避免内容集中顶部、底部大面积留白。采用正式简洁的配色、统一字体和线条,模块间距协调;正文和节点文字不小于24px。不通过无意义文字、拉伸图形、单纯撑高空卡片或整体缩小内容填充版面。程序按固定尺寸以2倍像素输出,不按滚动高度扩大截图;内容不得侵入边距或超出画布。按 results 中的 image_id 对应正文图片,逐项检查 status 和 error,按工具反馈修改源码并重试;成功后使用本次工具返回的图片资源引用。
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// AI 配图画面形式的唯一来源:正文配图工具据此限定 style,生图服务据此追加风格说明。
2+
const AI_IMAGE_STYLES = {
3+
realistic_photo: { label: '写实摄影', usage: '现场、作业、环境', hint: '画面采用专业写实摄影风格,真实材质与自然光线,构图克制,适合投标技术方案插图。' },
4+
product_shot: { label: '设备特写摄影', usage: '实物、部件细节', hint: '画面采用设备产品特写摄影风格,主体突出、背景简洁纯净,材质与细节清晰。' },
5+
architectural_render: { label: '建筑/场地效果图', usage: '效果图、园区、空间全貌', hint: '画面采用建筑与场地可视化效果图风格,空间尺度清晰,光影自然,整体完成效果明确。' },
6+
'3d_render': { label: '三维模型渲染', usage: '设备、系统立体构成', hint: '画面采用干净的三维模型渲染风格,材质简洁,光照柔和,体块与部件关系清楚。' },
7+
isometric_illustration: { label: '轴测插画', usage: '场景布局、系统空间关系', hint: '画面采用等轴测视角的工程插画风格,结构清晰、配色统一克制,空间与分区关系一目了然。' },
8+
cutaway_illustration: { label: '剖视透视插画', usage: '剖视图、物理结构、原理', hint: '画面采用剖切透视的技术插画风格,剖开外壳或结构层展示内部构造,层次与连接关系清楚。' },
9+
exploded_view: { label: '爆炸分解图', usage: '组件构成、装配关系', hint: '画面采用爆炸分解图风格,各组成部件沿装配方向有序分离排布,装配关系清楚。' },
10+
line_drawing: { label: '技术线稿', usage: '工艺、结构、操作要点', hint: '画面采用简洁的单色技术线稿风格,线条规整、疏密有度,重点部位清晰。' },
11+
flat_illustration: { label: '扁平矢量插画', usage: '概念图、对比示意', hint: '画面采用扁平矢量插画风格,色块简洁、造型概括,主题关系清晰。' },
12+
};
13+
14+
// 已知形式追加对应风格说明;未指定时不附加默认风格,避免覆盖提示词中的画面设计。
15+
function buildImageStylePrompt(prompt, style) {
16+
const hint = AI_IMAGE_STYLES[style]?.hint;
17+
return `${prompt}\n\n${hint ? `${hint}\n` : ''}避免出现品牌标识、水印、夸张营销元素和无关文字。`;
18+
}
19+
20+
module.exports = { AI_IMAGE_STYLES, buildImageStylePrompt };

‎client/electron/services/aiService.cjs‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const {
2323
writeAiLog,
2424
} = require('../utils/aiLog.cjs');
2525
const textTokenStatsStore = require('./textTokenStatsStore.cjs');
26+
const { buildImageStylePrompt } = require('./aiImageStyles.cjs');
2627
const { normalizeTokenUsage } = textTokenStatsStore;
2728

2829
const AI_REQUEST_TIMEOUT_MS = 600000;
@@ -442,10 +443,7 @@ function normalizeImagePrompt(request) {
442443
throw new Error('生图提示词为空');
443444
}
444445

445-
const styleHint = request.style === 'realistic_photo'
446-
? '画面采用专业实景照片风格,真实、克制、适合投标技术方案插图。'
447-
: '画面采用工程项目图示风格,结构清晰、专业克制、适合投标技术方案插图。';
448-
return `${prompt}\n\n${styleHint}\n避免出现品牌标识、水印、夸张营销元素和无关文字。`;
446+
return buildImageStylePrompt(prompt, request.style);
449447
}
450448

451449
function safeImageResponse(data) {

0 commit comments

Comments
 (0)