<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>拓宇 AI / 拓宇实验室</title><link>https://www.0315e.com/</link><description>Build With AI</description><item><title>简择手记-把整本长书读薄的微信小程序</title><link>https://www.0315e.com/post/jianze-shouji.html</link><description>&lt;p&gt;简择手记是一款把「整本长书读薄」的微信小程序。它的口号是「择其简要，记其要义」——不整段搬运原文，而是把一本书的骨架提炼出来，拆成章节、条目与可逐节精读的长文，让读者用碎片时间也能把一本厚书读透、记住、用得上。&lt;/p&gt;

&lt;h2&gt;作品初衷&lt;/h2&gt;

&lt;p&gt;很多好书内容扎实，但篇幅长、结构散，读完容易记不住、用不上；而单纯的「金句摘录」又太碎，丢了上下文。简择手记想做的是中间那一层：保留原书的章节脉络，把每一章拆成可独立阅读的条目或长文，既读得完，也记得住、查得到。&lt;/p&gt;

&lt;h2&gt;内容结构&lt;/h2&gt;

&lt;p&gt;小程序以「书单」为入口，每本书按自身特点采用两种阅读结构之一：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;条目型&lt;/strong&gt;：把全书拆成一条条可独立执行的要点，按章节分组、逐条编号，适合工具型、清单型的书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长文型&lt;/strong&gt;：保留章节论述的完整上下文，按节逐篇精读，支持上一节 / 下一节连续翻页，适合观点型、论述型的书。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目前已收录两本书：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《高性价比人生指南》（作者 eternity4719）——31 章 · 498 条，用「不要早死」「不要浪费钱」「别把自己搭进去」等主题，把寿命、金钱与人身自由拆成一条条可落地的要点。&lt;/li&gt;
&lt;li&gt;《自洽的程序员》（作者 辣条加辣）——8 章 · 45 节，聚焦工作中的焦虑、倦怠、迷茫与抑郁，梳理情绪、转变心境，成为一个自洽的程序员。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;核心功能&lt;/h2&gt;

&lt;h3&gt;书单首页与更新记录&lt;/h3&gt;

&lt;p&gt;首页即书单，一屏看清收录了哪些书、各自的章节与条目规模；下方更新记录按时间列出每次收录与上线，读到哪、更新到哪一目了然。&lt;/p&gt;

&lt;h3&gt;章节目录&lt;/h3&gt;

&lt;p&gt;每本书都有清晰的章节目录。条目型的书以卡片网格呈现每章及其条目数，长文型的书以列表逐节展开、含「本章导读」，方便按需跳读。&lt;/p&gt;

&lt;h3&gt;全文搜索&lt;/h3&gt;

&lt;p&gt;书详情页内置搜索框，可按标题或全文关键字检索，把「找一句话」变成「搜一个词」，需要时直接定位到对应条目或章节。&lt;/p&gt;

&lt;h3&gt;逐节精读与翻页&lt;/h3&gt;

&lt;p&gt;长文阅读页保留原文排版与配图，顶部显示当前进度（如 16 / 45），底部「上一节 / 下一节」连续翻页，通勤、排队等碎片时间也能连贯读完一章。&lt;/p&gt;

&lt;h3&gt;条目化清单&lt;/h3&gt;

&lt;p&gt;条目型的书里，每条要点都标注所属章节与序号（如「不要早死 · 第 24 条」），既是阅读也是清单，看完能直接照着做。&lt;/p&gt;

&lt;h2&gt;界面预览&lt;/h2&gt;

&lt;p&gt;以下为小程序端的实际截图：从书单首页、书详情与搜索，到章节目录、条目列表，再到长文逐节阅读。&lt;/p&gt;

&lt;div style=&quot;display:flex;flex-wrap:wrap;gap:1rem;justify-content:center;align-items:flex-start;margin:1.75rem 0 2rem&quot;&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-01-home.png&quot; alt=&quot;书单首页：收录书目与更新记录&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;书单首页：收录书目与更新记录&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-02-book-guide.png&quot; alt=&quot;书详情：封面、简介与全文搜索&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;书详情：封面、简介与全文搜索&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-05-book-programmer.png&quot; alt=&quot;书详情：《自洽的程序员》8 章 45 节&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;书详情：《自洽的程序员》8 章 45 节&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-03-chapters.png&quot; alt=&quot;章节目录：条目型卡片网格&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;章节目录：条目型卡片网格&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-04-items.png&quot; alt=&quot;条目列表：按章节分组、逐条编号&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;条目列表：按章节分组、逐条编号&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-06-toc.png&quot; alt=&quot;章节目录：长文型逐节列表&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;章节目录：长文型逐节列表&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-07-read-ai.png&quot; alt=&quot;长文阅读：2.9 天天用 AI，以后不会写代码怎么办&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;长文阅读：2.9 天天用 AI，以后不会写代码怎么办&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-08-read-intimate.png&quot; alt=&quot;长文阅读：4.2 接纳胜过改变&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;长文阅读：4.2 接纳胜过改变&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/2026/10/jianze-09-read-ending.png&quot; alt=&quot;长文阅读：结语 · 成为一个自洽的程序员&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;长文阅读：结语 · 成为一个自洽的程序员&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2&gt;适合人群&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;买了厚书却总读不完、读完记不住的读者&lt;/li&gt;
&lt;li&gt;想用通勤、排队等碎片时间系统读完一本书的人&lt;/li&gt;
&lt;li&gt;偏好清单式、可落地要点的工具型阅读者&lt;/li&gt;
&lt;li&gt;关注个人成长、职场心态与程序员自我调节的读者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;使用场景&lt;/h2&gt;

&lt;p&gt;通勤路上翻几节长文、睡前读几条人生清单、遇到问题时全文搜索定位对应章节、把要点当作行动清单逐条落实——把一本厚书拆进日常，读薄也用得上。&lt;/p&gt;

&lt;h2&gt;获取方式&lt;/h2&gt;

&lt;p&gt;微信搜索小程序「简择手记」即可打开使用，无需下载 App，即用即走。&lt;/p&gt;
</description><pubDate>Mon, 19 Oct 2026 09:42:59 +0800</pubDate></item><item><title>许愿式编程 DeepSeek V4.1 Flash</title><link>https://www.0315e.com/post/%E8%AE%B8%E6%84%BF%E5%BC%8F%E7%BC%96%E7%A8%8B%20DeepSeek%20V4.1%20Flash.html</link><description>&lt;p&gt;先回忆下过去的 AI 编程。&lt;/p&gt;

&lt;p&gt;之前我们叫 Vibe Coding，你给 AI 提需求，写提示词，AI 输出代码片段。但是，项目架构、依赖环境、报错排查，大多还是要你自己来。AI 只是帮你敲代码的助手，整个项目的规划、调试、修复，重担依然在开发者身上。一旦项目复杂，多轮对话来回拉扯，非常消耗精力。&lt;/p&gt;

&lt;p&gt;而 DeepSeek 这次更新的 V4.1 Flash，带来的许愿式编程，英文叫 Wish-Driven Programming，本质是&lt;strong&gt;以意图驱动的全链路项目 Agent&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;简单一句话：&lt;strong&gt;你只描述想要什么结果，AI 独立完成整套项目交付闭环&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;你不用指定用 Vue 还是 Java，不用拆分模块，不用定义接口。你只需要说清楚你的愿望：我想要一个网页版彩票历史走势图，带网格、折线、色块，能加载历史开奖数据。&lt;/p&gt;

&lt;p&gt;模型会自动做几件事：&lt;/p&gt;

&lt;p&gt;第一，拆解需求，规划整个项目架构；&lt;/p&gt;

&lt;p&gt;第二，选择合适技术栈，生成全套代码文件；&lt;/p&gt;

&lt;p&gt;第三，在 Harness 环境中自动运行、自测；&lt;/p&gt;

&lt;p&gt;第四，发现报错，自主定位问题，修改代码，反复迭代；&lt;/p&gt;

&lt;p&gt;第五，直到交付可以直接运行的完整工程。&lt;/p&gt;

&lt;p&gt;官方演示案例，一句需求，直接生成故宫 3D 场景、网页赛车游戏、Godot 游戏工程，全部从零构建，不需要大量提示词铺垫。&lt;/p&gt;

&lt;p&gt;底层核心，是自反馈强化学习。模型写完代码之后，会自我验证、自我纠错，不再是一次性输出代码片段就结束。&lt;/p&gt;

&lt;p&gt;那哪些人最受益？&lt;/p&gt;

&lt;p&gt;第一，零基础小白，不会写代码，有产品想法，能快速验证原型；&lt;/p&gt;

&lt;p&gt;第二，独立开发者、全栈，像我们平时做小程序、工具网站，快速搭建项目骨架，省下大量重复造轮子的时间；&lt;/p&gt;

&lt;p&gt;第三，游戏、3D 原型快速验证，快速产出可交互 Demo。&lt;/p&gt;

&lt;p&gt;但是，一定要理性看待，许愿式编程不是无限魔法。&lt;/p&gt;

&lt;p&gt;第一，你的愿望描述，依然决定最终成品质量。需求越笼统，AI 理解偏差越大；需求边界越清晰，交付质量越高。&lt;/p&gt;

&lt;p&gt;第二，复杂大型项目，依然需要人工介入做方案把关、安全审核。它适合原型、中小型项目快速落地，不适合直接交付生产级大型系统。&lt;/p&gt;

&lt;p&gt;第三，它能帮你做工程搭建、写代码、查 bug，但业务逻辑、产品设计，依然需要人来把控。&lt;/p&gt;

&lt;p&gt;从 Vibe Coding 到 Wish Coding，本质是人机协作范式的转变。&lt;/p&gt;

&lt;p&gt;过去是人适配 AI，把需求翻译成 AI 能看懂的详细提示词。&lt;/p&gt;

&lt;p&gt;未来是 AI 适配人，人只需要表达意图，AI 完成全部工程落地。&lt;/p&gt;

&lt;p&gt;这就是 DeepSeek V4.1 Flash 带来的许愿式编程。&lt;/p&gt;

&lt;p&gt;技术的终点，就是把门槛不断降低，让想法，直接变成产品。&lt;/p&gt;
</description><pubDate>Sun, 18 Oct 2026 20:10:40 +0800</pubDate></item><item><title>MD2DOCX · Markdown 转 Word 文档</title><link>https://www.0315e.com/post/md2docx-markdown-to-docx.html</link><description>拖入 Markdown 文件或直接粘贴内容，左侧编辑、右侧实时预览，一键导出 Word 文档，免注册、免安装。</description><pubDate>Sun, 18 Oct 2026 11:00:00 +0800</pubDate></item><item><title>码链 · HTML 转网页链接</title><link>https://www.0315e.com/post/malian-html-to-url.html</link><description>&lt;p&gt;码链是一款轻量化、免注册的在线 HTML 转链接工具：粘贴代码或拖拽上传文件，即可生成可公开访问的网页链接，支持实时预览、全屏浏览与安全防护，适合前端页面分享、临时网页展示与代码调试。&lt;/p&gt;&lt;p&gt;本条目用于首页「在线演示」区块，点击卡片直接打开该工具的线上演示站点。&lt;/p&gt;</description><pubDate>Sun, 18 Oct 2026 10:00:00 +0800</pubDate></item><item><title>件杂货（钢材）盘点 AI 识别计数解决方案</title><link>https://www.0315e.com/post/steel-inventory-ai-solution.html</link><description>&lt;p&gt;钢材堆场的盘点一直是件「既慢又不能错」的事。钢卷、中厚板、螺纹钢、线材盘条、型钢、钢管、钢坯这些件杂货，同规格、重外观、高堆叠，靠人眼清点既慢又错，同规格货物还无法仅凭外观区分炉号与批次。本方案面向露天堆场场景，用旋转框检测、实例分割、端面密集计数、3D 点云与 OCR 编码比对这些手段，把以「天」计的人工盘点压缩到以「小时」计的全场快盘，人工只需复核约 10% 的差异件。&lt;/p&gt;

&lt;figure style=&quot;margin:1.75rem 0&quot;&gt;
  &lt;img src=&quot;/zb_users/upload/steelai/aerial_warehouse.jpg&quot; alt=&quot;无人机航拍仓储园区&quot; style=&quot;margin:0;border-radius:1rem;border:1px solid var(--border)&quot;&gt;
  &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;无人机航拍仓储园区：全场快盘的采集底图&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2&gt;人工盘点为什么必须被替代&lt;/h2&gt;

