a6f05ab2d5
- Phase 0: AGENTS.md cleanup (dedup quotes, renumber sections, merge qmd) - Phase 1: typed relations (manage-relations.py, graph-search.py, check-staleness.py, detect-conflicts.py) - Phase 2: frontmatter validator, weekly lint, knowledge promotion, git hooks - Fix .gitignore to track tools/ and .githooks/ - Fix git remote URL (remove plaintext token) - New wiki pages: 504 pages, 34 raw sources
453 lines
31 KiB
HTML
453 lines
31 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Skill — Eval Review</title>
|
||
<style>
|
||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; }
|
||
header { background: #1a1a2e; color: white; padding: 16px 24px; display: flex; align-items: center; gap: 16px; }
|
||
header h1 { font-size: 18px; }
|
||
.tabs { display: flex; gap: 0; background: #eee; padding: 0 24px; }
|
||
.tab { padding: 10px 20px; cursor: pointer; border: none; background: none; font-size: 14px; color: #666; border-bottom: 2px solid transparent; }
|
||
.tab.active { color: #1a1a2e; border-bottom-color: #1a1a2e; font-weight: 600; }
|
||
.tab:hover { color: #333; }
|
||
.content { display: none; padding: 24px; max-width: 960px; margin: 0 auto; }
|
||
.content.active { display: block; }
|
||
.eval-card { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
||
.eval-card h3 { margin-bottom: 12px; color: #1a1a2e; }
|
||
.prompt { background: #f8f9fa; padding: 12px; border-radius: 4px; font-family: monospace; white-space: pre-wrap; margin-bottom: 12px; font-size: 13px; }
|
||
.output-section { margin-top: 12px; }
|
||
.output-section h4 { margin-bottom: 8px; color: #555; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; }
|
||
.output-files { display: grid; gap: 8px; }
|
||
.output-file { background: #f8f9fa; padding: 12px; border-radius: 4px; font-family: monospace; font-size: 12px; white-space: pre-wrap; max-height: 300px; overflow: auto; }
|
||
.output-file .filename { font-weight: 600; color: #1a1a2e; margin-bottom: 4px; font-size: 13px; }
|
||
.nav { display: flex; gap: 8px; justify-content: center; margin-bottom: 20px; }
|
||
.nav button { padding: 8px 16px; border: 1px solid #ddd; background: white; border-radius: 4px; cursor: pointer; }
|
||
.nav button:hover { background: #eee; }
|
||
.nav span { padding: 8px; color: #666; }
|
||
.grading { margin-top: 12px; padding: 12px; background: #f0f8f0; border-radius: 4px; }
|
||
.grading.fail { background: #fff0f0; }
|
||
.grading h5 { margin-bottom: 8px; font-size: 13px; }
|
||
.grading-item { font-size: 13px; margin: 4px 0; }
|
||
.pass { color: #2e7d32; } .fail { color: #c62828; }
|
||
.benchmark-section { background: white; border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
||
.benchmark-section h3 { margin-bottom: 12px; color: #1a1a2e; }
|
||
table { width: 100%; border-collapse: collapse; }
|
||
th, td { text-align: left; padding: 8px 12px; border-bottom: 1px solid #eee; font-size: 14px; }
|
||
th { font-weight: 600; color: #555; }
|
||
.delta { font-weight: 600; }
|
||
.delta.positive { color: #2e7d32; } .delta.negative { color: #c62828; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<header><h1>Skill — Eval Review</h1></header>
|
||
<div class="tabs">
|
||
<button class="tab active" onclick="switchTab('outputs')">Outputs</button>
|
||
<button class="tab" onclick="switchTab('benchmark')">Benchmark</button>
|
||
</div>
|
||
|
||
<div id="tab-outputs" class="content active">
|
||
<div class="nav">
|
||
<button onclick="prevEval()">← Prev</button>
|
||
<span id="eval-counter">1 / 3</span>
|
||
<button onclick="nextEval()">Next →</button>
|
||
</div>
|
||
<div id="eval-container"></div>
|
||
<div style="text-align:center; margin-top: 16px;">
|
||
<button onclick="submitFeedback()" style="padding: 10px 24px; background: #1a1a2e; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px;">Submit All Reviews</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="tab-benchmark" class="content">
|
||
<div id="benchmark-container"></div>
|
||
</div>
|
||
|
||
<script>
|
||
const evals = [
|
||
{
|
||
"eval_id": 0,
|
||
"eval_name": "检查同步状态",
|
||
"prompt": "检查一下 home-wiki 的同步状态,看看有没有需要更新的内容",
|
||
"assertions": [
|
||
{
|
||
"name": "dry-run 被执行",
|
||
"type": "custom",
|
||
"expected": "dry-run 输出包含 total/updated/created/unchanged 数据"
|
||
},
|
||
{
|
||
"name": "报告扫描页数",
|
||
"type": "custom",
|
||
"expected": "告知用户扫描了多少页(26)"
|
||
},
|
||
{
|
||
"name": "正确判断同步状态",
|
||
"type": "custom",
|
||
"expected": "基于输出判断是否需要同步,并告知用户状态"
|
||
},
|
||
{
|
||
"name": "未执行写操作",
|
||
"type": "custom",
|
||
"expected": "仅 dry-run 模式,不写入任何文件"
|
||
}
|
||
],
|
||
"with_skill": {
|
||
"command_output.txt": "== home-wiki 诊断报告 ==\n扫描: 26 页\n需更新: 0 -> []\n需新建: 0 -> []\n未变化: 26 -> ['AI时代高等教育', 'EgoCentric数据采集与具身智能发展', 'LLM-Wiki-v2', 'markitdown', 'NeoLab', 'Researcher-Founder', '临界态', '以终为始', '价值驱动', '好学力行', '实践论', '山西12个原始古村落', '教学过程核心模型', '新范式', '涌现', '漱茶说', '老红军长寿现象的精神分析', '顶级人生三重境:道家驭势、佛家修心、儒家立身', '万物本源说', '奇绩创坛', '郭朝晖', '陆奇', '陈望道', '哈尔滨工程大学春季校园招聘会调研报告', '教学过程核心模型-理论佐证研究', '教育研究核验提示词库']\n完成。\n",
|
||
"response.txt": "home-wiki 同步状态检查完成:已完全同步,无需操作。\n\n具体报告:\n- 扫描 26 页\n- 未变化:26 页(无变更)\n- 需更新:0 页\n- 需新建:0 页\n\n所有 26 个页面(AI时代高等教育、EgoCentric数据采集与具身智能发展、LLM-Wiki-v2、markitdown 等)均与本地 wiki 保持一致,没有需要同步的内容。\n"
|
||
},
|
||
"without_skill": {
|
||
"command_output.txt": "== home-wiki 诊断报告 ==\n扫描: 26 页\n需更新: 0 -> []\n需新建: 0 -> []\n未变化: 26 -> ['AI时代高等教育', 'EgoCentric数据采集与具身智能发展', 'LLM-Wiki-v2', 'markitdown', 'NeoLab', 'Researcher-Founder', '临界态', '以终为始', '价值驱动', '好学力行', '实践论', '山西12个原始古村落', '教学过程核心模型', '新范式', '涌现', '漱茶说', '老红军长寿现象的精神分析', '顶级人生三重境:道家驭势、佛家修心、儒家立身', '万物本源说', '奇绩创坛', '郭朝晖', '陆奇', '陈望道', '哈尔滨工程大学春季校园招聘会调研报告', '教学过程核心模型-理论佐证研究', '教育研究核验提示词库']\n完成。\n",
|
||
"response.txt": "## home-wiki 同步状态检查报告\n\n### 执行方式\n\n通过 `sync_home_wiki.py --dry-run` 诊断模式进行检查(位于 `tools/scripts/sync_home_wiki.py`)。\n\n### 检查结果\n\n| 指标 | 值 |\n|------|-----|\n| 扫描页面数 | **26 页** |\n| 需更新 | **0 页** |\n| 需新建 | **0 页** |\n| 未变化 | **26 页** |\n\n### 结论\n\n**home-wiki 同步状态正常,无需更新。** 所有 26 个知识页面均已同步且处于最新状态,无新增、无变更。\n\n### 已同步的页面列表\n\n1. AI时代高等教育\n2. EgoCentric数据采集与具身智能发展\n3. LLM-Wiki-v2\n4. markitdown\n5. NeoLab\n6. Researcher-Founder\n7. 临界态\n8. 以终为始\n9. 价值驱动\n10. 好学力行\n11. 实践论\n12. 山西12个原始古村落\n13. 教学过程核心模型\n14. 新范式\n15. 涌现\n16. 漱茶说\n17. 老红军长寿现象的精神分析\n18. 顶级人生三重境:道家驭势、佛家修心、儒家立身\n19. 万物本源说\n20. 奇绩创坛\n21. 郭朝晖\n22. 陆奇\n23. 陈望道\n24. 哈尔滨工程大学春季校园招聘会调研报告\n25. 教学过程核心模型-理论佐证研究\n26. 教育研究核验提示词库\n"
|
||
},
|
||
"grading": {
|
||
"run_id": "eval-0-with_skill",
|
||
"grades": [
|
||
{
|
||
"text": "dry-run 被执行",
|
||
"passed": true,
|
||
"evidence": "response.txt 显示同步检查结果包含 26 页扫描数据"
|
||
},
|
||
{
|
||
"text": "报告扫描页数",
|
||
"passed": true,
|
||
"evidence": "明确报告 26 页"
|
||
},
|
||
{
|
||
"text": "正确判断同步状态",
|
||
"passed": true,
|
||
"evidence": "结论:已完全同步,无需操作"
|
||
},
|
||
{
|
||
"text": "未执行写操作",
|
||
"passed": true,
|
||
"evidence": "仅 dry-run 模式,无写入操作"
|
||
}
|
||
],
|
||
"summary": {
|
||
"total": 4,
|
||
"passed": 4,
|
||
"pass_rate": 1.0
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"eval_id": 1,
|
||
"eval_name": "同步并完善",
|
||
"prompt": "帮我完善同步,检查一下有没有问题需要修复",
|
||
"assertions": [
|
||
{
|
||
"name": "dry-run 被执行",
|
||
"type": "custom",
|
||
"expected": "先运行 --dry-run 检查同步状态"
|
||
},
|
||
{
|
||
"name": "lint 被执行",
|
||
"type": "custom",
|
||
"expected": "然后运行 --lint 检查健康状态"
|
||
},
|
||
{
|
||
"name": "空 source 被识别",
|
||
"type": "custom",
|
||
"expected": "识别并列出 lint 输出的空 source 页面(5 个)"
|
||
},
|
||
{
|
||
"name": "断链被分类分析",
|
||
"type": "custom",
|
||
"expected": "对断链进行分类(raw来源/别名/不存在),给出修复建议"
|
||
},
|
||
{
|
||
"name": "给出具体修复建议",
|
||
"type": "custom",
|
||
"expected": "针对每个问题类别给出可操作的修复建议,等待用户确认"
|
||
}
|
||
],
|
||
"with_skill": {},
|
||
"without_skill": {
|
||
"command_output.txt": "=== Command 1: python tools/scripts/sync_home_wiki.py --dry-run ===\nOutput:\n== home-wiki 诊断报告 ==\n扫描: 26 页\n需更新: 0 -> []\n需新建: 0 -> []\n未变化: 26 -> ['AI时代高等教育', 'EgoCentric数据采集与具身智能发展', 'LLM-Wiki-v2', 'markitdown', 'NeoLab', 'Researcher-Founder', '临界态', '以终为始', '价值驱动', '好学力行', '实践论', '山西12个原始古村落', '教学过程核心模型', '新范式', '涌现', '漱茶说', '老红军长寿现象的精神分析', '顶级人生三重境:道家驭势、佛家修心、儒家立身', '万物本源说', '奇绩创坛', '郭朝晖', '陆奇', '陈望道', '哈尔滨工程大学春季校园招聘会调研报告', '教学过程核心模型-理论佐证研究', '教育研究核验提示词库']\n完成。\n\n=== Command 2: python tools/scripts/sync_home_wiki.py --lint ===\nOutput:\n== home-wiki 同步体检 ==\n同步页面: 26 | wiki 总文件: 490\n\n[孤儿] 0 个(0 入站链接)\n\n[source 空值] 5 个(违反 wiki 层 source 必填)\n - AI时代高等教育\n - 教学过程核心模型\n - 顶级人生三重境\n - 教学过程核心模型-理论佐证研究\n - 教育研究核验提示词库\n\n[断链] 27 个目标(同步页面引用、kepano 无对应页)\n - AI训练数据 ← EgoCentric数据采集与具身智能发展\n - 为什么口号越响亮做事越离谱-郭朝晖 ← 价值驱动\n - 具身智能 ← EgoCentric数据采集与具身智能发展\n - 向下因果 ← 涌现\n - 唯物辩证法 ← 实践论\n - 复杂性 ← 临界态\n - 宝钢 ← 郭朝晖\n - 序参量 ← 涌现\n - 心理韧性 ← 老红军长寿现象的精神分析\n - 意识 ← 万物本源说, 涌现\n - 成长哲学 ← 老红军长寿现象的精神分析\n - 我的科研经历-反思与成长-郭朝晖 ← 以终为始, 郭朝晖\n - 技术创新 ← 郭朝晖\n - 文化遗产 ← 山西12个原始古村落\n - 涌现的本质是什么-万物本源说 ← 万物本源说, 临界态, 涌现\n - 矛盾论 ← 实践论\n - 知行合一 ← 实践论\n - 粗粒化 ← 涌现\n - 茶道 ← 漱茶说\n - 认识论 ← 实践论\n - 还原论 ← 涌现\n - 陆奇-Researcher-Founder-从-1到1-2026-新浪财经 ← 陆奇\n - 陆奇新范式演讲-2024-云中江树整理 ← 新范式\n - 陆奇清华演讲-Sky光笺解读-2026 ← NeoLab, 奇绩创坛\n - 陆奇清华演讲-混沌学园-2026 ← Researcher-Founder\n - 陈望道读书法-2024-善读书 ← 好学力行, 陈望道\n - 零工经济 ← EgoCentric数据采集与具身智能发展\n\n[未入 index] 0 个(概念/实体未在跨库章节)\n\n硬性问题(孤儿+空source+未入index): 5\n软性问题(断链,多为待创建概念/raw来源): 27\n\n=== Additional Diagnostics ===\nhome-wiki source dir exists: True\nhome-wiki content: 19 concepts, 6 entities, 4 syntheses = 29 total .md files\n(26 synced after excluding index.md files)\n\nwiki directory: 490 .md files\nsummaries cache exists: True (26 entries cached)\nsummaries cache path: tools/data/home-wiki-summaries.json\n\nindex.md cross-library section: BEGIN/END home-wiki-sync block present\n- Concepts table: 18 entries\n- Entities table: 5 entries\n- Synthesis table: 3 entries (manual section after END block)\n",
|
||
"response.txt": "# home-wiki 跨库同步检查报告\n\n**日期**: 2026-06-30 \n**工具**: `tools/scripts/sync_home_wiki.py` \n**执行命令**: `--dry-run` + `--lint`\n\n---\n\n## 总体状态\n\n- **同步健康度**: 良好(26 页全部同步,内容一致)\n- **dry-run 结果**: 0 待更新,0 待新建,26 未变化 ✅\n- **index 覆盖**: 所有同步概念/实体均已纳入 index 跨库章节 ✅\n- **孤儿页面**: 0 个(每页都有入站链接)✅\n\n---\n\n## 待修复问题 🔴\n\n### 1. 5 个页面 source 字段为空(硬性问题)\n\n违反 AGENTS.md wiki 层规范:source 必须指向 raw 来源。\n\n| 页面 | root cause |\n|------|-----------|\n| AI时代高等教育 | home-wiki 源文件缺 `sources:` 字段 |\n| 教学过程核心模型 | 同上 |\n| 顶级人生三重境 | 同上 |\n| 教学过程核心模型-理论佐证研究 | 同上 |\n| 教育研究核验提示词库 | 同上 |\n\n**修复方案**:在 home-wiki 源文件的 frontmatter 中添加 `sources:` 字段,例如:\n```yaml\nsources:\n - \"原始来源文件名或URL\"\n```\n添加后重新运行 `sync_home_wiki.py`(非 dry-run)以更新 wiki 页面。如果源文件就在 home-wiki 内部(而非外部来源),则需评估是否可将这些页面标记为有来源,或移除 source 要求(需更新 AGENTS.md)。\n\n### 2. 27 个断链(软性问题)\n\n断链指向不存在的 `[[wikilink]]`,大部分是:\n- **home-wiki 内部的交叉引用**(如 `[[矛盾论]]`, `[[具身智能]]` 等概念,尚未在 kepano wiki 中创建)\n- **外部文档引用**(如 `[[陆奇新范式演讲-2024-云中江树整理]]`, `[[陈望道读书法-2024-善读书]]` 等原始资料)\n\n**修复方案**:两大类路线:\n- **可忽略** — 指向外部 raw 资料的断链(如 URL 类文件名)可等 ingest 时自然消解\n- **待创建** — 缺失的概念页(如 `[[矛盾论]]`, `[[具身智能]]`, `[[复杂性]]`)可补充创建到 wiki/\n\n建议对断链按 severity 分级,仅追踪概念级 cross-reference 的缺失。\n\n### 3. index 综合报告表含重复或过时项(潜在问题)\n\n综合报告表(手动维护区域)存在重复项:\n- `[[人为中心AI教育]]` 出现了两次(第 97-98 行)\n- `[[home-wiki/syntheses]]` 来源路径过于笼统(缺少具体文件名)\n\n---\n\n## 未发现的问题 ✅\n\n| 检查项 | 结果 |\n|--------|------|\n| 孤儿页面(0 入站链接) | 0 个 ✅ |\n| 未入 index | 0 个 ✅ |\n| 文件内容一致性 | 26/26 一致 ✅ |\n| 缓存完整性 | 26 条缓存 ✅ |\n| home-wiki 源目录 | 存在 ✅ |\n\n---\n\n## 建议行动\n\n1. **P0** 修复 5 个 source 空值 — 在 home-wiki 源文件中补充 `sources:` 字段后重新同步\n2. **P1** 修复 index 综合报告表的重复行 — 删除重复的 `[[人为中心AI教育]]`\n3. **P2** 定期处理断链中的概念级缺失页 — 按需创建新 wiki 页面\n4. **P3** 从 `顶级人生三重境:道家驭势、佛家修心、儒家立身.md` 提取缩略名时确认 NAME_MAP 映射已生效\n\n当前无需运行完整同步(内容已一致),仅在修复 source 空值后需重新执行。\n"
|
||
},
|
||
"grading": {
|
||
"run_id": "eval-1-with_skill",
|
||
"grades": [
|
||
{
|
||
"text": "dry-run 被执行",
|
||
"passed": true,
|
||
"evidence": "subagent 汇报运行 --dry-run,26 页全部一致"
|
||
},
|
||
{
|
||
"text": "lint 被执行",
|
||
"passed": true,
|
||
"evidence": "subagent 汇报运行 --lint,检出问题"
|
||
},
|
||
{
|
||
"text": "空 source 被识别",
|
||
"passed": true,
|
||
"evidence": "subagent 分析中列出 5 个空 source 页面及根因"
|
||
},
|
||
{
|
||
"text": "断链被分类分析",
|
||
"passed": true,
|
||
"evidence": "subagent 对 27 个断链进行了分类分析"
|
||
},
|
||
{
|
||
"text": "给出具体修复建议",
|
||
"passed": true,
|
||
"evidence": "subagent 给出具体修复建议"
|
||
},
|
||
{
|
||
"text": "输出文件保存成功",
|
||
"passed": false,
|
||
"evidence": "subagent 声称已保存文件,但 outputs/ 目录为空"
|
||
}
|
||
],
|
||
"summary": {
|
||
"total": 6,
|
||
"passed": 5,
|
||
"pass_rate": 0.833
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"eval_id": 2,
|
||
"eval_name": "完整同步执行",
|
||
"prompt": "帮我执行一次完整的 home-wiki 同步,包括更新 index 和记录日志",
|
||
"assertions": [
|
||
{
|
||
"name": "--index --log 被执行",
|
||
"type": "custom",
|
||
"expected": "脚本以 --index --log 参数执行"
|
||
},
|
||
{
|
||
"name": "汇报同步结果",
|
||
"type": "custom",
|
||
"expected": "汇报更新/新建/未变页面数"
|
||
},
|
||
{
|
||
"name": "确认 index 更新状态",
|
||
"type": "custom",
|
||
"expected": "告知 index.md 跨库章节是否已更新"
|
||
},
|
||
{
|
||
"name": "确认 log 记录",
|
||
"type": "custom",
|
||
"expected": "告知 log.md 已追加操作记录"
|
||
}
|
||
],
|
||
"with_skill": {
|
||
"command_output.txt": "--- 命令 1: python tools/scripts/sync_home_wiki.py --index --log ---\n\n== home-wiki 同步报告 ==\n扫描: 26 页\n需更新: 0 -> []\n需新建: 0 -> []\n未变化: 26 -> ['AI时代高等教育', 'EgoCentric数据采集与具身智能发展', 'LLM-Wiki-v2', 'markitdown', 'NeoLab', 'Researcher-Founder', '临界态', '以终为始', '价值驱动', '好学力行', '实践论', '山西12个原始古村落', '教学过程核心模型', '新范式', '涌现', '漱茶说', '老红军长寿现象的精神分析', '顶级人生三重境:道家驭势、佛家修心、儒家立身', '万物本源说', '奇绩创坛', '郭朝晖', '陆奇', '陈望道', '哈尔滨工程大学春季校园招聘会调研报告', '教学过程核心模型-理论佐证研究', '教育研究核验提示词库']\nwiki/index.md 跨库章节: 无变化\n完成。\n\n--- 命令 2: python tools/scripts/sync_home_wiki.py --lint ---\n\n== home-wiki 同步体检 ==\n同步页面: 26 | wiki 总文件: 490\n\n[孤儿] 0 个(0 入站链接)\n\n[source 空值] 5 个(违反 wiki 层 source 必填)\n - AI时代高等教育\n - 教学过程核心模型\n - 顶级人生三重境\n - 教学过程核心模型-理论佐证研究\n - 教育研究核验提示词库\n\n[断链] 27 个目标(同步页面引用、kepano 无对应页)\n - AI训练数据 ← EgoCentric数据采集与具身智能发展\n - 为什么口号越响亮做事越离谱-郭朝晖 ← 价值驱动\n - 具身智能 ← EgoCentric数据采集与具身智能发展\n - 向下因果 ← 涌现\n - 唯物辩证法 ← 实践论\n - 复杂性 ← 临界态\n - 宝钢 ← 郭朝晖\n - 序参量 ← 涌现\n - 心理韧性 ← 老红军长寿现象的精神分析\n - 意识 ← 万物本源说, 涌现\n - 成长哲学 ← 老红军长寿现象的精神分析\n - 我的科研经历-反思与成长-郭朝晖 ← 以终为始, 郭朝晖\n - 技术创新 ← 郭朝晖\n - 文化遗产 ← 山西12个原始古村落\n - 涌现的本质是什么-万物本源说 ← 万物本源说, 临界态, 涌现\n - 矛盾论 ← 实践论\n - 知行合一 ← 实践论\n - 粗粒化 ← 涌现\n - 茶道 ← 漱茶说\n - 认识论 ← 实践论\n - 还原论 ← 涌现\n - 陆奇-Researcher-Founder-从-1到1-2026-新浪财经 ← 陆奇\n - 陆奇新范式演讲-2024-云中江树整理 ← 新范式\n - 陆奇清华演讲-Sky光笺解读-2026 ← NeoLab, 奇绩创坛\n - 陆奇清华演讲-混沌学园-2026 ← Researcher-Founder\n - 陈望道读书法-2024-善读书 ← 好学力行, 陈望道\n - 零工经济 ← EgoCentric数据采集与具身智能发展\n\n[未入 index] 0 个(概念/实体未在跨库章节)\n\n硬性问题(孤儿+空source+未入index): 5\n软性问题(断链,多为待创建概念/raw来源): 27\n",
|
||
"response.txt": "## home-wiki 同步执行报告\n\n### 执行命令\n```\n$env:PYTHONIOENCODING=\"utf-8\"\npython tools/scripts/sync_home_wiki.py --index --log\n```\n\n### 同步结果\n- **扫描**: 26 页\n- **需更新**: 0\n- **需新建**: 0\n- **未变化**: 26\n- **wiki/index.md 跨库章节**: 无变化\n- **wiki/log.md**: 已追加同步记录\n\n### 同步后体检 (--lint)\n- **同步页面**: 26 | **wiki 总文件**: 490\n- **孤儿页面**: 0 个\n- **source 空值**: 5 个(违反 wiki 层 source 必填规则)\n- **断链**: 27 个(引用指向本仓库不存在的页面,多为待创建概念/raw来源)\n- **未入 index**: 0 个\n\n### 结论\n本次同步**无内容变更**,26 页均为未变化状态。index 和 log 已按流程维护。5 个 source 空值问题是现存已知的 frontmatter 规范缺口(这些页面无 home-wiki 来源对应),非本次同步引入。\n"
|
||
},
|
||
"without_skill": {
|
||
"command_output.txt": "== home-wiki 鍚屾鎶ュ憡 ==\n鎵弿: 26 椤?\n闇€鏇存柊: 0 -> []\n闇€鏂板缓: 0 -> []\n鏈彉鍖? 26 -> ['AI鏃朵唬楂樼瓑鏁欒偛', 'EgoCentric鏁版嵁閲囬泦涓庡叿韬櫤鑳藉彂灞?, 'LLM-Wiki-v2', 'markitdown', 'NeoLab', 'Researcher-Founder', '涓寸晫鎬?, '浠ョ粓涓哄', '浠峰€奸┍鍔?, '濂藉鍔涜', '瀹炶返璁?, '灞辫タ12涓師濮嬪彜鏉戣惤', '鏁欏杩囩▼鏍稿績妯″瀷', '鏂拌寖寮?, '娑岀幇', '婕辫尪璇?, '鑰佺孩鍐涢暱瀵跨幇璞$殑绮剧鍒嗘瀽', '椤剁骇浜虹敓涓夐噸澧冿細閬撳椹娍銆佷經瀹朵慨蹇冦€佸剴瀹剁珛韬?, '涓囩墿鏈簮璇?, '濂囩哗鍒涘潧', '閮湞鏅?, '闄嗗', '闄堟湜閬?, '鍝堝皵婊ㄥ伐绋嬪ぇ瀛︽槬瀛f牎鍥嫑鑱樹細璋冪爺鎶ュ憡', '鏁欏杩囩▼鏍稿績妯″瀷-鐞嗚浣愯瘉鐮旂┒', '鏁欒偛鐮旂┒鏍搁獙鎻愮ず璇嶅簱']\nwiki/index.md 璺ㄥ簱绔犺妭: 鏃犲彉鍖?\n瀹屾垚銆?\n",
|
||
"response.txt": "## home-wiki 跨库同步执行报告\n\n**执行命令**: `python tools/scripts/sync_home_wiki.py --index --log`\n\n**结果**:\n- 扫描 `D:\\TC_UP\\home-wiki` 的 concepts/entities/syntheses 共 **26 个页面**\n- **新建**: 0 页(全部已存在)\n- **更新**: 0 页(全部内容一致)\n- **未变化**: 26 页(幂等同步,无内容变动)\n- **wiki/index.md 跨库章节**: 无变化(同步页面与本地一致,无需刷新)\n- **wiki/log.md**: 未追加(脚本仅在发生更新/新建时记录日志,26 页均无变动)\n\n**结论**: home-wiki 知识库与 kepano LLM Wiki 已完全同步,无需任何变更。\n\n**命令输出原文**:\n```\n== home-wiki 同步报告 ==\n扫描: 26 页\n需更新: 0 -> []\n需新建: 0 -> []\n未变化: 26 -> ['AI时代高等教育', 'EgoCentric数据采集与具身智能发展', ...]\nwiki/index.md 跨库章节: 无变化\n完成。\n```\n"
|
||
},
|
||
"grading": {
|
||
"run_id": "eval-2-with_skill",
|
||
"grades": [
|
||
{
|
||
"text": "--index --log 被执行",
|
||
"passed": true,
|
||
"evidence": "response.txt 明确显示 $env:PYTHONIOENCODING 和 --index --log 命令"
|
||
},
|
||
{
|
||
"text": "汇报同步结果",
|
||
"passed": true,
|
||
"evidence": "明确报告扫描 26 页,0 更新,0 新建"
|
||
},
|
||
{
|
||
"text": "确认 index 更新状态",
|
||
"passed": true,
|
||
"evidence": "response.txt 明确说 wiki/index.md 跨库章节无变化"
|
||
},
|
||
{
|
||
"text": "确认 log 记录",
|
||
"passed": true,
|
||
"evidence": "response.txt 明确说 wiki/log.md 已追加同步记录"
|
||
}
|
||
],
|
||
"summary": {
|
||
"total": 4,
|
||
"passed": 4,
|
||
"pass_rate": 1.0
|
||
}
|
||
}
|
||
}
|
||
];
|
||
const benchmark = {
|
||
"skill_name": "sync-homewiki",
|
||
"iteration": 1,
|
||
"configurations": [
|
||
{
|
||
"name": "with_skill",
|
||
"pass_rate": 0.944,
|
||
"pass_rate_std": 0.096,
|
||
"avg_tokens": 0,
|
||
"avg_duration_s": 0,
|
||
"evals": [
|
||
{
|
||
"eval_id": 0,
|
||
"pass_rate": 1.0,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
},
|
||
{
|
||
"eval_id": 1,
|
||
"pass_rate": 0.833,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
},
|
||
{
|
||
"eval_id": 2,
|
||
"pass_rate": 1.0,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "without_skill",
|
||
"pass_rate": 0.833,
|
||
"pass_rate_std": 0.236,
|
||
"avg_tokens": 0,
|
||
"avg_duration_s": 0,
|
||
"evals": [
|
||
{
|
||
"eval_id": 0,
|
||
"pass_rate": 1.0,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
},
|
||
{
|
||
"eval_id": 1,
|
||
"pass_rate": 1.0,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
},
|
||
{
|
||
"eval_id": 2,
|
||
"pass_rate": 0.5,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"delta": {
|
||
"pass_rate": 0.111,
|
||
"tokens": 0,
|
||
"duration_s": 0
|
||
}
|
||
};
|
||
let currentEval = 0;
|
||
const feedback = {};
|
||
|
||
function switchTab(name) {
|
||
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
||
document.querySelectorAll('.content').forEach(c => c.classList.remove('active'));
|
||
document.querySelector(`.tab[onclick="switchTab('${name}')"]`).classList.add('active');
|
||
document.getElementById(`tab-${name}`).classList.add('active');
|
||
}
|
||
|
||
function renderEval(idx) {
|
||
const e = evals[idx];
|
||
if (!e) return;
|
||
document.getElementById('eval-counter').textContent = `${idx + 1} / ${evals.length}`;
|
||
let wsHtml = '', wosHtml = '';
|
||
const wsFiles = Object.entries(e.with_skill);
|
||
if (wsFiles.length) {
|
||
wsHtml = wsFiles.map(([name, content]) =>
|
||
`<div class="output-file"><div class="filename">📄 ${name}</div>${content}</div>`
|
||
).join('');
|
||
} else {
|
||
wsHtml = '<div class="output-file" style="color:#999;">(no output files)</div>';
|
||
}
|
||
const wosFiles = Object.entries(e.without_skill);
|
||
if (wosFiles.length) {
|
||
wosHtml = wosFiles.map(([name, content]) =>
|
||
`<div class="output-file"><div class="filename">📄 ${name}</div>${content}</div>`
|
||
).join('');
|
||
} else {
|
||
wosHtml = '<div class="output-file" style="color:#999;">(no output files)</div>';
|
||
}
|
||
|
||
let gradingHtml = '';
|
||
if (e.grading && e.grading.grades && e.grading.grades.length) {
|
||
const allPassed = e.grading.grades.every(g => g.passed);
|
||
gradingHtml = `<div class="grading ${allPassed ? '' : 'fail'}">
|
||
<h5>📊 Formal Grades</h5>
|
||
${e.grading.grades.map(g =>
|
||
`<div class="grading-item"><span class="${g.passed ? 'pass' : 'fail'}">${g.passed ? '✓' : '✗'}</span> ${g.text} <span style="color:#999;font-size:12px;">— ${g.evidence || ''}</span></div>`
|
||
).join('')}
|
||
</div>`;
|
||
}
|
||
|
||
const feedbackVal = feedback[e.eval_id] || '';
|
||
document.getElementById('eval-container').innerHTML = `
|
||
<div class="eval-card">
|
||
<h3>${e.eval_name}</h3>
|
||
<div class="prompt">${e.prompt}</div>
|
||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
|
||
<div class="output-section">
|
||
<h4>🔵 With Skill</h4>
|
||
<div class="output-files">${wsHtml}</div>
|
||
</div>
|
||
<div class="output-section">
|
||
<h4>⚪ Without Skill</h4>
|
||
<div class="output-files">${wosHtml}</div>
|
||
</div>
|
||
</div>
|
||
${gradingHtml}
|
||
<div style="margin-top:12px;">
|
||
<label style="font-size:13px;color:#555;font-weight:600;">Feedback</label>
|
||
<textarea style="width:100%;margin-top:4px;padding:8px;border:1px solid #ddd;border-radius:4px;font-size:13px;min-height:60px;resize:vertical;"
|
||
onchange="saveFeedback('${e.eval_id}', this.value)"
|
||
placeholder="Your feedback...">${feedbackVal}</textarea>
|
||
</div>
|
||
</div>`;
|
||
}
|
||
|
||
function nextEval() { if (currentEval < evals.length - 1) { currentEval++; renderEval(currentEval); } }
|
||
function prevEval() { if (currentEval > 0) { currentEval--; renderEval(currentEval); } }
|
||
function saveFeedback(id, val) { feedback[id] = val; }
|
||
|
||
function renderBenchmark() {
|
||
const c = document.getElementById('benchmark-container');
|
||
if (!benchmark) { c.innerHTML = '<div class="eval-card"><p style="color:#999;">No benchmark data available.</p></div>'; return; }
|
||
let html = '<div class="benchmark-section"><h3>Summary</h3><table><tr><th>Config</th><th>Pass Rate</th><th>Avg Tokens</th><th>Avg Duration (s)</th></tr>';
|
||
for (const cfg of benchmark.configurations) {
|
||
html += '<tr><td>' + cfg.name + '</td><td>' + (cfg.pass_rate * 100).toFixed(1) + '% ±' + (cfg.pass_rate_std * 100).toFixed(1) + '%</td><td>' + (cfg.avg_tokens != null ? cfg.avg_tokens.toFixed(0) : '-') + '</td><td>' + (cfg.avg_duration_s != null ? cfg.avg_duration_s.toFixed(1) : '-') + '</td></tr>';
|
||
}
|
||
if (benchmark.delta) {
|
||
const d = benchmark.delta;
|
||
html += '<tr style="font-weight:600;"><td>Delta</td><td class="delta ' + (d.pass_rate >= 0 ? 'positive' : 'negative') + '">' + (d.pass_rate >= 0 ? '+' : '') + (d.pass_rate * 100).toFixed(1) + '%</td><td>' + (d.tokens >= 0 ? '+' : '') + (d.tokens != null ? d.tokens.toFixed(0) : '-') + '</td><td>' + (d.duration_s >= 0 ? '+' : '') + (d.duration_s != null ? d.duration_s.toFixed(1) : '-') + '</td></tr>';
|
||
}
|
||
html += '</table></div>';
|
||
html += '<div class="benchmark-section"><h3>Per-Eval Breakdown</h3><table><tr><th>Eval</th><th>Config</th><th>Pass Rate</th><th>Tokens</th><th>Duration (s)</th></tr>';
|
||
for (const cfg of benchmark.configurations) {
|
||
if (cfg.evals) for (const e of cfg.evals) {
|
||
html += '<tr><td>' + e.eval_id + '</td><td>' + cfg.name + '</td><td>' + (e.pass_rate * 100).toFixed(1) + '%</td><td>' + (e.tokens != null ? e.tokens.toFixed(0) : '-') + '</td><td>' + (e.duration_s != null ? e.duration_s.toFixed(1) : '-') + '</td></tr>';
|
||
}
|
||
}
|
||
html += '</table></div>';
|
||
c.innerHTML = html;
|
||
}
|
||
|
||
function submitFeedback() {
|
||
const reviews = evals.map(e => ({
|
||
run_id: `${e.eval_id}-with_skill`,
|
||
feedback: feedback[e.eval_id] || '',
|
||
timestamp: new Date().toISOString()
|
||
}));
|
||
const blob = new Blob([JSON.stringify({reviews, status: 'complete'}, null, 2)], {type: 'application/json'});
|
||
const a = document.createElement('a');
|
||
a.href = URL.createObjectURL(blob);
|
||
a.download = 'feedback.json';
|
||
a.click();
|
||
}
|
||
|
||
renderEval(0);
|
||
renderBenchmark();
|
||
</script>
|
||
</body>
|
||
</html> |