架构决策(ADR)
ADR 0002: 产品方向——通用、许可证干净、不锁定框架的 RAG 库
总纲式北极星——把硬性不变量与由配置/Protocol 驱动的柔性灵活性分开——并索引八条逐决策 ADR 0003–0010。
状态:accepted · 日期:2026-06-17
不可变记录。ADR 免于漂移追踪(无
covers)。要推翻某项决策, 请新增一条取代旧决策的 ADR,而不是编辑它。
这是总纲 ADR。它记录了北极星,并索引了 2026-06-17 一次结构化设计访谈中敲定的八条逐决策 ADR(0003–0010)。
背景
RAGSpine 拥有强大的、由代码强制执行的严谨性(防编造机制、来源溯源、RESTRICTED 隔离、隐私感知 trace),但战略尚未选定:受众、范围、"金融专用还是通用"这一押注都悬而未决,并且大量能力已经建成却未接入运行中的流水线。我们自上而下地解决了战略问题,先处理根本性的分叉。
决策
北极星:一根确定性、许可证干净、不锁定框架的 RAG 脊柱——一个用纯 Python 组装的库,其中防编造机制 / 来源溯源 / 来源隔离是由代码强制执行的不变量,而不是提示词建议;通过配置做到领域无关,通过 locale 包做到多语言,每个后端都可经 Protocol 替换。
**贯穿全部八条决策的主线:**把_保证_与_灵活性_分开。不变量(防编造机制、来源溯源、隔离、依赖许可证、安全门)是硬性、确定性、不可插拔的。其余一切(领域、语言、LLM、embedding、重排器、解析策略)都是柔性的——由配置或 Protocol 驱动。
| # | 决策 | ADR |
|---|---|---|
| 1 | 受众 = 供他人在其上构建的通用 OSS 库 | 0003 |
| 2 | 经 DomainProfile 实现完全通用;金融只是内置示例之一 | 0004 |
| 3 | 精简核心 + 实验/extras 隔离;核心中不留休眠代码 | 0005 |
| 4 | 质量 = 以属性测试固化不变量 + 一个真实检索基准 | 0006 |
| 5 | 多语言 = 按 5 种语言设计、先交付 2 种(中文 + 英文),locale 包 | 0007 |
| 6 | 提示词 = 打包的 ragspine/prompts/<locale>/,置于 PromptRegistry 之后 | 0008 |
| 7 | 不绑定框架 = 不锁定框架 + 仅限宽松许可证;默认精简 | 0009 |
| 8 | 意图解析 = 确定性安全门 + 可插拔 IntentParser | 0010 |
后果
由此直接落出的近期工作流(无需进一步决策):
CompanyProfile→DomainProfile;把硬编码的指标词汇从common/glossary.py移入配置。- 结构化通道 schema:
fact_metric四元组 → 任意用户自定义维度。 - 从意图解析器中抽出确定性的
SecurityGate;把IntentParser变为 Protocol。 PromptRegistry+ragspine/prompts/<locale>/。- Locale 缝:分词器注册表 + 消息目录 +
LocaleProfile。 - CI:依赖许可证门禁;接入
scripts/check_doc_drift.py。 - 一个非金融的第二领域示例 + 一个真实检索基准(把"通用"和 "hybrid > BM25" 从断言变为证据)。
- 重写 README / 定位语言。
派生立场(未单独访谈;如有误请指出):
- FastAPI + RQ 的
service/层是一个参考部署示例,而非核心保证(由 0003 + 0005 推出)。因此其缺失的鉴权不是近期优先事项,除非我们把服务提升为一等交付物。 - 完全配置驱动的行为已被
DomainProfile(0004)涵盖。
风险:
- 完全通用化(0004)是最重的押注——一次真正的重构,有稀释那份_源自_最初金融约束的严谨性的风险。实现必须守住底线:通用化的同时不削弱任何不变量。
- 这八条决策合在一起,对一个全新的单作者 v0.1 来说描述了很大的工作面。工作要按"先让精简核心站得住,再逐个提升实验模块"的顺序推进,而不是一次铺开。