RAGSpine
架构决策(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
2DomainProfile 实现完全通用;金融只是内置示例之一0004
3精简核心 + 实验/extras 隔离;核心中不留休眠代码0005
4质量 = 以属性测试固化不变量 + 一个真实检索基准0006
5多语言 = 按 5 种语言设计、先交付 2 种(中文 + 英文),locale 包0007
6提示词 = 打包的 ragspine/prompts/<locale>/,置于 PromptRegistry 之后0008
7不绑定框架 = 不锁定框架 + 仅限宽松许可证;默认精简0009
8意图解析 = 确定性安全门 + 可插拔 IntentParser0010

后果

由此直接落出的近期工作流(无需进一步决策):

  • CompanyProfileDomainProfile;把硬编码的指标词汇从 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 来说描述了很大的工作面。工作要按"先让精简核心站得住,再逐个提升实验模块"的顺序推进,而不是一次铺开。

本页目录