# Ob Benchmark

> Obsidian 文章质量基准评测系统。通过交互式问答对知识库文章打分，记录缺点，自动提炼写作偏好。触发词：评分、打分、文章评价、ob-benchmark、知识库评分。

- Skill: `wangjs-jacky/ob-benchmark` (Agent Skill)
- Install (CLI): `npx skillmds@latest add wangjs-jacky/ob-benchmark`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wangjs-jacky/ob-benchmark/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: wangjs-jacky (https://skillmd.com/u/wangjs-jacky)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wangjs-jacky/ob-benchmark

---


<role>Obsidian 知识库质量评分助手，通过交互式问答让用户对文章进行主观质量评分，记录问题并自动提炼写作偏好。</role>
<purpose>建立人机结合的质量反馈闭环：用户评分 → 记录问题 → 提炼偏好 → 指导后续写作和采集。</purpose>
<trigger>

```text
触发词：
- 评分 / 打分 / 文章评价 / 知识库评分
- ob-benchmark / 给文章打分
- 评价知识库 / 文章质量

示例：
- "ob-benchmark"
- "帮我给知识库文章打分"
- "评分一下 claude 目录的文章"
- "评价一下我的文章质量"
```

</trigger>
<gsd:workflow xmlns:gsd="urn:gsd:workflow">
  <gsd:meta>requires=OBSIDIAN_REPO; focus=rate,preference,feedback</gsd:meta>
  <gsd:goal>通过交互式评分记录文章质量反馈，自动提炼用户写作偏好，持续优化知识库质量标准。</gsd:goal>
  <gsd:phase>**委托 ob-router skill** 解析当前激活仓库路径，扫描 wiki/ 目录，展示主题文件夹列表供用户选择。</gsd:phase>
  <gsd:phase>逐篇展示选中文件夹的文章摘要信息（标题、标签、字数、更新时间），用户在 Obsidian 中查看后打分（1-10）并描述缺点，记录到评分表。</gsd:phase>
  <gsd:phase>每评完 5 篇触发批量统计和偏好提炼，更新偏好文件。</gsd:phase>
  <gsd:phase>文件夹评完后展示总结，用户可选择继续下一个文件夹或结束。</gsd:phase>
</gsd:workflow>

# Obsidian 文章质量评分（ob-benchmark）

交互式文章评分系统，记录质量反馈并自动学习你的写作偏好。

## 配置检查

**【硬约束】仓库路径一律委托 ob-router skill 解析，本 skill 不自行读取路径文件。**

调用 ob-router skill 获取 `$OBSIDIAN_REPO`：
- ob-router 内部处理优先级（ob-router.json → CLAUDE.md → 询问）
- 若 ob-router.json 不存在，ob-router 会**主动提示** `ob-router init` 持久化
- 若存在多个仓库，ob-router 会**主动询问**切换目标，不静默使用默认值

将 ob-router 返回的路径保存为 `$OBSIDIAN_REPO`，后续全程使用此变量。
4. 检查 `$OBSIDIAN_REPO/wiki/` 目录是否存在
5. 如果不存在，提示用户先运行 ob-index 初始化

## 数据文件

### 评分表：`$OBSIDIAN_REPO/wiki/.ratings.md`

首次使用时自动创建，模板如下：

```markdown
---
type: meta
tags: [rating, system]
updated_at: {当前日期}
---

# 文章评分表

> 通过交互式评分记录每篇文章的质量反馈，持续优化知识库。

## 统计

| 指标 | 值 |
|------|-----|
| 已评分 | 0 |
| 平均分 | — |
| 最高分 | — |
| 最低分 | — |

## 评分记录

| ID | 文章 | 分数 | 问题标签 | 用户评价 | 评价时间 |
|-----|------|------|----------|----------|----------|
```

### 偏好文件：`$OBSIDIAN_REPO/wiki/.rating-preferences.md`

首次触发偏好提炼时自动创建，模板如下：

```markdown
---
type: meta
tags: [rating, preferences]
updated_at: {当前日期}
---

# 评分偏好

> 基于 {N} 篇已评分文章自动提炼的写作偏好。

## 高分文章特征（≥8分）

（评分积累后自动填充）

## 低分文章特征（≤5分）

（评分积累后自动填充）

## 偏好规则

（评分积累后自动填充量化规则）
```

## 执行流程

### 第一步：选择文件夹

1. 扫描 `$OBSIDIAN_REPO/wiki/` 下的所有一级子目录
2. 统计每个目录中的 `.md` 文件数量（排除 `index.md`、`log.md`、以 `.` 开头的文件）
3. 读取 `$OBSIDIAN_REPO/wiki/.ratings.md`，统计每个目录的已评分数
4. 使用 AskUserQuestion 展示选项：

```
📊 文章评分系统

主题目录：
  1. ai/ (3篇, 已评0篇)
  2. claude/ (8篇, 已评3篇)
  3. current-affairs/ (10篇, 已评0篇)
  ...

选择要评分的文件夹（输入编号）：
```

5. 用户选择后，筛选出该目录下未评分的文章（排除已出现在评分表中的文章）
6. 如果所有文章已评分，提示选择其他文件夹

### 第二步：逐篇评分

对每篇未评分文章，按顺序执行：

**展示文章**：

读取文章文件的 frontmatter 获取标题（第一个 `#` 标题）、tags、updated_at、article_id，统计正文字数（排除 frontmatter）。

```
━━━ [3/8] {相对路径} ━━━
🆔 {article_id} | 📂 标题: {文章标题}
🏷️ 标签: {tags 逗号分隔}
📝 约 {字数} 字 | 📅 更新: {updated_at}

请在 Obsidian 中查看文章后评分（1-10）并说明缺点：
（输入分数和意见，如 "7分，太长，缺代码示例"）
（输入 s 跳过，输入 q 结束本轮）
```

如果文章缺少 `article_id`，显示为 `🆔 无ID`。

**解析用户输入**：

- 提取分数：找到输入中的 1-10 的整数（支持"7分"、"7"、"给7分"等格式）
- 如果输入中没有有效分数，提示"请输入 1-10 的分数"
- 提取问题标签：从用户描述中提取关键词作为问题标签
- 记录原始评价：保留用户的完整评价文字

**记录数据**：

将评分追加到 `$OBSIDIAN_REPO/wiki/.ratings.md` 的评分记录表：

```
| {article_id 或 "无ID"} | {相对路径去掉 wiki/ 前缀} | {分数} | {问题标签逗号分隔} | {用户评价} | {当前日期} |
```

更新统计部分：
- 已评分：+1
- 平均分：重新计算所有评分记录的平均值
- 最高分：取最大值，附文件名
- 最低分：取最小值，附文件名
- updated_at：更新为当前日期

### 第三步：批量统计与偏好提炼

**触发时机**：每评完 5 篇 或 文件夹评分结束时

**展示本轮统计**：

```
📊 本轮统计（已评{N}篇）

- 平均分：{x.x}
- 常见问题：{问题1}({n}次), {问题2}({n}次)
- 高分文章：{文件名}({分数}分)
- 低分文章：{文件名}({分数}分)

🧠 偏好更新
新增规则：
  - {规则描述}

继续评分剩余 {N} 篇？
```

**偏好提炼逻辑**：

读取 `$OBSIDIAN_REPO/wiki/.ratings.md` 中的所有评分记录，执行以下分析：

1. **问题频率统计**：统计所有问题标签的出现次数，按频率降序排列。高频问题（出现 ≥3 次）为核心关注点
2. **分数-问题关联**：计算每个问题标签关联的文章平均分。平均分 < 5 的问题为强负面偏好
3. **高分特征提取**：分析所有 ≥8 分的文章，找出它们的共同特征
4. **低分特征提取**：分析所有 ≤5 分的文章，找出它们的共同特征
5. **增量更新**：将新分析结果与已有偏好合并。已有规则有新数据支撑时更新统计数字，发现新模式时追加规则

**更新偏好文件** `$OBSIDIAN_REPO/wiki/.rating-preferences.md`：

- 更新 `updated_at`
- 更新开头描述中的 N 值
- 重写"高分文章特征"部分
- 重写"低分文章特征"部分
- 更新"偏好规则"部分，每条规则附数据支撑（如"偏好短文（≤500字，平均得分 7.2 vs 长文 5.1）"）

### 第四步：文件夹完成

一个文件夹所有文章评完后：

```
✅ {目录名}/ 目录评分完成

总评 {N} 篇，平均分 {x.x}
偏好文件已更新

选择下一个文件夹？还是结束？
```

用户选择后：
- 选另一个文件夹 → 回到第一步重新选择
- 结束 → 进入第五步

### 第五步：改进建议

评分结束后（用户选择结束或所有文件夹评完），基于评分数据和偏好规则生成可执行的改进建议。

**读取数据**：

1. 读取 `$OBSIDIAN_REPO/wiki/.ratings.md` 获取所有评分记录
2. 读取 `$OBSIDIAN_REPO/wiki/.rating-preferences.md` 获取偏好规则

**生成建议**：

按优先级分类输出：

```
🔧 改进建议（基于 {N} 篇评分数据）

🔴 建议删除（{n} 篇，平均分 ≤2）：
  - {文件路径} ({分数}分) — {一句话原因}
  ...

🟡 建议迁移（{n} 篇，分类不当）：
  - {文件路径} → {建议目录}/{建议文件名}
  ...

🟢 建议重写（{n} 篇，有内容但质量不足）：
  - {文件路径} — {主要改进方向}
  ...

✅ 保持不变（{n} 篇，≥6分）：
  - {文件路径} ({分数}分)
```

**执行方式**：

使用 AskUserQuestion 让用户选择要执行的操作：

```
选择要执行的改进（可多选）：
  □ 删除 {n} 篇低质量文章
  □ 迁移 {n} 篇分类不当的文章
  □ 查看重写建议（不自动执行）
  □ 暂不操作，仅记录
```

- 用户选择"删除" → 确认后移到 `$OBSIDIAN_REPO/wiki/archive/` 目录（不直接删除）
- 用户选择"迁移" → 确认后移动文件并更新评分表中的路径
- 用户选择"重写建议" → 展示每篇的详细改进方向
- 用户选择"暂不操作" → 仅保存建议到 `$OBSIDIAN_REPO/wiki/.rating-actions.md`

## 输入解析规则

### 分数解析

从用户输入中提取 1-10 的整数，支持以下格式：
- "7分" → 7
- "7" → 7
- "给7分" → 7
- "我打7分" → 7
- "7/10" → 7

无法解析时提示"请输入 1-10 的分数"。

### 问题标签提取

从用户评价中提取有意义的关键词作为标签：
- "太长了" → `太长`
- "缺少代码示例" → `缺代码示例`
- "概念解释不清楚" → `概念不清`
- "没有引言" → `缺引言`
- "标题不明确" → `标题含糊`

标签应简短（≤6字），去除语气词。

### 命令处理

| 输入 | 动作 |
|------|------|
| `s` 或 `skip` | 跳过当前文章，继续下一篇 |
| `q` 或 `quit` | 结束本轮评分，保存进度 |
| `1`-`10`（纯数字） | 记录分数，追问缺点 |

## 边界条件

| 场景 | 处理 |
|------|------|
| 文件夹所有文章已评分 | 提示选择其他文件夹 |
| 用户输入不含有效分数 | 提示"请输入 1-10 的分数"，等待重新输入 |
| 用户输入 s 跳过 | 跳过当前文章，继续下一篇 |
| 用户输入 q 结束 | 保存当前进度，展示已评统计后退出 |
| 评分文件不存在 | 首次使用，创建模板文件 |
| 偏好文件不存在 | 首次触发偏好提炼时创建 |
| 中途退出 Claude | 进度已实时保存到文件中，下次启动自动恢复 |
| wiki/ 下无子目录 | 提示用户先运行 ob-collect 采集内容 |

## 与其他 skill 的关系

| Skill | 关系 |
|-------|------|
| ob-tidy | ob-tidy 做自动检查（12项规则），ob-benchmark 做主观评分，互补 |
| ob-collect | 采集新文章后，可引导用户使用 ob-benchmark 评分 |
| ob-index | 评分表不参与索引，不写入 index.md |
| 消费偏好 | ob-tidy 和 ob-project-log 在执行时读取偏好文件指导内容质量 |

