retaintive LLM 平台架构图解

Date: 2026-06-25 Status: Draft(图解配套版,配合 架构终态文档 读)


0. 这份文档怎么用

这份是图解版——把 架构终态文档 里的三平面模型画成图。两张图:

  • 图 1(§2):现在的系统整理好后长什么样(push context,没有 tool/agent)。
  • 图 2(§3):以后加 RAG / tool / Vapi,新功能该放在哪一层。

配一张 tool loop 时序图(§3.3),因为「模型→授权→执行→拿结果→再问模型」这种循环,用时序图比框图清楚。

为什么用 Mermaid 不用 ASCII / drawio:Mermaid 是文本写、引擎自动对齐渲染、能进 git 做 PR review。这个 Rspress 站点已通过 rspress-plugin-mermaid 支持 fenced Mermaid block;drawio 源文件仍可放在 docs/public/diagrams/,但这类会频繁改动的架构分层图更适合直接写在 Markdown 里。


1. 三个平面,一句话各是什么

读图前先记住三个平面(详细定义见终态文档 §2):

平面一句话改动节奏retaintive 里对应
Governance / Release Plane(治理/发布面)「发版本」——管这次请求被允许用哪个 prompt/model/schema/policy 版本慢,走 review + eval + 发布prompt-version.ts、common/taxonomy、ContactsAnalysisSchema、provider-routing
Data Plane(数据面)「跑请求」——一条请求真正怎么走:取 context → 组装 → 调模型 → 裁决 → 写库每条请求都跑contacts-analyzer / ai-analysis-processor handler
Cross-cutting Plane(横切面)「全程盯着」——trace / audit / 幂等 / eval,贯穿每一步不是最后一步持续Traceplane、Policy Guard、aiRunStartedAt、golden eval

⚠️ 命名提醒:官方 六层基座文档 把「Policy Guard / 裁决」那层叫 "Control Plane"。本文为不混淆,把「发版本的治理」叫 Governance / Release Plane,把「运行时拦请求的裁决关」叫 Runtime Gate(图里的 Proposal Commit Gate / Tool Authorization Gate)。前者慢、影响所有请求;后者快、每条请求都过、代码权威。


2. 图 1:现有系统整理好后(push context,单向)

怎么读:从上往下一条线。Governance 在最上面发出一个 bundle 注入 Data PlaneData Plane 单向走到写库;写库是一个 Neon 原子事务(业务表 + Decision Ledger 同生共死);最后投射给客户。Cross-cutting 在右边,贯穿全程。

图 1 相对今天唯一新增的实体Decision Ledger(和业务表同事务)+ Product Projection 投射层。其余全是把已有的(Traceplane / promptVersion / Policy Guard / 原子 batch)钉进格子。


3. 图 2:加 RAG / Tool / Vapi 后,新功能放哪

加了 tool/agent 后,Data Plane 从「单向」变「循环」:模型可以中途说「我要调个工具」,拿到结果再继续。但图 1 那条「唯一写库关」不变。新多出来的是一条「工具授权关」和一个「受控执行层」。

3.1 新功能放置总览(flowchart)

怎么读:Governance 多了 4 个 [+] 新格子(都进 bundle);Data Plane 里模型输出会分叉——要么「最终 proposal」直接去 Commit Gate(和图 1 一样),要么「tool call」先过 Tool Authorization Gate,执行后回到 Context 再循环

3.2 不变的内核(无论加什么)

模型只能 propose,Runtime Gate(代码)才能 authorize,Execution Service 才能 execute,每个动作进 Ledger。 RAG/tool/Vapi 让链路从单向变循环、context 源变多、「执行」变真,但这条 + 原子写 Ledger 永远不变。这是系统世界观的死规矩。

3.3 tool loop 时序图(循环用时序图最清楚)

怎么读:竖线是参与者,箭头是「谁调谁」,从上往下是时间。loop 框表示「可能来回好几轮」,直到模型给最终 proposal。注意 write tool(Vapi/SMS)比 read tool 多一步人工审批。


4. 放置决策表:新功能该加在哪

这是这两张图最重要的用途——以后任何新功能一来,查表就知道加哪层、挂什么 ID、要不要留痕。

4.1 拿到新功能先问三个问题

4.2 常见新功能 → 加在哪(速查表)