&lt;p&gt;钢材堆场的三大痛点决定了「纯人工」模式的天花板。&lt;/p&gt;

&lt;h3&gt;耗时&lt;/h3&gt;
&lt;p&gt;一个万吨级堆场人工清点往往需要数天；货车压港、船期等待，库存数据到手时已经失真。&lt;/p&gt;

&lt;h3&gt;易错&lt;/h3&gt;
&lt;p&gt;遮挡、堆叠导致漏计重计；夜晚与雨雪天视线差，数据质量完全依赖盘点员个人状态，错账率不可控。&lt;/p&gt;

&lt;h3&gt;难追溯&lt;/h3&gt;
&lt;p&gt;同规格螺纹钢、同规格钢卷外观几乎一致，肉眼无法区分炉号与批次；盘点结果没有影像证据，差异无法举证。&lt;/p&gt;

&lt;p&gt;典型堆场场景下，这些干扰因素还会叠加出现：货物上下叠放使俯视只能看到顶层；户外粉尘、雨雪反光、逆光、夜间照明不均持续拉低成像质量；行车吊装作业中货物移动，极易重复计数或漏计。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;难点&lt;/th&gt;&lt;th&gt;具体表现&lt;/th&gt;&lt;th&gt;技术对策&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;遮挡与层叠&lt;/td&gt;&lt;td&gt;货物上下叠放，俯视只见顶层；板垛只露侧面与边部&lt;/td&gt;&lt;td&gt;多角度采集 + 3D 点云分层还原下层数量&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;同类同规格&lt;/td&gt;&lt;td&gt;同批次螺纹钢、同规格钢卷外观几乎一致&lt;/td&gt;&lt;td&gt;不靠外观区分，用标签 OCR + 台账编码比对&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;环境干扰&lt;/td&gt;&lt;td&gt;户外粉尘、雨雪反光、逆光、夜间照明不均&lt;/td&gt;&lt;td&gt;图像增强 + 可用性阈值 + 低置信转人工兜底&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;标签不可靠&lt;/td&gt;&lt;td&gt;卷号 / 标牌锈蚀、脱落、被压住&lt;/td&gt;&lt;td&gt;OCR 只作辅助证据，与单证、位置、3D 联合决策&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;动态干扰&lt;/td&gt;&lt;td&gt;行车吊装作业中货物移动，重复计数或漏计&lt;/td&gt;&lt;td&gt;DeepSORT / ByteTrack 时序跟踪，防止重复&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;四层架构：从「看得见」到「回得去」&lt;/h2&gt;

&lt;p&gt;系统自上而下分为数据采集层、AI 识别引擎、盘点应用层与系统集成层。采集层解决「看得见」，识别引擎解决「认得准、数得清」，应用层解决「用得上、核得准」，集成层解决「接得通、回得去」。多路采集源按「全场快盘 / 实时出入库 / 高精度局部 / 深度测量」四类场景组合，互为兜底。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层次&lt;/th&gt;&lt;th&gt;解决什么&lt;/th&gt;&lt;th&gt;关键设计&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;数据采集层&lt;/td&gt;&lt;td&gt;看得见&lt;/td&gt;&lt;td&gt;多路采集源覆盖全场与死角，无人机兜底全场快盘&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AI 识别引擎&lt;/td&gt;&lt;td&gt;认得准&lt;/td&gt;&lt;td&gt;分货种定制算法，2D + 3D + OCR 联合决策，输出检测框 / 掩码 / 点数 / 编码 / 层数五类结果&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;盘点应用层&lt;/td&gt;&lt;td&gt;用得上&lt;/td&gt;&lt;td&gt;置信度分流，人工只处理低置信与冲突件；初盘、复核、入账、报表一条链&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;系统集成层&lt;/td&gt;&lt;td&gt;回得去&lt;/td&gt;&lt;td&gt;识别结果沉淀为标准化事件，向既有业务系统双向同步&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;一个通用模型打不了天下，逐货种定制识别方法&lt;/h2&gt;

&lt;p&gt;不同钢材形态差异极大：螺纹钢、钢管这类「端面密集小目标」优先用端面视角；钢卷、板坯这类大目标优先用俯视 + 3D 分层。下表为各货种的可见特征、推荐识别方法与计数口径。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;货种&lt;/th&gt;&lt;th&gt;可见特征&lt;/th&gt;&lt;th&gt;推荐识别方法&lt;/th&gt;&lt;th&gt;计数口径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;钢卷&lt;/td&gt;&lt;td&gt;端面圆柱、卷号标牌&lt;/td&gt;&lt;td&gt;端面旋转框检测 + OCR 卷号比对&lt;/td&gt;&lt;td&gt;卷数 / 吨&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;中厚板&lt;/td&gt;&lt;td&gt;侧面层线、边部轮廓&lt;/td&gt;&lt;td&gt;实例分割做层间分离 + 3D 分层&lt;/td&gt;&lt;td&gt;张数 / 层数 / 吨&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;螺纹钢&lt;/td&gt;&lt;td&gt;端面截面密排小圆&lt;/td&gt;&lt;td&gt;端面密集计数（先捆后支）&lt;/td&gt;&lt;td&gt;捆数 + 支数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;棒材圆钢&lt;/td&gt;&lt;td&gt;端面圆形截面、金属断口&lt;/td&gt;&lt;td&gt;端面旋转框检测 + 密集计数&lt;/td&gt;&lt;td&gt;支数 / 吨&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;线材盘条&lt;/td&gt;&lt;td&gt;端面螺旋纹、层叠堆放&lt;/td&gt;&lt;td&gt;端面检测 + 3D 点云分层&lt;/td&gt;&lt;td&gt;盘数 / 吨&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;H 型钢&lt;/td&gt;&lt;td&gt;端面固定截面形状&lt;/td&gt;&lt;td&gt;旋转框（OBB）检测&lt;/td&gt;&lt;td&gt;支数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无缝钢管&lt;/td&gt;&lt;td&gt;端面圆环阵列&lt;/td&gt;&lt;td&gt;端面圆环检测 + 密集计数&lt;/td&gt;&lt;td&gt;支数 / 根数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;钢坯&lt;/td&gt;&lt;td&gt;矩形截面网格&lt;/td&gt;&lt;td&gt;网格切分 + 3D 分层&lt;/td&gt;&lt;td&gt;支数 / 吨&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;div style=&quot;display:flex;flex-wrap:wrap;gap:.75rem;margin:1.75rem 0&quot;&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/coils_warehouse.jpg&quot; alt=&quot;钢卷仓库整齐排列&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;钢卷仓库&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/plate_stack.jpg&quot; alt=&quot;中厚板堆垛&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;中厚板堆垛&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/rebar_bundle.jpg&quot; alt=&quot;螺纹钢成捆堆放&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;螺纹钢成捆堆放&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/pipe_warehouse.jpg&quot; alt=&quot;无缝钢管仓库堆放&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;无缝钢管堆场&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/rebar_stack.jpg&quot; alt=&quot;螺纹钢堆场&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;螺纹钢堆场&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/hbeam_yard.jpg&quot; alt=&quot;H 型钢堆场&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;H 型钢堆场&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/billet_warehouse.jpg&quot; alt=&quot;钢坯库&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;钢坯库&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 calc(25% - 9px);min-width:150px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/aerial_yard.jpg&quot; alt=&quot;堆场航拍全景&quot; style=&quot;width:100%;height:170px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;堆场航拍全景&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;设计要点&lt;/strong&gt;：螺纹钢、钢管这类端面密集小目标，优先用端面视角而非侧面视角，近距离高分辨率采集是准确率前提；钢卷、板坯这类大目标，优先用俯视 + 3D 分层还原下层数量。&lt;/p&gt;

&lt;h2&gt;七类算法组合，覆盖「定位 → 拆分 → 点数 → 测深 → 追码」&lt;/h2&gt;

&lt;p&gt;按货种与场景路由到合适的算法组合，各算法独立可替换、可灰度上线。&lt;/p&gt;

&lt;h3&gt;旋转框目标检测（OBB）&lt;/h3&gt;
&lt;p&gt;钢材堆垛往往呈任意朝向，水平框（HBB）会产生大量重叠与误检；旋转框输出带角度定位，精准锁定每个钢卷、每根型钢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：训练数据需标注角度；端面小圆这类小目标需提高输入分辨率。&lt;/p&gt;

&lt;h3&gt;实例分割&lt;/h3&gt;
&lt;p&gt;相邻捆包、相邻钢卷粘连严重，仅靠检测框无法区分边界；对每个实例输出掩码，实现轮廓级拆分与板垛层间分离。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：遮挡部分用 3D 点云补全。&lt;/p&gt;

&lt;h3&gt;端面密集计数&lt;/h3&gt;
&lt;p&gt;螺纹钢捆、钢管捆端面是密集小目标，通用检测模型易漏检；对端面截面做点数回归，配合「先捆后支」两级计数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：高分辨率端面图像（近距离采集）是准确率的前提。&lt;/p&gt;

&lt;h3&gt;3D 点云感知&lt;/h3&gt;
&lt;p&gt;俯视看不到的下层数量必须靠深度信息推断：做层数分割与体积估算，再结合单件理论重量反算件数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：点云与 2D 图像需做时空对齐与融合。&lt;/p&gt;

&lt;h3&gt;标签 OCR 与编码比对&lt;/h3&gt;
&lt;p&gt;识别卷号标牌、钢印、铭牌编码，与 WMS / TOS 台账逐条比对，输出「匹配 / 疑似 / 不匹配」三档结果，支撑炉号与批次追溯。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：针对锈蚀、倾斜、低对比度场景专项微调；OCR 只作辅助证据。&lt;/p&gt;

&lt;h3&gt;多模态融合与时序跟踪&lt;/h3&gt;
&lt;p&gt;2D 检测 + 3D 点云分层 + OCR 标签按空间位置对齐做联合决策；吊装移动目标用时序跟踪防止重复计数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：冲突时以「证据充分者优先」，仍冲突则转人工。&lt;/p&gt;

&lt;h3&gt;主动学习闭环&lt;/h3&gt;
&lt;p&gt;人工复核结果自动回流为训练样本，针对长尾场景（锈蚀标签、极端天气、异形堆垛）持续迭代，形成「识别 → 复核 → 再训练」的飞轮。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：复核数据打标后按周 / 月批量进入标注流水线。&lt;/p&gt;

&lt;h2&gt;按精度与成本分层组合，避免「一把抓」&lt;/h2&gt;

&lt;p&gt;能通过固定相机 + 出入库关口实现自动计数的，就不依赖无人机定时飞行；无人机用于兜底的全场盘点与复核。&lt;/p&gt;

&lt;h3&gt;无人机 + RTK 航线飞行&lt;/h3&gt;
&lt;p&gt;大面积堆场小时级完成全场粗盘；RTK 厘米级定位保证垛位可复测、可对比。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设备&lt;/strong&gt;：多旋翼无人机 / RTK 基站 / 正射相机&lt;/p&gt;

&lt;h3&gt;龙门架 / 门禁固定相机&lt;/h3&gt;
&lt;p&gt;出入口自动计数、防漏记；事件驱动入账，无需人工发起。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设备&lt;/strong&gt;：工业双目相机 / 补光灯 / 边缘算力盒&lt;/p&gt;

&lt;h3&gt;行车随动相机 + 手持 PDA&lt;/h3&gt;
&lt;p&gt;遮挡区、标签核对、差异件精核；行车视角贴近货物，端面图像清晰。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设备&lt;/strong&gt;：行车 / 吊具随动相机 / 工业 PDA / 5G 图传&lt;/p&gt;

&lt;h3&gt;3D 扫描 / 激光雷达&lt;/h3&gt;
&lt;p&gt;层数、体积、重量反算；为遮挡区域提供深度证据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设备&lt;/strong&gt;：固态激光雷达 / 手持 3D 扫描仪&lt;/p&gt;

&lt;div style=&quot;display:flex;flex-wrap:wrap;gap:.75rem;margin:1.75rem 0&quot;&gt;
  &lt;figure style=&quot;flex:1 1 300px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/hero_gantry.jpg&quot; alt=&quot;龙门架固定相机&quot; style=&quot;width:100%;height:230px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;龙门架固定相机：出入口自动计数&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:1 1 300px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/steelai/plate_warehouse.jpg&quot; alt=&quot;行车随动相机与手持终端&quot; style=&quot;width:100%;height:230px;object-fit:cover;margin:0;border-radius:.75rem;border:1px solid var(--border)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;行车随动相机与手持终端&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;选型原则&lt;/strong&gt;：固定相机 + 出入库关口优先实现自动化；无人机负责兜底快盘与复核；精度要求高的局部场景再上随动相机与深度设备，按 ROI 分阶段投入。&lt;/p&gt;

