2026-06-12-mode-workflow-design.md 9.5 KB

mode_workflow 设计文档

日期:2026-06-12 状态:已确认(用户口头批准) 位置:examples/mode_workflow/

目标

examples/ 下新建 mode_workflow 项目,把 examples/process_pipeline/script/search_eval/fixed_query_eval(固定 query 搜索评估 + 工具解构)和 mode_procedure(工序解构)两套服务 合并简化为一套:单服务 + 单页 HTML(Dashboard / Dataset / 聚类库 三 tab), 数据以 MySQL 三张新表为唯一事实源。

已确认的决策

  1. 数据库:复用现有 MySQL(.envMYSQL_* 配置,同一个库),新建三张表 search_data / mode_process / mode_tools,与旧表 fqe_posts / fqe_tools 并存。
  2. 历史数据:只导入搜索结果(runs_full 的 form_A.jsonsearch_data); 工序/工具解构数据不导入,由新系统重新产生。
  3. mode_process 行粒度:一行一个工序(procedure),steps 等嵌套结构存 JSON 列。
  4. 架构:DB 为唯一事实源(区别于旧系统"文件为主 + DB 双写"); 本地 JSON 仅作运行中间产物(runs/,gitignore)。
  5. 范围裁剪:只保留 form A 单形式;工序/工具解构只要大模型解构 (不含 procedure-dsl 执行引擎、mode-dsl 模式提取);去掉 cloudflared 公网分享、 规范文档编辑弹窗、pid/log 等冗余。
  6. 聚类库 tab 仅占位。

文件结构

examples/mode_workflow/
├── README.md                  # 项目说明 + 启动方式
├── server.py                  # 唯一服务(端口 8772):页面 + 全部 API
├── db.py                      # MySQL 连接 + 三表建表/读写(读 .env MYSQL_*)
├── index.html                 # 单文件前端:Dashboard / Dataset / 聚类库 三 tab
├── import_history.py          # 一次性脚本:runs_full form_A.json → search_data
├── pipeline/
│   ├── search_eval.py         # 搜索+评估(从 search_and_evaluate.py 精简,写 search_data)
│   ├── procedure_extract.py   # 工序解构(仅大模型),写 mode_process
│   └── tool_extract.py        # 工具解构(仅大模型),写 mode_tools
├── prompts/
│   ├── eval_prompt.md         # 搜索评估 prompt(同步自 search_eval)
│   ├── procedure_extract_system.md
│   └── tool_extract_system.md
├── reference/
│   └── judged_matrix.json     # 内容树(27 动作 × 50 类型,643 有效节点)
└── runs/                      # 运行中间产物(gitignore)

来源映射:

新文件 来源
pipeline/search_eval.py search_eval/search_and_evaluate.py(只保留 form A 路径)
pipeline/procedure_extract.py mode_procedure/ 的工序解构调用链(仅 LLM 解构部分)
pipeline/tool_extract.py fixed_query_eval/tool_extract.py
prompts/procedure_extract_system.md mode_procedure/mode-dsl/prompts/procedure_extract_system.md
prompts/tool_extract_system.md fixed_query_eval/prompts/tool_extract_system.md
db.py 参考 fixed_query_eval/db.py(pymysql + .env),表结构全新
reference/judged_matrix.json search_eval/evaluation/judged_matrix.json

三张表 Schema(MySQL)

search_data — 一行一帖

唯一键 (query_id, case_id)

类型 说明
id BIGINT PK AUTO_INCREMENT
query_id VARCHAR(32) 如 q0000
query_text VARCHAR(512) query 原文
case_id VARCHAR(128) 平台_内容ID
platform VARCHAR(32) xhs / gzh / zhihu
title TEXT 帖子标题
url TEXT 帖子链接
content_type VARCHAR(32) note / video 等
body_text LONGTEXT 正文
images JSON 图片 URL 数组
videos JSON 视频 URL 数组
like_count INT
publish_time DATETIME NULL
quality_score FLOAT NULL post._quality_score
quality_grade VARCHAR(8) NULL A/B/C
found_by_queries JSON 命中的子 query
knowledge_type JSON ["能力","工序","工具"] 子集
overall_score FLOAT NULL 综合分(相关均值+质量均值)/2
llm_evaluation JSON 评估全量原始 JSON
created_at / updated_at DATETIME

mode_process — 一行一工序

类型 说明
id BIGINT PK
query_id / case_id / platform / post_title 同上 关联帖子
source JSON 解构返回的 source 块
procedure_id VARCHAR(16) p1, p2…
name / purpose VARCHAR/TEXT 工序名 / 目的
category VARCHAR(32) 产物创造/资产建设/自动化/分析/学习
declarations JSON inputs / resources / returns
type_registry JSON 自定义类型表
steps JSON 步骤数组全量(id/kind/via/effect/action/substance/form/directive/intent/inputs/outputs)
step_count INT
tools_used JSON 从 steps[].via 去重提取
model VARCHAR(64) 解构用模型
version VARCHAR(16) v_MMDDHHMM,保留历史版本
cost_usd DECIMAL(10,6) NULL 本次解构 LLM 成本
duration_s FLOAT NULL 本次解构耗时
created_at DATETIME

