Files
cmroubao/docs/02-requirements.md
T

231 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 需求
> 本文描述“要什么”和“怎么算达成”,不规定框架或代码实现。
## 一、业务现状
| 项 | 当前事实 |
| --- | --- |
| 任务来源 | 其他管理后台或本项目管理 Web 采集商品标题、SKU、描述、图片、数量和预算。 |
| 第一层样本来源 | 本机目录中的蝦皮订单文本和参考图;二者以蝦皮订单号作为同名文件名。 |
| 执行方式 | 采购人员使用 Android App 操作拼多多;需求提取、动态词搜索、最多 5 个候选证据采集、匹配建议和人工确认停止点已可运行。 |
| 核心痛点 | 人工把图片和描述转成搜索词、逐条比较商品并记录结果,耗时且不一致。 |
| 验证范围 | 一台设备、一个管理身份、一个采购执行人员、拼多多单平台。 |
| 资金边界 | MVP 不提交订单、不支付,只验证到人工确认位置。 |
## 二、用户角色
- **采购管理员**:创建、查看、取消未执行任务,或请求执行中任务安全停止,并查看结果。
- **采购执行员**:在 App 上检查设备状态、手动领取、执行和人工确认任务。
- **设备身份**:代表一台获得授权的 Android 设备领取任务和上报状态。
- **系统管理员/审核员**:目标架构角色,MVP 不提供完整管理界面。
- **未登录用户**:不能访问任务、图片、执行证据或设备接口。
## 三、MVP 功能
| ID | 功能 | 用户结果 | 优先级 | 用户故事 |
| --- | --- | --- | --- | --- |
| F-001 | 创建采购任务 | 管理员提交标题、SKU、描述、图片、数量和可选预算,获得任务编号。 | P0 | US-001 |
| F-002 | 查看任务状态 | 管理员看到任务阶段、候选摘要、截图和失败原因。 | P0 | US-002 |
| F-003 | 手动领取任务 | 空闲且就绪的 App 点击后只领取一条待处理任务。 | P0 | US-003 |
| F-004 | 解析采购需求 | 系统从图片和文字提取搜索词、属性及约束,并保留原始输入。 | P0 | US-004 |
| F-005 | 拼多多搜索与候选判断 | App 搜索并检查少量结果,得到一个候选或明确无匹配。 | P0 | US-004 |
| F-006 | 人工确认停止点 | 自动化停在候选/订单确认位置,采购员确认结果或拒绝候选。 | P0 | US-005 |
| F-007 | 结果与异常回传 | 管理员和采购员看到成功、失败、取消及可恢复建议。 | P0 | US-002、US-006 |
| F-009 | 手机独立执行与 VLM | App 本地完成模型判断和自动化,后端只控制任务并接收结果。 | P0 | US-009 |
### F-009 手机独立执行与 VLM
1. 正式采购链路为:App 从管理后端领取完整任务,直接调用本机配置的 VLM、操作
拼多多和人工确认,再向管理后端提交结构化结果和证据。
2. 管理后端不保存、代理或下发 provider、Base URL、model、prompt 和 API Key;
后台任务也不能覆盖 App 的本地模型设置。
3. App 支持 `MANUAL_FIRST` 和 `AI_ASSISTED`。没有 VLM 时仍可直接搜索并由人员判断;
发生模式切换必须明确显示和记录,不能静默降级。
4. provider Key 使用 Android Keystore 包装的加密存储。每台设备使用独立、可撤销、
有限额度的 Key;普通日志、结果和崩溃报告不得包含秘密。
5. start 后默认获得 30 分钟有限离线执行授权,成功 heartbeat 可续期。后端短时不可用
不阻止授权内执行;授权到期必须安全停止,RUNNING 任务不得自动分给其他设备。
6. 回传结果包含模式、provider/model/prompt/schema、任务和证据哈希、候选、推荐、
人工理由及设备版本,但不包含 Key、Authorization、完整 endpoint 或供应商正文。
## 四、后续迭代
| 功能 | 说明 | 阶段 |
| --- | --- | --- |
| F-008 候选决策数据闭环 | 保存每次搜索实际曝光的最多 5 个候选、模型评估、系统推荐和人工理由,为离线评估与优化提供可信样本。 | P1,T-208;不阻塞第一版流程 |
| 完整 RBAC | 采购管理员、执行员、审核员和系统管理员的细粒度权限。 | V2 |
| 多设备容量调度 | 在当前原子领取/租约基础上增加优先级、容量、运营监控和跨实例调度。 | V2 |
| 后台通知 | WebSocket/厂商推送只通知有任务,App 仍通过 claim 领取。 | V2 |
| 订单提交审批 | 在金额、店铺和品类规则内,经人工审批后允许提交订单。 | V2,需单独安全评审 |
| 多平台比价 | 淘宝、1688、京东等平台。 | V3 |
| 支付自动化 | 不在当前规划内,除非另行完成资金和合规评审。 | 未规划 |
### F-008 候选决策数据闭环(后置)
T-206/T-207 先跑通领取、执行、候选/证据和最小结果回传;T-208 再实现可用于优化的
完整数据闭环。不能为了建设未来训练数据阻塞第一版端到端流程,但 20 条真实任务试验
开始前必须完成 T-208,避免试验结束后才发现缺少曝光和人工标签。
1. 每次 search run 保存需求快照、精确搜索词、App/拼多多版本、采集时间以及最多
5 个实际曝光候选的原始 ordinal。该集合只是特定账号、地区、时间和平台排序下的
可见结果,不得宣称为全平台 Top 5。
2. 每个候选保存可观测标题、价格、规格文本、可选平台商品 ID/规范化链接、截图资产
和采集完整性。平台链接和图片链接可能短期有效,只是辅助字段,不能替代受控截图。
3. 候选观测、模型预测、本地推荐规则和人工结论必须分开保存。模型理由不能自动复制
为人工理由,也不能把模型预测当作真实标签。
4. 人工接受、拒绝、改选和全部无匹配都必须提供理由。第一版允许简短人工说明;
T-208 改为至少一个结构化理由码、一个主要理由和可选备注,选择 `OTHER` 时备注
必填。无预算任务不能使用预算匹配或超预算理由。
5. 拒绝推荐项并改选时,同时记录原推荐项的拒绝理由和替代项的选择理由;全部拒绝时
每个候选都要有拒绝理由。允许人员明确选择候选后批量应用同一理由,禁止静默预填
模型结论。
6. 人工修正使用追加版本和 `supersedes` 关系,不覆盖历史;理由 schema、模型、
prompt、阈值和推荐策略全部版本化。
7. 后端不得根据 Android 提交的任意 URL 抓取内容。候选截图由 App 有界上传,经真实
解码、大小/像素/哈希检查和脱敏后保存;外链只做不可执行文本并清除追踪参数。
8. 图片保留期限、平台条款、训练用途和人工备注隐私必须在 T-302 前固定。没有人工
结论的数据只能用于运行审计,不能计入模型准确率。
## 五、业务规则
1. 标题、SKU 和图片必填,描述可为空。
2. 数量必须是正整数;最高商品总预算如填写,必须大于零。总预算表示当前任务全部
数量的商品金额上限,不包含尚无法可靠确认的运费、优惠或支付金额。
3. SKU、数量和最高商品总预算以管理员输入为准,模型不得更改。
4. 一台设备同一时间最多有一条未过期 `CLAIMED` 或任意
`RUNNING/WAITING_CONFIRMATION` 任务。
5. 一条任务同一时间只能被一台设备持有;重复点击不能产生重复领取。
6. App 未就绪时不能领取:无障碍未连接、拼多多未安装、设备 heartbeat 过期或已有
活跃任务都必须说明原因。
7. 遇到验证码、登录失效、风控提示、页面未知、预算不满足或模型低置信度时停止,
不猜测点击。
8. MVP 的“成功”表示完成验证闭环并得到人工确认的候选结果,
`order_submitted` 必须为 `false`。
9. 取消和失败不得自动转成新任务;是否重试由人员显式决定。
10. 管理页面和管理 API 只允许有效 ADMIN 会话;App 执行接口只允许有效 BUYER 与
预授权设备联合身份,两种凭证不能互换。
11. 设备只能由本地管理命令预授权;首次 BUYER 登录可原子绑定空闲设备,客户端
不能自助登记、抢占或重新绑定他人设备。
12. 密码、设备 secret、管理 session 和 App access token 不得以明文持久化或进入
普通日志;禁用用户或设备后,已有凭证必须立即失效。
13. 管理登录和 App token 登录必须在高成本密码校验前按服务端观察到的来源地址限流;
超限返回通用错误和重试时间,不得泄露账号、角色或设备是否存在。
14. 管理员创建/取消和 App 状态迁移必须记录真实 user actor;设备操作还必须记录
device actor。heartbeat 不写高频事件;历史事件允许 actor 为空。
15. claim token 由 App 在请求前生成并安全保存,必须与幂等 key 独立;数据库只保存
SHA-256,API 和日志不得回显原值或 hash。
16. `CLAIMED` 租约过期后可以被原子回收;`RUNNING/WAITING_CONFIRMATION` 租约
过期后不得自动回到队列,避免失联设备与新设备重复执行。
17. 管理取消 `PENDING/CLAIMED` 可立即终态;执行中只设置取消请求,必须等 App 在
安全检查点确认停止后才能进入 `CANCELED`。
18. start 后默认运行授权为 30 分钟,App 每 30 秒 best-effort heartbeat;断网时可以
执行到服务端下发的截止时间,到期后必须安全停止。离线期间管理取消不能保证即时
生效,恢复连接后必须在继续动作前同步。
19. App 本地 VLM 配置不能来自任务 payload。后端不代理模型;端上 Key 必须加密存储,
模型不可用时允许显式切换 `MANUAL_FIRST`,不能阻塞人工完成任务。
## 六、第一层本地样本约定
第一层技术探针不依赖 Go-Gin。开发工具从用户明确指定的本机目录读取蝦皮订单样本,
规范化为与未来 API 一致的采购任务,再提供给 Android/VLM 工作流。
已经确认:
- 一份文本文件和一份参考图使用相同的蝦皮订单号作为主文件名,例如
`240725001234.txt` 与 `240725001234.jpg`。
- 文本包含自己的蝦皮店铺名、待采集商品标题、SKU 和数量。
- 2026-07-25 提供的首份样例是可按 UTF-8 解码的无 BOM 文本,固定四行标签为
`店铺名:`、`商品标题:`、`SKU:`、`数量:`。
- 首份同名参考图是可正常解码的 JPEG;具体像素尺寸只是样本事实,不作为固定限制。
- 蝦皮订单号作为外部来源标识,只用于关联样本和追踪,不作为内部数据库主键。
- 参考图和订单文本属于私有验证数据,不得提交 Git。
导入后至少形成以下不可变原始字段:
| 字段 | 来源 | 规则 |
| --- | --- | --- |
| `source_order_no` | 文件主名 | 必填;同一批样本内唯一。 |
| `source_store_name` | 文本 | 必填;日志和截图默认脱敏。 |
| `title` | 文本 | 必填。 |
| `sku` | 文本 | 必填;不得由模型改写。 |
| `quantity` | 文本 | 必须为正整数;不得由模型改写。 |
| `reference_image` | 同名图片 | 必填;缺失或匹配到多张时拒绝导入。 |
T-004 已固定首版规则:推荐私有目录为被 Git 忽略的 `private-fixtures/shopee/`,
导入命令仍要求显式目录;图片扩展名允许 `.jpg`/`.jpeg`,实际内容必须是唯一且可
解码的 JPEG;一张订单只允许一个 SKU 和一张参考图。多 SKU 或其他图片类型必须先
通过新样例扩展契约。解析器不得根据模糊内容猜测字段,也不得静默选择重名图片。
## 七、MVP 验收标准
### 单任务验收
- F-001/US-001/IX-002:合法输入创建后出现唯一任务编号和 `PENDING` 状态;非法
标题、SKU、数量、预算或缺失图片时在原表单显示可修复错误。
- F-002/US-002/IX-003:状态变化后管理页面能看到最新阶段、时间、设备、候选摘要
或结构化错误;无权限用户不可访问。
- F-003/US-003/IX-005:App 点击“获取任务”后原子领取一条任务;重复点击或多请求
不得领取第二条或把同一任务分配两次。T-205 已完成后端 heartbeat、原子 claim、
client-generated token 安全重放、参考图授权和租约;T-206 已完成 Android 手动
领取、安全存储、预览、start/release、前台 heartbeat 和恢复。
- F-004/US-004/IX-006:解析结果包含搜索词、识别属性、预算、数量、置信度和警告;
原始输入保留,硬约束与输入一致。T-103 已实现版本化 schema、0.75 置信阈值、
冲突转人工以及 SKU/数量的本地确定性回填;当前样本未提供预算,因此预算保持空。
- F-005/US-004/IX-006:在已验证的拼多多版本上,App 能从任务进入搜索结果并检查
最多 5 个候选;T-104 已把需求搜索词、当前候选证据和严格评估 schema 绑定,
无合理候选时明确结束而不是随意选择。
- F-006/US-005/IX-007:流程到达人工确认点后停止;MVP 任意路径都不能触发最终
提交订单或支付。T-104 的本地确认只允许标记建议候选可用或拒绝本次候选,
`order_submitted` 固定为 `false`。
- F-007/US-006/IX-008:失败包含稳定错误码、失败步骤、可读说明和必要截图;重新
打开任务后证据仍可查看。
- US-007/IX-001/IX-004:管理员可登录和退出,采购员可用预授权设备取得 1 小时
Bearer token;匿名、角色错误、禁用、过期、篡改和跨端凭证替代均被拒绝。
- F-009/US-009/IX-010:后台任务不能覆盖手机 VLM 配置;断开管理后端超过 90 秒后,
App 仍可在服务端下发的有限授权内执行,授权到期安全停止且任务不被重复分配。
### 试验验收
使用至少 20 条经采购人员确认的代表性任务:
- 至少 80% 能自动到达合理候选商品页或给出正确的“无匹配/需人工”结论。
- 至少 70% 的首选候选被采购人员判定可接受。
- 不发生重复领取、重复执行导致的不可逆操作或订单提交。
- 每条失败任务都能定位到具体步骤和错误类别。
- 记录每条任务的耗时、人工介入点和候选接受结果,用于决定是否进入 V2。
- 同时记录实际曝光候选、模型预测、系统推荐和人工结构化理由;准确率以人工结论为
标签,不能用模型自己的判断验证模型。
这些比例是进入下一阶段的验证门槛,不是正式生产 SLA。
## 八、范围决策
| 问题 | 当前决策 |
| --- | --- |
| 客户端形态 | 管理人员用 Web,采购人员用 Android App,共享统一后端。 |
| 任务到达 | MVP 由 App 手动领取;后续通知只作唤醒/提示。 |
| 搜索方式 | 先验证关键词搜索;拼多多原生以图搜图作为后续可选路径。 |
| 搜索结果 | 最多检查前 5 个可见候选,避免无界遍历。 |
| 下单边界 | MVP 停在候选或订单确认页,不提交订单、不支付。 |
| 账号边界 | 验证版为 ADMIN 会话 + BUYER/预授权设备联合身份;完整人员 RBAC 后置。 |
| 第一层任务输入 | 从本机私有蝦皮订单文件生成测试任务,不先建设 Go-Gin。 |
| 执行边界 | 手机本地完成 VLM、拼多多自动化和人工确认;后端负责身份、任务控制和结果审计。 |
| 离线边界 | start 默认授权 30 分钟;后端断线可继续到截止时间,过期安全停止且不自动重分配。 |
## 九、待确认与风险
- Roubao 上游仓库、许可证和远端构建版本已核实;源码导入、分支选择和本机构建仍由
`T-001` 完成。
- 首份蝦皮样本已由 T-004 真实导入验证;当前只支持单 SKU 和 JPEG,扩展格式需新
样例和独立任务。
- OnePlus PKG110、Android 16/API 36、拼多多 8.17.0 的首页、搜索输入、结果页、
候选卡和详情返回已形成可复现基线;不同账号、类目和页面实验的差异仍是风险。
- VLM 需求提取的 provider-neutral 合约和 OpenAI 兼容适配器已实现;真实供应商、
模型、测试凭证、成本上限、数据留存地区和图片隐私规则仍待确认。候选评估契约和
本机 mock 集成已实现,但尚无真实模型质量证据。
- 拼多多平台条款、自动化允许范围和账号风控需要业务方确认;项目不实现绕过措施。
- 后续若允许提交订单,必须先明确 SKU、收货地址、运费、优惠、发票、金额审批、
幂等和人工确认规则,并单独更新需求。
- “最终产品是否自动支付”没有定案,当前明确排除。