&lt;h2&gt;从驾驶舱到复核台&lt;/h2&gt;

&lt;p&gt;以下为盘点系统的核心界面形态（界面数据为 MVP 演示口径，实际以现场标定结果为准）。&lt;/p&gt;

&lt;figure style=&quot;margin:1.75rem 0&quot;&gt;
  &lt;img src=&quot;/zb_users/upload/steelai/mvp.jpg&quot; alt=&quot;钢材盘点系统 MVP：Web 端盘点总览驾驶舱与移动端 App&quot; style=&quot;margin:0;border-radius:1rem;border:1px solid var(--border)&quot;&gt;
  &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;盘点系统 MVP 总览：上部为 Web 端「盘点总览驾驶舱」，下部为移动端 App 的盘点任务、识别补拍、差异复核与盘点看板&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3&gt;盘点总览驾驶舱&lt;/h3&gt;
&lt;p&gt;按货种展示盘点进度，并列出今日盘点任务：任务编号、负责区域与采集来源（无人机 / 龙门架 / 车载终端 / 手持 PDA）、进度、差异件数与执行状态，一眼看出哪片堆场还没盘完、哪些差异还没处理。&lt;/p&gt;

&lt;h3&gt;AI 识别工作台&lt;/h3&gt;
&lt;figure style=&quot;margin:1.5rem 0&quot;&gt;
  &lt;img src=&quot;/zb_users/upload/steelai/port_rebar_crane.jpg&quot; alt=&quot;龙门吊吊运螺纹钢捆的识别场景&quot; style=&quot;margin:0;border-radius:1rem;border:1px solid var(--border)&quot;&gt;
  &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;龙门吊吊运螺纹钢捆：检测框与掩码标注示意，「遮挡区域」自动转入复核队列&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;在工作台上叠加检测框、掩码与计数结果，标注置信度；被判定为遮挡或冲突的区域不直接入账，而是自动进入复核队列。&lt;/p&gt;

&lt;h3&gt;差异复核队列&lt;/h3&gt;
&lt;p&gt;人工只处理系统标出的差异件，每条差异都带原因与置信度，复核时能直接看到「为什么它可疑」。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;垛位 / 相机&lt;/th&gt;&lt;th&gt;货种&lt;/th&gt;&lt;th&gt;AI 识别&lt;/th&gt;&lt;th&gt;台账数&lt;/th&gt;&lt;th&gt;差异&lt;/th&gt;&lt;th&gt;置信度 · 原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;B3-06 · CAM-B3-02&lt;/td&gt;&lt;td&gt;螺纹钢&lt;/td&gt;&lt;td&gt;9 捆&lt;/td&gt;&lt;td&gt;9 捆&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.71 · 低置信（标牌锈蚀）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;A2-11 · UAV-01&lt;/td&gt;&lt;td&gt;钢卷&lt;/td&gt;&lt;td&gt;24 卷&lt;/td&gt;&lt;td&gt;22 卷&lt;/td&gt;&lt;td&gt;+2&lt;/td&gt;&lt;td&gt;0.98 · 高置信（台账冲突）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C1-03 · VAN-02&lt;/td&gt;&lt;td&gt;中厚板&lt;/td&gt;&lt;td&gt;46 张&lt;/td&gt;&lt;td&gt;46 张&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.79 · 低置信（层线模糊）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;D2-08 · CAM-D2-01&lt;/td&gt;&lt;td&gt;钢坯&lt;/td&gt;&lt;td&gt;132 支&lt;/td&gt;&lt;td&gt;121 支&lt;/td&gt;&lt;td&gt;+11&lt;/td&gt;&lt;td&gt;0.97 · 高置信（出入库未登记）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;B1-01 · CAM-B1-04&lt;/td&gt;&lt;td&gt;钢管&lt;/td&gt;&lt;td&gt;57 根&lt;/td&gt;&lt;td&gt;57 根&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.66 · 低置信（夜间照明）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;A4-02 · UAV-02&lt;/td&gt;&lt;td&gt;型钢&lt;/td&gt;&lt;td&gt;36 支&lt;/td&gt;&lt;td&gt;36 支&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.88 · 中置信（端面反光）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h3&gt;出入库自动计数&lt;/h3&gt;
&lt;figure style=&quot;margin:1.5rem 0&quot;&gt;
  &lt;img src=&quot;/zb_users/upload/steelai/billet_lift.jpg&quot; alt=&quot;门禁相机视角下的钢坯吊装&quot; style=&quot;margin:0;border-radius:1rem;border:1px solid var(--border)&quot;&gt;
  &lt;figcaption style=&quot;margin-top:.5rem;font-size:.83rem;line-height:1.6;color:var(--text-2);text-align:center&quot;&gt;门禁相机视角下的钢坯吊装：吊装运动目标经 ByteTrack 时序跟踪，同一吊次只计一次&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;关口相机事件驱动计数，同一吊次只计一次，防止重复计数。&lt;/p&gt;

&lt;h3&gt;3D 点云分层&lt;/h3&gt;
&lt;p&gt;对板垛、卷堆做层数分割与体积估算，把俯视看不到的下层数量还原出来。&lt;/p&gt;

&lt;h3&gt;移动端 App · 理货员 / 库管手持端&lt;/h3&gt;
&lt;p&gt;手机 App 与 Web 端共用同一套识别服务与台账数据，现场补拍、复核结论即时回写。&lt;/p&gt;

&lt;h2&gt;与既有系统双向打通，盘点结果自动回流&lt;/h2&gt;

&lt;p&gt;识别结果沉淀为标准化事件，经 REST API / 消息队列 / 中间表与业务系统双向同步。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;对接系统&lt;/th&gt;&lt;th&gt;对接方式&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;WMS 仓储管理系统&lt;/td&gt;&lt;td&gt;REST API 双向&lt;/td&gt;&lt;td&gt;读取台账、回写盘点结果、库存同步&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;TOS 码头操作系统&lt;/td&gt;&lt;td&gt;REST API / 消息队列&lt;/td&gt;&lt;td&gt;堆场位置管理、出入库事件触发&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ERP 财务系统&lt;/td&gt;&lt;td&gt;API / 中间表&lt;/td&gt;&lt;td&gt;重量对账、盘盈盘亏核销&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;视频监控平台&lt;/td&gt;&lt;td&gt;RTSP / GB28181&lt;/td&gt;&lt;td&gt;接入固定相机与无人机图传&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;数据中台&lt;/td&gt;&lt;td&gt;数据总线&lt;/td&gt;&lt;td&gt;识别结果统一存储与分析&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;所有识别结果保留原图 + 坐标 + 置信度 + 识别编码，保证可追溯、可举证；&lt;/li&gt;
&lt;li&gt;出入库事件驱动：门禁相机触发即自动计数，无需人工发起；&lt;/li&gt;
&lt;li&gt;台账回写采用「预写 + 确认」两段式，避免把未复核结果直接覆盖正式账。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;可量化的验收口径，先标定、后承诺&lt;/h2&gt;

&lt;p&gt;以下为建议的验收流程与目标设定方式，P0 试点阶段需结合现场实测基线校准后再正式承诺指标。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选取独立测试垛区&lt;/strong&gt;：覆盖至少 3 个货种、含遮挡与夜间工况的典型垛区。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人工精盘生成真值&lt;/strong&gt;：由两名以上理货员独立清点并交叉确认，作为真值基准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对比 AI 输出&lt;/strong&gt;：逐垛比对件数、重量、编码匹配率三项指标，出具差异清单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验收与留档&lt;/strong&gt;：达到目标值即验收；未达标项进入 P0 迭代，记录基线便于后续对比。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;四阶段推进：先试点、后推广、再闭环&lt;/h2&gt;

&lt;p&gt;避免一次性大投入，每阶段有明确交付与验收出口，目标 3–6 个月实现主力货种盘点 AI 化。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;试点验证&lt;/strong&gt;：选 1 个货种（建议钢卷）+ 1 个垛区，跑通「采集 → 识别 → 比对」链路。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多货种扩展&lt;/strong&gt;：覆盖 2–3 个主力货种，接入 WMS 比对，上线差异复核工作流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常态闭环&lt;/strong&gt;：出入库关口自动计数上线，实现日盘 / 周盘常态化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长尾攻坚&lt;/strong&gt;：主动学习持续迭代，攻克锈蚀标签、恶劣天气、异形堆垛等长尾场景。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;把不确定性写进方案，而不是藏起来&lt;/h2&gt;

&lt;p&gt;每类风险都有明确的兜底策略，确保低置信时「不硬出账」。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;风险&lt;/th&gt;&lt;th&gt;应对策略&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;训练样本不足&lt;/td&gt;&lt;td&gt;先小范围标注 + 数据增强，配合主动学习持续扩展样本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;遮挡导致漏计&lt;/td&gt;&lt;td&gt;多角度 / 多高度补拍，固定相机与无人机结果交叉验证&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;同类同规格难以区分&lt;/td&gt;&lt;td&gt;不依赖外观，靠标签 OCR + 台账编码比对定位炉号批次&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;恶劣天气影响成像&lt;/td&gt;&lt;td&gt;设置可用性阈值与人工巡检兜底，低置信时不硬出账&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;现场与方案假设不符&lt;/td&gt;&lt;td&gt;P0 试点先做实测标定，再定最终指标&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;数据安全与合规&lt;/td&gt;&lt;td&gt;图像与台账本地化存储，脱敏后上云分析&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2&gt;钢材盘点 AI 化的本质：多模态感知 + 业务闭环&lt;/h2&gt;

&lt;p&gt;技术上没有银弹——钢卷靠端面检测、螺纹钢靠端面密集计数、层叠靠 3D 点云、规格追溯靠 OCR 比对，每种货种都要定制策略。落地的关键不在模型多先进，而在于把 AI 嵌进真实的盘点流程：让人工只处理 10% 的差异件，让复核结果持续反哺模型。盘点不再是「拍照 → 出数量」，而是一条可追溯、可举证、能自我进化的业务闭环。&lt;/p&gt;</description><pubDate>Sat, 17 Oct 2026 14:00:00 +0800</pubDate></item><item><title>点学单词-人教版教材同步的英语单词发音小程序</title><link>https://www.0315e.com/post/dianxue-danci-xiaochengxu.html</link><description>&lt;p&gt;点学单词是给孩子做的英语单词小程序。中小学生背单词、练发音的痛点很具体，而市面上不少学习软件广告多、要登录注册、收费项目繁杂，于是干脆自己做了一款&lt;strong&gt;免费、无广告&lt;/strong&gt;的课本单词点读工具，给孩子一个干净纯粹的英语学习环境。&lt;/p&gt;

&lt;h2&gt;作品初衷&lt;/h2&gt;

&lt;p&gt;从真实的学习场景出发做减法：不弹广告、不要账号、不做付费墙，打开就是课本单词。所有内容严格对齐人教版教材单元，课本学到哪，就学到哪，与校内课堂进度完全同步。&lt;/p&gt;

&lt;h2&gt;词库覆盖&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;完整适配&lt;strong&gt;人教版小学、初中、高中全套 20 本教材&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;合计 &lt;strong&gt;6157 个课本原版单词&lt;/strong&gt;，严格按教材单元分组&lt;/li&gt;
&lt;li&gt;预习、复习、背单词都适配，不需要再找教辅对词表&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;核心功能&lt;/h2&gt;

&lt;h3&gt;标准在线发音&lt;/h3&gt;

&lt;p&gt;点击单词即可播放标准读音，解决家长发音不准、没人带读的难题，孩子可以自主跟读、磨耳朵。&lt;/p&gt;

&lt;h3&gt;多维单词学习素材&lt;/h3&gt;

&lt;p&gt;每个单词配套例图、常用短语和课本原版例句，不止记拼写，还能理解词义、学会实际运用。&lt;/p&gt;

&lt;h3&gt;免登录即用&lt;/h3&gt;

&lt;p&gt;无需注册账号，打开直接使用，省去繁琐操作，点开就能学。&lt;/p&gt;

&lt;h3&gt;纯净无广告&lt;/h3&gt;

&lt;p&gt;全程没有弹窗广告、没有付费弹窗，无多余干扰，孩子专注在单词本身。&lt;/p&gt;

