首页/架构/功能架构

功能架构

这一页讲 Trove 的功能与边界:产品有哪些功能块、分给谁用、 怎么串成一条链路、哪些事刻意不做。代码怎么分层在系统架构, 一次提问经过了哪些节点在查询工作流—— 本页不重复机制细节,只把功能说全、把边界划清。

两个界面,三种角色

Trove 对外只有两个界面:用户端(提问与读答案)与 管理台(治理与运营)。功能按角色投放—— 用户看到的数据源也已被两层授权筛过(数据源授权 + 主题域授权), 只有「已连接且知识库已初始化」的数据源才可能出现。

能力的投放方式:挂载,而不是拦截

管理台入口、生成时的 schema 枚举工具,都是按角色与档位挂载的:不具备就不出现,而不是出现了再被拦回来。服务端接口另有自己的鉴权(fail-closed)——两道门各自成立。

角色在哪工作能做什么
普通用户 用户端 提问;读答案的每一块(结论 / 结果表 / 图表 / 依据抽屉 / 归因分析卡);会话管理与反馈;切换主题域
分析员 用户端 + 管理台(只读) 普通用户的全部;管理台只读浏览(数据源、知识库、语义层、判定历史等);生成时可用 schema 枚举工具(值确认 / 结构懒加载 / 执行计划)。不能改任何治理内容
管理员 管理台 数据源注册、知识库初始化 / 学习与确认、语义模型编辑与版本回滚、判定规则、订阅与定时任务、行动审批、Skills、记忆确认、主题域与授权、审计、系统设置与模型配置

功能块:四段链路,一层支撑

首页把 Trove 概括为一条链路——问数 · 分析 · 决策 · 行动。 落到功能上,每一段都有用户端形态与管理端配套。图 1 是功能分解(不是调用图): 四段链路在上,一层横向支撑在下——支撑层不对应某一个环节, 而是所有环节共用的治理与沉淀。

flowchart TB
    %% 配色 = 站点 token 的半透明版,与总览页同一套链路色(问数 indigo · 分析 teal ·
    %% 决策 amber · 行动 violet · 外部 zinc 虚线);半透明填充 + 实色描边,亮暗两档同源
    subgraph chain["链路:问数 · 分析 · 决策 · 行动(终点在系统外)"]
        direction LR
        Q["问数<br/>提问 → 可核对的答案<br/>对话问答 · 可答边界<br/>扩展确认 · 元数据 · 澄清"]:::q
        A["分析<br/>「为什么」的分解与检验<br/>归因卡 · 噪声带 · 来源四档"]:::a
        D["决策<br/>算不算有问题,有多确定<br/>判定规则 · 历史对照 · 订阅<br/>因果升级梯 · What-if<br/>主动扫描 · 质量回评"]:::d
        ACT["行动<br/>停在一份可审计的提案<br/>提案 · 审批 · 拉通道<br/>回执对账 · 效果验收"]:::act
        EXT["外部系统<br/>执行与后果"]:::ext
        Q --> A
        A --> D
        D --> ACT
        ACT -.->|回执对账| D
        ACT -.->|交付 / 回执| EXT
    end
    SUP["横向支撑(所有环节共用)<br/>知识库 · 语义模型 · 记忆 · Skills<br/>主题域 · 权限 · 审计 · 令牌 · 评测台<br/>人工确认的闸门贯穿全部"]:::sup
    %% 带间不连线:跨带边会让带内 direction LR 失效(mermaid v11),支撑层用单节点绕开
    chain ~~~ SUP
    classDef q fill:#6366f11f,stroke:#6366f1,stroke-width:2px;
    classDef a fill:#14b8a614,stroke:#14b8a699,stroke-width:1.5px;
    classDef d fill:#f59e0b14,stroke:#f59e0b99,stroke-width:1.5px;
    classDef act fill:#8b5cf614,stroke:#8b5cf699,stroke-width:1.5px;
    classDef ext fill:transparent,stroke:#71717a80,stroke-width:1.5px,stroke-dasharray:4 4;
    classDef sup fill:#71717a14,stroke:#71717a59,stroke-width:1px;
    style chain fill:#71717a0d,stroke:#71717a2e,stroke-width:1px
    linkStyle 3 stroke:#8b5cf6,stroke-width:1.5px
