benchmark_v1.md 7.49 KB

Reddit Scraper Benchmark v1

Agent: reddit-scraper Phase: Digest (Phase 2) 评估维度: 6 | 满分: 100 | 目标线: ≥ 95


1. 评估维度总览

维度 满分 权重 说明
数据准确性 100 20% Reddit API / HTML / RSS 数据抓取与字段映射的准确性,含端点、必填字段、数据映射
反爬策略 100 20% 请求频率控制、UA 轮换、降级与重试机制的健壮性
Schema 标准化 100 15% 输出数据结构严格符合 agent.md 定义的 schema,字段完整且一致
数据清洗与过滤 100 15% 去重、NSFW/低质量/删除内容过滤、阈值裁剪、内容完整性保证
戏剧性内容提取 100 20% drama_score 计算、conflict_type 映射、戏剧性标签与下游脚本价值提取
合规与伦理 100 10% 遵守 robots.txt 精神、频率限制、隐私与内容安全规范
总分 100 100% 加权计算,目标线 ≥ 95

2. 维度 1:数据准确性 (20%)

评分细则

子项 分值 评分标准
API 端点正确性 30 正确调用 reddit.com/r/{subreddit}/{sort}.json;搜索使用 restrict_sr=1;评论使用 /comments/{post_id}.json;支持 after 分页与 time 参数组合
字段提取完整率 40 必填字段 (post_id, title, score, source_url, crawl_time) 100% 存在且非空;评论字段 (comment_id, author, body, score, parent_id) 完整
数据映射准确性 30 permalink → source_url,score → engagement.score,num_comments → engagement.num_comments,created_utc 时间戳正确,单位无误

减分项

  • 端点拼写错误或漏传必要参数(如 limit、after、restrict_sr): -10 ~ -30
  • 字段映射错误(如把 score 当成 upvotes): -15 ~ -40
  • RSS/HTML 提取遗漏核心字段且未标注说明: -5 ~ -20

3. 维度 2:反爬策略 (20%)

评分细则

子项 分值 评分标准
请求频率控制 35 单 IP 请求间隔 ≥ 2 秒,无突发请求(>20 次/分钟),具备随机 jitter (2–5s)
请求头伪装 30 使用真实浏览器 User-Agent 并轮换(≥2 条),包含 Accept: application/json,必要时模拟完整 Headers
降级与重试 35 遇到 429/403/503 时执行指数退避重试(2s → 5s → 15s,最多 3 次);JSON API 不可用时降级到 old.reddit.com HTML 或 RSS

减分项

  • 无请求延迟或延迟
  • 单一 UA 未轮换: -10 ~ -30
  • 未处理 429/403 直接失败: -15 ~ -35
  • 无降级策略或降级链路不完整: -10 ~ -20

4. 维度 3:Schema 标准化 (15%)

评分细则

子项 分值 评分标准
结构一致性 40 所有输出记录使用统一嵌套结构:source, content, engagement,且字段层级正确;评论以数组形式存在于 comments 字段
字段命名规范 35 严格使用英文 snake_case,与 agent.md 输出 schema 完全一致(如 post_id, subreddit, upvote_ratio)
可空与默认值 25 缺失字段使用 null 而非空字符串或缺失;awards 缺失默认 0;upvote_ratio 缺失默认 null;link_post 标记规范

减分项

  • 结构层级混乱或字段拼写错误: -10 ~ -40
  • 未使用 snake_case 或与 schema 定义冲突: -10 ~ -35
  • 缺失字段未正确处理(导致下游解析失败): -5 ~ -25

5. 维度 4:数据清洗与过滤 (15%)

评分细则

子项 分值 评分标准
基础过滤 35 按 min_score 过滤生效;is_nsfw=True 被剔除(除非显式允许);[deleted] / [removed] 作者与正文被移除
去重 30 以 post_id 为唯一键去重,重复记录仅保留第一条有效数据
内容完整性 35 title 不能为空;selftext 为空时标记为 link_post 并保留 url;单次采集输出有效记录数 ≥ 需求量的 80%

