2. 四通道连接层
| 序 | 通道 | 技术 | 适用 | 限制与兜底 |
| 1 | USB(WebUSB) | WebUSB API,直连 CDC | β Dongle 主路径 | 需 https/localhost;失败降级到 2 |
| 2 | USB(Web Serial) | Web Serial API | WebUSB 不可用时兜底 | 需用户手动选端口 |
| 3 | Wi-Fi(HTTP) | fetch 直连板子 IP | 同局域网、α 模组 | 须 CORS;须 http/localhost 页面 |
| 4 | 救砖(esptool-js) | 串口 ROM bootloader | 设备变砖、固件损坏 | 唯一救砖通道,不可移除 |
浏览器访问不了 USB 大容量存储(MSC)。虚拟 U 盘是 OS 层概念,JS 没有 API 枚举或写入它。
所以「拖 .emf 进虚拟 U 盘」在 Web GUI 里做不到。Studio 只能:生成 .emf 供下载 + 引导用户拖拽,执行者是文件管理器。
UX 依然成立(LED 蓝快闪 → 绿常亮可作确认),但不得当成浏览器功能排期。
2.1 连接状态机
IDLE ──选择通道──> PROBING ──成功──> AUTHED ──> READY
│ │
└─失败→ FALLBACK(下一通道) └─心跳超时→ LOST ──重连──> PROBING
READY ──> BUSY(灌库中,进度条+断点续传) ──> READY | FAILED(已回滚,库完好)
READY 时立即拉取 /api/store/map 与 /api/mem/stat,展示容量、条数、碎片清单。LOST 状态必须明确区分「设备掉线」与「灌库失败」——后者要求库完好如初。
5. 预设 Prompt 全集(P0–P5)
以下为可直接复制的 Prompt 模板。{{...}} 为运行时替换变量。所有 Prompt 的共同主线:把「记忆会挑」翻译成可执行规则。
P0 · 规格卡生成(把用户访谈成规格)
你是 EdgeMemory 知识库架构师。你要为一块**设备端记忆外设**设计知识库规格。
这块设备是 MCU 级(ESP32-S3),容量约 {{cap_kb}} 条记忆,**不跑模型、不联网**,
所有检索在本地完成。因此这份规格必须极度克制:宁可少而准,不可多而杂。
【输入】
- 使用者:{{user_desc}}
- 宿主设备:{{host_desc}}
- 运行环境:{{env_desc}}(是否常断网?)
- 场景类型:{{scene}}
【请你输出一份规格卡,包含以下六项】
1. 使用者画像(3 句话内)
2. 杀手问题 10 条:这块记忆**必须答对**的 10 个问题。
要求:每条都是**真实会被问到**的,不是百科知识;按重要性降序。
3. 红线清单:绝对不能给出的回答(如医疗剂量、法律定性、竞品价格)。
每条给出「触发条件」与「应当如何拒答」。
4. 术语别名表:同义词 / 缩写 / 行业黑话 → 标准词。至少 15 组。
5. 时效策略:哪些类别的知识会过期?分别多少天?哪些永不过期?
6. 答错代价分级:A=可能造成人身/财产损害;B=造成返工或误判;
C=仅造成不便。把第 2 步的 10 条杀手问题分别标级。
【约束】
- 自洽:六项之间不得矛盾。若使用者画像与杀手问题冲突,直接指出并修正。
- 容量意识:总条目数不得超过 {{cap_kb}}。若 10 条杀手问题撑不下,
明确说明应砍掉哪些。
- 输出为 JSON,键名:persona / killer_questions / redlines /
aliases / ttl_policy / cost_grades
P1 · 红线与拒答话术
基于以下规格卡,生成「拒答话术」清单。
规格卡:{{spec_card}}
对每一条红线,生成:
- trigger:触发条件(可用关键词或语义描述)
- reply:拒答话术(**中文,不超过 40 字**)
- alternative:能给出的替代信息(如「请查阅设备手册第 X 章」;
若无则填 null)
【原则】
- 宁可拒答,不可编造。这一点比召回率重要。
- 话术必须**承认不知道**,不要说「根据我的知识…」之类的模糊表述。
- 同一条红线在不同上下文下可能不触发,请在 trigger 中写清边界。
输出 JSON 数组。
P2 · 知识条目生成(按记忆优先级排序生成)
基于规格卡生成知识条目。目标 {{target_count}} 条。
规格卡:{{spec_card}}
拒答清单:{{redlines}}
【生成顺序 —— 严格按此顺序,不得打乱】
1. 先覆盖 10 条杀手问题(每条 3–5 个条目变体,覆盖不同问法)
2. 再覆盖红线(每条红线 1 个条目,内容为「如何拒答」的元知识)
3. 再覆盖术语别名表的同义表述
4. 最后才是背景知识(按重要性降序,直到达到目标条数)
【每条条目格式】
{
"text": "摘要,不超过 150 字节(UTF-8,中文按 3 字节算)",
"meta": {"tags": ["..."], "src": "...", "scene": n},
"prio": 0-1000, // 杀手问题相关 ≥ 800;背景知识 ≤ 400
"ttl_h": 0 或 小时数
}
【硬约束】
- text **必须** ≤ 150 字节。超了就重写,不要截断。
- 不得出现规格卡未定义的术语(别名表之外的同义词视为噪音)。
- 不得生成与已有条目**语义重复**的内容(见 P3)。
- 一次输出不超过 50 条,我会分批请求。
P3 · 去重与合并
以下是本批次新生成的条目,以及库中已有的条目摘要(仅向量相似度 > 0.85 的候选)。
新条目:{{new_items}}
相似候选:{{similar_items}}
对每一对新条目 × 候选,判断:
- MERGE:语义重复,合并(保留 prio 更高者,hit_count 累加)
- KEEP_BOTH:语义不同,都保留
- DROP_NEW:新条目是候选的子集,丢弃
【判据】
余弦相似度 > 0.95 → MERGE
0.85–0.95 → 人工判断(输出你的理由)
< 0.85 → KEEP_BOTH
输出 JSON 数组:{"new_id":..., "action":..., "reason":...}
P4 · 验收用例 20 条(会打进 .emf 包里)
基于规格卡生成 20 条验收用例,用于**现场断网自检**。
规格卡:{{spec_card}}
每条用例:
{
"q": "提问(真实问法,不要书面语)",
"expect_top1": "期望命中的条目 text 片段",
"must_refuse": false, // true = 必须拒答
"min_score": 0.0-1.0
}
【分布要求】
- 10 条来自杀手问题(其中至少 3 条 must_refuse = true)
- 5 条来自术语别名(问法用别名,期望命中标准词条目)
- 3 条来自背景知识
- 2 条**故意问库中没有的知识**(must_refuse = true,验证「会挑」)
这些用例会被写进 .emf 包,设备端可执行 /api/frag/verify 离线自检。
P5 · 断网话术模板
生成「断网时怎么说不知道」的话术模板。
规格卡:{{spec_card}}
这是本产品最独特的部分:竞品的记忆引擎**全在云端**,断网即失忆。
我们的设备断网仍可检索,但必须诚实告知能力边界。
生成三类模板:
1. 命中但置信度低(top-1 分数介于 min_score 与阈值之间)
2. 完全没命中
3. 命中了但知识已过期(ttl 已过,条目标记待更新)
每类给出:
- 中文话术(≤ 40 字)
- 是否提示「联网后可更新」
- 是否提示「附近设备可能有」(EdgeMesh 接力可用时)
输出 JSON。
P4 生成的 20 条验收用例会打进 .emf 包里,现场断网也能自检——这是「记忆健康检查」卖点的实现基础,也是 P5 存在的理由。