mode_tools — 一行一工具

字段风格与旧 fqe_tools 对齐,新增成本/耗时:

类型 说明
id BIGINT PK
query_id / case_id / platform / post_title 关联帖子
tool_name VARCHAR(256) 工具名称
substance_scope JSON 实质作用域
form_scope JSON NULL 形式作用域
creation_layer VARCHAR(16) 制作层 / 创作层
source_link TEXT NULL
input_desc / output_desc TEXT NULL 输入 / 输出
usage_json JSON NULL 用法
cases_json JSON NULL 案例(输入/输出/效果)
defects_json JSON NULL 缺点
last_update_time VARCHAR(32) NULL 工具最新更新时间
model / version VARCHAR 同 mode_process
cost_usd / duration_s 同 mode_process
created_at DATETIME

Dashboard 指标口径

结果数据:

指标 计算方式 图表
内容树覆盖节点 mode_process.steps 的 (action × 输入/输出 type) 命中 judged_matrix 有效节点数 / 643 数字卡 + 27×50 热力图
实质覆盖度 steps.substance ∪ mode_tools.substance_scope 去重数(无固定分母,展示数量 + 分布) 条形图
形式覆盖度 steps.form ∪ mode_tools.form_scope 同上 条形图
采集帖子数量 count(search_data) 数字卡
解构帖子数量 distinct case_id in (mode_process ∪ mode_tools) 数字卡
工具数量 distinct tool_name in mode_tools 数字卡
工序提及工具 Top10 steps[].via 频次 Top10 横向条形图

过程数据:

指标 计算方式 图表
单条/累计解构成本 avg/sum(cost_usd),mode_process ∪ mode_tools 数字卡 + 按日趋势线
平均/总耗时 avg/sum(duration_s) 数字卡
工序进度 distinct case_id in mode_process ÷ search_data 中 knowledge_type 含「工序」的帖子数 进度环
工具进度 同理,knowledge_type 含「工具」 进度环

注:实质/形式覆盖度按"去重数量 + 分布图"处理(非百分比);进度分母取 "knowledge_type 含对应类型的帖子数"。两个口径已经用户确认,后续如有标准分类体系可改为百分比。

Dataset 页面(核心)

顶部「工序 / 工具」子切换,三栏布局:

  • 左栏 query 列表:从 search_data 按 query_id 聚合,显示帖子数 / 解构进度。
  • 中栏 帖子列表:该 query 下帖子卡片(标题/平台/评分/知识类型),带「解构」触发按钮。
  • 右栏 解构结果:
    • 工序模式:复刻现有大模型工序结果页——版本下拉(v_xxx)、重新生成按钮、 工序卡片(名称/目的/类别/平台/作者 + 输入/返回声明)、 需求-输入-实现-输出分区明细表格、推断字段高亮(inferred 标记 + hover 理由)。
    • 工具模式:渲染 mode_tools 工具卡片(作用域/层级/输入输出/用法/案例/缺点)。

数据流:index.html → /api/* → MySQL。点「解构」→ server 起子进程跑 pipeline 脚本 → 写库 → 前端轮询任务状态接口刷新。

API 概要(server.py,端口 8772)

  • GET / — index.html
  • GET /api/dashboard — 全部 Dashboard 聚合指标
  • GET /api/queries — query 列表 + 进度
  • GET /api/posts?query_id= — 帖子列表
  • GET /api/process?case_id=&version= / GET /api/process_versions?case_id=
  • GET /api/tools?case_id=&version= / GET /api/tools_versions?case_id=
  • POST /api/extract_process / POST /api/extract_tools — 触发解构(子进程)
  • GET /api/task_status?task_id= — 轮询任务状态
  • POST /api/run_search — 触发搜索评估

错误处理

  • MySQL 不可达:server 启动报错并明确提示检查 .env;不做静默文件回退(与旧系统不同)。
  • 解构子进程失败:任务状态接口返回 failed + 日志尾部,前端弹出错误。
  • LLM 返回 JSON 解析失败:重试 1 次,仍失败则记任务失败,不写脏数据。

测试 / 验收

仓库无 pytest 体系,按现有惯例用独立脚本 + 手工验收:

  1. python db.py --init 建三张表成功。
  2. python import_history.py 导入 q0000–q0003 搜索结果,行数与 form_A.json 条数一致。
  3. 启动 server,Dashboard 各卡片/图表出数(解构类指标为 0 是正常初始态)。
  4. Dataset 选一个帖子触发工具解构、工序解构,落库且右栏渲染正确,版本切换可用。
  5. 聚类库 tab 显示占位页。

UI

单文件 HTML + 原生 JS + ECharts(CDN)。实现阶段用 frontend-design 技能出定制视觉: 延续现有工序结果页风格(深色表头多色分区表格、标签 pill、卡片),三 tab 顶部导航。