oh-my-muse/design-docs/临时-02-market-install下游物化方案.html
lili 26ff1af374 docs(market): market install 下游物化方案设计文档(评审版、待 review 拍板)
market install 后下游物化方向(用户选)方案设计:深调研 2 agent+spot-check 坐实两物化断点——install 只写 muse_market_installation 与 ai/knowledge 解耦、KB bind kbId=parseLong(sourceId)不建本地 muse_knowledge_base 行致检索 no_dataset 第四门省略、agent slot 放宽但 runtime requireVisibleAgent 拒裸引用。出 C(完整物化)/B(惰性)/B(installed_ref 最小留痕)/暂缓 四方案对比。

推荐 B(installed_ref 最小留痕、KB 优先共享发布者 dataset、物化落点放目标域绑定路径非 install——handoff 非物化桥、安装解耦正确不应改)。地基不对称坐实:KB(V5 kb_type/source_market_asset_id)+agent(V27 source_market_asset_id、注释物化后续主线本列先就位)列已备、但 agent market_installed 类型有文档(后端-04)无实现→两域工程量不同。决策点待拍板:物化深度(倾向 B)、时机(绑定同步非惰性)、dataset 共享 vs 复制(唯一硬风险、共享前必验多租户 RAGFlow 隔离)、agent market_installed 落地量(否则 KB 先行)、召回回滚。两图文+大纲注册。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 06:47:45 -07:00

