内容
<div align="center">
<img src="assets/kibble.png" alt="kibble" width="180">
# Kibble
**一款快速的Rust大规模知识和数据平台 — 处理任何来源的数据,生成干净的数据集。**
[](https://crates.io/crates/kibble)
[](https://docs.rs/kibble)
[](https://crates.io/crates/kibble)
[](https://github.com/femboyisp/kibble#license)


<img src="assets/kibble-demo.gif" alt="kibble demo — clean, index, search, and grounded cited RAG" width="720">
</div>
`kibble` 从几乎任何地方(本地文件、git仓库、网站、HuggingFace数据集、文件托管、存档)获取知识和数据,提取并清理它,分类和编目它,并构建聊天格式的JSONL数据集 — 用于训练和检索的原材料。
它也可以作为一个HTTP服务运行,以便机器人/自动化可以提交链接进行摄取,以及摄取代理(技能),就像摄取数据一样。
重型任务(模型训练、OCR、嵌入)存在于外部后端;`kibble` 是一个快速、依赖轻的调度器,它将请求路由到这些后端,并将杂乱的源转换为干净的、确定性的、结构化的数据集和知识库 — 大规模。
## 安装
```bash
# 从crates.io(需要Rust工具链)
cargo install kibble
# 预编译二进制文件(Linux / macOS)
curl -fsSL https://github.com/femboyisp/kibble/releases/latest/download/kibble-installer.sh | sh
# 预编译二进制文件(Windows,PowerShell)
powershell -c "irm https://github.com/femboyisp/kibble/releases/latest/download/kibble-installer.ps1 | iex"
# 从源代码
git clone https://github.com/femboyisp/kibble && cd kibble && cargo build --release
```
预编译目标:Linux x86_64/arm64,macOS Intel/Apple Silicon,Windows x86_64 — 请参阅[Releases](https://github.com/femboyisp/kibble/releases)。
## 快速开始(30秒,无需设置)
```bash
cargo build --release
./target/release/kibble index examples/ # BM25索引 — 无需后端
./target/release/kibble search "ownership" # 排名结果(约1秒)
```
`kibble init` 在任何目录中都准备好了这些(一个 `kibble.toml` + 示例文档)。
**什么需要后端?**核心管道完全离线运行:
| 离线工作(无需后端) | 需要LLM/嵌入端点 |
|----------------------------|-----------------------------|
| `clean` · `index` · `search` · `build` · `eval` · `pack` · `crawl` | `ask` · `bench` · `cluster` · `extract`(OCR/ASR) |
(当未设置嵌入后端时,`index`/`search`/`classify`软失败为仅基于词汇的BM25 — 它们仍然有效,只是没有语义排名。)
## 命令
```
kibble clean # 将文本清理规则应用于stdin → stdout
kibble ingest <source> # 将本地源(twitter存档,文本文件)拉入data/raw/local/
kibble fetch <url> [--name] # 下载/解析URL到data/ingest/<slug>/(请参阅处理程序)
kibble crawl <url> # BFS爬取站点(同主机,robots安全)→ ingest树中的markdown
kibble extract <path|dir> # 将工件 → 文本(OCR / 转录 / PDF / 视频 / 办公软件)转换为data/extracted/
kibble build # 原始文档 + 配置的源 → train/valid/test JSONL + 目录 + 统计
kibble tune # 将构建的数据集分组为分阶段课程 + config.yaml(读取[tune])
kibble train # 对tune包运行配置的训练器(读取[train];--dry-run;请参阅docs/TRAIN.md)
kibble pack # 将构建输出打包为Kaggle数据集包(读取[pack])
kibble eval [--strict] # 评估数据集质量(SFT就绪,重复,泄漏,平衡);门控CI
kibble index [path] # 构建检索索引(块 + 嵌入 + BM25)
kibble search "<q>" [--k N] # 索引上的混合语义 + BM25搜索
kibble ask "<q>" [--k N] [--web] # 基于索引的RAG回答(代理搜索;--web添加实时网络搜索)
kibble cluster [--k N] [--json] # 数据集行(嵌入)主题聚类 → data/clusters.json
kibble serve # 运行摄取HTTP API(POST /ingest,GET /jobs/{id});需要KIBBLE_API_TOKEN
kibble caps install <path|url> # 将源的技能拉入能力注册表(也是:扫描/列出/删除)
kibble bench [--strict] [--stream] # 基准测试服务模型(OpenAI兼容端点);得分 + 延迟;门控CI(--stream:实时研究输出到stderr)
kibble soul build # 编译soul.toml → 服务工件(聊天模板,生成配置,工具,清单)
kibble mcp # stdio MCP服务器 — 将build/eval/bench/soul/caps公开为工具,供代理/运行环境驱动
```
完整的循环:**获取/摄取 → 构建 → 调整 → 打包 → 训练(Kaggle/Unsloth)→ 评估。**
### 命令一览
每个命令都执行一个专注的任务 — 将其指向源,它就会完成其任务:
| 命令 | 标签 | 它执行的操作 |
|---------|-------|--------------|
| `fetch` / `serve` | 💨 **获取** | 拉取它指向的任何内容(URL,仓库,数据集,文件托管) |
| `crawl` | 🕸️ **爬取** | BFS爬取整个站点 → 干净的markdown(robots安全,礼貌,SSRF保护) |
| `extract` | ⭐ **提取** | 将工件转换为文本 — OCR / 转录 / PDF / 视频 / 办公软件 |
| `clean` | 🌬️ **清理** | 去除垃圾(提及,URL,标签,零宽度) |
| `build` | 🍳 **构建** | 组合所有内容 → 聊天格式数据集(**重复数据删除 + 泄漏安全分割**) |
| `tune` | 🎓 **调整** | 将数据集分组为分阶段课程,按源和训练器配置(**sprint/** 布局) |
| `pack` | 🎁 **打包** | 为Kaggle/Unsloth训练打包数据集 |
| `eval` | 📊 **评分** | 评估数据集质量(就绪性,重复数据删除,泄漏,平衡,多样性)+ 门控CI |
| `caps` | ✨ **复制技能** | 拉取仓库的**技能**并在注册表中保持它们 |
| `bench` | 🥊 **基准测试** | 基准测试服务模型(质量 + 速度)与测试套件;门控CI |
| `soul` | 👻 **灵魂** | 编译`soul.toml` → 服务工件(系统提示,采样,工具,聊天模板) |
| `mcp` | 🌐 **服务工具** | 将整个工具包公开为MCP工具,代理/运行环境可以驱动(stdio JSON-RPC) |
## 能力(`kibble caps`)
技能安装应用于代理本身:消费源并**获得其技能**。将`caps`指向本地路径或URL(URL源重用`fetch`处理程序 — git/存档/HTTP),并且任何`SKILL.md`技能都被安装到托管注册表中:
```bash
kibble caps install https://github.com/you/skills-repo # 检测并安装技能(--force,--project)
kibble caps scan <path|url> # 试运行:列出将安装的内容
kibble caps list # 已安装技能
kibble caps remove <name> # 卸载
```
技能位于`<root>/skills/<name>/`,索引位于`<root>/registry.json`(`[caps].root`,默认为`~/.kibble/caps`;`--project`用于repo-local `.kibble/caps`)。安装仅**复制 + 注册** — 技能脚本从不执行;名称被净化,目标被限制在技能根目录下,符号链接被跳过,输入大小被限制。这是代理层的基础(通过MCP公开注册表,组装代理配置,以及自主构建/调整循环是下一步)。
## 源(`kibble.toml`)
`build` 摄取本地原始树 **和** `kibble.toml` 中声明的任何 `[[source]]`。源类型从路径自动检测(具有显式 `type` 覆盖):
```toml
[[source]]
path = "https://github.com/you/repo" # 代码库(克隆,扫描)
[[source]]
path = "data/external/chat.jsonl" # 数据集(折叠到分割中)
system_prompt = "简洁准确地回答。" # 可选的每个源提示注入
[[source]]
path = "https://blog.example.com/post" # 网络(获取 → 提取主文本)
[[source]]
path = "notes/" # 文件目录(.txt/.md → 散文行)
[network]
proxy = "socks5://127.0.0.1:9050" # 所有出站流量都具有代理感知(否则 *_PROXY 环境变量)
[paths]
data_root = "data" # raw/catalog/mirror 基目录
dataset_dir = "data/datasets/unsloth" # build 将拆分和统计数据写入此处
```
自动检测涵盖:**数据集**(`.jsonl`),**代码库**(git URL 或代码目录),**网络**(URL),**博客**(`.html`),**文件**(`.txt`/`.md` 目录)。代码内容绕过散文清理器(保留 `$VAR`/URL/路径);散文被清理。
**策划( `[curate]` ):** 在写入之前,`build` 会删除格式错误/退化/过短的行,对相同的答案进行重复数据删除,并按答案内容进行分割(`SHA256(answer) %100` → 78/12/10),这样相同的答案永远不会出现在两个分割中 — 从而在构造上防止确切的训练 ↔ 有效/测试泄漏。一个 **可选的 MinHash 近似重复传递** (`near_dedup`)还会折叠近似段落/模板答案。确定性;`stats.json` 报告 `dropped_duplicates`、`dropped_filtered` 和 `dropped_near_duplicates`。
## 处理器(`kibble fetch` / 服务 API)
`fetch` 和 `/ingest` 将 URL 路由到正确的下载器,将结果暂存到 ingest 树中供 `build` 消费 — 将 kibble 指向链接,它就会拉取:
- **git** — 浅克隆(代理感知,参数保护)
- **HuggingFace 数据集** — 通过 hub API 列出和下载
- **开放 HTTP 目录** — 爬取 `<a href>` 链接;**直接 HTTP 文件** — 流式下载
- **存档** — `.zip` / `.tar.gz` 提取(zip-slip 和符号链接安全)
- **Dropbox / Google Drive / MediaFire / gofile** — 共享链接解析器
- **mega.nz** — 公共文件和文件夹链接,下载并 **解密** (手工滚动 AES-128)
每个下载都有大小限制,并写入遍历安全的文件名。
## 服务 API
一个作业队列 — 将自动化工具指向它,作业就会进来:
```bash
KIBBLE_API_TOKEN=… kibble serve # 失败关闭:没有令牌拒绝启动
```
> **机密 / `.env`:** kibble 自动加载启动时最近的 `.env` (工作目录向上),因此 `OCR_API_KEY`、`KIBBLE_API_TOKEN`、`OPENAI_API_KEY` 等不需要 `source`。真正的环境变量始终获胜。复制 `.env.example` → `.env` (gitignored)。没有 `.env` → 什么也不发生。
- `GET /health` (开放)· `POST /ingest {url,name?}` → `{job_id}` · `GET /jobs/{id}` → 状态
- Bearer 令牌身份验证在摄取/作业上;**SSRF 保护** 拒绝环回/私有/链路本地 IP(包括 IPv4 映射的 IPv6 和用户信息技巧),具有 `allow_hosts` 绕过;内存作业注册表。默认绑定到 `127.0.0.1`;用反向代理前面来公开它。
## 评估
`kibble eval` 评估已构建数据集的 **训练准备度和质量** (SFT)— 有效行/畸形检查,确切 + 归一化 **重复** 率,训练 ↔ 有效/测试 **泄漏**,长度分布,源 **平衡** (来自 `stats.json`),**退化** 行和答案 **多样性** (distinct-2)。它写入 `report.{json,md}`,带有 0-100 的分数和每个指标的阈值;**整体通过当且仅当所有门控指标都通过**。一个 **可选的近重复传递** (`[eval].near_dup`)添加 `near_duplicate_rate` + `near_leakage_rate` (MinHash),因此门控也认证模糊/段落重复和泄漏。当存在 `clusters.json` 时,`max_topic_share` 指标门控主题平衡(默认阈值 `0.60`),如果嵌入后端不可用,则软跳过。
```bash
kibble eval # 仅报告
kibble eval --strict # 如果数据集未通过门控,则退出 1 (阻止 CI / 构建)
```
阈值位于 `[eval.thresholds]` 下(参见 `docs/EVAL.md`)。在一个真实的 59k 行语料库上,它捕获了 14% 的训练/有效泄漏和 8.5% 的重复数据 — 正是这些问题会无声地破坏微调。主动策划 *修复* 一个失败的数据集(在 `build` 中重复数据删除/过滤/重新平衡)和 DPO/预训练格式是下一步。
## 理解层(嵌入)
一个密集嵌入后端(任何OpenAI兼容的`/embeddings`端点),带有内容哈希 **向量存储/缓存** (`data/embeddings/`,在`build` → `eval`中重用),以及一个手工制作的 **SimHash LSH** 用于余弦近似重复搜索。没有新的crate依赖。两个消费者,均 **可选** 且软失败(未配置/无法访问的端点 → 跳过并警告,`build` / `eval` 不受影响):
```toml
[understand.embed]
base_url = "http://localhost:8090/v1" # 空 = 禁用
model = "nomic"
```
- `[curate].semantic_dedup` (默认关闭) — 折叠近似段落答案,保持最长的答案;报告为 `dropped_semantic_duplicates`。
- `[eval].semantic` (默认关闭)— 增加 `semantic_near_duplicate_rate` + `semantic_leakage_rate`,计入分数和 `--strict`。
键来自 `EMBED_API_KEY` / `OPENAI_API_KEY` (仅限环境变量,可选的受信任 LAN)。参见 `docs/UNDERSTAND.md` 获取完整配置、存储格式和推荐的推出(首先启用 `[eval].semantic` — 只读 — 然后在数字看起来正确时启用 `[curate].semantic_dedup`)。
## 聚类
`kibble cluster` 使用 **确定性球面 k 均值** (k-means++ 种子,固定 PRNG 种子,最大 50 次迭代)根据其嵌入对已构建数据集的答案进行主题聚类。每个主题都由其最 **独特的术语** 标记(高 TF-IDF 聚类内,在聚类间很少见;无需 LLM)。质心存储在 `clusters.json` 中,并为 `eval` 数据集平衡门控提供 `max_topic_share` (#25)和构建时主题重新平衡。
```toml
[cluster]
k = 12 # 默认:目标主题数量
enabled = true # 默认
out = "data/clusters.json" # 默认
rebalance = false # 默认:限制构建过程中过度代表的主题
max_topic_share = 0.35 # 默认:限制主题在训练中的比例(构建端)
llm_labels = false # 默认:选择 LLM 命名标签
[understand.embed]
base_url = "http://localhost:8090/v1" # 与理解层共用
model = "nomic"
```
聚类是 **可选且软失败的**:如果嵌入后端未配置或无法访问,则聚类将被跳过并发出警告 — `kibble build` 完成不受影响,而 `kibble cluster` 仍然成功。
```bash
kibble cluster # 使用 [cluster].k (默认 12)
kibble cluster --k 8 # 聚类为恰好 8 个主题
kibble cluster --json # 输出 JSON (参见 docs/CLUSTER.md)
```
当 `[cluster].rebalance = true` 时,`kibble build` 在内存中聚类精选的训练数据,限制过度代表的主题,通过丢弃其边缘行,并写入生成的 `clusters.json` — 因此 `eval` 读取相同的质心并在一次构建中收敛。当重新平衡关闭且 `[cluster].enabled = true` 时,聚类在构建结束时在所有分割上运行(路径不变)。设置 `[cluster].llm_labels = true` 以用 LLM 生成的主题名称替换独特的术语标签(重用 `[ask]` 端点;如果不可用则软失败)。参见 `docs/CLUSTER.md` 了解完整详细信息。
## 检索/搜索
`kibble index` 将语料库分块,通过共享的 `[understand.embed]` 缓存将每个块嵌入,并构建一个手工制作的 **BM25** 倒排索引;`kibble search` 通过 BM25 + 语义余弦的 **Reciprocal Rank Fusion** 对段落进行排名。当没有嵌入后端时,两者都软失败为仅基于词汇的(BM25),如果端点无法访问或索引是使用不同模型构建的:
```toml
[index]
dir = "data/index" # 默认
sources = ["data/raw", "data/ingest", "data/extracted"] # 默认
chunk_chars = 800 # 默认
rrf_k = 60 # 默认
```
```bash
kibble index # 从 [index].sources 构建/重建索引
kibble search "如何工作" --k 5 --json # 混合搜索 → 表格或 JSON 结果
```
写入 `data/index/{chunks.jsonl,bm25.json,meta.json}`;缺少/空索引会报错 `run kibble index first`。无新 crate 依赖;确定性离线测试。参见 `docs/RETRIEVE.md` 了解完整行为、输出形状和软失败详细信息。
## 提问/ RAG
`kibble ask "<question>"` 在索引语料库中回答问题:它播种一个 `search`,然后让一个服务 LLM 调用一个 `search_corpus` 工具,最多 `[ask].max_rounds` 次,然后使用 `[n]` 引用回答 — 或当语料库无法覆盖它时,交互式未找到流程(提供源和重试/添加详细信息和重试/ `--chance` 通用知识后备,标记为无基础)。**始终显示基础:** 引用来源,或检索的段落,这些段落为无引用的答案或 `⚠` 提供了支持,当它是通用知识时。重用检索索引和共享的 OpenAI 兼容聊天助手(也由 `bench` 使用);检索保持软失败,但 `ask` 需要一个服务 LLM( `[ask].base_url`)— 那部分是一个硬依赖,与 `search` 不同。
```toml
[ask]
base_url = "http://localhost:8000/v1" # 服务型 LLM (空 → 硬错误)
model = "kibble-style"
temperature = 0.2
max_tokens = 1024
k = 6 # 每次 search_corpus 调用传递的段落数
max_rounds = 3 # 代理搜索迭代
[web]
base_url = "https://localhost:8888" # SearXNG 实例;空 → DuckDuckGo 抓取备用
default = false # 默认情况下,网络工具关闭,除非 --web 覆盖
max_results = 5
allow_hosts = []
fetch_bytes = 2000000
fetch_chars = 4000
```
**将 `ask` 指向任何OpenAI兼容的服务器**(Ollama,LM Studio,vLLM,llama.cpp):
```toml
```
# kibble.toml
[understand.embed]
base_url = "http://localhost:11434/v1" # 例如:`ollama pull nomic-embed-text`
[ask]
base_url = "http://localhost:11434/v1" # 例如:`ollama pull llama3.2`
model = "llama3.2"
```
或者复制完整的注释模板:`cp kibble.toml.example kibble.toml`.
```bash
kibble ask "重试回退机制如何工作"
kibble ask "SSRF 防护策略是什么" --k 8 --json
kibble ask "谁编写了最初的 BASIC 解释器" --chance
kibble ask "Rust 最新版本中有哪些变化" --web
```
`--web`(或 `[web].default = true`)还会为模型提供 `web_search`/`fetch_page` 工具 —
它优先使用语料库,只有在需要时才会访问网络;`--no-web` 强制仅使用语料库进行一次查询。引文在 `来源:` 列表中标记为 **`[本地]`** 和 **`[网络]`** (`--json` 获取一个 `"类型"` 字段);抓取的页面仅为该答案引用,而不会添加到 `数据/索引` 中。
答案 **按令牌流式传输** 到终端,当模型生成它们时( `[ask].stream`,默认为开启;`--no-stream` 禁用,`--stream` 强制启用)— 管道输出会缓冲,而 `--json` 会缓冲到单个对象,除非与 `--stream` 配对。 **`--json --stream` 流式传输 NDJSON 事件**,适用于程序化消费者(搜索/令牌事件 → 终端答案/未找到事件;无需 TTY)。
密钥来自 `ASK_API_KEY` / `OPENAI_API_KEY`(仅限环境变量)。无需新的 crate 依赖;通过脚本聊天缝隙和本地模拟器进行确定性离线测试,适用于网络模式。有关代理循环、未找到流程、网络增强答案、流式传输和输出示例(找到 / 未找到 / `--chance`),请参阅 `docs/ASK.md`。
## 库使用
kibble 不仅是一个 CLI 命令,还可以作为 **库** 使用 — 直接链接它,而不是通过 shell 命令行解析 stdout。搜索/询问消费者使用精简的 **`retrieval`** 功能,该功能删除了重量级的摄入/构建/爬取/服务树(`parquet`、`axum`、`pdf-extract`、`tar`/`zip`/`aes`);默认的 **`full`** 功能是完整的(`kibble` 二进制文件使用的功能)。
```toml
# 精简消费者 — 仅限搜索 + 询问(+ 网络):
kibble = { git = "https://github.com/femboyisp/kibble", default-features = false, features = ["retrieval"] }
```
API 是异步的(tokio),并返回类型化结果。错误是干净的 `Err`,而不会发生恐慌(例如,未设置的 `[ask].base_url` 表现为 `io::Error`,而不会崩溃):
```rust
use std::path::Path;
use kibble::ask::{AskOptions, AskEvent, Outcome};
let root = Path::new("."); // 持有 kibble.toml + data/index 的目录
// 混合 BM25 + 语义搜索 → 类型化命中(在阻塞池上运行阻塞读取)
let hits = kibble::retrieve::search(root, "重试回退机制如何工作", 5).await?;
// 缓冲接地 RAG → 整个结果一次
let out: Outcome = kibble::ask::query(
root, "SSRF 防护策略是什么",
AskOptions { web: true, ..Default::default() }, // { k: Option<usize>, web: bool, chance: bool }
).await?;
// 流式接地 RAG → 搜索进度 + 答案令牌 + 最终引用结果,按事件发生顺序
use tokio_stream::StreamExt;
let mut stream = kibble::ask::query_stream(root, "解释询问循环", AskOptions::default())?;
while let Some(ev) = stream.next().await {
match ev {
AskEvent::Search { query, kind } => { /* "⋯ 搜索语料库" — SearchKind::{Corpus,Web,Fetch} */ }
AskEvent::Token(t) => print!("{t}"), // 一个答案文本增量
AskEvent::Done(outcome) => { /* 终端:Outcome::{Answered{answer,sources,..},NotFound} */ }
}
}
```
`query`/`query_stream`/`search` 未来是 `Send`,因此它们可以与 `tokio::spawn`、`select!` 和 `Send` 边界异步特征组合。`query_stream` 返回 `io::Result<impl Stream<Item = AskEvent> + Send>` — 设置错误在流式传输之前是一个类型化的 `Err`;最终结果作为终端 `AskEvent::Done` 发送。
## 基准测试(模型基准)
在 `eval` 评估 **数据集** 的情况下,`kibble bench` 评估 **模型**。将它指向任何 OpenAI 兼容的端点(您的 vLLM / MLX 服务器),运行一个 **可扩展的** 基准测试套件,评估质量 **和速度**,并进行检查:
```toml
[bench.model]
base_url = "http://localhost:8000/v1"
model = "style-lora"
[[bench.benchmark]]
name = "知识"
path = "benchmarks/knowledge.jsonl"
method = "contains" # contains | mcq | judge
threshold = 0.7
```
```bash
kibble bench # 评分 + 延迟报告 → bench/report/{report.json,report.md}
kibble bench --strict # 如果模型未通过检查,则退出 1(CI)
```
一个基准测试 = 一个 `[[bench.benchmark]]` 条目 + 一个 `cases.jsonl`;**添加一个文件 → 添加一个基准测试**(参见 `docs/BENCH.md`)。这是循环的“模型是否变得更好 / 是否足够快?”的信号。一个 **网络研究 / 工具执行** 方法(`method = "research"`)运行一个代理循环 — 模型调用 `web_search` / `fetch_page`(SearXNG 或 DuckDuckGo + KIBBLE 的页面抓取),测试框架执行它们,最终答案被评估 + 计时端到端(可衡量的“beat-Perplexity”)。`fetch_page` 受到 SSRF 保护 + 字节限制。添加 `--stream` 以在 stderr 上实时查看模型的网络研究输出(仅限研究;评估和 stdout 不变)。参见 `docs/BENCH.md`。
## 提取
`kibble extract <path|dir>` 将工件转换为干净的文本(提取层),
在 `data/extracted/` 下为 `build` 消费(`fetch → extract → build`):
- **图像 → OCR** 和 **音频 → 转录** 通过配置的 OpenAI 兼容端点(例如,无限 OCR / Whisper 服务器),具有本地 CLI 备用(`tesseract`、`whisper`)
- **PDF** — 通过 `pdf-extract` 进行文本层提取;扫描/稀疏 PDF 渲染为 `pdftoppm` → OCR
- **视频** — `ffmpeg` 拉取音频轨 → 转录
- **办公软件**(docx/odt/…)— `pandoc` → 纯文本
- **HTML/文本** — 主文本提取 / 直通
每个后端尝试端点,然后尝试 CLI,然后清楚地报错。密钥仅来自环境变量;CLI 通过参数向量调用,路径规范化(无 shell,无标志注入);输入大小上限。在 `[extract]` / `[extract.ocr]` / `[extract.transcribe]` / `[extract.pdf]` / `[extract.video]` / `[extract.office]` 下配置。
## 清洁规则
`clean` 按顺序删除:零宽度/替换字符;`@提及`(保留电子邮件);`http(s)://` URL;`#标签`、`$TICKERS`、`r/子版块`;Discord 邀请;删除后留空的括号 — 然后规范化空格。
## 路线图
`kibble` 是一个 **消费任何东西** 的摄入和数据集平台,构建为分层栈(发现 → 获取 → 提取 → 理解 → 整理 → 检索 → **答案** → 调整)。**已交付:** 获取(`fetch`/`serve` + 处理程序,包括 git/HuggingFace/Dropbox/Drive/MediaFire/gofile/mega),完整的提取器(`extract`:OCR / 转录 / PDF / 视频 / 办公软件),`build`/`pack`/`eval`,`understand` 层(嵌入 + 语义重复/泄漏检测),`retrieve` 层(`index`/`search` — BM25 + 语义混合,RRF 融合),和 `ask` 层(`kibble ask` — 代理,引用 RAG)。**下一个:** 网络增强的 `ask`(基于 SearXNG 的研究超越语料库),基于嵌入的自动分类/聚类,可调训练混合和自动调优工具,带有可观察性。参见 `CHANGELOG.md` 和设计规格,了解分层路线图。
## 开发
**386 个测试**,全部离线(本地模拟器 + 存根二进制文件,无真实网络/工具),clippy 干净:
```bash
cargo test # 离线测试(无网络/外部工具 — 本地模拟器 + 存根二进制文件)
cargo clippy
```
## 许可证
在 [MIT](LICENSE-MIT) 或 [Apache-2.0](LICENSE-APACHE) 许可证下授权,由您选择。
欢迎贡献 — 预 1.0 版,因此请期待有锋利的边缘 🦴
连接信息
猜你喜欢
暂无推荐服务器