&lt;h3&gt;长期稳定可用&lt;/h3&gt;

&lt;p&gt;无需下载 App，小程序即用即走，不占用手机存储空间，换设备也能随时打开。&lt;/p&gt;

&lt;h2&gt;界面预览&lt;/h2&gt;

&lt;p&gt;以下为小程序端的实际使用截图：从选词书、浏览单元单词，到查看单词详解与例句跟读。&lt;/p&gt;

&lt;div style=&quot;display:flex;flex-wrap:wrap;gap:1rem;justify-content:center;align-items:flex-start;margin:1.75rem 0 2rem&quot;&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/englishapp/01-home.jpg&quot; alt=&quot;首页：按小学 / 初中 / 高中选择词书&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;首页：按小学 / 初中 / 高中选择词书&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/englishapp/02-unit-list.jpg&quot; alt=&quot;单元单词列表：音标释义，点行播放&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;单元单词列表：音标释义，点行播放&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/englishapp/03-word-detail.jpg&quot; alt=&quot;单词详情：配图、音标、词性与短语&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;单词详情：配图、音标、词性与短语&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/englishapp/04-word-examples.jpg&quot; alt=&quot;课本原版例句：逐句跟读、反复听&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;课本原版例句：逐句跟读、反复听&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure style=&quot;flex:0 0 210px;max-width:210px;margin:0&quot;&gt;
    &lt;img src=&quot;/zb_users/upload/englishapp/05-stats.jpg&quot; alt=&quot;收录统计：20 本教材 6157 个单词&quot; style=&quot;display:block;width:100%;height:auto;margin:0;border-radius:.7rem;border:1px solid rgba(15,23,42,.1);box-shadow:0 8px 20px rgba(15,23,42,.09)&quot;&gt;
    &lt;figcaption style=&quot;margin-top:.55rem;font-size:.82rem;line-height:1.5;color:#6b7280;text-align:center&quot;&gt;收录统计：20 本教材 6157 个单词&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;h2&gt;适合人群&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;使用人教版英语教材的小学生、初中生、高中生&lt;/li&gt;
&lt;li&gt;担心自身发音不标准、没法辅导孩子英语的家长&lt;/li&gt;
&lt;li&gt;需要课前预习、课后巩固、跟读背单词的家庭&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;使用场景&lt;/h2&gt;

&lt;p&gt;课前预习单元单词、课后复习巩固、碎片时间跟读练发音、听写前过一遍词汇，随时随地练习课本单词，帮助孩子攻克单词与口语发音，告别哑巴英语。&lt;/p&gt;

&lt;h2&gt;获取方式&lt;/h2&gt;

&lt;p&gt;抖音主页直达，扫码即可进入小程序体验。&lt;/p&gt;</description><pubDate>Sat, 17 Oct 2026 11:20:00 +0800</pubDate></item><item><title>Mutiai —— AI 聚合问答工具</title><link>https://www.0315e.com/post/Mutiai%20%E2%80%94%E2%80%94%20AI%20%E8%81%9A%E5%90%88%E9%97%AE%E7%AD%94%E5%B7%A5%E5%85%B7.html</link><description>&lt;p&gt;&lt;img src=&quot;https://www.0315e.com/zb_users/upload/2026/10/20261017104243179220496356058.png&quot; alt=&quot;屏幕截图 2026-10-16 205039.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;p&gt;&gt; 一个窗口，装下十多款主流大模型。一次提问，多模型同时作答，横向对比各家答案。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;官网&lt;/strong&gt;：&lt;a href=&quot;http://mutiai.0315e.com/&quot;&gt;http://mutiai.0315e.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;&lt;img src=&quot;https://www.0315e.com/zb_users/upload/2026/10/20261017104247179220496788620.png&quot; alt=&quot;屏幕截图 2026-10-16 204735.png&quot;&gt;&lt;/h2&gt;

&lt;h2&gt;产品简介&lt;/h2&gt;

&lt;p&gt;Mutiai 是一款个人开发的 AI 聚合问答客户端。它把国内十多款主流大模型整合进同一个窗口，你只需要输入一次问题，点击发送，所有已接入的大模型会同时开始回答，方便你对各家答案进行横向对比。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;核心特性&lt;/h2&gt;

&lt;h3&gt;1. 一窗多模型&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;单个窗口同时接入豆包、DeepSeek、Kimi、通义千问等多款主流大模型&lt;/li&gt;
&lt;li&gt;无需在多个网页、多个标签页之间来回切换&lt;/li&gt;
&lt;li&gt;各模型答案并排展示，一目了然&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;2. 一次提问，多方作答&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;只需输入一次问题，一键发送&lt;/li&gt;
&lt;li&gt;多个大模型同步返回结果&lt;/li&gt;
&lt;li&gt;省去反复复制粘贴、逐家提问的繁琐操作&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;3. 横向对比，甄别差异&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;各家 AI 的回答同屏展示，方便对比内容质量与风格差异&lt;/li&gt;
&lt;li&gt;可快速识别 AI 幻觉（一本正经地编造错误内容）等常见问题&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;4. 提示词模板 + 变量填充&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;支持将常用提示词存入模板库，随时复用&lt;/li&gt;
&lt;li&gt;模板支持变量占位符，例如：&lt;code&gt;用费曼学习法讲解【{{topic}}】&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用时可自由填充变量，例如将 &lt;code&gt;{{topic}}&lt;/code&gt; 替换为「木桶原理」，一键发送给所有模型&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;5. 灵活的界面布局&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;支持全屏展示单个面板&lt;/li&gt;
&lt;li&gt;支持自由切换布局，例如双列视图&lt;/li&gt;
&lt;li&gt;面板可单独收起、展开，按需组织工作区&lt;/li&gt;
&lt;li&gt;支持白 / 夜主题切换&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;隐私与安全&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不经服务器中转&lt;/strong&gt;：所有对话请求直接发往各 AI 厂商接口，不经过作者服务器中转&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不上传隐私数据&lt;/strong&gt;：不会收集、上传你的对话与隐私信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据本地保存&lt;/strong&gt;：账号信息、对话数据全部保存在本地设备&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;平台支持与安装&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;支持方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;直接下载安装包，安装即用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;暂无预编译包，可自行下载源码编译&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;开源与源码&lt;/h2&gt;

&lt;p&gt;项目源码开源，可在 Gitee 查看：支持自行下载编译，适配不同平台。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;开发背景&lt;/h2&gt;

&lt;p&gt;Mutiai 采用 Vibe Coding 方式开发，是一个简洁、朴素、注重隐私的实用小工具，适合经常需要在多个 AI 之间对比答案、追求效率的用户。&lt;/p&gt;

&lt;hr&gt;
</description><pubDate>Sat, 17 Oct 2026 10:40:10 +0800</pubDate></item><item><title>智绘SQL-对话即出图，数据更鲜活</title><link>https://www.0315e.com/post/aisql.html</link><description>&lt;p&gt;&lt;img src=&quot;https://www.0315e.com/zb_users/upload/2026/10/20261017104637179220519718944.png&quot; alt=&quot;屏幕截图 2026-10-17 104625.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;p&gt;&gt; &lt;strong&gt;对话即出图，数据更鲜活&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一个把「自然语言提问」直接变成「SQL 查询 + 可视化图表」的轻量级智能数据分析工具。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;一、产品定位&lt;/h2&gt;

&lt;p&gt;智绘SQL 面向所有需要看数据、但不想写 SQL 的人。你只需要像聊天一样说出想问的问题，它就能：

&lt;ol&gt;
&lt;li&gt;读懂你的问题，结合数据库真实表结构&lt;strong&gt;自动生成 SQL&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;连接你的数据库&lt;strong&gt;执行查询&lt;/strong&gt;，返回真实数据；&lt;/li&gt;
&lt;li&gt;基于查询结果&lt;strong&gt;自动生成 ECharts 图表&lt;/strong&gt;，让数据直接变成可看的图。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整个过程不需要打开任何 BI 工具，也不需要等待数据团队排期。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、它解决什么问题&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;传统方式的痛点&lt;/th&gt;
&lt;th&gt;智绘SQL 的做法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;提需求 → 排期 → 取数，链路动辄一两天&lt;/td&gt;
&lt;td&gt;提问到出图，一次对话完成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非技术同事看不懂、也写不出 SQL&lt;/td&gt;
&lt;td&gt;用中文描述需求，AI 负责写 SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拿到数据还要手工整理、做图&lt;/td&gt;
&lt;td&gt;数据返回后自动生成图表配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传统报表是固定的，临时问题追不上&lt;/td&gt;
&lt;td&gt;每个问题都是一次即席查询&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;一句话概括：&lt;strong&gt;把「取数」这件事的门槛，从「会 SQL」降到「会提问」。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、核心功能&lt;/h2&gt;
&lt;h3&gt;1. 对话式取数（对话）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;输入自然语言问题，例如「上个月订单量趋势」「各产品销售额对比」「用户增长情况」；&lt;/li&gt;
&lt;li&gt;系统自动调用大模型生成 SQL，并&lt;strong&gt;展示生成的 SQL 语句&lt;/strong&gt;，可一键复制；&lt;/li&gt;
&lt;li&gt;执行查询后返回数据表格，做到「SQL 可见、结果可查」，不是黑盒；&lt;/li&gt;
&lt;li&gt;内置&lt;strong&gt;推荐问题&lt;/strong&gt;：连接数据库后，会自动根据你的表结构推荐几个可以问的问题，第一次使用也无从下手。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 智能图表生成（图表）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;数据返回后自动生成图表，无需手动配置坐标轴、系列、图例；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;支持在 7 种图表形态间&lt;strong&gt;随时切换&lt;/strong&gt;：&lt;/p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;p&gt;&lt;code&gt;auto（自动推荐）/ line 折线 / bar 柱状 / area 面积 / scatter 散点 / pie 饼图 / radar 雷达&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;p&gt;切换图表类型时会基于同一份数据重新生成配置，方便快速找到最合适的表达方式。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;h3&gt;3. 表结构感知（查看表结构）&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;连接数据库后可读取真实的表名、表注释与字段列表；&lt;/li&gt;
&lt;li&gt;支持多选表，&lt;strong&gt;批量导出表结构到 Excel&lt;/strong&gt;，也可以一键全部导出；&lt;/li&gt;
&lt;li&gt;这份表结构会作为上下文传给大模型，保证生成的 SQL 用对表名和字段名——这是「生成准确 SQL」的关键前提。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;4. 结果导出&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;查询结果表格支持导出为 Excel（.xlsx），方便二次加工或直接汇报；&lt;/li&gt;
&lt;li&gt;表结构信息同样支持导出，便于交接与文档沉淀。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;5. 数据源与密钥管理（设置）&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API Key 配置&lt;/strong&gt;：填写火山方舟（Ark）API Key，作为模型调用的凭证，保存后本地留存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库配置管理&lt;/strong&gt;：新增、保存、删除多套数据库连接配置（类型 / 主机 / 端口 / 数据库名 / 用户名 / 密码），并可直接「使用」切换到某一套；&lt;/li&gt;
&lt;li&gt;配置持久化在浏览器本地（localStorage），下次打开无需重新填写。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;6. 帮助&lt;/h3&gt;

&lt;p&gt;内置使用指南，说明从配置到出图的完整流程，降低首次上手成本。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;四、工作原理&lt;/h2&gt;

