ShreyasPasumarthi/pipeline-incidents-bench

GitHub: ShreyasPasumarthi/pipeline-incidents-bench

一个用于评估 AI agent 修复破损数据 pipeline 能力的可复现基准测试框架,通过执行结果而非主观评判来衡量修复效果。

Stars: 0 | Forks: 0

# pipeline-incidents-bench **你的 AI agent 真的能修复破损的数据 pipeline 吗?证明它。** 提供可复现的破损数据 pipeline 场景,并包含*可执行的*标准答案,用于 评估 AI 事件响应 agent。每个场景都是一个小巧、真实的 分析代码仓库(包含 dbt + DuckDB 和 git 历史),并注入了一个故障。 agent 将获得与人类待命工程师相同的证据——失败的运行日志、 dbt artifacts、git log、源数据样本——并且必须诊断出根本原因, 并**编辑代码仓库以修复它**。 核心特性:**修复结果由执行结果评判,而非主观意见。** 在 agent 进行编辑后,测试框架会重新运行 pipeline。它会变绿并通过 隐藏的数据断言,否则就不会。没有 LLM 裁判来决定诊断是否“听起来合理”。 ## 为什么需要它 数据 pipeline 事件代价高昂且频繁发生:上游 schema 漂移, 供应商悄悄更改导出格式,看似无害的重构悄悄 丢失数据行。现有的可观测性工具可以检测到这些。目前悬而未决的问题是 agent 能否*修复*它们——而且目前 没有客观的方法来衡量这一点。这个 benchmark 就是那个测量标尺。 由此产生的设计选择: - **根本原因归因会被评分,包括空情况。** 有一个场景 根本没有代码原因——那些反射性地将责任归咎于最新 commit 的 agent 会扣分。真实的事件往往是数据问题,而不是代码问题。 - **到处都是诱饵 commit。** 无辜的 commit 修改了失败的模型; 有故障的 commit 带着无害的信息(“perf: simplify joins”)。 - **受保护的路径。** agent 不能通过编辑其不拥有的上游 数据或删除失败的测试来“修复” pipeline。警报并不等于火灾。 - **零基础设施。** 场景运行在 dbt + DuckDB 上:只需 `pip install`,无需 Docker,几秒钟内从红灯转为绿灯。更重级别的场景(Airflow, Postgres, Spark) 已在路线图上,但采用阻力比 真实感得分更重要。 ## 快速开始 ``` python3 -m venv .venv && .venv/bin/pip install -e . # 仅限 Python 3.14:pip install -U mashumaro (dbt-core 锁定版本滞后于 3.14 支持) .venv/bin/pib list # show scenarios .venv/bin/pib validate # every scenario: reproduces red + solvable .venv/bin/pib run --agent null # do-nothing baseline (~5%) .venv/bin/pib run --agent oracle # hidden solutions applied (100%) .venv/bin/pib run --agent "python3 agents/example/agent.py" # your agent here ``` ### 上下文来源 默认情况下,测试框架会自行组装事件包(`--context-source curated`)。如果要让其由 [Pipemend](../pipemend) 收集器从原始工作区状态构建——就像在生产环境中的方式一样——请传入 `--context-source collector`: ``` .venv/bin/pib run --agent "" --context-source collector ``` 收集器仅接收破损的代码仓库和运行命令,绝不接收 场景的标准答案。它必须能够通过作为同级目录的 `pipemend` 仓库(具有已构建的 `.venv`)、在 `PATH` 中,或通过 `PIPEMEND_CMD` 环境变量被发现。请参阅 [RESULTS.md](RESULTS.md) 查看 curated 与 collector 的比较。 ## Agent 协议 任何可执行的程序都可以。测试框架会调用: ``` --workspace --context --output ``` - `workspace` —— 破损的 pipeline 代码仓库。读取任何内容,编辑任何内容 (你的编辑就是修复方案)。你可以随意重新运行 `bash run_pipeline.sh`。 - `context` —— 事件包:失败的运行 stdout/stderr、解析后的 dbt `run_results`、最近 commit 的 `git log -p`、文件树,以及 每个数据文件(包括不在 git 中的落地文件)的头部样本。其确切 结构取决于 `--context-source`(curated 包还是 Pipemend collector 包);agent 应将其视为不透明的事件证据。 - `report.json` —— 你的诊断: ``` { "root_cause_category": "schema_change | source_data_change | logic_bug | dependency_failure | infra_failure | other", "root_cause": "free-text diagnosis", "culprit_commit": ", or null if no code change caused this", "evidence": ["paths or short descriptions"], "fix_description": "what you changed and why" } ``` 请参阅 `agents/example/agent.py` 获取最简 I/O 框架。 ## 评分 | 检查项 | 权重 | 评分方式 | |---|---|---| | `fix_verified` | 50% | Pipeline 重新运行变绿 + 隐藏的 SQL 断言通过 + 未触及受保护的文件 | | `root_cause` | 20% | 诊断包含关键概念(关键词组,OR 的 AND) | | `category` | 15% | 与可接受的类别匹配(复合事件接受多个类别) | | `culprit_commit` | 15% | 正确的 sha —— 或正确地报告*没有*罪魁祸首 | 隐藏断言会阻止退化的“修复”:删除行、硬编码值, 或削弱测试都不会产生正确的行数和总数。 ## 场景剖析 ``` scenarios/001-upstream-column-rename/ scenario.yaml # commits to replay, ground truth, hidden assertions base/ # working pipeline repo (initial commit) commits/ # overlays replayed as git history; one may be the fault landing/ # files dropped outside git (vendor exports), if any solution/ # hidden reference fix — proves the scenario is solvable ``` 每个场景都必须通过 `pib validate`:故障必须能重现红灯,并且 参考解决方案得分刚好 100%。无法解决或无法 重现的场景不会被发布。 ### 当前场景 | id | 故障 | 原因在 git 中? | |---|---|---| | `001-upstream-column-rename` | 上游导出重命名 `user_id` → `customer_id`;staging 视图损坏 | 是,伪装成 chore | | `002-vendor-export-format-change` | 供应商将 `amount` 切换为 `amount_minor`(美分);not_null 测试失败 | **否** —— 仅限数据 | | `003-bad-join-refactor` | “perf” commit 将 left join 变成了 inner join;访客订单被悄悄丢弃 | 是,伪装成 perf | | `004-broken-import-refactor` | 摄取重构发布了破损的 import;pipeline 在 dbt 之前死亡 | 是 | | `005-duplicate-vendor-rows` | 供应商重新交付了重叠的行;unique 测试失败 | **否** —— 仅限数据 | 困难级别 —— 这些场景会惩罚浅尝辄止的“打补丁直到变绿”策略: | id | 故障 | 困难之处 | |---|---|---| | `006-incremental-backfill` | 美分 bug 损坏了*增量*模型 | 仅修复代码是不够的——过期行依然存在;必须进行回填(full-refresh) | | `007-compound-incident` | 供应商格式更改**和** join 回归同时发生 | 仅修复一个故障仍会使 pipeline 处于红灯状态;归因必须理清两个原因 | | `008-fanout-join` | 地址扩充 join 未过滤类型;订单出现发散 | 错误是发生在原因下游两个模型处的粒度违规 | | `009-poisoned-numeric-format` | 供应商添加了千位分隔符(`"1,234.56"`);类型转换崩溃 | 故障表面出现在 mart 中,原因却在 landing 文件中;没有 git 原因 | | `010-warehouse-path-drift` | “标准化仓库位置”chore 将 dbt 指向了一个空数据库 | *诱人*的修复(将摄取与新路径对齐)会变绿,但违反了代码仓库文档约定的规范——隐藏断言会捕捉到它 | ## 相关工作与定位 “用于事件响应的 AI agent”领域非常活跃,但它根据*层* 以及工具实际拥有的*循环中的哪一部分*进行了清晰的划分: - **通用软件/基础设施可观测性** —— 例如 [Superlog](https://superlog.sh/) (开源 agentic 遥测:摄取 OpenTelemetry traces/logs/metrics, 将嘈杂的信号分组为事件)。这些工具在运行中的服务遥测上运行,在*检测和分类*方面表现最强;自主*修复*仍处于早期阶段(开放的默认 agent 仅记录事件摘要)。 - **数据可观测性** —— Monte Carlo, Anomalo, Metaplane:检测数据仓库中的数据质量 和新颖度异常。在报警方面很强;补救措施 则留给了人类。 这个 benchmark 刻意与两者正交。它不检测事件 ——它假设已经发生了一个事件——并且它衡量了其他人都避而不谈的步骤:**agent 真的能修复它,并通过执行验证吗?** 其范围是 *数据层*(dbt/warehouse/git),评分是可复现的 标准答案,而不是 LLM 裁判或人类的意见。据我们所知,没有公开的 benchmark 衡量过数据 pipeline 事件的已验证补救措施;这个差距就是 它存在的原因。 ## 路线图 - 30–50 个场景,涵盖 schema drift、数据异常、逻辑 bug、依赖 和基础设施故障 - 困难级别:dockerized Airflow + Postgres + Spark 场景 - LLM-agent 基准(Claude, GPT)及已发布的记分卡 - 用于根本原因自由文本的 LLM 裁判(关键词组为 v0) - 嘈杂的多信号事件:在这种场景中,失败的运行只是许多相关 警报中的一个,旨在测试分类/分组,而不仅仅是单故障修复 ## License MIT 由 **Pipemend** 构建和维护 —— 针对 数据 pipeline 的 AI 事件响应。
标签:AI智能体, dbt, DuckDB, 数据可观测性, 数据管道, 网络安全研究, 软件工程, 逆向工具