减分项

  • 未按 min_score / exclude_nsfw 过滤: -10 ~ -35
  • 存在重复 post_id: -10 ~ -30
  • 空标题或缺失 body 未正确标记为 link_post: -10 ~ -35

6. 维度 5:戏剧性内容提取 (20%)

评分细则

子项 分值 评分标准
Drama Score 计算 40 正确应用公式:base_drama + comment_density + conflict_bonus,结果限定在 0–100 之间,计算可复现
Conflict Type 映射 35 基于子版块和关键词正确映射枚举值:AITA → moral_dilemma;relationship_advice → betrayal/trust_issue;funny → observational_humor/absurdist
标签与潜在脚本价值 25 输出 drama_tags 数组、hook_strength (0–10)、viral_elements 标签等下游脚本可用字段

减分项

  • drama_score 计算逻辑错误或结果超出 0–100: -15 ~ -40
  • conflict_type 映射明显错误(如 funny 映射为 betrayal): -10 ~ -35
  • 任务参数要求计算 drama_score 但未输出戏剧性相关字段: -10 ~ -25

7. 维度 6:合规与伦理 (10%)

评分细则

子项 分值 评分标准
平台合规 40 遵守 Reddit robots.txt / Crawl-delay 精神,控制频率不造成服务器压力;不绕过登录墙抓取非公开内容
隐私保护 30 不采集私信、真实身份信息、精确地理位置;对个人信息做去标识化处理
内容安全 30 对涉及自杀、自残、暴力的内容增加安全审核标记或过滤,不适合直接作为娱乐素材输出

减分项

  • 高频请求对目标服务器造成明显压力(如 >30 次/分钟且无退避): -15 ~ -40
  • 采集非公开内容或用户隐私信息: -30(一票否决)
  • 未对高风险内容做安全处理: -10 ~ -30

8. 总分计算方式

总分 = 维度1 * 0.20
     + 维度2 * 0.20
     + 维度3 * 0.15
     + 维度4 * 0.15
     + 维度5 * 0.20
     + 维度6 * 0.10
  • 优秀: 95–100 分(目标线,可进入下游生产使用)
  • 良好: 85–94 分(需小幅度修正)
  • 及格: 70–84 分(存在明显缺陷,需返工)
  • 不及格:

9. 与 train/test 数据集的关联

  • train.jsonl 和 test.jsonl 中的每条记录均包含 dimensions 和 score。
  • grader 在评估模型输出时,应参照本标准进行逐项打分。
  • grader_hints 提供了该样本的关注检查点,供自动化或人工评分时聚焦重点。

10. 快速检查清单 (Quick Checklist)

  • [ ] 使用 https://www.reddit.com/r/{subreddit}/hot.json (或等价 sort) 并携带正确 headers
  • [ ] 包含 after 分页逻辑与 time 参数的正确组合
  • [ ] 轮换真实浏览器 User-Agent 字符串
  • [ ] 执行 ≥ 2s 延迟且 ≤ 20 req/min
  • [ ] 遇到 429/403 时指数退避重试,失败后再降级到 old.reddit / RSS
  • [ ] 提取所有必填字段到统一 schema
  • [ ] 过滤 NSFW、[deleted]/[removed]、低于 min_score 的帖子
  • [ ] 按 post_id 去重
  • [ ] 空 selftext 正确标记为 link_post 并保留外部 url
  • [ ] 评论树映射正确,含 comment_id、parent_id、score
  • [ ] 计算 drama_score 与 conflict_type 并限定在合理范围
  • [ ] 遵守平台 ToS 与登录墙边界
  • [ ] 对高风险内容进行安全过滤或标记

由 Digester Agent 生成 | 验收标准: 6 维度完整对齐 knowhow_v1.md ✅ | 满分 100 目标线 ≥95 ✅