&lt;p&gt;智绘SQL 的核心是&lt;strong&gt;两次大模型调用 + 一次数据库查询&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;第一次调用&lt;/strong&gt;：把「用户问题 + 真实表结构」交给大模型，让它只输出一条标准 SQL；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据库查询&lt;/strong&gt;：后端连接 MySQL / PostgreSQL 执行这条 SQL，拿到真实数据（不是模型编造的数据）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;第二次调用&lt;/strong&gt;：把查询结果交给大模型，让它输出一份 ECharts 图表配置；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;前端渲染&lt;/strong&gt;：展示 SQL、结果表格与图表，并允许切换图表类型、导出数据。&lt;/p&gt;
&lt;p&gt;flowchart LR&lt;/p&gt;
&lt;p&gt;A[用户自然语言提问] --&amp;gt; B[拼接真实表结构]&lt;/p&gt;
&lt;p&gt;B --&amp;gt; C[大模型调用 1&amp;lt;br/&amp;gt;生成 SQL]&lt;/p&gt;
&lt;p&gt;C --&amp;gt; D[连接数据库执行查询]&lt;/p&gt;
&lt;p&gt;D --&amp;gt; E[真实结果数据]&lt;/p&gt;
&lt;p&gt;E --&amp;gt; F[大模型调用 2&amp;lt;br/&amp;gt;生成图表配置]&lt;/p&gt;
&lt;p&gt;C -.可复制.-&amp;gt; G[展示 SQL]&lt;/p&gt;
&lt;p&gt;D -.-&amp;gt; H[结果表格 / 导出 Excel]&lt;/p&gt;
&lt;p&gt;F --&amp;gt; I[ECharts 图表渲染]&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;设计上的两个关键取舍：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只让模型写 SQL，不让模型编数据&lt;/strong&gt;：数据永远来自你的数据库，模型只负责「翻译」和「表达」；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL 对用户完全透明&lt;/strong&gt;：生成的语句始终展示出来，既方便核对，也方便直接拿去复用。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;五、技术栈&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;技术选型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;前端框架&lt;/td&gt;
&lt;td&gt;Next.js 14（App Router）+ React 18 + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;样式&lt;/td&gt;
&lt;td&gt;Tailwind CSS（深色主题、玻璃拟态卡片）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图表&lt;/td&gt;
&lt;td&gt;ECharts 5（echarts-for-react）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内容渲染&lt;/td&gt;
&lt;td&gt;react-markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图标&lt;/td&gt;
&lt;td&gt;lucide-react&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据导出&lt;/td&gt;
&lt;td&gt;xlsx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服务端&lt;/td&gt;
&lt;td&gt;Next.js Route Handlers（Node.js 运行时）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据库驱动&lt;/td&gt;
&lt;td&gt;mysql2、pg（另有 better-sqlite3、oracledb 依赖）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大模型&lt;/td&gt;
&lt;td&gt;火山方舟 Ark · `doubao-1-5-pro-32k-250115`&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;六、快速上手&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置 API Key&lt;/strong&gt;：进入「设置」，填入火山方舟 API Key 并保存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置数据库&lt;/strong&gt;：在「设置」中新增一套数据库连接（MySQL 或 PostgreSQL），保存后点击「使用」；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始提问&lt;/strong&gt;：回到「对话」，输入你的问题，或直接点击系统推荐的问题；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;看图与导出&lt;/strong&gt;：查看生成的 SQL、数据表格与图表，按需切换图表类型或导出 Excel。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;七、适用场景&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运营 / 市场&lt;/strong&gt;：临时想看某个活动的转化、某段时间的订单趋势，不必走数据需求流程；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产品经理&lt;/strong&gt;：快速验证一个假设，用真实数据支撑判断；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据分析师&lt;/strong&gt;：把重复的取数工作交给它，自己专注在更有价值的分析上；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发 / 测试&lt;/strong&gt;：连上自己的库，快速查数据、核对数据、导出结果；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;教学演示&lt;/strong&gt;：把「自然语言 → SQL → 可视化」这条链路完整地演示出来。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;八、当前能力边界&lt;/h2&gt;

&lt;p&gt;为了准确，这里明确说明现状：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;已完整实现&lt;/strong&gt;：对话式取数、SQL 生成与展示、MySQL / PostgreSQL 查询执行、图表自动生成与类型切换、表结构查看与导出、结果导出 Excel、API Key 与多数据源配置管理；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;已支持的数据源&lt;/strong&gt;：MySQL、PostgreSQL（Schema 读取与查询执行均已实现）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖中已引入但暂未接入路由&lt;/strong&gt;：SQLite、Oracle（驱动已在依赖中，接口层尚未实现，选择其他类型会返回「不支持的数据库类型」）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;占位页面&lt;/strong&gt;：查询历史目前为占位状态，尚未接入真实历史数据展示。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;九、一句话总结&lt;/h2&gt;

&lt;p&gt;智绘SQL 把数据分析里最繁琐的两段——&lt;strong&gt;写 SQL&lt;/strong&gt; 和 &lt;strong&gt;画图表&lt;/strong&gt;——压缩成了一句话。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;你只管提问，SQL 和图表交给它。&lt;/p&gt;
&lt;/blockquote&gt;
</description><pubDate>Sat, 17 Oct 2026 10:18:18 +0800</pubDate></item><item><title>AI 海报素材站管理端 AI 生成全流程解析</title><link>https://www.0315e.com/post/ai-haibaosucaizhanguanliduan-ai-shengchengquanliuchengjiexi.html</link><description>&lt;p&gt;从前端 Prompt 编辑到后端异步任务队列，再到双引擎出图落盘——完整拆解管理端 AI 生图模块的设计思路与实现细节。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;目录&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E8%83%8C%E6%99%AF%E4%B8%BA%E4%BB%80%E4%B9%88%E7%AE%A1%E7%90%86%E7%AB%AF%E9%9C%80%E8%A6%81-ai-%E7%94%9F%E5%9B%BE%E8%83%BD%E5%8A%9B&quot;&gt;背景：为什么管理端需要 AI 生图能力&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E5%8F%8C%E5%BC%95%E6%93%8E--%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1&quot;&gt;整体架构：双引擎 + 异步任务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5prompt-%E7%AE%A1%E7%90%86%E4%B8%8E%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%96%87%E6%A1%88%E7%94%9F%E6%88%90&quot;&gt;第一阶段：Prompt 管理与大模型文案生成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B&quot;&gt;第二阶段：图片生成核心流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%E5%8F%8C%E5%BC%95%E6%93%8E%E8%AF%A6%E8%A7%A3comfyui-vs-dashscope&quot;&gt;双引擎详解：ComfyUI vs DashScope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%9C%BA%E5%88%B6%E4%B8%8E%E7%8A%B6%E6%80%81%E6%9C%BA&quot;&gt;异步任务机制与状态机&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-%E4%B8%80%E9%94%AE%E6%89%B9%E9%87%8F%E7%94%9F%E5%9B%BE%E6%A0%8F%E7%9B%AE%E7%BA%A7%E7%B4%A0%E6%9D%90%E8%87%AA%E5%8A%A8%E5%8C%96&quot;&gt;一键批量生图：栏目级素材自动化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%E5%89%8D%E7%AB%AF%E7%AE%A1%E7%90%86%E7%95%8C%E9%9D%A2%E8%AE%BE%E8%AE%A1&quot;&gt;前端管理界面设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93%E4%B8%8E%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95&quot;&gt;经验总结与踩坑记录&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;1 背景：为什么管理端需要 AI 生图能力&lt;/h2&gt;

&lt;p&gt;AI 海报素材站是一个面向用户的移动端资讯与工具平台，核心内容之一是&lt;strong&gt;海报素材库&lt;/strong&gt;——各类资源的宣传海报、推荐图片需要持续更新，以保持用户新鲜感。传统做法是由设计师手工出图，周期长、成本高，且难以快速响应运营活动。&lt;/p&gt;

&lt;p&gt;引入 AI 生图后，运营人员只需在管理端维护一批&lt;strong&gt;结构化 Prompt 模板&lt;/strong&gt;，点击&amp;quot;生成&amp;quot;按钮，后台即可调用图像模型自动产出海报，全程无需设计师介入。更进一步，系统支持&lt;strong&gt;一键为整个栏目批量重刷封面&lt;/strong&gt;，数十张图片几分钟内全部到位。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;痛点&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;出图效率低&lt;/td&gt;
&lt;td&gt;设计师手工制作一张海报需 1~2 小时，远不能满足运营频次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;素材库难维护&lt;/td&gt;
&lt;td&gt;数百条资源素材，封面更新后需逐条替换，工作量巨大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解法：AI + 异步任务&lt;/td&gt;
&lt;td&gt;Prompt 模板 + 异步队列，运营直接操作，出图全自动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;2 整体架构：双引擎 + 异步任务&lt;/h2&gt;

&lt;p&gt;整个 AI 生图模块由三层组成：&lt;strong&gt;前端管理界面&lt;/strong&gt;（Vue 3 + Element Plus）、&lt;strong&gt;后端 Spring Boot 服务&lt;/strong&gt;（异步任务 + Service 层 + Client 层），以及&lt;strong&gt;两个可切换的图像引擎&lt;/strong&gt;（本地 ComfyUI 或阿里云 DashScope）。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;管理员（前端）
    │
    │ ① 选 Prompt / 提交生成
    ▼