193 lines
14 KiB
HTML
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.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>临时-02 · Market Install 下游物化方案(人读图)</title>
<style>
:root{
--bg:#0f1419; --panel:#1a2129; --ink:#e6edf3; --sub:#9fb0bf; --line:#2b3641;
--green:#3fb950; --green-bg:#11331c; --red:#f85149; --red-bg:#3a1718;
--blue:#58a6ff; --blue-bg:#10243e; --amber:#d29922; --amber-bg:#3a2c0a;
--purple:#bc8cff; --purple-bg:#241634;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
line-height:1.6;padding:32px 20px 80px}
.wrap{max-width:1140px;margin:0 auto}
h1{font-size:24px;margin:0 0 6px;letter-spacing:.3px}
.meta{color:var(--sub);font-size:13px;margin-bottom:22px}
.tldr{background:linear-gradient(135deg,#10243e,#142e1c);border:1px solid var(--line);
border-radius:12px;padding:18px 22px;margin-bottom:30px;font-size:15px}
.tldr b{color:var(--blue)} .tldr .rec{color:var(--green);font-weight:700}
h2{font-size:17px;margin:38px 0 14px;padding-left:12px;border-left:4px solid var(--blue)}
.sub{color:var(--sub);font-size:13.5px;margin:-6px 0 14px}
/* 断点链路 */
.chain{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:6px}
@media(max-width:820px){.chain{grid-template-columns:1fr}}
.lane{border:1px solid var(--line);border-radius:12px;padding:16px;background:var(--panel)}
.lane h3{margin:0 0 12px;font-size:15px;display:flex;align-items:center;gap:8px}
.lane.kb h3{color:var(--blue)} .lane.agent h3{color:var(--purple)}
.node{font-size:13px;padding:9px 12px;border-radius:8px;margin:7px 0;border:1px solid var(--line);background:#141b22}
.node .lbl{font-size:11px;color:var(--sub);display:block;margin-bottom:2px}
.node.ok{border-color:#1f6f33;background:var(--green-bg)}
.node.warn{border-color:#7a5a12;background:var(--amber-bg)}
.node.bad{border-color:#7d2a2a;background:var(--red-bg)}
.node.add{border-color:#27ae60;background:var(--green-bg)}
.arrow{text-align:center;color:var(--sub);font-size:15px;line-height:1;margin:2px 0}
.break{font-weight:700;color:var(--red);font-size:13px;margin-top:4px;display:flex;gap:6px;align-items:flex-start}
.fix{font-weight:700;color:var(--green);font-size:13px}
.code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:var(--amber)}
/* 对比表 */
table{width:100%;border-collapse:collapse;margin-top:6px;font-size:12.8px;background:var(--panel);
border-radius:12px;overflow:hidden}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}
th{background:#222c36;color:var(--ink);font-weight:600;font-size:12.5px}
td:first-child,th:first-child{white-space:nowrap}
.opt{font-weight:700}
.opt.c{color:var(--amber)} .opt.bp{color:var(--green)} .opt.b{color:var(--blue)} .opt.h{color:var(--sub)}
.pill{display:inline-block;font-size:11px;padding:1px 8px;border-radius:5px;font-weight:600}
.p-hi{background:var(--green-bg);color:var(--green)}
.p-mid{background:var(--amber-bg);color:var(--amber)}
.p-lo{background:var(--red-bg);color:var(--red)}
.star{color:var(--green);font-weight:700}
/* 决策点 */
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px}
@media(max-width:820px){.grid2{grid-template-columns:1fr}}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:15px}
.card h4{margin:0 0 6px;font-size:13.5px;color:var(--blue)}
.card p{margin:5px 0;font-size:12.8px;color:var(--sub)}
.card .lean{color:var(--green);font-weight:600}
.legend{font-size:12px;color:var(--sub);margin-top:8px}
.badge{display:inline-block;font-size:10.5px;padding:1px 7px;border-radius:20px;font-weight:600;border:1px solid}
.b-add{color:var(--green);border-color:var(--green);background:var(--green-bg)}
.note{background:var(--blue-bg);border:1px solid #1c3a5e;border-radius:10px;padding:12px 15px;font-size:12.8px;color:var(--ink);margin-top:14px}
.note b{color:var(--blue)}
</style>
</head>
<body>
<div class="wrap">
<h1>临时-02 · Market Install 下游物化方案</h1>
<div class="meta">评审版 v1 · 2026-06-26 · 给人一眼看懂:两个物化断点 / 四方案权衡 / 关键决策点 · 配套工程稿见同名 .md</div>
<div class="tldr">
用户从市场<b>安装</b>智能体或知识库后<b>点不出效果</b>:知识库检索静默落到“无数据集”而命不中,智能体在生成任务里被运行期直接拒绝。
根因不是安装坏了——安装按设计<b>只记账、不物化</b>是对的;错在本该承接物化的<b>目标域绑定路径只写了引用、没造出真实体</b>
<span class="rec">推荐 B'installed_ref 最小留痕,知识库优先共享发布者数据集),物化落点放在目标域绑定路径;完整物化 C 留作远期;暂缓是合理过渡(至少先把“静默断点”改成“诚实标注未开放”)。</span>
</div>
<h2>① 两个物化断点(现状:安装→绑定只写引用,下游必然失败)</h2>
<div class="sub">安装只写 <span class="code">muse_market_installation</span> + 授权投影,<span class="code">targetFactsWritten=false</span>。物化本该在目标域绑定路径发生,但现状那一步也只写了引用。</div>
<div class="chain">
<div class="lane kb">
<h3>🔵 知识库 — 断点①:检索“数据集门”拿不到数据集</h3>
<div class="node"><span class="lbl">目标域绑定</span>createKnowledgeBinding消费 handoff token</div>
<div class="arrow"></div>
<div class="node bad"><span class="lbl">现状只写</span>binding + 来源投影;<span class="code">kbId = parseLong(sourceId)</span><br>❌ 不建 muse_knowledge_base 实体</div>
<div class="arrow"></div>
<div class="node">检索四门:用途 ✓ · 授权 ✓ · 来源状态 ✓</div>
<div class="arrow"></div>
<div class="node warn"><span class="lbl">第四门</span><span class="code">selectActiveDatasetByKbId(kbId)</span> → null<br>(无本地 KB → 无 ragflow_binding 数据集行)</div>
<div class="break">🔴 <span>记为 <span class="code">no_dataset</span> 静默省略,检索仍 fail-closed 返回。<br>用户:检索悄无声息命不中,<b>不报错</b>,无从排查。</span></div>
</div>
<div class="lane agent">
<h3>🟣 智能体 — 断点②:运行期“二次校验”拒绝</h3>
<div class="node"><span class="lbl">目标域绑定</span>bindAgentSlotmarketHandoff 仅放宽<b>属主可见性</b></div>
<div class="arrow"></div>
<div class="node bad"><span class="lbl">现状只写</span>slot binding <b>裸引用</b>(指向 market 出身 agentId<br>❌ 不建 muse_agent / muse_agent_version</div>
<div class="arrow"></div>
<div class="node">运行期 resolveAgentForTask → requireVisibleAgent</div>
<div class="arrow"></div>
<div class="node warn"><span class="lbl">关键</span>此路径<b>不带 marketHandoff 放宽</b>,按“系统/本人 user + active 版本”校验</div>
<div class="break">🔴 <span><span class="code">AI_AGENT_NOT_EXISTS</span> / <span class="code">SCOPE_FORBIDDEN</span><br>用户AI 任务<b>直接失败</b>,尽管市场标“已安装、已绑定”。</span></div>
</div>
</div>
<div class="note"><b>边界澄清:</b>handoff token <b>不负责物化</b>——市场侧 target owner facade 只生成跳转 URL真正写目标事实及未来物化发生在<b>消费域内部</b>,目标域在自己的事务里核销 token + 写事实。正确链路是 <b>install(记账) → 跳转 → 目标域绑定路径(消费 token + 写绑定 + 物化)</b>不是“install 直接物化”、也不是“handoff 自己物化”。</div>
<h2>② B' 物化后:在目标域绑定路径补建实体(同事务、原子)</h2>
<div class="sub">不复制资产,建轻量“安装引用型”实体让下游能解析;底层数据集/配置优先共享发布者的。地基大半已备:<span class="code">muse_knowledge_base</span><span class="code">kb_type=installed_ref</span> / <span class="code">source_market_asset_id</span> / <span class="code">license_snapshot_id</span> 在 V5 就有。</div>
<div class="chain">
<div class="lane kb">
<h3>🔵 知识库 B'</h3>
<div class="node">createKnowledgeBinding写 binding + 投影(不变)</div>
<div class="arrow"></div>
<div class="node add"><span class="badge b-add">新增</span> 建 muse_knowledge_base<br><span class="code">kb_type=installed_ref</span><span class="code">source_market_asset_id</span> 溯源</div>
<div class="arrow"></div>
<div class="node add"><span class="badge b-add">新增</span> 建 ragflow_binding<br>指向<b>发布者数据集(共享,不复制)</b></div>
<div class="arrow"></div>
<div class="node ok">检索第四门 → 拿到数据集 ✓ → <b>命中,用户可见效果</b> 🟢</div>
</div>
<div class="lane agent">
<h3>🟣 智能体 B'</h3>
<div class="node">bindAgentSlot写 slot binding不变</div>
<div class="arrow"></div>
<div class="node add"><span class="badge b-add">新增</span> 建 muse_agent<span class="code">market_installed</span> 型)<br>+ active muse_agent_version引用发布者 config</div>
<div class="arrow"></div>
<div class="node warn"><span class="badge b-add">需扩展</span> 运行期 requireVisibleAgent<br>放行“授权有效的 market_installed”</div>
<div class="arrow"></div>
<div class="node ok">运行期解析通过 → <b>AI 任务可跑</b> 🟢</div>
</div>
</div>
<div class="note"><b>智能体侧多一层成本:</b><span class="code">market_installed</span> 类型<b>有文档无实现</b>——<span class="code">后端-04</span> 写了 <span class="code">muse_agent</span> 区分 system/user/market_installed但现网 DDL/代码仅 system/user。B' 智能体需先把这类型落成真实 schema + 运行期放行,工程量略大于知识库。可考虑<b>知识库先行、智能体视工程量分阶段</b></div>
<h2>③ 四方案权衡(本质区别 = 物化深度:造多真的实体 / 复制还是共享数据集)</h2>
<table>
<thead><tr>
<th>方案</th><th>做什么</th><th>用户价值</th><th>工程成本</th><th>数据集</th><th>跨租户</th><th>幂等</th>
</tr></thead>
<tbody>
<tr>
<td class="opt c">C 完整物化</td>
<td>复制成租户独立 agent/kb 实体 + 复制 RAGFlow 数据集</td>
<td><span class="pill p-hi">最高</span> 自洽副本,发布者改版/下架不影响</td>
<td><span class="pill p-lo">最高</span> 数据集克隆+重索引异步重活agent 类型还要落地</td>
<td>复制 · <b>N 倍放大</b></td>
<td>隔离天然干净</td>
<td><span class="pill p-lo"></span> 避免重复克隆</td>
</tr>
<tr>
<td class="opt bp">B' 最小留痕 <span class="star">★ 推荐</span></td>
<td>建 installed_ref 实体;数据集/配置<b>优先共享</b>发布者</td>
<td><span class="pill p-hi"></span> 终态等价 C命中/可跑),最小正确步</td>
<td><span class="pill p-mid"></span> kb 地基已备不碰数据集复制agent 需补类型</td>
<td>共享 · <b>不放大</b></td>
<td><span class="pill p-mid">需验证</span> 共享数据集的隔离</td>
<td><span class="pill p-hi"></span> 唯一键+命令回放</td>
</tr>
<tr>
<td class="opt b">B 按需物化</td>
<td>安装/绑定只留引用,<b>首次使用时</b>惰性物化</td>
<td><span class="pill p-mid"></span> 终态同 B',但首用有延迟</td>
<td><span class="pill p-lo">反更高</span> 热路径插写+外调,破坏读写分离</td>
<td>共享(同 B'</td>
<td>同 B'</td>
<td><span class="pill p-lo">最难</span> 热路径并发首用</td>
</tr>
<tr>
<td class="opt h">暂缓</td>
<td>维持现状 + <b>诚实标注“未开放”</b> + 留接口位</td>
<td><span class="pill p-lo"></span> 仍不可用,但消除“静默骗用户”</td>
<td><span class="pill p-hi">最低</span> 文档/文案为主</td>
<td>不涉及</td>
<td>不涉及</td>
<td>不涉及</td>
</tr>
</tbody>
</table>
<div class="legend">演进关系:<span class="opt bp">B'</span> ──(当“安装者需独立改造副本/发布者频繁改版冲击安装者”成真实痛点)──▶ <span class="opt c">C</span><span class="opt h">暂缓</span> 是合理过渡兜底,不是“什么都不做”——最低限度也要把现状的静默断点降级为诚实提示。</div>
<h2>④ 待人类拍板的关键决策点</h2>
<div class="grid2">
<div class="card"><h4>1. 物化深度(最关键)</h4><p>完整 C / 最小 B' / 暂缓。</p><p class="lean">倾向 B' 优先C 远期演进。</p></div>
<div class="card"><h4>2. 物化时机</h4><p>安装同步 / 绑定同步 / 异步 worker / 惰性首用。</p><p class="lean">倾向绑定同步(与 token 消费原子);不选惰性。</p></div>
<div class="card"><h4>3. 数据集:共享 vs 复制 ⚠️</h4><p>B' 与 C 的分水岭,也是 B' 唯一硬风险点。</p><p class="lean">选共享前<b>必须先验证</b>多租户共享同一 RAGFlow 数据集的隔离是否隔得住。</p></div>
<div class="card"><h4>4. 智能体 market_installed 落地</h4><p>是否接受“补 schema + 运行期放行”工程量。</p><p class="lean">若暂不接受,可知识库先行、智能体暂缓。</p></div>
<div class="card"><h4>5. 授权快照承载</h4><p>沿用 ADR-020 字符串 envelopeVARCHAR</p><p class="lean">market_installation 两列 BIGINT 残留建议<b>不纳入本方案</b>,作独立契约议题。</p></div>
<div class="card"><h4>6. 来源溯源与回滚</h4><p>经 source_market_asset_id 溯源;来源召回/下架的处置。</p><p class="lean">倾向复用 muse_source_propagation_target阻断新使用、不自动删。</p></div>
</div>
</div>
</body>
</html>