图 1 · 上带是四段链路(首页口径):问数 → 分析 → 决策 → 行动,终点在外部系统——每段列出自己的功能块,细节见下方两张表。下方一块是贯穿所有环节的横向支撑。虚线是交付与回执。颜色读法与首页一致:问数 indigo · 分析 teal · 决策 amber · 行动 violet,外部系统 zinc 虚线。 上面这段以源码显示:图渲染库没加载起来(离线、CDN 被拦或浏览器禁用了 JavaScript 时会这样)。这段 Mermaid 文本本身就说明了上面那些框与连线。

四段链路

段功能块界面一分钟说明
问
数
对话问答 用户端 全管线:意图分流 → 生成与自校验 → 规则链校验 → 人话解释 + 依据抽屉(机制见查询工作流)
可答边界 用户端 / 管理端 超出语义模型的声明范围时:结构性缺口(硬 MISS)拒绝并给扩展引导;词表 / 值 / 口径未声明(软 MISS)产出骨架照常作答,未解析部分由生成补齐
模型扩展确认 管理端 被拒不是终点:LLM 草拟扩展(术语 / 枚举 / 口径)→ 管理员确认 → 自动重答原问
元数据问答 用户端 「有哪些表 / 某字段是什么意思」走独立的解释与自校验回路
澄清纠错 用户端 指代不明先反问(可选档);纠错题在上一问的结果上直接出新答案
分
析
归因分析卡 用户端 问「为什么」时多出的卡:总变化按已声明度量拆到主维度(瀑布图 + 维度贡献表 + 基期口径),附本次证据查询清单;不成时整卡不出现,绝不改变答案本身
分析面板 · 来源 用户端 答案旁可看它怎么一步步算出来;每条 SQL 标注四档来源之一——已认证复用 / 知识库复用 / 语义编译 / 模型生成
决
策
判定规则 管理端 阈值规则声明在语义模型自己的词汇上(与语义查询同一个形状);确定性引擎求值,零 LLM
判定历史 管理端 每次触发留下版本、相邻两次对照;每条判定带 SQL 与原始行——证据可回放
因果升级梯 管理端 声明 causal 的规则在噪声带之后逐级升级(相关 → 差中差 → 合成对照),每条假设带体检(通过 / 不通过 / 无法检验),过不去就停在上一级并说明——因果是附录,绝不改变触发结论
What-if 重放 管理端 把最近一条判定留下的数字行灌进同一个 judge 纯函数当场重判:零业务库查询、显著性只重放不重算;规则被改过,结果自报「重放的是旧规则」
主动扫描 管理端 反向的找问题:scan_spec(度量 × 维度 × top_k)扫出超出噪声带的异常按 |z| 排序,落草稿、确认后才成规则;可选的 LLM 假设层默认关
质量回评 管理端 按 (rule_id, rule_rev) 分桶看每条规则的四类结局与触发率;分母不够就明说「样本不足」,不给伪精度
报告订阅 管理端 按主题域订阅,结果主动找到人
定时任务 管理端 判定 / 订阅 / 问数统一调度;不可求值的规则以错误上报,不静默
行
动
行动提案 管理端 判定触发即生成提案:载荷创建即定稿、同一触发只提案一次
审批与总闸 管理端 两道门加一个总闸;谁批的、何时发的全程留痕
拉通道交付 外部系统 webhook 与 MCP 并列;对方回执回来对账
效果验收 管理端 交付不是终点:按约定窗口回来测量,与判定用同一套噪声带比对,给「超出噪声带 / 无可辨识变化 / 测不了」三态结局——没有变化也是诚实的结论

横向支撑层