AdminAiController  /api/admin/ai/**
    │
    ▼
AiMaterialService  业务编排层
    ├──②a 单条/批量──► AiTaskExecutor  @Async 异步线程池
    └──②b 同步出图───► AiImageClient   统一出图入口
                              │
                  ┌───────────┴────────────┐
                  │ provider=comfyui       │ provider=dashscope
                  ▼                        ▼
        ComfyUiImageClient        DashScopeImageClient
        HTTP Polling                REST API
        ComfyUI :8188              DashScope aliyuncs.com
                  │                        │
                  └───────────┬────────────┘
                              ▼
                    FileUploadUtil  UUID 落盘 uploads/ai/
                              │
                    ③ 回写 URL
                              ▼
                    MySQL: ai_generate_task / material

    ④ 前端轮询 batchTaskStatus
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;核心设计决策是将&lt;strong&gt;出图引擎与业务逻辑完全解耦&lt;/strong&gt;——&lt;code&gt;AiImageClient&lt;/code&gt; 作为唯一出图入口，通过 &lt;code&gt;ai.image-provider&lt;/code&gt; 配置项在运行时动态切换 ComfyUI 或 DashScope，上层业务代码完全无感知。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;3 第一阶段：Prompt 管理与大模型文案生成&lt;/h2&gt;

&lt;h3&gt;3.1 Prompt 模板数据结构&lt;/h3&gt;

&lt;p&gt;每条 Prompt 模板（&lt;code&gt;AiPromptTemplate&lt;/code&gt;）包含标题、分类、资源 ID、排序权重、提示词正文和启用状态。管理员可在前端 CRUD 维护这批模板，不同资源类型、不同类型（号码推荐 / 活动海报等）各自有对应的模板。&lt;/p&gt;

&lt;h3&gt;3.2 大模型辅助生成 Prompt 文案&lt;/h3&gt;

&lt;p&gt;很多运营人员对&amp;quot;文生图 Prompt 怎么写&amp;quot;并不熟悉。系统内置了一个&lt;strong&gt;大模型辅助生成 Prompt&lt;/strong&gt; 的接口（&lt;code&gt;POST /api/admin/ai/generatePrompt&lt;/code&gt;），运营只需填写素材标题、分类和补充要求，系统自动调用阿里云 DashScope Chat API 生成专业提示词。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// AiMaterialServiceImpl.java — generatePromptText()
public String generatePromptText(String title, String category, String hint) {
    StringBuilder sb = new StringBuilder();
    sb.append(&amp;quot;你是资源平台宣传海报提示词专家。请直接输出一段可用于文生图模型的中文提示词，不要解释、不要编号。&amp;quot;);
    sb.append(&amp;quot;要求：竖版海报、红金喜庆、商业宣传风格，底部预留合规区「推荐仅供参考，请理性选购」。&amp;quot;);
    if (StringUtils.hasText(title))    sb.append(&amp;quot;素材标题：&amp;quot;).append(title).append(&amp;quot;。&amp;quot;);
    if (StringUtils.hasText(category)) sb.append(&amp;quot;分类：&amp;quot;).append(category).append(&amp;quot;。&amp;quot;);
    if (StringUtils.hasText(hint))     sb.append(&amp;quot;补充要求：&amp;quot;).append(hint).append(&amp;quot;。&amp;quot;);
    sb.append(&amp;quot;请生成完整提示词。&amp;quot;);
    return dashScopeChatClient.generatePrompt(sb.toString());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;3.3 DashScope Chat 客户端：流式 SSE 解析&lt;/h3&gt;

&lt;p&gt;Chat 模型返回的是 &lt;strong&gt;Server-Sent Events（SSE）&lt;/strong&gt; 流式响应，需要逐行读取并聚合 &lt;code&gt;delta.content&lt;/code&gt;。实现上用原生 &lt;code&gt;HttpURLConnection&lt;/code&gt; 打开长连接，开启 &lt;code&gt;&amp;quot;enable_thinking&amp;quot;: true&lt;/code&gt; 让模型先思考再输出。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// DashScopeChatClient.java — 流式读取并聚合 content
private String readSseContent(InputStream is) throws Exception {
    StringBuilder content = new StringBuilder();
    try (BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, StandardCharsets.UTF_8))) {
        String line;
        while ((line = reader.readLine()) != null) {
            line = line.trim();
            if (line.isEmpty() || !line.startsWith(&amp;quot;data:&amp;quot;)) continue;
            String data = line.substring(5).trim();
            if (&amp;quot;[DONE]&amp;quot;.equals(data)) break;
            JsonNode delta = objectMapper.readTree(data)
                .path(&amp;quot;choices&amp;quot;).path(0).path(&amp;quot;delta&amp;quot;);
            if (delta.has(&amp;quot;content&amp;quot;))
                content.append(delta.get(&amp;quot;content&amp;quot;).asText(&amp;quot;&amp;quot;));
        }
    }
    return content.toString();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 请求头需设置 &lt;code&gt;Accept: text/event-stream&lt;/code&gt;，并将超时设置到 180 秒，否则大模型 thinking 阶段可能导致连接超时。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;4 第二阶段：图片生成核心流程&lt;/h2&gt;

&lt;p&gt;文案 Prompt 准备好后，正式进入出图环节。根据业务场景，系统支持&lt;strong&gt;三种触发方式&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;步骤 1 — 单条异步生成（基于 Prompt 模板）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;管理员在「提示词管理」页勾选模板，点击批量生成，后台为每条模板创建一个 &lt;code&gt;AiGenerateTask&lt;/code&gt;（状态 pending），立即丢入异步线程池。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;步骤 2 — 同步出图（素材行内生成）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;管理员在素材管理页直接输入 Prompt，点击「立即出图」，调用 &lt;code&gt;generateImageSync&lt;/code&gt;，同步等待图片返回后刷新预览。适合快速验证 Prompt 效果。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;步骤 3 — 一键批量生图（栏目级）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;按资源类型批量为当前栏目下所有图片素材重新出图，所有任务一次性提交异步队列，前端轮询进度直至全部完成。&lt;/p&gt;

&lt;h3&gt;4.1 任务创建与状态流转&lt;/h3&gt;

&lt;p&gt;异步生成路径中，任务对象（&lt;code&gt;AiGenerateTask&lt;/code&gt;）的状态机遵循严格的&lt;strong&gt;单向流转：pending → running → success / fail&lt;/strong&gt;。失败的任务支持手动重试，会将状态重置为 pending 后重新投入队列。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[创建] ──► pending ──► running ──► success ──► [结束]
                                └──► fail ──► pending（重试）
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;5 双引擎详解：ComfyUI vs DashScope&lt;/h2&gt;

&lt;p&gt;系统通过 &lt;code&gt;AiImageClient&lt;/code&gt; 提供统一的 &lt;code&gt;generateImage(promptText)&lt;/code&gt; 方法，内部根据配置选择实际引擎。两套引擎在接入方式上差异显著：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;ComfyUI（本地）&lt;/th&gt;
&lt;th&gt;DashScope（云端）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;部署方式&lt;/td&gt;
&lt;td&gt;本地/私有服务器，127.0.0.1:8188&lt;/td&gt;
&lt;td&gt;阿里云 SaaS API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通信模式&lt;/td&gt;
&lt;td&gt;提交 → HTTP 轮询 history API&lt;/td&gt;
&lt;td&gt;一次请求，等待响应&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工作流&lt;/td&gt;
&lt;td&gt;JSON 工作流文件（z-image-turbo）&lt;/td&gt;
&lt;td&gt;多模态消息体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图片返回&lt;/td&gt;
&lt;td&gt;PNG 文件名，需再下载字节流&lt;/td&gt;
&lt;td&gt;URL 或 Base64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;随机种子&lt;/td&gt;
&lt;td&gt;每次随机注入 seed 节点&lt;/td&gt;
&lt;td&gt;API 自动随机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;开发/本地测试，自有 GPU&lt;/td&gt;
&lt;td&gt;生产环境，稳定 SLA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;超时配置&lt;/td&gt;
&lt;td&gt;默认 300 秒（可配置）&lt;/td&gt;
&lt;td&gt;readTimeout 180 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;h3&gt;5.1 ComfyUI 引擎：工作流注入 + 轮询&lt;/h3&gt;

&lt;p&gt;ComfyUI 使用节点工作流（&lt;code&gt;z-image-turbo-workflow.json&lt;/code&gt;）驱动出图。客户端在启动时通过 &lt;code&gt;@PostConstruct&lt;/code&gt; 将工作流 JSON 加载到内存，出图时做两件事：&lt;strong&gt;① 把 Prompt 文本注入 57:27 节点&lt;/strong&gt;；&lt;strong&gt;② 随机注入 seed 到 57:3 节点&lt;/strong&gt;，保证每次出图不重复。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// ComfyUiImageClient.java — 工作流节点注入
ObjectNode workflow = workflowTemplate.deepCopy();
((ObjectNode) workflow.path(&amp;quot;57:27&amp;quot;).path(&amp;quot;inputs&amp;quot;)).put(&amp;quot;text&amp;quot;, promptText);
long seed = ThreadLocalRandom.current().nextLong(1, Long.MAX_VALUE);
((ObjectNode) workflow.path(&amp;quot;57:3&amp;quot;).path(&amp;quot;inputs&amp;quot;)).put(&amp;quot;seed&amp;quot;, seed);

// 提交后轮询 history/{promptId}，800ms 一次
while (System.currentTimeMillis() &amp;lt; deadline) {
    JsonNode history = getJson(&amp;quot;/history/&amp;quot; + promptId);
    if (history.has(promptId)) {
        JsonNode images = history.path(promptId)
            .path(&amp;quot;outputs&amp;quot;).path(&amp;quot;9&amp;quot;).path(&amp;quot;images&amp;quot;);
        return downloadAndSave(images.get(0));
    }
    Thread.sleep(800L);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;5.2 DashScope 引擎：多结构兼容解析&lt;/h3&gt;

&lt;p&gt;DashScope 图像 API 的响应结构在不同模型版本下&lt;strong&gt;字段路径可能不同&lt;/strong&gt;（&lt;code&gt;output.choices[].message.content[].image&lt;/code&gt;、&lt;code&gt;output.results[].url&lt;/code&gt;、&lt;code&gt;data[].url&lt;/code&gt; 等均有出现）。为了应对版本差异，&lt;code&gt;extractImage&lt;/code&gt; 方法实现了&lt;strong&gt;多路径优先级解析&lt;/strong&gt;，最终兜底用递归深度搜索 &lt;code&gt;image&lt;/code&gt;/&lt;code&gt;url&lt;/code&gt; 字段。&lt;/p&gt;

&lt;p&gt;拿到图片数据后，无论是 HTTP URL 还是 Base64，统一调用 &lt;code&gt;saveImage()&lt;/code&gt; 落盘到 &lt;code&gt;uploads/ai/{UUID}.png&lt;/code&gt;，返回相对访问路径。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配置切换：&lt;/strong&gt; 在 &lt;code&gt;application.yml&lt;/code&gt; 中设置 &lt;code&gt;ai.image-provider: comfyui&lt;/code&gt; 或 &lt;code&gt;ai.image-provider: dashscope&lt;/code&gt; 即可切换，无需改代码。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;6 异步任务机制与状态机&lt;/h2&gt;

&lt;h3&gt;6.1 Spring @Async 线程池&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AiTaskExecutor&lt;/code&gt; 标注了 &lt;code&gt;@Component&lt;/code&gt;，其 &lt;code&gt;execute()&lt;/code&gt; 和 &lt;code&gt;executeMaterialBatch()&lt;/code&gt; 方法均标注 &lt;code&gt;@Async&lt;/code&gt;，依赖 &lt;code&gt;AsyncConfig&lt;/code&gt; 中配置的专用线程池执行，不阻塞 HTTP 请求线程。&lt;/p&gt;

&lt;p&gt;Controller 层在接收到生成请求后，&lt;strong&gt;立即返回 taskId 给前端&lt;/strong&gt;，前端再通过轮询 &lt;code&gt;/api/admin/ai/batchTaskStatus&lt;/code&gt; 拿到任务的成功/失败统计。这样避免了出图时间过长（30～300 秒）导致 HTTP 请求超时。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// AiMaterialServiceImpl.java — 提交任务后立即返回
AiGenerateTask task = new AiGenerateTask();
task.setPromptId(promptId);
task.setAdminId(adminId);
task.setStatus(&amp;quot;pending&amp;quot;);
taskMapper.insert(task);          // ① 先入库
aiTaskExecutor.execute(task.getId()); // ② 异步执行，立即返回
return task.getId();              // ③ taskId 同步返回给调用方
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;6.2 异步执行器内部流程&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AiTaskExecutor.execute()&lt;/code&gt; 是真正干活的地方，步骤如下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;标记 running&lt;/strong&gt; — 任务开始时立即将状态更新为 running，前端可感知任务已被处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;读取 Prompt 模板&lt;/strong&gt; — 从 &lt;code&gt;ai_prompt_template&lt;/code&gt; 表查出 promptText，若不存在则直接 fail。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用出图引擎&lt;/strong&gt; — 通过 &lt;code&gt;AiImageClient.generateImage(promptText)&lt;/code&gt; 出图，获取本地文件相对路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入 Material 并更新任务&lt;/strong&gt; — 新建一条 &lt;code&gt;material&lt;/code&gt;（类型 poster，状态上架），回写 &lt;code&gt;result_url&lt;/code&gt; 和 &lt;code&gt;material_id&lt;/code&gt;，状态设为 success。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常处理&lt;/strong&gt; — 任何异常（含 API 限流、超时）均 catch，将错误信息截取前 480 字符写入 &lt;code&gt;error_msg&lt;/code&gt;，状态设为 fail。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;6.3 前端轮询进度&lt;/h3&gt;

&lt;p&gt;任务管理页（&lt;code&gt;task.vue&lt;/code&gt;）在 &lt;code&gt;onMounted&lt;/code&gt; 时启动一个 &lt;strong&gt;5 秒定时器&lt;/strong&gt;自动刷新任务列表，并在 &lt;code&gt;onUnmounted&lt;/code&gt; 时清除，避免内存泄漏。批量任务提交后，前端拿到 &lt;code&gt;taskIds&lt;/code&gt; 数组，通过 &lt;code&gt;batchTaskStatus&lt;/code&gt; 接口获得 pending/running/success/fail 四个计数，当 &lt;code&gt;pending + running === 0&lt;/code&gt; 时判定全部完成。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;7 一键批量生图：栏目级素材自动化&lt;/h2&gt;

&lt;p&gt;「一键生图」是整个 AI 生图模块最有业务价值的功能。其逻辑入口是 &lt;code&gt;POST /api/admin/ai/batchGenerateMaterials&lt;/code&gt;，参数 &lt;code&gt;resourceId&lt;/code&gt;（资源 ID）、&lt;code&gt;type&lt;/code&gt;（素材类型，仅 poster）、&lt;code&gt;onlyEmpty&lt;/code&gt;（是否仅为无封面的素材生成）。&lt;/p&gt;

&lt;h3&gt;7.1 Prompt 自动构建&lt;/h3&gt;

&lt;p&gt;批量模式下没有人工 Prompt，系统在 &lt;code&gt;AiTaskExecutor.buildMaterialPosterPrompt()&lt;/code&gt; 中根据素材的标题、分类和资源名称&lt;strong&gt;自动拼接一段标准化 Prompt&lt;/strong&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// AiTaskExecutor.java — 批量模式自动构建 Prompt
static String buildMaterialPosterPrompt(Material material, String resourceName) {
    String title    = hasText(material.getTitle())    ? material.getTitle()    : &amp;quot;资源宣传海报&amp;quot;;
    String category = hasText(material.getCategory()) ? material.getCategory() : &amp;quot;号码推荐&amp;quot;;
    String lot      = hasText(resourceName)            ? resourceName            : &amp;quot;资源&amp;quot;;
    return &amp;quot;竖版 9:16 手机海报，&amp;quot; + lot + &amp;quot;宣传海报，主题标题「&amp;quot; + title
        + &amp;quot;」，分类「&amp;quot; + category
        + &amp;quot;」，热情红主色搭配琥珀金点缀，喜庆现代电商活动海报质感，明亮高饱和，&amp;quot;
        + &amp;quot;干净排版，扁平化商业 UI，高清，8k。底部合规区文字：推荐仅供参考，请理性选购。&amp;quot;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这段 Prompt 具有很强的工程实践性：竖版比例、颜色风格（红+琥珀金）、质感描述（电商海报）、分辨率和&lt;strong&gt;合规文字&lt;/strong&gt;全部内置，保证批量产出的图片风格统一、满足监管要求。&lt;/p&gt;

&lt;h3&gt;7.2 批量任务提交与 onlyEmpty 优化&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;batchGenerateMaterials&lt;/code&gt; 先查出当前资源类型下最多 500 条素材，若 &lt;code&gt;onlyEmpty=true&lt;/code&gt; 则跳过已有封面的素材，仅为空封面素材创建任务，&lt;strong&gt;避免重复消耗 AI 算力配额&lt;/strong&gt;。任务列表批量插入后，调用 &lt;code&gt;executeMaterialBatch(taskIds)&lt;/code&gt; 统一异步执行。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;8 前端管理界面设计&lt;/h2&gt;

&lt;h3&gt;8.1 Prompt 管理页（prompt.vue）&lt;/h3&gt;

&lt;p&gt;Prompt 管理页的核心交互非常简洁：表格展示所有模板，支持多选后点击「批量异步生成」一键提交，勾选数量实时显示在按钮上。编辑对话框支持 6 行 Textarea 直接修改提示词正文。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能模块&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;提示词 CRUD&lt;/td&gt;
&lt;td&gt;新增、编辑、删除，支持标题 / 分类 / 资源 ID / 状态管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批量异步生成&lt;/td&gt;
&lt;td&gt;勾选多条模板一键提交，后台异步处理，不卡前端页面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跳转任务监控&lt;/td&gt;
&lt;td&gt;提交后可一键跳转到「生成任务」页查看实时进度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;h3&gt;8.2 生成任务页（task.vue）&lt;/h3&gt;

&lt;p&gt;任务监控页展示所有任务的状态、结果缩略图、错误信息，并支持对失败任务单条&lt;strong&gt;重试&lt;/strong&gt;。页面在 &lt;code&gt;mounted&lt;/code&gt; 时自动启动 5 秒轮询，让运营实时看到出图进度，无需手动刷新。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// task.vue — 自动轮询 5 秒一次
onMounted(() =&amp;gt; {
  loadData()
  timer = setInterval(loadData, 5000)  // 5 秒刷新
})
onUnmounted(() =&amp;gt; clearInterval(timer))  // 组件销毁时清除
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;9 经验总结与踩坑记录&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决方案&lt;/th&gt;
&lt;th&gt;严重度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ComfyUI 出图超时&lt;/td&gt;
&lt;td&gt;默认超时 60s 不够&lt;/td&gt;
&lt;td&gt;将 &lt;code&gt;comfyui.timeout-seconds&lt;/code&gt; 调到 300s&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DashScope 响应结构变化&lt;/td&gt;
&lt;td&gt;不同版本 API 字段路径不同&lt;/td&gt;
&lt;td&gt;多路径优先级解析 + 递归兜底&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSE 流式请求超时&lt;/td&gt;
&lt;td&gt;readTimeout 默认太短&lt;/td&gt;
&lt;td&gt;设置 &lt;code&gt;readTimeout=180000ms&lt;/code&gt; + Accept: text/event-stream&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批量任务重复生成&lt;/td&gt;
&lt;td&gt;未过滤已有封面的素材&lt;/td&gt;
&lt;td&gt;新增 &lt;code&gt;onlyEmpty&lt;/code&gt; 参数过滤&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;error_msg 存储溢出&lt;/td&gt;
&lt;td&gt;异常信息过长超出字段长度&lt;/td&gt;
&lt;td&gt;截取前 480 字符&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前端轮询内存泄漏&lt;/td&gt;
&lt;td&gt;timer 未在组件销毁时清除&lt;/td&gt;
&lt;td&gt;在 &lt;code&gt;onUnmounted&lt;/code&gt; 中 &lt;code&gt;clearInterval&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;随机种子固定导致重复图&lt;/td&gt;
&lt;td&gt;工作流默认 seed 不变&lt;/td&gt;
&lt;td&gt;每次出图随机注入新 seed&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;h3&gt;9.1 整体设计感悟&lt;/h3&gt;

&lt;p&gt;整个 AI 生图模块最核心的设计是&lt;strong&gt;关注点分离&lt;/strong&gt;：Controller 负责鉴权和参数解析，Service 负责业务编排（任务创建、进度汇总），TaskExecutor 负责异步执行，Client 层负责与外部 AI 服务通信，每一层职责清晰，便于独立测试和替换。&lt;/p&gt;

&lt;p&gt;双引擎设计让系统既能在开发阶段使用本地 ComfyUI 快速迭代 Prompt 效果，又能在生产环境无缝切换到云端 DashScope，&lt;strong&gt;无需修改任何业务代码&lt;/strong&gt;，只需改一行配置项。这种策略模式的应用，在实际项目中非常实用。&lt;/p&gt;
</description><pubDate>Fri, 16 Oct 2026 17:19:13 +0800</pubDate></item><item><title>AI聚合问答工具：多 AI 并排聚合客户端的技术实践</title><link>https://www.0315e.com/post/aijuhewendagongju-duo-ai-bingpaijuhekehuduandejishushijian.html</link><description>&lt;p&gt;&lt;img src=&quot;https://www.0315e.com/zb_users/upload/2026/10/20261016163301179213958121510.png&quot; alt=&quot;screenshot.png&quot;&gt;&lt;/p&gt;

&lt;h2&gt;1. 摘要&lt;/h2&gt;

&lt;p&gt;「AI聚合问答工具」是一款桌面客户端，核心目标是把多个主流大模型网页&lt;strong&gt;并排装进同一个窗口&lt;/strong&gt;：用户在底部输入框写一次问题，点一下即可同步发送给所有面板，并排对比各家回答。它不调用任何大模型 API，而是&lt;strong&gt;复用各站点的网页登录态&lt;/strong&gt;，以 &lt;code&gt;webview&lt;/code&gt; 嵌入真实对话框；强调&lt;strong&gt;本地优先、无遥测、数据仅存本机&lt;/strong&gt;。本文从问题定义、技术选型、系统架构、核心模块、工程化交付与关键问题六个维度，复盘这一项目的实践过程。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;2. 问题定义与项目目标&lt;/h2&gt;

&lt;p&gt;大模型能力高度分化：有的擅长推理，有的擅长长文，有的联网检索更强。用户日常需要在多个站点之间反复复制粘贴、来回切换，既低效又难以横向对比。本项目据此设定四项目标：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一窗并排，一问多答&lt;/strong&gt;：同一窗口内并排打开 2–12 个 AI 面板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一次输入，全部发送&lt;/strong&gt;：一个输入框，一键广播给所有面板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复用网页、本地优先&lt;/strong&gt;：复用各 AI 网页版登录态，不索取 API Key；登录态与配置存于本机。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私友好&lt;/strong&gt;：无统计、无追踪、无云端上报。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;3. 技术选型&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;选择&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;壳层框架&lt;/td&gt;
&lt;td&gt;**Electron 44**&lt;/td&gt;
&lt;td&gt;原生支持 `webview` 嵌入任意站点、分区持久化（`partition`）、`nativeTheme` 系统级色彩联动，最契合&amp;quot;聚合网页&amp;quot;的场景。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;打包工具&lt;/td&gt;
&lt;td&gt;**electron-builder 26**&lt;/td&gt;
&lt;td&gt;统一产出 Windows（NSIS/便携）与 macOS（dmg），支持代码签名与 CI。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图标生成&lt;/td&gt;
&lt;td&gt;**sharp 0.35**&lt;/td&gt;
&lt;td&gt;用一条命令把矢量 `icon.svg` 栅格化为 1024×1024 `icon.png`，纳入构建流程。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;聚合方式&lt;/td&gt;
&lt;td&gt;**网页注入**，非 API 聚合&lt;/td&gt;
&lt;td&gt;调用 API 需各平台 Key、计费且接口频繁变动；直接嵌入官方网页可零成本、零授权地复用其完整能力。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;blockquote&gt;
&lt;p&gt;关键判断：&lt;strong&gt;不重写对话 UI，而是&amp;quot;借用&amp;quot;各站点的对话 UI&lt;/strong&gt;。这把工作量从&amp;quot;适配每个模型的 API&amp;quot;转移为&amp;quot;定位每个站点的输入框与发送按钮&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;4. 系统架构&lt;/h2&gt;

&lt;h3&gt;4.1 进程与目录结构&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;src/
  main/        主进程：窗口、会话、主题联动、版本检测、本地存储
    main.js
    store.js
  preload/     安全桥接（contextIsolation）
    preload.js
  renderer/    界面、布局、站点适配、注入、提示词库
    index.html  app.js  styles.css
    providers.js  layouts.js  inject.js  prompts.js
scripts/       图标生成、应用截图、自检脚本
build/         图标与 README 截图（icon.png / screenshot.png）
assets/        矢量图标（icon.svg）
`&amp;amp;lt;/pre&amp;amp;gt;

### 4.2 进程模型与 IPC

采用 Electron 推荐的**主进程 / 预加载 / 渲染进程**三层隔离：
`&amp;lt;/pre&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预加载（&lt;code&gt;preload.js&lt;/code&gt;）&lt;/strong&gt; 通过 &lt;code&gt;contextBridge&lt;/code&gt; 只暴露最小 API 集合，绝不开启 &lt;code&gt;nodeIntegration&lt;/code&gt;：&lt;pre&gt;`contextBridge.exposeInMainWorld(&amp;#39;api&amp;#39;, {
  storeGet:  (k, f) =&amp;gt; ipcRenderer.invoke(&amp;#39;store:get&amp;#39;, k, f),
  storeSet:  (k, v) =&amp;gt; ipcRenderer.invoke(&amp;#39;store:set&amp;#39;, k, v),
  openExternal: (url) =&amp;gt; ipcRenderer.invoke(&amp;#39;open-external&amp;#39;, url),
  setNativeTheme: (mode) =&amp;gt; ipcRenderer.invoke(&amp;#39;set-native-theme&amp;#39;, mode),
  onUpdateAvailable: (cb) =&amp;gt; ipcRenderer.on(&amp;#39;update-available&amp;#39;, (_e, i) =&amp;gt; cb(i))
});
`&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主进程（&lt;code&gt;main.js&lt;/code&gt;）&lt;/strong&gt; 用 &lt;code&gt;ipcMain.handle&lt;/code&gt; 实现这些通道；其中 &lt;code&gt;open-external&lt;/code&gt; 强制校验 &lt;code&gt;^https?://&lt;/code&gt;，避免任意协议跳转。&lt;/p&gt;
&lt;p&gt;* * *&lt;h2&gt;5. 核心模块实现&lt;/h2&gt;
&lt;h3&gt;5.1 多面板并排与 22 种布局&lt;/h3&gt;
每个面板是一个 &lt;code&gt;webview&lt;/code&gt;，用 &lt;code&gt;partition=&amp;amp;amp;quot;persist:&amp;amp;amp;lt;providerId&amp;amp;amp;gt;&amp;amp;amp;quot;&lt;/code&gt; 实现&lt;strong&gt;登录态隔离与重启存活&lt;/strong&gt;：&lt;pre&gt;`function createWebview(provider) {
  var wv = document.createElement(&amp;#39;webview&amp;#39;);
  wv.setAttribute(&amp;#39;partition&amp;#39;, &amp;#39;persist:&amp;#39; + provider.id);
  wv.setAttribute(&amp;#39;src&amp;#39;, provider.url);
  wv.className = &amp;#39;pane-web&amp;#39;;
  return wv;
}
`&lt;/pre&gt;
布局由 &lt;code&gt;layouts.js&lt;/code&gt; 以 0–1 归一化坐标描述，共 &lt;strong&gt;22 种&lt;/strong&gt;：2 屏（左右/上下）→ 3 屏（三栏/主从）→ … → 12 屏（3×4 / 4×3），涵盖网格、左右/上下、主从（一大带多小）等形态，渲染时映射为百分比定位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;切换布局不刷新对话&lt;/strong&gt;是整个交互的关键。实现要点：&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paneEls&lt;/code&gt; 缓存已创建的窗格实例；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relayout()&lt;/code&gt; 增删窗格后，用 &lt;code&gt;syncPaneProvider()&lt;/code&gt; 判断——&lt;strong&gt;仅当某窗格的 provider 变化时才重建 &lt;code&gt;webview&lt;/code&gt;，否则原网页原样保留&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;切布局时统一复位 &lt;code&gt;is-fullscreen / is-collapsed&lt;/code&gt;，避免与新的几何位置冲突。&lt;h3&gt;5.2 一次输入、全发送的站点适配&lt;/h3&gt;
&lt;code&gt;providers.js&lt;/code&gt; 为每个站点维护 &lt;code&gt;inputs&lt;/code&gt;（输入框候选选择器）与 &lt;code&gt;send&lt;/code&gt;（发送按钮候选选择器）。真正执行在 &lt;code&gt;inject.js&lt;/code&gt;——一段注入到目标页面&lt;strong&gt;隔离世界&lt;/strong&gt;的脚本，全程只读写该标签页 DOM、不触网：&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定位输入框&lt;/strong&gt;：先按站点专属选择器匹配，未命中则回退通用发现——在 &lt;code&gt;textarea / contenteditable / input[type=text]&lt;/code&gt; 中按可见性、位置（偏下方）、宽度、&lt;code&gt;placeholder&lt;/code&gt; 关键词打分取最优。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;框架感知填充&lt;/strong&gt;：&lt;pre&gt;`*   `textarea/input`：用原型 `value` setter + 派发 `input/change` 事件；
`&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;*   `contenteditable`：清空后用 `InputEvent(&amp;amp;amp;#39;beforeinput&amp;amp;amp;#39;, {inputType:&amp;amp;amp;#39;insertText&amp;amp;amp;#39;})` 兼容 **Slate**，失败回退 `execCommand(&amp;amp;amp;#39;insertText&amp;amp;amp;#39;)`；
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;个别站点（如智谱清言）的提交绑定在 &lt;code&gt;mousedown&lt;/code&gt;，脚本据此改走 &lt;code&gt;mousedown&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定位并触发发送&lt;/strong&gt;：优先 &lt;code&gt;aria-label/title&lt;/code&gt; 含&amp;quot;发送/Send&amp;quot;的按钮，兜底按按钮文本匹配；触发时派发 &lt;code&gt;Pointer/Mouse/Click&lt;/code&gt; 序列，或回退为在输入框 &lt;code&gt;pressEnter&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;渲染进程对每个面板并行 &lt;code&gt;executeJavaScript&lt;/code&gt;，用 &lt;code&gt;Promise&lt;/code&gt; 聚合结果，逐窗标记 &lt;code&gt;ok / fail&lt;/code&gt; 并 toast 汇总。&lt;h3&gt;5.3 单窗全屏 / 收缩（不刷新）&lt;/h3&gt;
全屏与收缩均为&lt;strong&gt;纯 CSS class 切换&lt;/strong&gt;，不重建、不刷新 &lt;code&gt;webview&lt;/code&gt;：&lt;pre&gt;`pane.classList.toggle(&amp;#39;is-fullscreen&amp;#39;);  // 置顶覆盖，同一时刻仅一个
pane.classList.toggle(&amp;#39;is-collapsed&amp;#39;);   // 隐藏网页区，webview 仍驻留 DOM
`&lt;/pre&gt;
这保证了&amp;quot;专注单个 AI&amp;quot;时既不丢失其他对话，也不产生额外的页面加载。&lt;h3&gt;5.4 白 / 夜模式联动&lt;/h3&gt;
渲染进程 &lt;code&gt;applyTheme()&lt;/code&gt; 经 &lt;code&gt;api.setNativeTheme()&lt;/code&gt; 通知主进程，后者设置 &lt;code&gt;nativeTheme.themeSource = mode&lt;/code&gt;（&lt;code&gt;light/dark/system&lt;/code&gt;）。由于 &lt;code&gt;webview&lt;/code&gt; 内的 AI 站点普遍响应系统 &lt;code&gt;prefers-color-scheme&lt;/code&gt;，&lt;strong&gt;应用切主题即联动所有内嵌站点&lt;/strong&gt;同步深/浅色。&lt;/p&gt;
&lt;p&gt;同时，主进程在 &lt;code&gt;session-created&lt;/code&gt; 时清洗 User-Agent，剥离 &lt;code&gt;Electron/*&lt;/code&gt; 与应用名令牌，让各站点按正常桌面浏览器渲染、降低被限流风险：&lt;pre&gt;`.replace(/\s*Electron\/[0-9.]+/i, &amp;#39;&amp;#39;).replace(/\s*AI聚合问答工具\/[0-9.]+/i, &amp;#39;&amp;#39;)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;5.5 提示词库&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;`prompts.js` 提供本地增删改查、分类与搜索；支持单 `{变量}` 与双 `{{变量}}` 占位符，使用时自动弹出变量表单（`buildVarFields` / `confirmVars`），把填好的内容回填到输入框。该模块与&amp;amp;quot;发送注入&amp;amp;quot;解耦，可独立维护。

### 5.6 版本检测与自动升级

主进程 `app ready` 后请求 `https://mutiai.0315e.com/curr_version`，用 `compareVersion()` 做语义化比较，发现远端更新即 `webContents.send(&amp;amp;amp;#39;update-available&amp;amp;amp;#39;, …)`，渲染进程弹窗并提供&amp;amp;quot;去升级&amp;amp;quot;按钮跳转官网；离线或接口不可达时静默忽略。

### 5.7 本地优先与隐私
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;每个 AI 独立 &lt;code&gt;persist:&lt;/code&gt; 分区，登录态互不串扰；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;应用配置（布局、provider、主题）以 &lt;code&gt;store.json&lt;/code&gt; 落盘于 &lt;code&gt;userData&lt;/code&gt;，由 &lt;code&gt;store.js&lt;/code&gt; 用 &lt;code&gt;fs&lt;/code&gt; 读写；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;全程无遥测接口；&lt;code&gt;requestSingleInstanceLock&lt;/code&gt; 保证单实例运行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* * *
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. 工程化与交付实践&lt;/h2&gt;
&lt;h3&gt;6.1 国内镜像源加速&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.npmrc&lt;/code&gt; 将 npm、Electron 二进制、electron-builder 二进制、sharp 及其 libvips 全部指向 npmmirror，显著缩短依赖与二进制下载时间：&lt;/p&gt;
&lt;pre&gt;`registry=https://registry.npmmirror.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;electron_mirror=&lt;a href=&quot;https://registry.npmmirror.com/-/binary/electron/&quot;&gt;https://registry.npmmirror.com/-/binary/electron/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;electron_builder_binaries_mirror=&lt;a href=&quot;https://registry.npmmirror.com/-/binary/electron-builder-binaries/&quot;&gt;https://registry.npmmirror.com/-/binary/electron-builder-binaries/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sharp_binary_host=&lt;a href=&quot;https://registry.npmmirror.com/-/binary/sharp&quot;&gt;https://registry.npmmirror.com/-/binary/sharp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sharp_libvips_binary_host=&lt;a href=&quot;https://registry.npmmirror.com/-/binary/sharp-libvips&quot;&gt;https://registry.npmmirror.com/-/binary/sharp-libvips&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;6.2 图标与截图自动化&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图标&lt;/strong&gt;：&lt;code&gt;scripts/make-icon.js&lt;/code&gt; 用 sharp 把 &lt;code&gt;assets/icon.svg&lt;/code&gt; 栅格化为 &lt;code&gt;build/icon.png&lt;/code&gt;（1024×1024），纳入 &lt;code&gt;npm run icon&lt;/code&gt; 流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截图&lt;/strong&gt;：&lt;code&gt;scripts/shot.js&lt;/code&gt; 启动独立 Electron 实例加载真实 &lt;code&gt;index.html&lt;/code&gt;，注册最小 IPC 桩（&lt;code&gt;store:get/set&lt;/code&gt;、&lt;code&gt;open-external&lt;/code&gt;、&lt;code&gt;set-native-theme&lt;/code&gt;）后 &lt;code&gt;capturePage()&lt;/code&gt; 输出 &lt;code&gt;build/screenshot.png&lt;/code&gt;。实践中的关键坑：必须 &lt;code&gt;disableHardwareAcceleration()&lt;/code&gt; 并加 &lt;code&gt;--disable-gpu&lt;/code&gt;，否则 GPU 进程崩溃；且必须提供最小 IPC 桩，否则渲染进程启动中断、窗格不渲染。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;6.3 打包与分发&lt;/h3&gt;

&lt;p&gt;electron-builder 产出：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;：&lt;code&gt;AI聚合问答工具-&amp;amp;amp;lt;版本&amp;amp;amp;gt;-win-x64.exe&lt;/code&gt;（NSIS 安装版）+ &lt;code&gt;-portable.exe&lt;/code&gt;（免安装便携版）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;：&lt;code&gt;*.dmg&lt;/code&gt;（x64 / arm64 通用）。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;跨平台限制&lt;/strong&gt;：Electron 不支持在单一系统交叉编译另一系统的安装包，macOS 包必须在 Mac 上执行 &lt;code&gt;npm run dist:mac&lt;/code&gt; 或通过 CI 构建。仓库已提供 GitHub Actions 工作流，推送 &lt;code&gt;v*&lt;/code&gt; tag 自动构建双平台。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;6.4 版本管理与协作&lt;/h3&gt;

&lt;p&gt;代码托管于 Gitee（&lt;code&gt;tyerp/ai-aggregated-qa-tool&lt;/code&gt;），HTTPS + 账号密码推送；&lt;code&gt;.gitignore&lt;/code&gt; 排除 &lt;code&gt;node_modules/&lt;/code&gt;、&lt;code&gt;release/&lt;/code&gt; 等体积较大的产物目录，仅纳入源码、配置与 &lt;code&gt;build/&lt;/code&gt; 资源。&lt;/p&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;7. 关键问题与解决方案&lt;/h2&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;现象&lt;/th&gt;
&lt;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;运行态退化&lt;/td&gt;
&lt;td&gt;环境 `ELECTRON_RUN_AS_NODE=1` 使 Electron 退化成 Node，`app is undefined`&lt;/td&gt;
&lt;td&gt;`start` 脚本先 `delete process.env.ELECTRON_RUN_AS_NODE` 再拉起&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU/沙箱受限&lt;/td&gt;
&lt;td&gt;虚拟桌面/服务器上 GPU 进程 FATAL，整体闪退&lt;/td&gt;
&lt;td&gt;`disableHardwareAcceleration()` + `--no-sandbox --disable-gpu --disable-software-rasterizer`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后台进程被回收&lt;/td&gt;
&lt;td&gt;用 `&amp;amp;` 后台启动随 shell 结束被回收，误判启动失败&lt;/td&gt;
&lt;td&gt;改用守护方式常驻拉起&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跨平台打包&lt;/td&gt;
&lt;td&gt;Windows 无法产出 macOS 包&lt;/td&gt;
&lt;td&gt;明确在 Mac 或 CI 构建，文档标注限制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;截图窗格空白&lt;/td&gt;
&lt;td&gt;渲染进程缺 IPC 桩，中断启动&lt;/td&gt;
&lt;td&gt;`shot.js` 补齐最小 IPC 桩后三栏正常渲染&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;8. 安全与合规&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进程隔离&lt;/strong&gt;：&lt;code&gt;contextIsolation: true&lt;/code&gt;、&lt;code&gt;nodeIntegration: false&lt;/code&gt;，预加载仅暴露必要 API；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部跳转白名单&lt;/strong&gt;：&lt;code&gt;open-external&lt;/code&gt; 仅放行 &lt;code&gt;http(s)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最小权限&lt;/strong&gt;：不索取任何 API Key、不读取用户隐私文件，所有数据存于本机 &lt;code&gt;userData&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;hr&gt;&lt;/p&gt;

&lt;h2&gt;9. 总结与展望&lt;/h2&gt;

&lt;p&gt;「AI聚合问答工具」用&amp;quot;轻壳层 + 网页注入&amp;quot;的组合，以极低的维护成本实现了&lt;strong&gt;多 AI 并排对比&lt;/strong&gt;这一高频诉求。其可复用经验有三：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;复用网页优于调用 API&lt;/strong&gt;——在能力快速迭代的大模型领域，嵌入官方网页比适配 API 更稳更省；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存与复用是流畅体验的底座&lt;/strong&gt;——窗格实例与 &lt;code&gt;webview&lt;/code&gt; 的复用，让&amp;quot;切布局/切主题不刷新对话&amp;quot;成为现实；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程化前置&lt;/strong&gt;——镜像源、图标/截图脚本、CI 打包、&lt;code&gt;.gitignore&lt;/code&gt; 设计，决定了项目能否稳定交付。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;后续可演进方向：补齐 macOS 构建与签名、提示词跨设备同步、可拖拽自定义布局、更多站点适配，以及把&amp;quot;变量表单&amp;quot;能力下沉到发送流程。&lt;/p&gt;
</description><pubDate>Fri, 16 Oct 2026 16:32:14 +0800</pubDate></item></channel></rss>