面向 AI 问答的异构标准、法规、政策、规则知识库文件架构。整体思路参考 LLM Wiki:不是简单把 PDF 丢进向量库,而是把原始资料、转写文本、文档主档案、provision 事实页、跨文档主题、实体、时间线、版本对比和检索索引组织成可追溯、可维护的 Markdown 知识库。
本项目定位为:
Regulatory Knowledge Compiler — 标准法规知识编译器。
它不是传统 RAG chatbot。传统弱 RAG 通常是:
PDF → arbitrary chunks → embedding top_k → answer
本项目目标是:
heterogeneous raw sources
→ extracted source text
→ reviewed Markdown knowledge layer
→ deterministic indexes / graph / vector artifacts
→ citation-grounded answers
多层模型资源主要按能力与稳定性分工:推理能力强且稳定的即时模型用于关键判断与最终审核,稳定的中等能力即时模型用于结构化初抽,不稳定但高能力的后台模型用于异步草稿、交叉检查和评测生成;这些资源主要用于 build-time 编译、审查、对比和评测生成,而不是每次 query-time 重新把大量原文塞进上下文。
详细原则见 _meta/architecture-principles.md。
该知识库供 AI 查阅并回答人类问题,例如:
- “涉及到座椅的都有哪些 GB / ISO / ECE 标准?”
- “GB 7258 最新版实施日期是什么时候,有没有过渡期?”
- “ECE R100 和 GB 38031 对电池安全的要求有什么差异?”
- “某个工信部政策通知什么时候发布、适用对象是什么?”
- “哪些规则涉及 OTA、软件升级、数据安全?”
核心原则:
每个答案都应该能从“主题/实体 → 文档 → provision → 原文来源”完整追溯。
本项目需要同时容纳:
- 中国 GB、GB/T、行业标准、地方标准;
- ISO、IEC、SAE 等国际/组织标准;
- UNECE / ECE regulations、EU regulations/directives;
- 政策通知、公告、部门规章、实施细则、认证规则、官方解读、征求意见稿;
- PDF、Word、网页、扫描件、图片等多种来源。
因此核心抽象从“standard + clause”升级为:
SourceFile / SourceURL
→ SourceText
→ Document
→ Provision
→ Topic / Entity / Timeline / Comparison / Question
standards-llm-wiki/
├── README.md
├── SCHEMA.md
├── index.md
├── log.md
│
├── raw/ # 原始文件,不修改
│ ├── standards/ # GB/ISO/IEC/SAE 等标准原件
│ ├── regulations/ # ECE/EU/法规性技术规则
│ ├── policies/ # 政策通知、公告、部门文件
│ ├── rules/ # 实施细则、认证规则、测试规程
│ ├── interpretations/ # 官方解读、问答、宣贯材料
│ └── web/ # 网页抓取原文或快照
│
├── sources/ # 原始文件转写后的 Markdown/Text
│ ├── standards/
│ ├── regulations/
│ ├── policies/
│ ├── rules/
│ ├── interpretations/
│ └── web/
│
├── documents/ # 所有正式文档主页面,推荐新内容使用
├── provisions/ # 通用条款/段落/章节/附件/表格页
├── topics/ # 跨文档主题页
├── entities/ # 机构、车辆类型、术语、技术对象、法规概念
├── comparisons/ # 版本对比、跨体系对比
├── timelines/ # 发布时间、实施日期、替代关系、过渡期
├── questions/ # 高频问答沉淀
├── indexes/ # 给 AI 和程序快速检索用的索引
│
├── eval/ # QA benchmark and golden answers
├── tools/ # 后续放 CLI/ingestion/indexing 工具
├── db/ # 本地派生索引,默认不提交生成物
│
├── src/standards_wiki/ # 第一阶段导入流水线程序包
├── tests/ # 自动化测试
├── docs/plans/ # 实施计划
│
├── _drafts/ # 后台模型生成的草稿,未审核
├── _candidates/ # 候选元数据、候选文档、候选条款、候选主题、候选引用
├── _reviews/ # 多模型交叉检查结果、审核记录
├── _jobs/ # 异步任务描述和运行结果
└── _meta/ # 规则、prompt、质量清单、工具方案
详细字段定义见 SCHEMA.md。
只存放原始资料,不修改。包括标准 PDF、法规公告、政策网页、官方解读、网页存档等。
存放从 PDF/OCR/网页抽取出来的 Markdown 或文本,尽量贴近原文,不做解释性改写。
每个 GB、ISO、ECE、政策、规则、解读都至少有一个 document 页面。不要要求所有文档都有统一字段;允许 unknown 和稀疏 metadata。
provisions/:可引用的条款/段落/章节/附件/表格;topics/:跨文档主题页;entities/:组织、监管机构、车型、术语、技术对象、法规概念;comparisons/:版本对比、跨体系对比;timelines/:发布日期、实施日期、替代关系、过渡期。
indexes/:Markdown 结构化索引,适合 AI 直接读;questions/:高价值复杂问答沉淀,避免重复推理;eval/:FactQ / RelationQ / ComparisonQ / InferenceQ benchmark;db/:SQLite FTS5、JSON、graph、vector 等派生索引,不作为 canonical source。
最小可行工具链:
PDF 文本型:PyMuPDF + pymupdf4llm
PDF 扫描/复杂版式:marker-pdf 或 docling
网页:trafilatura/readability + 手动保存官方 URL
DOCX:python-docx
全文检索:SQLite FTS5
向量检索:LanceDB 或 Qdrant
图谱探索:JSONL graph / Neo4j CSV optional
服务层:FastAPI
任务层:先用 CLI,后续再加 RQ/Celery/Dramatiq
_meta/architecture-principles.md— compiler-first 架构原则。_meta/ingestion-pipeline.md— 入库流水线。_meta/tooling.md— 外部工具选型。_meta/parser-strategy.md— GB/ISO/ECE/政策 parser 策略。_meta/requirement-obligation-schema.md— requirement / obligation 抽取 schema。_meta/graph-model.md— 派生图谱模型。_meta/evaluation-benchmark.md— 评测集设计。_meta/source-inventory.md— 来源、授权、构建溯源。_meta/export-formats.md— SQLite/JSON/graph/RDF 导出方案。_meta/roadmap.md— 实施路线图。
indexes/topic-to-documents-index.md
→ topics/seats.md
→ provisions/*seat*.md
→ documents/*/current 或 document page
→ raw/sources 原文
documents/<family>/current.md
→ timelines/<family>.md
→ indexes/effective-dates-index.md
→ indexes/transition-periods-index.md
→ source quote
comparisons/ece-r100-vs-gb-38031.md
→ topics/battery-safety.md
→ provisions/ece-r100-*/ + provisions/gb-38031-*/
→ documents/ece/... + documents/gb/...
Level 1: Document page
只保存原文、抽取文本、基本 metadata。
Level 2: Provision split
能拆章节/条款/段落/附件,并保留 locator。
Level 3: Semantic enrichment
能提取主题、实体、引用关系、实施日期、替代关系、适用对象、requirement/obligation。
奇怪格式文档至少应做到 Level 1,不要因无法精准拆条款而阻塞入库。
当前最新开发方向是先补“导入流水线”,让项目可以接收 PDF 和网页链接,并产生可追溯的候选资料。
第一阶段目标:
PDF / URL
→ raw/ 原始归档
→ sources/ 正文提取
→ _candidates/ 元数据和候选文档
→ _jobs/ 任务状态记录
计划模块:
src/standards_wiki/ingest.py
src/standards_wiki/archive.py
src/standards_wiki/extractors/pdf.py
src/standards_wiki/extractors/html.py
src/standards_wiki/classifier.py
src/standards_wiki/metadata.py
src/standards_wiki/jobs.py
src/standards_wiki/writers/
tools/ingest_pdf.py
tools/ingest_url.py
详细说明见:
_meta/ingestion-pipeline.md_meta/phase-1-development-scope.mddocs/plans/2026-05-05-phase-1-ingestion.md
先用 3–5 个异构样本跑通流程:
- 一个 GB 标准,例如 GB 7258 或 GB 38031;
- 一个 ISO 标准,例如 ISO 26262;
- 一个 ECE regulation,例如 ECE R100;
- 一个政策通知/公告网页;
- 一个认证规则或实施细则。
优先建设:
kb ingest-file / ingest-url
kb compile-document
kb validate
kb export sqlite/json
kb search
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]".venv/bin/python tools/ingest_pdf.py ./raw/standards/example.pdf输出:
raw/standards/{slug}.pdf— 原始 PDF 归档sources/standards/{slug}.md— 提取的 Markdown 文本_candidates/metadata/{slug}.yaml— 候选元数据_candidates/documents/{slug}.md— 候选文档页面_jobs/completed/{job_id}.json— 任务完成记录
默认 auto 策略会对页数较多的文本型标准 PDF 优先尝试 marker-pdf 的 marker_single,以获得更好的版面、表格和图片保留效果;如果 marker 不可用或转换失败,会自动回退到 pymupdf4llm。小 PDF、测试样例和疑似扫描件不会默认触发重型 marker,避免本地 CPU 长时间运行。
可以用环境变量强制选择:
STANDARDS_WIKI_PDF_ENGINE=pymupdf4llm .venv/bin/python tools/ingest_pdf.py ./raw/standards/example.pdf
STANDARDS_WIKI_PDF_ENGINE=marker .venv/bin/python tools/ingest_pdf.py ./raw/standards/example.pdfmarker 输出中的图片会复制到 sources/standards/{slug}_assets/,Markdown 图片链接会同步改写。
.venv/bin/python tools/ingest_url.py "https://example.gov.cn/notice.html"输出目录同上,sources/ 下放入 web/ 子目录。
Phase 1 仅支持文本型 PDF(可直接提取文字)。如果 PDF 是扫描件或图片型,提取的文字量会很少,系统会自动标记 ocr_required: true 并在输出中发出警告。OCR / 高质量 PDF 转 Markdown 后续单独开发。
Phase 2 将 Phase 1 的候选文档继续编译成可审核的 document、provision 和 requirement 候选结果。未审核内容默认保持在 documents/drafts/ 或 _candidates/ 下,不会直接进入正式 provisions/ / clauses/ 页面。
.venv/bin/python tools/compile_document.py <document_id>输出:
documents/drafts/{document_id}.md— draft document page
.venv/bin/python tools/split_provisions.py <document_id>输出:
_candidates/provisions/{document_id}.jsonl— machine-extracted provision candidates
.venv/bin/python tools/extract_requirements.py <document_id>输出:
_candidates/requirements/{document_id}.jsonl— machine-extracted requirement candidates
.venv/bin/python tools/generate_provision_pages.py <document_id>输出:
_candidates/provision-pages/{document_id}/*.md— review-safe candidate provision pages
.venv/bin/python tools/validate.py --document-id <document_id>校验范围包括 metadata、candidate document、provision JSONL、requirement JSONL、locator 和 evidence quote。
.venv/bin/python -m pytest -qPhase 3 MVP 从候选数据构建确定性索引,支持 Markdown 索引重建、JSON 导出和本地搜索。不依赖向量数据库或外部服务。
.venv/bin/python tools/build_indexes.py输出:
indexes/documents-index.md— 文档索引indexes/provisions-index.md— 条款索引indexes/requirements-index.md— 要求索引indexes/effective-dates-index.md— 实施日期索引
.venv/bin/python tools/export_json.py输出:
db/json/documents.jsondb/json/provisions.jsondb/json/requirements.jsondb/json/manifest.json— 含记录计数和诊断信息
.venv/bin/python tools/search.py "机动车" --limit 10支持搜索文档标题/ID/标准号、条款标签/正文、要求原文引用。纯本地子串匹配,无需外部服务。
Phase 3.5 在 Phase 3 确定性索引基础上,增加候选审核工作流、规则化主题/实体标记和确定性评测 MVP。所有功能完全本地运行,不调用外部服务。
重要原则:
- 所有功能本地确定性执行,不依赖 LLM 或外部 API
- 系统不会自动 promote 未审核候选到正式
provisions/目录 - 真实样例生成物(如
gb-7258-2017候选)不应默认提交到仓库
从候选条款生成审核清单,列出所有待审条目:
.venv/bin/python tools/review_candidates.py manifest <document_id>输出到 _candidates/review-manifests/<document_id>.json,包含每条 provision 的 review_status(默认 pending)。
手动审核后,将确认的 provision ID 标记为 reviewed:
.venv/bin/python tools/review_candidates.py mark _candidates/review-manifests/<document_id>.json <provision_id> [<provision_id> ...]标记操作是增量累加的,不会覆盖已有的 reviewed 状态。
仅将 review_status: reviewed 的候选提升为正式条款页:
.venv/bin/python tools/promote_candidates.py <document_id>输出到 provisions/<document_id>/<provision_id>.md,保留 source locator 和 evidence quote。未标记 reviewed 的候选不会被提升。
基于内置关键词字典为候选条款和结构化要求打上 topic/entity 标签:
.venv/bin/python tools/tag_candidates.py <document_id>输出到 _candidates/topic-tags/<document_id>.json,包含 topics(如 seats、braking-system、lighting-system)和 entities 字段。
用 JSONL 检查文件对当前候选数据做确定性断言验证:
.venv/bin/python tools/eval_candidates.py eval/qa/phase3_5_smoke.jsonl --document-id <document_id>输出 total / passed / failed 计数。失败时写入 _reviews/eval-failures/<run_id>.json 并返回非零退出码。
.venv/bin/python -m pytest -qPhase 4 在 Phase 3.5 评测 MVP 基础上,建立正式的 benchmark JSONL schema 和多类型确定性检查。所有 benchmark 数据为小型人工/确定性 fixture,不提交真实 PDF 或完整候选生成物。
Schema 定义:eval/qa/schema.md 定义 7 种检查类型,每条 check 包含 id、type、category、severity、expected、notes 字段。
| 文件 | 类型 | 说明 |
|---|---|---|
eval/qa/phase4_smoke.jsonl |
冒烟测试 | 覆盖全部 7 种 check type 的基础验证 |
eval/qa/gb-7258-2017_factq.jsonl |
事实查询 | 文档元数据、条款标签、关键词召回、evidence 引用 |
eval/qa/gb-7258-2017_dateq.jsonl |
日期查询 | 实施日期、发布日期、过渡期等时间相关断言 |
eval/qa/gb-7258-2017_citationq.jsonl |
引用查询 | 条款 evidence quote 存在性和内容匹配 |
运行全部 Phase 4 benchmark:
.venv/bin/python tools/eval_candidates.py eval/qa/phase4_smoke.jsonl eval/qa/gb-7258-2017_factq.jsonl eval/qa/gb-7258-2017_dateq.jsonl eval/qa/gb-7258-2017_citationq.jsonl --document-id gb-7258-2017单独运行某一类型:
.venv/bin/python tools/eval_candidates.py eval/qa/gb-7258-2017_factq.jsonl --document-id gb-7258-2017输出 total / passed / failed 计数,失败时写入 _reviews/eval-failures/<run_id>.json 并返回非零退出码。
| Type | 断言内容 | Failure Category |
|---|---|---|
document_id_exists |
文档 ID 存在 | missed_document |
provision_label_exists |
条款标签存在 | missed_provision |
keyword_search |
关键词检索命中数 | missed_provision |
requirement_modality_exists |
要求情态存在 | missed_requirement |
evidence_quote_exists |
引用原文包含子串 | citation_missing |
metadata_field_equals |
元数据字段精确匹配 | metadata_mismatch |
topic_tag_exists |
主题标签存在 | topic_mismatch |
.venv/bin/python -m pytest -q后续阶段再补:
SQLite FTS5
Graph export / Neo4j CSV
Vector index
FastAPI QA service
Answer-engine grading / LLM rubric(Phase 4 后续增强)
批处理任务队列
多模型审核工作流