Skip to main content

遵循RAG-Storage-Spec的知识库构建工具

Project description

ragjson

遵循 RAG-Storage-Spec 规范的基于文件系统的 RAG 知识库构建工具。

将文档解析为 Markdown、切片、生成向量嵌入,并以 .ragjson 格式存储到文件系统中 —— 零外部数据库依赖。

特性

  • 零外部依赖:仅依赖操作系统文件系统,无需向量数据库或中间件
  • 文档解析:内置 markitdown 解析引擎
  • 文本切片:支持 RecursiveCharacterTextSplitter(默认)和 MarkdownTextSplitter
  • Embedding:兼容 OpenAI API 的向量生成
  • 原子写入:write-to-tmp + rename 保证写入安全性
  • 增量更新:基于 MD5 对比,仅处理变更文件
  • 目录级并发:不同目录可并行处理,目录内 flock 互斥

安装

# 全局安装为独立命令(推荐,无需 venv)
uv tool install ragjson

或在项目虚拟环境中使用:

uv venv
source .venv/bin/activate
uv pip install ragjson

本地开发模式(从源码安装):

uv venv
uv pip install -e .
source .venv/bin/activate

配置

在用户 home 目录下创建 ~/.rag.config 文件(JSON 格式):

{
  "embedding_model": {
    "base_url": "https://api.example.com/v1",
    "api_key": "sk-your-token",
    "model_name": "text-embedding-3-small",
    "dimension": 1536
  },
  "splitter": {
    "chunk_size": 1000,
    "chunk_overlap": 200
  },
  "vector_database": {
    "db_url": "zvec:/data/vectordb",
    "index_type": "flat"
  }
}
配置项 说明
embedding_model.base_url OpenAI 兼容 API 的地址
embedding_model.api_key API 密钥
embedding_model.model_name Embedding 模型名称
embedding_model.dimension 向量维度
splitter.chunk_size 切片最大字符数
splitter.chunk_overlap 切片重叠字符数
vector_database.db_url 向量数据库目录(collection 在其下的 zvec-db1/
vector_database.index_type 索引类型:flat / hnsw

使用方法

查看状态

# 当前目录
rag status

# 指定目录
rag status ./docs

# 递归扫描子目录
rag status ./docs -r

# 单文件
rag status ./docs/readme.md

输出说明:

  • 🟢 EMBEDDED — 已完成嵌入且 MD5 一致,无需更新
  • 🔴 NEW / CHANGED — 新文件或 MD5 已变更,需要更新
  • 🟡 DELETED / SLICING / EMBEDDING — 中间状态或已标记删除

增量更新

仅处理 MD5 发生变化的文件,执行完整流水线:解析 → 切片 → 嵌入 → 写入

# 使用默认切片器 (recursive)
rag update ./docs

# 递归更新子目录
rag update ./docs -r

# 使用 Markdown 切片器
rag update ./docs --splitter markdown

# 指定并发数
rag update ./docs -r -j 4

# 强制重新处理所有文件(跳过 MD5 检查)
rag update ./docs -f

# 单文件更新
rag update ./docs/readme.md

# 单文件强制更新
rag update ./docs/readme.md -f

参数说明:

参数 说明 默认值
-r 递归扫描子目录
-f 强制重新处理所有文件(跳过 MD5 检查)
-j N 并行处理的目录数 CPU 核心数
--splitter 切片器类型:recursive / markdown recursive

导出

.ragjson 文件打包为 tar.gz 归档:

rag export backup.tar.gz              # 仅当前目录
rag export backup.tar.gz -r           # 递归包含子目录
rag export backup.tar.gz ./docs/a.md  # 导出单文件

清理 .rag 目录

# 清理当前目录
rm -rf .rag

# 递归清理所有子目录
find . -name ".rag" -type d -exec rm -rf {} +

索引同步

将向量同步到向量数据库(需安装 ragjson[index]):

# 增量同步(消费 .mushroom 变更通知)
rag index

# 递归增量同步
rag index -r

# 全量同步(扫描所有 EMBEDDED 的 .ragjson,不依赖 mushroom)
rag index -f

# 递归全量同步
rag index -f -r

# 单文件补偿索引(需要 -f)
rag index -f ./docs/readme.md

参数说明:

参数 说明 默认值
-r 递归扫描子目录
-f 全量同步(跳过 mushroom,扫描所有 .ragjson)

向量数据库路径和索引类型在 ~/.rag.configvector_database 节配置。

安装索引依赖:

uv pip install ragjson[index]

目录结构

执行 rag update 后的目录结构示例:

docs/
├── .rag/                          # 控制目录
│   ├── tmp/                       # 原子写入暂存区
│   ├── readme.md.ragjson          # readme.md 的元数据
│   └── manual.pdf.ragjson         # manual.pdf 的元数据
├── readme.md                      # 源文件
└── manual.pdf                     # 源文件

.ragjson 文件格式

{
  "ragjson_version": "2.2",
  "processing": {
    "status": "EMBEDDED",
    "create_dt": "2026-07-14T10:00:00Z",
    "modify_dt": "2026-07-14T12:00:00Z"
  },
  "source": {
    "file_name": "readme.md",
    "md5_hash": "d41d8cd98f00b204e9800998ecf8427e",
    "size_bytes": 2048,
    "mtime": 1710508800,
    "inode": 12345678
  },
  "embedding": {
    "model_name": "text-embedding-3-small",
    "dimension": 1536
  },
  "chunks": [
    {
      "content": "切片完整原文内容...",
      "content_hash": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
      "overlap_size": 0,
      "vector_base64": "P0A/0D9A/0D9A/0D9A=="
    }
  ]
}

支持的文件类型

.pdf .docx .doc .pptx .ppt .xlsx .xls .md .txt .html

状态流转

INITIAL → CHUNKING → CHUNKED → EMBEDDING → EMBEDDED
                                            ↓
    (源文件变更) ←─────────────────── INITIAL (回退)

    源文件删除:任意状态 → rename .ragjson → .ragjson.deleted
    源文件恢复:.ragjson.deleted → rename .ragjson → (update 检测 MD5)

项目架构

src/ragjson/
├── commands/     # CLI 命令(status, update, destroy, export, index)
├── embed/        # Embedding 生成(OpenAI 兼容 API)
├── index/        # 向量索引(zvec backend,可扩展)
├── parser/       # 文档解析(markitdown backend,可扩展)
├── splitter/     # 文本切片(recursive / markdown)
├── store/        # 存储层(ragjson 文件、原子操作、mushroom)
├── config.py     # ~/.rag.config 配置加载
├── utils.py      # 工具函数(MD5、向量编码、颜色输出)
└── cli.py        # CLI 入口

开发

# 克隆项目
git clone <repo>
cd ragjson

# 创建虚拟环境并安装开发版本
uv venv
uv pip install -e ".[index]"
source .venv/bin/activate

# 运行 CLI
rag --help

许可证

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ragjson-0.2.3.tar.gz (27.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ragjson-0.2.3-py3-none-any.whl (32.5 kB view details)

Uploaded Python 3

File details

Details for the file ragjson-0.2.3.tar.gz.

File metadata

  • Download URL: ragjson-0.2.3.tar.gz
  • Upload date:
  • Size: 27.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ragjson-0.2.3.tar.gz
Algorithm Hash digest
SHA256 5462170cee0d8e18ea6af94a33e38b4d2b4b145fe6ed4baa63839df823bb8561
MD5 37c58c27474354e785705067c93c942b
BLAKE2b-256 68650812252e9ba6b49b78d7e1299ab173deb9fd53d21777f629800412dff19a

See more details on using hashes here.

File details

Details for the file ragjson-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: ragjson-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 32.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ragjson-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 159f80eeaaf08e780cd6e383b29e464a62e3794cf4ae6faffcb6db603c275915
MD5 42993747966d9845bdbb6f992821b1f1
BLAKE2b-256 148188ae132a5374a404d9d424ffec9b1f3230e21e776d468cd768f8814eb311

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page