[{"data":1,"prerenderedAt":1437},["ShallowReactive",2],{"post-ecom-detail-ai-part1-architecture":3,"post-nav-posts":1080,"post-project-ecom-detail-ai-part1-architecture":1104},{"id":4,"title":5,"body":6,"cover":1064,"date":1065,"description":95,"extension":1066,"links":1067,"meta":1068,"navigation":1069,"path":1070,"project":41,"seo":1071,"slug":1072,"stem":1073,"summary":1074,"tags":1075,"visible":1069,"__hash__":1079},"posts\u002Fposts\u002Fecom-detail-ai-part1-architecture.md","我用 Go 搭了一条 AI Agent 流水线：从 1 张商品图到一整套淘宝详情页",{"type":7,"value":8,"toc":1052},"minimark",[9,27,32,35,48,51,54,61,67,73,78,82,85,96,103,113,127,133,138,142,149,298,301,306,313,316,346,350,353,364,435,438,449,453,456,467,473,479,591,594,597,604,626,633,637,640,646,669,672,679,683,690,766,776,779,786,790,793,803,880,890,965,976,983,987,990,1001,1004,1008,1011,1031,1042,1048],[10,11,12],"blockquote",{},[13,14,15,16,21,22,26],"p",{},"系列说明：这是「AI 详情页生成工具」系列的第 1 篇，讲架构解析。第 2 篇 ",[17,18,20],"a",{"href":19},"\u002Fblog\u002Fecom-detail-ai-part2-wails","《Wails v2 实战：用 Go + Vue3 做一个真正能用的 AI 桌面应用》"," 讲怎么把这套东西落成桌面应用；第 3 篇 ",[17,23,25],{"href":24},"\u002Fblog\u002Fecom-detail-ai-part3-pitfalls","《一个人做 AI 产品，我踩过的 9 个真实的坑》"," 是踩坑复盘。",[28,29,31],"h2",{"id":30},"一为什么做这件事","一、为什么做这件事",[13,33,34],{},"淘宝\u002F天猫的中小卖家上架一个新品，详情页通常要找外包美工：一套 300–1500 元，等 3–7 天。市面上的 AI 工具要么只能\"一键美化\"，要么生成的图里商品被\"重新设计\"得面目全非，还有的直接让大模型在图里\"写字\"，出来一堆变形假汉字。",[13,36,37,38,42,43,47],{},"我做的这个项目（",[17,39,41],{"href":40},"\u002Fprojects\u002Fecom-detail-ai","ecom-detail-ai","）目标是：",[44,45,46],"strong",{},"上传 1 张商品图，全程不选品类、不选风格，约 10 分钟得到一整套带真实感光影的详情页长图 + 主图包 + 文案","。它是一个 Wails v2 桌面客户端（Go 后端 + Vue3 前端），核心是一条全自动的 Agent 流水线。",[13,49,50],{},"这篇文章把这条流水线完整拆开，讲讲每一步的设计取舍。文中代码节选自项目源码，有删减。",[13,52,53],{},"先看一眼最终产出效果（示例商品，均为项目真实生成结果）：",[13,55,56],{},[57,58],"img",{"alt":59,"src":60},"AI 生成的场景主图：逆光石墙前的商品，光影与商品结构均来自图生图编辑","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai-part1-architecture\u002Fmain-scene1.jpg",[13,62,63],{},[64,65,66],"em",{},"图 1：AI 生成的场景主图。",[13,68,69],{},[57,70],{"alt":71,"src":72},"排版引擎合成的详情切片：参数表与文字为真实字体叠加，画面区无任何 AI 生成文字","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai-part1-architecture\u002Fslice-02.jpg?imageMogr2\u002Fformat\u002Fwebp\u002Fquality\u002F88",[13,74,75],{},[64,76,77],{},"图 2：排版引擎合成的详情切片。参数表与文字为真实字体叠加。",[28,79,81],{"id":80},"二流水线全景","二、流水线全景",[13,83,84],{},"一条任务从创建到完成，实际走过的步骤是：",[86,87,92],"pre",{"className":88,"code":90,"language":91},[89],"language-text","抠图(matte) → 读图感知(perceive) → 自主规划(plan) → [规划确认门]\n    → 渲染×N(render，含自检重渲染) → 画面描述(caption)\n    → 文案(copy) → 本机排版合成(layout) → [SOP 卡片] → 完成(成本落库)\n","text",[93,94,90],"code",{"__ignoreMap":95},"",[13,97,98,99,102],{},"编排核心在 ",[93,100,101],{},"internal\u002Fservice\u002Fpipeline.go","。有两个设计决策值得先说：",[13,104,105,108,109,112],{},[44,106,107],{},"第一，LLM 步骤和确定性步骤严格分家。"," 感知、规划、文案、自检这四个\"需要智商\"的环节收敛在 ",[93,110,111],{},"internal\u002Fagent\u002F"," 包里，这个包只做\"调模型 + 解析结构化结果\"，不碰数据库；抠图、渲染、排版、导出这些\"不需要智商但要紧\"的环节全是确定性代码。LLM 负责决策，代码负责执行，两边接口就是 JSON。",[13,114,115,118,119,122,123,126],{},[44,116,117],{},"第二，每一步都持久化、都可观测。"," 每个子步骤写 ",[93,120,121],{},"TaskStep"," 记录并通过 Wails 事件 ",[93,124,125],{},"task:progress"," 推给前端，用户在界面上能看到\"正在读图 → 识别为『便携榨汁机』→ 规划了 5 张图 → 第 2 张渲染触发限流，20 秒后重试……\"这样的实时时间线。做长耗时 Agent 产品，进度可见不是锦上添花，是信任的底座。",[13,128,129],{},[57,130],{"alt":131,"src":132},"生成过程实况：左侧 AI 识别结果与生成计划，右侧流式图片墙与步骤进度条","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai-part1-architecture\u002Fsop-process.png?imageMogr2\u002Fthumbnail\u002F1440x\u002Fformat\u002Fwebp\u002Fquality\u002F88",[13,134,135],{},[64,136,137],{},"图 3：生成过程实况。左侧是 AI 识别结果与自主规划，右侧是随事件一张张\"长出来\"的流式图片墙，顶部是流水线步骤进度。",[28,139,141],{"id":140},"三第一步感知先把商品看懂","三、第一步：感知——先把商品\"看懂\"",[13,143,144,145,148],{},"流水线的质量上限由第一环决定。感知步骤用视觉模型（GLM-4.6V）读商品图，输出一个结构化 ",[93,146,147],{},"Analysis","：",[86,150,154],{"className":151,"code":152,"language":153,"meta":95,"style":95},"language-go shiki shiki-themes github-dark github-light","type Analysis struct {\n    Name          string   `json:\"name\"`           \u002F\u002F 商品名建议\n    Category      string   `json:\"category\"`       \u002F\u002F 一级类目\n    Material      string   `json:\"material\"`       \u002F\u002F 材质\n    SellingPoints []string `json:\"selling_points\"` \u002F\u002F 卖点线索\n    Details       []string `json:\"details\"`        \u002F\u002F 结构特征：顶部提手\u002F侧面散热孔\u002Flogo位置\n    VisibleText   []string `json:\"visible_text\"`   \u002F\u002F 图中真实印有的文字，逐字转写\n    Params        []Param  `json:\"params\"`         \u002F\u002F 图中可见参数（键值对）\n    Palette       string   `json:\"palette\"`        \u002F\u002F 商品主色 hex，驱动排版配色\n}\n","go",[93,155,156,176,193,207,221,235,249,263,278,292],{"__ignoreMap":95},[157,158,161,165,169,172],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"spKkM","type",[157,166,168],{"class":167},"sqoU-"," Analysis",[157,170,171],{"class":163}," struct",[157,173,175],{"class":174},"shWlK"," {\n",[157,177,179,182,185,189],{"class":159,"line":178},2,[157,180,181],{"class":174},"    Name          ",[157,183,184],{"class":163},"string",[157,186,188],{"class":187},"skb7c","   `json:\"name\"`",[157,190,192],{"class":191},"si27w","           \u002F\u002F 商品名建议\n",[157,194,196,199,201,204],{"class":159,"line":195},3,[157,197,198],{"class":174},"    Category      ",[157,200,184],{"class":163},[157,202,203],{"class":187},"   `json:\"category\"`",[157,205,206],{"class":191},"       \u002F\u002F 一级类目\n",[157,208,210,213,215,218],{"class":159,"line":209},4,[157,211,212],{"class":174},"    Material      ",[157,214,184],{"class":163},[157,216,217],{"class":187},"   `json:\"material\"`",[157,219,220],{"class":191},"       \u002F\u002F 材质\n",[157,222,224,227,229,232],{"class":159,"line":223},5,[157,225,226],{"class":174},"    SellingPoints []",[157,228,184],{"class":163},[157,230,231],{"class":187}," `json:\"selling_points\"`",[157,233,234],{"class":191}," \u002F\u002F 卖点线索\n",[157,236,238,241,243,246],{"class":159,"line":237},6,[157,239,240],{"class":174},"    Details       []",[157,242,184],{"class":163},[157,244,245],{"class":187}," `json:\"details\"`",[157,247,248],{"class":191},"        \u002F\u002F 结构特征：顶部提手\u002F侧面散热孔\u002Flogo位置\n",[157,250,252,255,257,260],{"class":159,"line":251},7,[157,253,254],{"class":174},"    VisibleText   []",[157,256,184],{"class":163},[157,258,259],{"class":187}," `json:\"visible_text\"`",[157,261,262],{"class":191},"   \u002F\u002F 图中真实印有的文字，逐字转写\n",[157,264,266,269,272,275],{"class":159,"line":265},8,[157,267,268],{"class":174},"    Params        []",[157,270,271],{"class":167},"Param",[157,273,274],{"class":187},"  `json:\"params\"`",[157,276,277],{"class":191},"         \u002F\u002F 图中可见参数（键值对）\n",[157,279,281,284,286,289],{"class":159,"line":280},9,[157,282,283],{"class":174},"    Palette       ",[157,285,184],{"class":163},[157,287,288],{"class":187},"   `json:\"palette\"`",[157,290,291],{"class":191},"        \u002F\u002F 商品主色 hex，驱动排版配色\n",[157,293,295],{"class":159,"line":294},10,[157,296,297],{"class":174},"}\n",[13,299,300],{},"系统提示词里有一条铁律，是整个项目对抗幻觉的第一道闸：",[10,302,303],{},[13,304,305],{},"\"visible_text 与 params 只允许逐字转写图中真实可见的内容，看不清或没有就返回空数组，禁止凭常识推断补全——编造参数属于违规。\"",[13,307,308,309,312],{},"这条规则后面还会反复出现：",[44,310,311],{},"下游任何环节（规划、文案、参数表）能引用的事实，最多到感知输出 ∪ 用户输入为止","。模型看不到的，宁可空着，不许编。",[13,314,315],{},"另外两个细节：",[317,318,319,327],"ul",{},[320,321,322,323,326],"li",{},"对\"抽 JSON\"这类任务，视觉模型的思考模式要显式关掉（",[93,324,325],{},"WithThinkingDisabled()","）。长推理链只会拖慢请求甚至拖挂，对抽取质量没有帮助。",[320,328,329,330,333,334,337,338,341,342,345],{},"解析模型输出时不能天真地 ",[93,331,332],{},"json.Unmarshal","。模型爱包 markdown 代码围栏、爱加前后缀解释语，所以有一个 ",[93,335,336],{},"unmarshalJSON","：剥掉围栏，取首个 ",[93,339,340],{},"{"," 到末个 ",[93,343,344],{},"}"," 再解析。这是所有要求纯 JSON 输出的 LLM 应用的标配防御。",[28,347,349],{"id":348},"四第二步规划让模型当导演但给它剧本框架","四、第二步：规划——让模型当导演，但给它剧本框架",[13,351,352],{},"规划步骤（DeepSeek）根据识别结果决定：出几张图、每张什么 kind（whitebg \u002F hero \u002F scene \u002F detail \u002F selling）、什么场景和光影、详情页模块序列、文案基调。同样是纯 JSON 输出。",[13,354,355,356,359,360,363],{},"这里踩过一个很典型的坑：",[44,357,358],{},"当你想\"让模型自己决定数量\"时，提示词里绝不能出现数字 0","。早期版本用户不指定张数时传 ",[93,361,362],{},"image_count: 0","，模型非常听话地规划了 0 张图，任务直接中断。现在的写法：",[86,365,367],{"className":151,"code":366,"language":153,"meta":95,"style":95},"countHint := fmt.Sprintf(\"计划 %d 张图\", imageCount)\nif imageCount \u003C= 0 {\n    \u002F\u002F 0 不能出现在提示词里，否则模型会\"听话地\"返回 0 个条目\n    countHint = \"渲染张数由你决定（3-8 张）\"\n}\n",[93,368,369,399,415,420,431],{"__ignoreMap":95},[157,370,371,374,377,380,383,386,389,393,396],{"class":159,"line":160},[157,372,373],{"class":174},"countHint ",[157,375,376],{"class":163},":=",[157,378,379],{"class":174}," fmt.",[157,381,382],{"class":167},"Sprintf",[157,384,385],{"class":174},"(",[157,387,388],{"class":187},"\"计划 ",[157,390,392],{"class":391},"sTU5a","%d",[157,394,395],{"class":187}," 张图\"",[157,397,398],{"class":174},", imageCount)\n",[157,400,401,404,407,410,413],{"class":159,"line":178},[157,402,403],{"class":163},"if",[157,405,406],{"class":174}," imageCount ",[157,408,409],{"class":163},"\u003C=",[157,411,412],{"class":391}," 0",[157,414,175],{"class":174},[157,416,417],{"class":159,"line":195},[157,418,419],{"class":191},"    \u002F\u002F 0 不能出现在提示词里，否则模型会\"听话地\"返回 0 个条目\n",[157,421,422,425,428],{"class":159,"line":209},[157,423,424],{"class":174},"    countHint ",[157,426,427],{"class":163},"=",[157,429,430],{"class":187}," \"渲染张数由你决定（3-8 张）\"\n",[157,432,433],{"class":159,"line":223},[157,434,297],{"class":174},[13,436,437],{},"规划还是整条流水线的第一环，输出空 items 会直接中断任务，所以规划调用内置了一次\"自动纠正重试\"：解析失败或 items 为空时，追加一条用户消息骂它\"必须输出至少 3 个条目\"，再给它一次机会。",[13,439,440,441,444,445,448],{},"规划完成后有一个",[44,442,443],{},"规划确认门","：默认模式下停留 30 秒\"机会窗口\"（用户可以顺手调整计划）后自动继续；确认模式下任务置为 ",[93,446,447],{},"planned"," 状态最长挂 10 分钟等用户点继续。全自动和人在回路之间，我选择两个都要，用配置切换。",[28,450,452],{"id":451},"五第三步渲染五段式提示词与商品保真","五、第三步：渲染——五段式提示词与商品保真",[13,454,455],{},"渲染是整条流水线最贵的环节（按张计费），也是最容易翻车的环节：图生图模型会\"顺手优化\"你的商品——换个 logo、改个孔位，一套图下来已经是另一个产品了。",[13,457,458,459,462,463,466],{},"对策是",[44,460,461],{},"五段式渲染提示词","（",[93,464,465],{},"internal\u002Fagent\u002Fprompt.go","），把一条 prompt 拆成模型自由度截然不同的五段：",[86,468,471],{"className":469,"code":470,"language":91},[89],"保留段（零自由）+ 场景段（模型规划）+ 光影段（词库映射）+ 构图段（按kind固定）+ 品质段（全kind共享）\n",[93,472,470],{"__ignoreMap":95},[13,474,475,476,148],{},"保留段不是一句\"保持一致\"，而是引用感知结果",[44,477,478],{},"逐条点名",[86,480,482],{"className":151,"code":481,"language":153,"meta":95,"style":95},"b.WriteString(\"严格保持参考图中的商品原样不变\")\nif len(a.Details) > 0 {\n    b.WriteString(\"，以下特征必须原样保留、不得改动：\")\n    b.WriteString(strings.Join(a.Details, \"、\"))  \u002F\u002F 顶部提手、侧面散热孔……\n}\nif len(a.VisibleText) > 0 {\n    b.WriteString(\"商品上的文字「…」必须逐字保持原样、清晰无变形。\")\n}\n",[93,483,484,500,517,531,555,559,574,587],{"__ignoreMap":95},[157,485,486,489,492,494,497],{"class":159,"line":160},[157,487,488],{"class":174},"b.",[157,490,491],{"class":167},"WriteString",[157,493,385],{"class":174},[157,495,496],{"class":187},"\"严格保持参考图中的商品原样不变\"",[157,498,499],{"class":174},")\n",[157,501,502,504,507,510,513,515],{"class":159,"line":178},[157,503,403],{"class":163},[157,505,506],{"class":167}," len",[157,508,509],{"class":174},"(a.Details) ",[157,511,512],{"class":163},">",[157,514,412],{"class":391},[157,516,175],{"class":174},[157,518,519,522,524,526,529],{"class":159,"line":195},[157,520,521],{"class":174},"    b.",[157,523,491],{"class":167},[157,525,385],{"class":174},[157,527,528],{"class":187},"\"，以下特征必须原样保留、不得改动：\"",[157,530,499],{"class":174},[157,532,533,535,537,540,543,546,549,552],{"class":159,"line":209},[157,534,521],{"class":174},[157,536,491],{"class":167},[157,538,539],{"class":174},"(strings.",[157,541,542],{"class":167},"Join",[157,544,545],{"class":174},"(a.Details, ",[157,547,548],{"class":187},"\"、\"",[157,550,551],{"class":174},"))  ",[157,553,554],{"class":191},"\u002F\u002F 顶部提手、侧面散热孔……\n",[157,556,557],{"class":159,"line":223},[157,558,297],{"class":174},[157,560,561,563,565,568,570,572],{"class":159,"line":237},[157,562,403],{"class":163},[157,564,506],{"class":167},[157,566,567],{"class":174},"(a.VisibleText) ",[157,569,512],{"class":163},[157,571,412],{"class":391},[157,573,175],{"class":174},[157,575,576,578,580,582,585],{"class":159,"line":251},[157,577,521],{"class":174},[157,579,491],{"class":167},[157,581,385],{"class":174},[157,583,584],{"class":187},"\"商品上的文字「…」必须逐字保持原样、清晰无变形。\"",[157,586,499],{"class":174},[157,588,589],{"class":159,"line":265},[157,590,297],{"class":174},[13,592,593],{},"（显式列出保留项而不是笼统说\"保持一致\"，这是 Google 编辑模型官方指南的要求，实测也确实有效。）",[13,595,596],{},"光影段用中文预设映射到摄影术语词库——\"柔光\"映射为\"柔光箱布光，光线均匀柔和，阴影过渡自然\"，比扔形容词给模型稳定得多。构图段按 kind 写死（hero 固定\"三分之二侧视角，低机位平视，商品占画面 60%~70%\"），品质段全 kind 共享，保证整套详情页视觉统一。品质段里有一句\"无霓虹描边、光影符合真实商业摄影物理规律\"，来自实测教训：规划给出\"轮廓光勾边\"时，Seedream 会字面化执行成赛博朋克霓虹描边。",[13,598,599,600,603],{},"渲染的工程骨架是 ",[93,601,602],{},"renderOne","：多参考图 data URL → 图生图 → 下载落盘 → 自检。两个细节：",[317,605,606,620],{},[320,607,608,611,612,615,616,619],{},[44,609,610],{},"限流指数退避","：生图新账户 RPM 极低，429 是常态。识别\"速率限制\u002F429\u002FThrottling\"等错误特征，按 10s\u002F20s\u002F40s\u002F60s 退避重试，等待期间用 ",[93,613,614],{},"select"," 同时监听 ",[93,617,618],{},"ctx.Done()","，用户点取消立刻退出等待。",[320,621,622,625],{},[44,623,624],{},"重试必须带诊断","：自检不过触发重渲染时，同参数重跑毫无意义。第二次的 prompt 会追加\"上一轮生成存在问题：商品与原图不一致、光影违和。重新生成时务必修正，其余要求不变。\"——把评审意见回灌给生成模型。",[13,627,628,629,632],{},"首屏（hero）是转化关键位，我给它加了",[44,630,631],{},"双候选选优","：规划构图和\"正面平视\"构图各渲染一次，由自检打分择优保留。best-of-N 是图像生成里性价比最高的质量杠杆，一次 +0.1 元的成本。但注意代码注释里的实测教训：双候选本身已是有效重试，单候选就不再叠加自检重试了，否则最坏情况一个槽位烧掉 4 张图的钱。",[28,634,636],{"id":635},"六文字零幻觉这个项目我最满意的设计","六、\"文字零幻觉\"：这个项目我最满意的设计",[13,638,639],{},"电商详情页有海量的文字：标题、卖点、参数表。让生图模型画文字，出来必然是变形假汉字；那能不能让模型\"尽量别画字\"？也不行，模型管不住自己的手。",[13,641,642,643,148],{},"我的方案是",[44,644,645],{},"从源头把文字这件事从 AI 手里收走",[647,648,649,656,659],"ol",{},[320,650,651,652,655],{},"规划提示词里写入铁律（",[93,653,654],{},"planNoTextRule","）：场景描述不得携带\"画文字\"的意图，prompt 只描述商品、场景、氛围与构图；",[320,657,658],{},"渲染品质段再显式禁止：\"画面中不得出现任何文字、数字、标注、标签贴纸（商品本身印刷的文字除外）\"——注意例外条款要与保留段的\"商品上印刷的文字逐字保留\"自洽，否则模型会困惑；",[320,660,661,664,665,668],{},[44,662,663],{},"真实文字由本机排版引擎后期叠加","。",[93,666,667],{},"internal\u002Frender\u002F"," 是一个手写的 750px 宽位图合成引擎，用 golang.org\u002Fx\u002Fimage 加系统 CJK 字体，把文案以真实字体排进对应模块槽位。",[13,670,671],{},"这样 AI 只负责\"画面\"，排版引擎负责\"文字\"，各干各的擅长的事。字体、字号、行距、配色全部可控，改一个字不需要重新生成图片。顺带的好处是：文案编辑后实时预览重排版只要几百毫秒，而重生成一张图要几十秒加几毛钱。",[13,673,674,675,678],{},"自检环节还会专门检查\"画面文字错误\"（",[93,676,677],{},"text_error"," 是硬伤 tag，直接判不通过）——禁令 + 质检双保险。",[28,680,682],{"id":681},"七第四步自检模型当评委代码设门禁","七、第四步：自检——模型当评委，代码设门禁",[13,684,685,686,689],{},"自检用视觉模型做",[44,687,688],{},"双图对比","：参考图 + 生成图 + 规划描述一起给\"质检员\"，输出：",[86,691,693],{"className":151,"code":692,"language":153,"meta":95,"style":95},"type CheckResult struct {\n    Pass       bool     `json:\"pass\"`\n    Fidelity   float64  `json:\"fidelity\"`     \u002F\u002F 商品保持度 0-1\n    Tags       []string `json:\"tags\"`         \u002F\u002F 诊断标签（五选一枚举）\n    Issue      string   `json:\"issue\"`        \u002F\u002F 不通过的人话原因\n    ...\n}\n",[93,694,695,706,717,731,744,757,762],{"__ignoreMap":95},[157,696,697,699,702,704],{"class":159,"line":160},[157,698,164],{"class":163},[157,700,701],{"class":167}," CheckResult",[157,703,171],{"class":163},[157,705,175],{"class":174},[157,707,708,711,714],{"class":159,"line":178},[157,709,710],{"class":174},"    Pass       ",[157,712,713],{"class":163},"bool",[157,715,716],{"class":187},"     `json:\"pass\"`\n",[157,718,719,722,725,728],{"class":159,"line":195},[157,720,721],{"class":174},"    Fidelity   ",[157,723,724],{"class":163},"float64",[157,726,727],{"class":187},"  `json:\"fidelity\"`",[157,729,730],{"class":191},"     \u002F\u002F 商品保持度 0-1\n",[157,732,733,736,738,741],{"class":159,"line":209},[157,734,735],{"class":174},"    Tags       []",[157,737,184],{"class":163},[157,739,740],{"class":187}," `json:\"tags\"`",[157,742,743],{"class":191},"         \u002F\u002F 诊断标签（五选一枚举）\n",[157,745,746,749,751,754],{"class":159,"line":223},[157,747,748],{"class":174},"    Issue      ",[157,750,184],{"class":163},[157,752,753],{"class":187},"   `json:\"issue\"`",[157,755,756],{"class":191},"        \u002F\u002F 不通过的人话原因\n",[157,758,759],{"class":159,"line":237},[157,760,761],{"class":163},"    ...\n",[157,763,764],{"class":159,"line":251},[157,765,297],{"class":174},[13,767,768,769,772,773,664],{},"关键认知：",[44,770,771],{},"不能只信模型的 pass 判断，服务端要做一道确定性门限","。模型评委有放水倾向，所以拿到评分后代码再硬校验一遍——fidelity \u003C 0.95 直接判不过；出现 product_drift \u002F structure_deform \u002F text_error 任一硬伤 tag 直接判不过；light_off、scene_mismatch 这类氛围问题单独出现时可放行但保留提示。这就是 ",[93,774,775],{},"enforceCheckGate",[13,777,778],{},"诊断 tags 同时服务两个消费方：回灌重渲染的 prompt（机器读），和前端时间线上\"待人工确认\"的 warn 状态（人读）。一张\"自检存疑\"的图不会被扔掉，而是标黄交给用户决定——自动化系统的最后一格永远留给人。",[13,780,781,782,785],{},"场景图\u002F卖点图自检仍不过时，还有",[44,783,784],{},"合成保真兜底","：文生图只生成纯背景（提示词明确\"不要出现任何商品\"），再把真实抠图的商品像素贴回去。商品像素 100% 真实，不存在漂移，直接免自检。这也是\"省流模式\"的底层路线，更便宜且成本可预期。",[28,787,789],{"id":788},"八多模型分工一个网关五个模型位","八、多模型分工：一个网关、五个模型位",[13,791,792],{},"没有任何一家平台的每个模态都最强，所以我按\"每个环节用该环节性价比最优的模型\"设计，同时用架构把供应商锁定风险压到零。",[13,794,795,796,462,799,802],{},"配置抽象成五个",[44,797,798],{},"模型位",[93,800,801],{},"internal\u002Fconfig\u002Fconfig.go","）：",[804,805,806,821],"table",{},[807,808,809],"thead",{},[810,811,812,815,818],"tr",{},[813,814,798],"th",{},[813,816,817],{},"默认配置",[813,819,820],{},"职责",[822,823,824,836,847,858,869],"tbody",{},[810,825,826,830,833],{},[827,828,829],"td",{},"perception",[827,831,832],{},"智谱 GLM-4.6V",[827,834,835],{},"读图感知 + 成品自检",[810,837,838,841,844],{},[827,839,840],{},"brain",[827,842,843],{},"DeepSeek flash（fallback: pro）",[827,845,846],{},"规划（Agent 大脑）",[810,848,849,852,855],{},[827,850,851],{},"copy",[827,853,854],{},"DeepSeek flash",[827,856,857],{},"详情文案",[810,859,860,863,866],{},[827,861,862],{},"render",[827,864,865],{},"GLM-Image（可切方舟 Seedream）",[827,867,868],{},"图像生成",[810,870,871,874,877],{},[827,872,873],{},"matting",[827,875,876],{},"阿里云商品分割",[827,878,879],{},"抠图",[13,881,882,883,886,887,148],{},"而网关层（",[93,884,885],{},"internal\u002Fllm\u002Fgateway.go","）只实现 OpenAI 兼容协议，",[44,888,889],{},"换供应商 = 换 base_url + api_key + model 三个参数",[86,891,893],{"className":151,"code":892,"language":153,"meta":95,"style":95},"var presetBaseURL = map[string]string{\n    \"zhipu\":    \"https:\u002F\u002Fopen.bigmodel.cn\u002Fapi\u002Fpaas\u002Fv4\",\n    \"deepseek\": \"https:\u002F\u002Fapi.deepseek.com\",\n    \"ark\":      \"https:\u002F\u002Fark.cn-beijing.volces.com\u002Fapi\u002Fv3\",\n}\n",[93,894,895,921,935,948,961],{"__ignoreMap":95},[157,896,897,900,903,905,908,911,913,916,918],{"class":159,"line":160},[157,898,899],{"class":163},"var",[157,901,902],{"class":174}," presetBaseURL ",[157,904,427],{"class":163},[157,906,907],{"class":163}," map",[157,909,910],{"class":174},"[",[157,912,184],{"class":163},[157,914,915],{"class":174},"]",[157,917,184],{"class":163},[157,919,920],{"class":174},"{\n",[157,922,923,926,929,932],{"class":159,"line":178},[157,924,925],{"class":187},"    \"zhipu\"",[157,927,928],{"class":174},":    ",[157,930,931],{"class":187},"\"https:\u002F\u002Fopen.bigmodel.cn\u002Fapi\u002Fpaas\u002Fv4\"",[157,933,934],{"class":174},",\n",[157,936,937,940,943,946],{"class":159,"line":195},[157,938,939],{"class":187},"    \"deepseek\"",[157,941,942],{"class":174},": ",[157,944,945],{"class":187},"\"https:\u002F\u002Fapi.deepseek.com\"",[157,947,934],{"class":174},[157,949,950,953,956,959],{"class":159,"line":209},[157,951,952],{"class":187},"    \"ark\"",[157,954,955],{"class":174},":      ",[157,957,958],{"class":187},"\"https:\u002F\u002Fark.cn-beijing.volces.com\u002Fapi\u002Fv3\"",[157,960,934],{"class":174},[157,962,963],{"class":159,"line":223},[157,964,297],{"class":174},[13,966,967,968,971,972,975],{},"智谱、DeepSeek、火山方舟全部兼容 chat\u002Fcompletions，一个 ",[93,969,970],{},"Chat"," 方法通吃。唯一的协议例外是图生图——各家参考图参数形状不一致，我把它隔离在 ",[93,973,974],{},"images.go"," 一个文件里，注释写明\"联调时只允许改本文件，调用方不受影响\"。脏活收敛在最小面积里。",[13,977,978,979,982],{},"BYOK（用户自带密钥）则顺便解决了合规和成本透明：费用直接结算在用户自己的模型账号，每个任务结束时按刊例价折算消耗（",[93,980,981],{},"taskCost"," 记录 tokens 与出图张数）在界面明示。产品方不经手资金、不存储商品图，排版合成全在本机。",[28,984,986],{"id":985},"九文案与排版的防呆契约","九、文案与排版的防呆契约",[13,988,989],{},"文案（DeepSeek）按模块撰写，有两条铁律写进 system prompt：参数只能用\"图中可见参数 ∪ 卖家输入\"，都没有就写\"详细参数以实物为准\"；不同模块之间不得复述同一卖点，\"重复即浪费\"。",[13,991,992,993,996,997,1000],{},"模型输出与排版引擎之间还有一层容量契约（",[93,994,995],{},"CleanCopy","）：标题 ≤12 字、正文 ≤80 字，与排版字号档位配套，超限截断防溢出；空块丢弃；清洗后一块不剩就回退到用感知字段拼装的基础文案——",[44,998,999],{},"流水线可以降级，但绝不产出空结果","。文案步骤整体失败也不阻塞任务，兜底文案照常出，前端提示可手动修改。",[13,1002,1003],{},"顺带一提\"文案对图\"的小设计：渲染完成后每张成图会过一遍视觉模型生成一句 ≤40 字的画面描述（caption），文案的 user 消息里会带上\"第 2 张 scene\u002F卧室床头：暖光下商品立在床头柜上……\"，让文字模块写出来的话和画面真正呼应，消灭图文两张皮。",[28,1005,1007],{"id":1006},"十小结","十、小结",[13,1009,1010],{},"回头看，这条流水线的核心方法论就三条：",[647,1012,1013,1019,1025],{},[320,1014,1015,1018],{},[44,1016,1017],{},"LLM 输出全部收敛为纯 JSON + 结构化解析 + 确定性门限","。模型负责创意和判断，代码负责校验和执行，评委放水就硬拦。",[320,1020,1021,1024],{},[44,1022,1023],{},"每个易幻觉的环节都有\"事实源白名单\"","：参数只能来自图中可见 ∪ 卖家输入；文字只能由排版引擎写入画面。",[320,1026,1027,1030],{},[44,1028,1029],{},"失败路径层层兜底且成本如实","：限流退避 → 诊断回灌重渲染 → 合成保真兜底 → 本地裁切兜底 → 基础文案兜底；同时每一张付费生成的图都计数进成本明细，重试也计费，绝不自欺。",[13,1032,1033,1034,1037,1038,1041],{},"这个工具是怎么在桌面端把这套东西跑起来的（Wails 绑定、SQLite 调度器、密钥加密、三平台打包），以及一路上踩过的具体的坑，分别是系列",[17,1035,1036],{"href":19},"第 2 篇","和",[17,1039,1040],{"href":24},"第 3 篇","的主题。",[13,1043,1044,1045,1047],{},"（项目代码节选自个人开源\u002F私有项目 ",[17,1046,41],{"href":40},"，均已做删减；文中模型价格与配置以写稿时为准。）",[1049,1050,1051],"style",{},"html pre.shiki code .spKkM, html code.shiki .spKkM{--shiki-default:#F97583;--shiki-light:#D73A49}html pre.shiki code .sqoU-, html code.shiki .sqoU-{--shiki-default:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .shWlK, html code.shiki .shWlK{--shiki-default:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .skb7c, html code.shiki .skb7c{--shiki-default:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .si27w, html code.shiki .si27w{--shiki-default:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sTU5a, html code.shiki .sTU5a{--shiki-default:#79B8FF;--shiki-light:#005CC5}",{"title":95,"searchDepth":178,"depth":178,"links":1053},[1054,1055,1056,1057,1058,1059,1060,1061,1062,1063],{"id":30,"depth":178,"text":31},{"id":80,"depth":178,"text":81},{"id":140,"depth":178,"text":141},{"id":348,"depth":178,"text":349},{"id":451,"depth":178,"text":452},{"id":635,"depth":178,"text":636},{"id":681,"depth":178,"text":682},{"id":788,"depth":178,"text":789},{"id":985,"depth":178,"text":986},{"id":1006,"depth":178,"text":1007},"https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-hero.webp","2026-10-14","md",null,{},true,"\u002Fposts\u002Fecom-detail-ai-part1-architecture",{"title":5,"description":95},"ecom-detail-ai-part1-architecture","posts\u002Fecom-detail-ai-part1-architecture","抠图 → 感知 → 规划 → 渲染 ×N → 文案 → 本机排版 → 自检，一条全自动 Agent 流水线。五个模型位怎么分工、文字零幻觉怎么做到、模型评委放水怎么硬拦——都在这里。",[1076,1077,1078],"AI 应用","Agent","Go","ia1uLxgj0mONsQ0zKn8DbiAxf1LvbzrTe7FSjf6_aJ4",[1081,1085,1089,1093,1096,1099,1100],{"title":1082,"slug":1083,"date":1084},"不引 Ghostscript：我用纯 Go 给 PDF 做了一场「压缩手术」","pure-go-pdf-compression","2026-10-24",{"title":1086,"slug":1087,"date":1088},"Wails v3 升级实战：桌面提醒客户端从 v2 升到 v3，踩了 10 个不报错的坑","wails-v3-upgrade","2026-10-23",{"title":1090,"slug":1091,"date":1092},"用 RAG + FAISS 构建古诗词 AI 取名系统：从向量检索到六层质量过滤","chinese-poetry-rag","2026-10-15",{"title":1094,"slug":1095,"date":1065},"一个人做 AI 产品，我踩过的 9 个真实的坑","ecom-detail-ai-part3-pitfalls",{"title":1097,"slug":1098,"date":1065},"Wails v2 实战：用 Go + Vue3 做一个真正能用的 AI 桌面应用","ecom-detail-ai-part2-wails",{"title":5,"slug":1072,"date":1065},{"title":1101,"slug":1102,"date":1103},"AI 时代，如何把一个需求真正落地成应用？——一条\"文档驱动 + 实测修订\"的实战路径","ai-requirement-landing","2026-10-13",{"id":1105,"title":1106,"architecture":1107,"body":1108,"category":1349,"client":1350,"cover":1064,"date":1351,"demo":1067,"demoMobile":1067,"description":95,"extension":1066,"featured":1069,"features":1352,"github":1067,"manual":1369,"meta":1422,"modules":1067,"navigation":1069,"order":1423,"path":40,"seo":1424,"slug":41,"stem":1425,"summary":1426,"techStack":1427,"visible":1069,"year":1435,"__hash__":1436},"projects\u002Fprojects\u002Fecom-detail-ai.md","电商详情页 AI 生成客户端","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-architecture.svg",{"type":7,"value":1109,"toc":1341},[1110,1113,1116,1119,1122,1125,1128,1131,1187,1190,1259,1269,1280,1288,1291,1331,1334],[28,1111,1112],{"id":1112},"缘起",[13,1114,1115],{},"帮人上过一款连衣裙的详情页。找外包要等好几天，自己上手就得同时会 PS、会布光、还会写文案，我三样都不精。第一版做出来光影像贴上去的，商品边缘还走了形。",[13,1117,1118],{},"当时想要的东西其实很朴素：扔一张挂拍图进去，别问我品类、别问我风格，直接出一套能用的。",[28,1120,1121],{"id":1121},"背景",[13,1123,1124],{},"现成的 AI 工具大多停在模板拼贴：光影有贴图感、商品容易变形，号称一键生成，实际仍要用户逐项选品类、选风格、选模板，等于把设计判断又还给了不会设计的人。而详情页本身是一整套东西——主图、场景图、白底图、详情长图、切片、文案，每一样尺寸和规则都不一样，分开做就要分开对齐。要压缩的是这一整段决策：上传一张商品图，不选品类、不选风格，直接得到一整套带真实感光影渲染的详情页。",[28,1126,1127],{"id":1127},"方案",[13,1129,1130],{},"一个装在电脑上、双击就能用的客户端，核心是一条会自己拿主意的生成流水线：",[317,1132,1133,1139,1145,1151,1157,1163,1169,1175,1181],{},[320,1134,1135,1138],{},[44,1136,1137],{},"十步全自动，中途不用管","：抠图 → 读图理解 → 自主规划（出几张图、每张什么场景与光影、页面分几块）→ 逐张渲染 → 画面描述 → 文案 → 本机排版合成 → 标准卡片 → 自检 → 完成。每一步的状态和中间产物都会落盘，界面上按时间线看得见进度，任务可以取消、关掉再开还能接着跑",[320,1140,1141,1144],{},[44,1142,1143],{},"真实感出图","：基于原图做编辑式生成，而不是把商品抠出来贴进模板；多张参考图输入保住商品一致性。出图引擎可在 Seedream \u002F GLM-Image 之间切换，主选是拿真实商品盲测定的",[320,1146,1147,1150],{},[44,1148,1149],{},"关键文字交给本机，不交给模型","：卖点、参数这类文字由本机排版引擎叠加（内置可免费商用的中文字体，不消耗模型额度，可编辑、可导出），生成模型不承担关键文字的渲染",[320,1152,1153,1156],{},[44,1154,1155],{},"自检闭环","：出完自动拿成品跟原图比——查商品有没有走形、光影是否违和、图内有没有错字；没过就带着诊断重做，还是没过就标成「待人工确认」并在结果页置顶提示",[320,1158,1159,1162],{},[44,1160,1161],{},"标准卡片产线","：主图卡 + 参数卡 × 3 规格。取色优先级为 单张卡手动改色 > 任务级模板 > 类目默认模板 > 全局默认 > 按商品图派生的配色——模板只管结构，颜色默认跟着商品走",[320,1164,1165,1168],{},[44,1166,1167],{},"商品类目可以自己管","：内置 11 组，能增、能删、能改，改完直接保存下来。类目还额外带着这个类目的参数项提示、默认卡片样式，以及敏感类目下强制关闭人像场景的硬规则（无条件压过全局的人像开关）",[320,1170,1171,1174],{},[44,1172,1173],{},"批量生成","：表格文件或整个文件夹一次导入、整批排队，共用同一套队列按设定的并发数（1-3）跑；单条失败不影响其它，同一批连续 3 条失败会自动停下并提示排查",[320,1176,1177,1180],{},[44,1178,1179],{},"密钥自带，成本透明","：智谱 \u002F DeepSeek \u002F 火山方舟 \u002F 阿里云四家各一把密钥，都是必需的；费用直接结算在用户自己的模型账号上，每个任务开跑前明示预估金额",[320,1182,1183,1186],{},[44,1184,1185],{},"导出即合规","：主图 800×800（含白底图）+ 详情 750px 切片（单张目标不超过 500KB）+ 文案 + 压缩包，导出前先预检尺寸和体积；生成来源的标记在切片、压缩全过程都不会被剥离，另在图上用角标显式标出",[28,1188,1189],{"id":1189},"技术架构",[804,1191,1192,1202],{},[807,1193,1194],{},[810,1195,1196,1199],{},[813,1197,1198],{},"模块",[813,1200,1201],{},"技术选型",[822,1203,1204,1212,1220,1228,1236,1243,1251],{},[810,1205,1206,1209],{},[827,1207,1208],{},"后端",[827,1210,1211],{},"Go + GORM + SQLite（纯 Go 驱动，交叉编译无 CGO）",[810,1213,1214,1217],{},[827,1215,1216],{},"桌面运行时",[827,1218,1219],{},"Wails v2（WebView2 \u002F WKWebView），无边框窗口 + 托盘 + 崩溃落盘",[810,1221,1222,1225],{},[827,1223,1224],{},"前端",[827,1226,1227],{},"Vue3 + Vite + Element Plus + Pinia，暗色优先设计令牌",[810,1229,1230,1233],{},[827,1231,1232],{},"模型网关",[827,1234,1235],{},"OpenAI 兼容协议统一接入（chat + 图像生成），模型位\u002F降级顺位\u002F价格表全部配置化",[810,1237,1238,1240],{},[827,1239,879],{},[827,1241,1242],{},"阿里云商品分割 API（≈0.002 元\u002F次，直出白底图）",[810,1244,1245,1248],{},[827,1246,1247],{},"排版",[827,1249,1250],{},"Go 侧 750px 位图合成 + CJK 字体渲染",[810,1252,1253,1256],{},[827,1254,1255],{},"工程化",[827,1257,1258],{},"架构护栏（AST 断言）+ 依赖登记制 + golden 像素基线测试 + OpenSpec 治理",[13,1260,1261,1262,1264,1265,1268],{},"数据侧 6 张表（Product \u002F GenerationTask \u002F GenerationBatch \u002F TaskStep \u002F GeneratedAsset \u002F ExportRecord），其中 ",[93,1263,121],{}," 按",[44,1266,1267],{},"图片实例","多行存储，各自携带状态与产物引用——图级断点续跑和\"已完成部分不重复计费\"都依赖这个粒度。",[13,1270,1271,1272,1275,1276,1279],{},"工程约定编译成了会红的检查：分层越界（",[93,1273,1274],{},"app.go"," 不直接 import gorm）、模型注册双向校验、新增依赖必须登记 ",[93,1277,1278],{},"deps.yaml","、渲染层禁 import node 能力、禁硬编码色值，且护栏解析到 0 个结果会 Fatal 而非静默放行。冒烟测试定位为本地验证——三平台 CI 只做静态检查与编译，不启动图形界面。",[13,1281,1282,1283,1287],{},"本项目由 ",[17,1284,1286],{"href":1285},"\u002Fprojects\u002Fwails-bailer-starter","Wails 桌面端脚手架基座"," 实例化而来——运行时能力与管道契约直接复用，业务面全部在此长出。",[28,1289,1290],{"id":1290},"成果",[317,1292,1293,1303,1313,1319,1325],{},[320,1294,1295,1298,1299,1302],{},[44,1296,1297],{},"从 3-7 天到 8 分半","：单套（5 图）真实密钥全流程实测 ",[44,1300,1301],{},"8 分 27 秒","，落在「≤10 分钟出整套详情页」的目标内",[320,1304,1305,1308,1309,1312],{},[44,1306,1307],{},"它要替换掉的那件事","：外包一套 300-1500 元、3-7 天交付；这里单套模型消耗理想值约 ",[44,1310,1311],{},"1 元","，算上 1-3 次单张重做的真实预期 1-2 元——费用结算在用户自己的模型账号上，中间不过手",[320,1314,1315,1318],{},[44,1316,1317],{},"出图主选是盲测翻盘定的","：Seedream 4.5 把商品结构复刻到近乎完美，GLM-Image 重绘成\"同类不同款\"——据此调换了出图位顺位",[320,1320,1321,1324],{},[44,1322,1323],{},"自检不是摆设","：成品自检比对原图查商品走形、光影违和与图内错字，未通过带诊断重做；仍不通过就置顶标记「待人工确认」，而不是悄悄交付",[320,1326,1327,1330],{},[44,1328,1329],{},"拿到手就是装完能用的安装包","：Mac 出带拖拽引导的安装包、Windows 出安装器，目标机器不需要 Go \u002F Node.js 运行时",[28,1332,1333],{"id":1333},"体验",[13,1335,1336,1337,1340],{},"内测阶段的桌面客户端，目前主要是我自己在用——",[44,1338,1339],{},"暂无公开下载与在线演示，源码也未公开","。想先看它是怎么搭起来的，可以读本页下方列出的相关技术文章——架构、工程化与踩坑各有落笔。",{"title":95,"searchDepth":178,"depth":178,"links":1342},[1343,1344,1345,1346,1347,1348],{"id":1112,"depth":178,"text":1112},{"id":1121,"depth":178,"text":1121},{"id":1127,"depth":178,"text":1127},{"id":1189,"depth":178,"text":1189},{"id":1290,"depth":178,"text":1290},{"id":1333,"depth":178,"text":1333},"ai","个人项目","2026-09-29",[1353,1357,1361,1365],{"title":1354,"description":1355,"image":1356},"1 张挂拍图 → 一整套场景渲染","左侧用户上传的挂拍原图，右侧由程序自己规划并渲染的逆光石墙与窗边场景，商品结构保持一致","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-input2out.webp",{"title":1358,"description":1359,"image":1360},"详情长图 · 750px 本机排版合成","关键文字在出图后由本机排版叠加，生成模型不承担文字渲染；按平台高度限制自动切片","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-longpage.webp",{"title":1362,"description":1363,"image":1364},"主图导出 · 场景图与白底图","阿里云商品分割直出白底图，800×800 主图 + AI 标识角标 + ZIP 打包","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-mainimgs.webp",{"title":1366,"description":1367,"image":1368},"首次启动向导 · 四把密钥各司其职","感知自检 \u002F 规划文案 \u002F 图像生成 \u002F 抠图四家服务商均为必需，内置注册指引与一键跳转控制台","https:\u002F\u002Fname.os.bennywen.xyz\u002Fbennywen.xyz\u002Fassets\u002Fecom-detail-ai\u002Fecom-detail-wizard.webp",{"specs":1370,"modules":1389,"deploy":1413,"limits":1417},[1371,1374,1377,1380,1383,1386],{"label":1372,"value":1373},"交付形态","Windows \u002F macOS 桌面客户端，装完即用，目标机器不需要另装运行环境",{"label":1375,"value":1376},"单套产出","主图 + 白底图 + 详情长图切片 + 文案，一套实测约 8 分半",{"label":1378,"value":1379},"使用成本","一套约 1-2 元，结算在你自己名下的模型账号，开跑前先给预估金额",{"label":1381,"value":1382},"风格决策","不用选品类、不用选风格——程序读图后自己定，也可在看图后手动指定",{"label":1384,"value":1385},"批量能力","表格或文件夹一次导入一整批商品排队生成，单批上限 200 条",{"label":1387,"value":1388},"隐私","商品图只发往你自己账号下的模型服务；长图排版与打包在本机完成",[1390,1393,1396,1399,1402,1405,1408,1410],{"name":1391,"desc":1392},"读图","拿到商品图先看懂它是什么——品类、材质、结构，以及有哪些值得讲的点",{"name":1394,"desc":1395},"自主规划","自己决定这套详情页要出几张图、每张配什么场景与光影、页面分几块",{"name":1397,"desc":1398},"场景渲染","按规划逐张生成，商品结构保持一致，不是把商品抠出来贴进模板",{"name":1400,"desc":1401},"文字排版","卖点与参数文字在本机排版合成，不吃模型的额度，也可以自己改",{"name":1403,"desc":1404},"成品自检","出完自动跟原图比对，发现商品走形、光影违和或图内错字就带诊断重做",{"name":1406,"desc":1407},"导出打包","一次拿到主图、白底图、详情长图切片与文案，尺寸体积先自检再打包",{"name":1173,"desc":1409},"整批商品排队跑，单条失败不影响其它；连环失败自动停下提示排查",{"name":1411,"desc":1412},"成本预估","开跑前估算这一套要花多少钱，钱花在哪一步看得见",[1414,1415,1416],"内测阶段的桌面客户端：装包后双击即用，不需要装数据库，也不需要自己的服务器","首次启动有一个配置向导，带你领四家模型服务的密钥（读图、规划、出图、抠图各一把）","生成在云端跑，不吃本机算力；长图排版与打包在本机完成",[1418,1419,1420,1421],"Mac 上关掉窗口即退出，没有常驻托盘（Windows 上可以收进托盘后台继续生成）","编辑只到「模块」这一层——增删、排序、换图可以，没有元素级的拖拽排版","商品模特图暂时没有：真人像生成涉及合规，留到下一版评估","在设置页手动换过模型服务商之后，成本估算仍按原来的价格显示，需要重过一遍向导才会同步",{},16,{"title":1106,"description":95},"projects\u002Fecom-detail-ai","面向淘宝\u002F天猫中小卖家与美工——1 张商品图进，不选品类不选风格，8 分半出一整套详情页，单套模型消耗约 1-2 元",[1078,1428,1429,1430,1431,1432,1433,1434],"GORM","SQLite","Wails","Vue3","Element Plus","Vite","Pinia","2026","gD63yNSExkuy6opU0htv0KjL2bv-jAcGuYWjwHk1L7w",1792857942429]