架构决策(ADR)
ADR 0004: 完全通用化——DomainProfile 与任意维度事实
彻底通用化——CompanyProfile 变为 DomainProfile,结构化通道变为带任意用户自定义维度的类型化事实存储。
状态:accepted · 日期:2026-06-17
不可变记录。免于漂移追踪(无
covers)。取代,而不是编辑。
背景
叙事 RAG + agent + 防编造机制这根脊柱是真正领域无关的,但结构化通道骨子里就是金融的:固定的 metric/entity/period/channel 四元组、fact_metric 表、REVENUE/PROFIT/ROE,以及仍硬编码在 common/glossary.py 中的指标词汇表(实体/地理/敏感级别已经是配置驱动的;指标还不是)。既然已经选择做通用库(0003),"通用"就必须对_两条_通道都成立。
决策
彻底通用化。CompanyProfile → DomainProfile。结构化通道变为一个带任意用户自定义维度的类型化事实存储,外加针对这些维度的参数化查询;metric/period/channel 坍缩为声明式维度。指标词汇表和同义词从 glossary.py 移入配置。金融/ACME 作为 ≥2 个内置示例之一发布,其中至少一个非金融示例,以实证方式证明通用性。
曾考虑的备选方案(已否决)
- 仅脊柱通用(方案 B):只宣称叙事 RAG + agent + 防编造机制是"通用"的;把结构化数值通道保留为一个可 fork 的金融模块。否决——这等于把最稀缺的差异化能力(确定性结构化数值问答)拱手让给"自己去 fork"。
- 配置驱动但暂无第二领域(方案 C):以构造方式证明通用性(无硬编码金融),但暂不交付第二领域演示。作为_终点_被否决——最终选择了完全通用化,并配一个真实的第二领域示例。
后果
- 这组决策里最大的工程押注:schema 变更(四元组 → 任意维度)、动态工具 schema 生成、配置驱动的解析都随之而来。
- 涵盖了独立的"配置驱动完备性"问题。
- 倒逼意图解析器停止硬编码金融维度 → 0010。
- **风险:**严谨性有一部分正_来自_金融约束;通用化绝不能削弱任何不变量。这是用户对推荐的渐进路径所做的更激进的覆盖——实现必须显式守护这些不变量。