如果你要加…加在哪一层挂哪些 ID / 进哪个 ledger为什么
新 prompt 写法 / 新 sectionGovernance: Prompt Registrybump promptVersion + 重算 hash → 进 releaseBundle影响所有请求,必须可复现可回滚
换 model / 加 fallbackGovernance: Model Routing进 bundle 的 model 字段同 prompt 换 model 输出会变
新 task 类型 / 新 enumGovernance: Taxonomy(common)bump taxonomyVersion → 进 bundle从 common 渲染,绝不在 prompt 手写第二份
新 Policy Guard 规则(如新 DNC)Data Plane: Runtime Gate裁决进 Decision Ledger死红线在代码,不在 prompt;拒了要留痕
新 context 源(如接 CRM 只读)Data Plane: Context 获取带 storeId/tenantId scope隔离在数据访问层
新 AI 输出面(coaching / call 分类)Data Plane: 新 schema + Builder复用同一 bundle + Ledger共享底座 + 薄 harness,不另起一套
新阈值(如 lead outreach 天数)Governance: Policy/Threshold进 bundle 的 policy 字段部署级配置,影响裁决
新渠道入口(如 Salesforce 事件)Data Plane: 入口/Trigger生成 aiRunId / 带 source进门平等、信任不平等
RAGData Plane: Context 获取 + Governance: RAG Index Registry带 tenant namespace;index 版本进 bundle它只是「多一个 context 源」,是参考非权威,不改裁决关
只读 tool(查 CRM/POS)Governance: Tool Catalog + Data Plane: tool looptool_call_id + capability envelope + tenant-scoped authz + Ledger即使只读也要 tenant 隔离,否则跨租户取数
Vapi / 写 tool(打电话/发 SMS)Governance: Capability Envelope + Data Plane: Execution Serviceapproval queue + Agent Log + Ledger一句话出口=对客户真实影响 → 必须人批 + 记账;AI 永不直接调外部 API
Agent objectiveGovernance: Objective Config进 bundleobjective 必须可量化、代码能校验
给客户展示「AI 为什么这么判」投射层(读 Neon evidence + Ledger)不读 Traceplane客户看 evidence + 裁决,不看 prompt hash/token
内部 debug 某次 runCross-cutting: Traceplane replay用 aiRunId / bundleId 查Traceplane 内部 observability,不面客
模型/prompt 漂移监控Cross-cutting: Evaluationgolden eval + DB replayeval 是发布流程一部分,不阻塞请求

4.3 三条「放错地方」的红线

❌ 把死红线(DNC/store隔离/写入权限)写进 prompt
   → 必须在 Data Plane / Runtime Gate 的代码里(prompt 只帮模型少犯错,不是权威)

❌ 把「绝不静默丢弃」放进 Traceplane(fail-open 可丢)
   → rejected/skipped 必须进 Neon Decision Ledger,且和业务 mutation 同一个 db.batch 原子事务
     (业务改了但 ledger 没记 = 正好制造了静默丢弃)

❌ 只存 bundleId 的 hash,不存可读 components
   → hash 只能追责,不能解释「当时用了啥」。必须同时存 resolved model/params/versions

❌ 让新功能各自拼一套 prompt / 各自记一套 trace
   → 新输出面复用同一底座(bundle/Ledger/Traceplane/eval)。厚底座薄壳子

5. 这和 prompt 分层工作怎么对上

如果当前在改 contacts-analyzer prompt 分层,对照图 1,改的是 Data Plane 里「③ LLM Request Builder」那一格的内部结构。这个方向是需要的,但它只是 Governance → Data 这条线上的一个组件。

  • prompt 分层 = Data Plane / Builder 内部整理,继续做
  • 没碰 releaseBundle 收敛、Decision Ledger、Traceplane 记结果 —— 这些是下一批独立工作,不该塞进同一个 prompt 分层改动
  • schema 从 prompt 手写挪到 request body = 也是 Builder 内部 ✅ 同 branch 可做

6. 落地顺序(架构演进,不是细粒度 issue)

Phase做什么关键约束
ABuilder 分层:prompt sections 重组 + schema 移 request body + taxonomy 从 common 渲染不碰数据模型,纯 Builder 内部
BreleaseBundle 收敛:入口算 bundleId,同时存可读 components 不只 hash,所有写入点带上它收敛,不造新表;区分 releaseBundleId vs assembledPromptHash
CDecision Ledger(唯一真缺口):先定 4 条 contract(同 db.batch 原子事务 / 粒度 / tenant+PII scope / customer reason taxonomy),再补 task_decision_attempts复用 repo 已有 atomic-batch 硬约束
DTraceplane 记结果:从「只记 input+proposal」扩成「也记裁决结果」演进现有,不重建;仍是内部 fail-open sink
E(Demo 后)客户可见性投射:evidence 链 + Ledger 投射成 Studio「为什么有/没有任务」产品差异化
F(更后)tool calling / agent:Tool Catalog + capability envelope + approval queue + Agent Log + LLM Gateway官方 final-state 的「Demo 后」缺口,前提是 A-D 做完

7. 调研依据

  • 画图方式:本 Rspress 站点通过 rspress-plugin-mermaid 渲染 Mermaid;复杂架构图的 drawio 源文件放在 docs/public/diagrams/。这类需要随文字同步 review 的架构图优先用 Mermaid。
  • 架构判断:见 架构终态文档 §10 调研依据(含 live code anchors)。
  • 两张图经 Codex adversarial review 修正(箭头方向、两 gate 拆名、releaseBundle vs assembledPromptHash 分层、原子事务框、Approval Queue 独立、read tool 也需 authz 等)。