支撑层是功能「用起来之后变准」的地方——它不直接回答问题, 但决定了下次回答的依据从哪来、谁说了算。

功能块谁在用一句话
知识库 管理员(+ 自动草案) 五个 YAML 按「谁能写」分工;自动写入一律 pending,管理员确认后才进检索
语义模型 管理员 可答边界的唯一声明处:初始化起草、可视化编辑、版本历史与回滚
记忆 自动 + 管理员确认 情节记忆(问过什么)自动可用;偏好与晋升先落草案,确认才生效(晋升默认关)
Skills 管理员 组织方法论(区别于数据源事实):四档——整段注入、按需加载、只断言不注入(validator 断结果、guard 断 SQL,拦在交付前与执行前)
主题域 · 权限 · 审计 管理员 给问题划范围 + 第二层授权收窄(不可见即不存在);角色授权、审计日志、API 令牌
质量与成本运营台 管理员 评测对比与回归门:答得对不对、花得值不值摊开成一页

service.py:41 MemoryService service.py:96 _TIERS

产物链:谁产生,谁消费

把上图拆散看,功能之间真正流动的是产物—— 这也决定了「用起来会变准」具体是怎么发生的:每一次问答与判定都在留下 下一次要用的东西,而自动留下的部分必须过确认门。

产物谁产生谁消费落在哪
答案卡(结论 / SQL / 证据) 问数管线 提问者;依据抽屉随时复查 会话记录
归因卡 独立的只读分析 提问者 会话记录(不成时不出现)
情节记忆 每次问答自动写回(事实记录) 下一次生成:成功 SQL 当锚点、失败与纠正当反例 本机记忆库
待确认草案(示例 / 教训 / 偏好) 自动沉淀 管理员确认 知识库的 pending 区 → 确认后进检索
判定(verdict + 证据) 定时判定引擎 判定历史、订阅推送、行动提案 判定运行记录
行动提案 判定触发 管理员审批 提案台
交付与回执 审批通过后的拉通道 外部系统;回执回来对账 审计轨迹
效果结局(三态) 效果验收窗口到期后的测量 质量回评的分桶统计;判定历史 判定运行记录

这条链上有一条贯穿的分工:凡是「算不算、对不对、变没变好」的判断 都交给确定性代码——门禁判定、编译器、结果规则链、版本比对、 判定引擎、审批留痕,全是零 LLM;LLM 只负责理解与表达。所以「行动」才可能 停在一份可审计的提案上,而不是一个不可解释的自主执行。

service.py:334 DecisionService expr.py:499 parse_condition service.py:155 ActionService

边界:刻意不做的事

下面这些不是待办清单,是产品口径的一部分—— 写出来,才不会在演示时被过度承诺。

不做的事为什么
不由 Trove 执行行动 系统只到「提案 → 审批 → 交付 → 回执」;执行与后果在外部系统——行动在系统外是刻意边界,不是缺口
自动内容不直接进检索 记忆 / Skills / 教训的自动写入一律落 pending,晋升默认关——人工确认是知识库不被污染的闸门
未建模的数据源不开放问数 语义模型是可答边界的唯一声明处:接入即建模——先初始化知识库,再开放给用户
判定不做「AI 判断」 阈值规则声明式(无 eval 的闭集表达式)、三值逻辑、证据可回放;「判不了」绝不报成告警
人工环节默认拒绝 人工确认与行动审批的失败方向都是不放行——拿不准时宁可停在原地

继续读

想了解去哪
代码怎么分层 / 一次提问的节点级机制系统架构 / 查询工作流
用户视角:怎么问、答案每一块怎么读提问与读懂答案
四段链路各自的机制细节数据能力总览 / Agent 能力总览
判定、订阅与定时怎么配自动化与治理
行动提案的完整生命周期行动与审批
角色、授权与审计的口径用户·权限·安全
评测对比与回归门怎么跑评测与回归门
本页源码锚点的基准提交:anchor-base: 211ae86 GitHub 仓库 文档首页