Skip to content

图形工坊如何保持计算一致

2026-10-24。操作和截图见策略工坊指南。

三份数据各自负责什么

计算定义仍是现有方案、组件目录及不可变版本。画布将相同定义投影为节点和连线,参数或依赖变更必须经过后端编译,不能绕过模型、Agent、Portfolio 和 Risk 的现有约束。

布局单独保存节点坐标、缩放、选择和子图视口,以方案或会话草稿身份区分,使用乐观修订检查拒绝覆盖。移动和选择不会改变计算摘要、训练缓存键或发布版本。布局摘要用于说明保存时的定义,结构变化后失效坐标可以重新自动排列。

未发布预置使用会话身份加方案标识生成独立布局键;已发布方案继续按方案ID保存并检查修订。同一会话切回已保存的预置可以恢复布局,不会借用另一方案的坐标。载入不同定义摘要的已发布版本时,旧坐标不会强行套入新图。

运行证据只读,带运行ID、冻结定义摘要、子策略路径、阶段、日期和事件游标。当前草稿摘要与运行不一致时,界面显示旧结果提示并停止为新图绘制成功状态。读取节点和重新打开历史不会产生新任务。

画布与 Gradio 的分工

项目内 StrategyGraph 组件沿用 Gradio 6.16 的 HTML 值、watch 和事件接口;内部是 Svelte Flow,不另建前端应用。选择、搜索、导航、拖动和连线先在浏览器完成;应用、布局保存和运行证据读取才调用服务。参数更新同步组件值,运行入口比较图形和 YAML 的生效定义,防止执行未应用前的旧草稿。

可编辑组件值由浏览器持有,Python通过独立的patch属性发送更新。更新标明定义身份、本地编辑修订和请求顺序,分别处理显式载入、YAML输入、应用确认、布局回执与只读证据。证据只能合并过程数据,旧定义的回调会被拒绝;较早的应用确认也不会覆盖后来继续输入的参数。显式载入即使YAML内容相同,仍生成新定义身份并重置未应用修改。

YAML输入、原步骤表的应用动作与显式载入分别绑定;普通输出变化不再重复触发整图同步。全屏适配由容器尺寸观察和连续稳定帧驱动,等待新尺寸生效后再fit;执行证据刷新不重新调整视口。配置位于 egs/config/strategies/strategy_graph.yaml,相关前端逻辑拆分在updates.ts和viewport.ts。

图资源在工坊加载时才从同源静态目录获取,构建产物随项目交付。开发目录为 src/frontend/components/strategy_graph/frontend/,使用锁文件安装后执行 npm 的 check、test 和 build;部署不需要 Node 或开发服务器。Python 图投影、证据索引、布局存储按职责拆在 src/frontend/service/graph_*.py。

连线和层级含义

实线更新阶段的有序 inputs,融合权重跟随输入来源;虚线只说明训练历史母池;子策略到预算汇总的百分比边只表示资金份额。Portfolio、Risk、执行是受保护的配置链,不能当作普通阶段删除。子策略身份是逻辑实例路径,不是可读取的文件路径。

前端先拒绝明显无效连线,服务端再校验整个依赖图、参数范围和类型。图导入只接受有版本号、大小受限的本工坊 JSON;未知组件和外部代码不执行。参数和事件内容通过文本渲染,不能成为页面脚本。

过程展示为何有边界

事件索引按文件偏移增量读取,并以有界缓存保留各节点近期事件;写入和读取使用相同锁,避免 UTF-8 半行。API 的 after 游标返回后续预览事件,旧节点摘要仍可保留。预览数组最近 8 项、文本 6000 字符、节点事件缓存 60 条;这些限制可在 egs/config/strategies/strategy_graph.yaml 配置。

图中默认是近期日期的实际阶段,终态后轮询停止。完整长回测应读取已保存结果/事件附件;未增加任意日期的全量图查询或从任意失败节点续跑。模型训练、阻塞 API 的取消仍遵循原有执行器边界。

正式设计为项目 doc/strategies/gradio_visual_strategy_editor_design.md;首次实施、独立问题复现和修复验收分别保留在项目 docs/audit/strategy_graph_2026-10-23/、strategy_graph_e2e_2026-10-24/、strategy_graph_fix_2026-10-24/。图形交互通过不代表策略有投资收益,行情长度和日线撮合限制继续有效。