第三节 — 架构目标与质量取舍
这一节回答:这个架构在追求什么;冲突时按什么规则取舍。
总体目标
让 FinBayes 实施者(写代码的 AI 助手 / 接手维护的工程师)能够实现的代码:
- 不漂移战略白皮书与产品定义文档的不变量
- 覆盖产品定义文档要求的全部用户行为
- 多入口(CLI、TUI、Web、MCP、Channel)的认知质量与用户体验一致
- 未来增加新任务类型 / 新市场 / 新入口时不需要推倒重来
关键质量属性
按对架构决策的影响优先级排序:
| 优先级 | 质量属性 | 工程上具体做什么 |
|---|---|---|
| 一 | 战略保真度 | 每次架构改动过 review gate,双层检查:(a) 机械 grep 检查战略不变量原句仍存在 (b) 人工实质语义核查战略未授权概念的本质内涵未被同义改写 / 结构隐藏 / 英文替换等方式引入。grep 是必要的快速过滤,不是合格判定 |
| 二 | 认知输出质量 | 综合层产出反方证据 / 关键风险 / 失效条件 / 信息缺口按事实空间生成;画像只影响表达密度,不进入证据筛选;每条认知输出可被重放、对比、追溯(含证据来源、综合路径、Provider 调用),作为后续质量评估的可被验证基础。具体的认知质量验收方法(评估维度、rubric、多评估者机制)属于待定义的工程设计问题,详见 OQ-002 与后续 CHAP-20 / CHAP-21 |
| 三 | 可演化性 | 跨模块接口显式版本化;任务路由 / 技能 / 数据源 / 大模型 Provider 走注册表查找而非硬编码;与战略未决问题相关的参数走配置 |
| 四 | 可观测性 | 每次任务执行产出可序列化审计记录(不含凭证类内容);每个降级 / 失败的证据节点带降级原因;用户可见"为什么这么答"线索 |
| 五 | 响应性 | 多任务并发执行;部分结果流式输出(不等所有内部任务完成才出第一屏);长时间任务异步走 |
| 六 | 可测试性 | 五层测试:单元(模块内部)/ 契约(跨模块接口)/ 集成(多模块协作)/ 场景抽样回归(FinBayes Case Library,定位质量退化与缺口,内容动态迭代不作为二元门禁)/ 认知质量评估(具体方法待 CHAP-20 / CHAP-21 与产品团队共同定义) |
| 七 | 本地优先 | 第一阶段本地部署跑完整体验;本机配置秘密走本机安全存储;状态可落本地文件或嵌入式数据库 |
| 八 | 健壮性 | 每个外部依赖有降级路径;一个证据节点失败只影响依赖它的下游节点,不阻塞其他任务 |
冲突时的取舍
| 冲突情境 | 取舍 |
|---|---|
| 战略保真度 vs 实施速度 | 保真度优先 |
| 认知输出质量 vs 响应性 | 第一屏先回答用户题眼并标注"反方 / 详细条件还在补充";最终结果必须完整 |
| 可演化性 vs 简洁性 | 跨模块接口必须版本化(不可简化);内部实现可简化(单进程优先,不微服务化) |
| 响应性 vs 完整性 | 部分结果先输出 + 最终归并;不允许"等齐了再出"导致用户等待 |
| 本地优先 vs 多入口一致性 | 多入口走同一 runtime 接口契约;不为本地特殊化降级共用接口 |
| 可观测性 vs 性能 | 第一阶段全量审计 trail;性能问题在后续优化时再讨论降低粒度 |
第一阶段实施时的具体技术取向
明确这些事项第一阶段这样做(而不是另一种做法):
- 单进程优先:runtime 在第一阶段单进程实现,不微服务化。多入口(CLI / TUI / Web / MCP / Channel)共享同一 runtime 实例
- 本地优先:状态落本地文件 / 嵌入式数据库(如 SQLite);不依赖云端 state store
- 异步走 Python asyncio:多任务并发用异步等待原语(具体细节见 ADR-005 待写)
- 大模型 Provider 走统一适配层:不直接调用各家 SDK,所有 Provider 通过统一接口接入(具体细节见 ADR-008 待写)
- 状态写入两步:长期状态对象(关注列表、判断记录、动态画像)的写入分待确认 / 已确认两步(具体细节见 ADR-007 待写)
- 审计 trail 全量记录:第一阶段每次任务执行的证据 / 综合路径 / Provider 调用全量写审计,性能优化是后续事项
第一阶段不投入优化的事
显式声明这几件事第一阶段不做(避免实施者误优化):
- 极致低延迟(首屏 100 毫秒以内):认知任务本质需要大模型调用,秒级延迟合理
- 大规模并发(单实例万级 QPS):第一阶段本地部署优先 + 个人用户量级
- 跨地域部署 / 跨用户横向扩展 / 数据库分片:远期事项
什么时候开始投入这些优化的判断条件留给运维 / 产品决定,工程架构不预设阈值。