把代码 Agent 钉在数据平台里:北大 DataFlow-Harness 怎么桥接自然语言到可编辑流水线

论文:DataFlow-Harness: A Grounded Code-Agent Platform for Constructing Editable LLM Data Pipelines 链接:https://arxiv.org/abs/2607.16617 作者:Runming He, Zhen Hao Wong, Hao Liang, Zimo Meng, Chengyu Shen, Xiaochen Ma, Wentao Zhang 单位:北京大学 / 上海先进算法研究院 / 中关村学院 日期:2026 年 7 月 18 日(v1,13 页,2 图 5 表,技术报告)


核心摘要

如果你让 Claude Code "帮我搭一个把 PDF 教材转成 VQA 训练数据的流水线",它大概率会甩给你一个 Python 脚本。能跑,但第二天你要改个字段、加个过滤算子、给同事解释这个数据流怎么流的,就抓瞎了——脚本是一次性工艺品,不是平台里可治理的工作流资产

这篇来自北大 DCAI 团队的 arXiv:2607.16617 把这种痛点起了一个名字:NL2Pipeline gap——自然语言意图与"平台里能持续编辑、可视化、复用的工作流对象"之间的鸿沟。DataFlow-Harness 给出的答案是:别让 Agent 自由发挥地写脚本了,把它在平台里——通过 MCP 暴露的"活"算子注册表 + 流程化的 Skills 知识 + 类型化的增量改写,让 Agent 每一步都只能在平台 DAG 的合法状态空间里动刀。

实测数据很漂亮:在 12 个数据工程任务上端到端通过率 93.3 个百分点,相比 Vanilla Claude Code 砍掉 72.5 个百分点 的 token 成本和 49.9 个百分点 的延迟;比给它喂 DataFlow 仓库代码做 in-context 的 Context-Aware Claude Code 通过率只低 0.9 个点,但成本再低 42.8 个百分点。更关键的是在下游训练评估里,用它搭的流水线产出的数据去 SFT 出来的模型,在 AIME25@32 上 1 epoch 直接从 21.6 拉到 34.5。

但我看完之后想说的是:这其实是工程整合的天花板作品,不是底层方法论的突破。它验证了一件事——当你有一个像 DataFlow 这样成熟的算子库时,给 Agent 加一层"平台接地"远比提升模型本身更能解决生产部署问题。但它没解决的问题同样刺眼:评估规模太小、没做组件级消融、ablation 都在系统层面、case study 也不足以支撑因果推断。


一、问题:为什么"写个脚本"在生产里不够用?

数据准备(data preparation)这件事在工业 LLM 项目里是个尴尬的存在:模型进入了自动驾驶时代,数据准备还在手工坊阶段。

刷过几次数据流水线的人应该都有过这种体验——

让 Agent 帮我搞一个"清理脏数据 + 合成 QA 对"的流水线,它吭哧吭哧写了一个 pipeline.py,里面有 200 行代码,import 了六七个库,调了三个 LLM API。跑通了,数据出来了。但接下来:

  • 想加个字段过滤?改脚本,再跑一遍。
  • 想给运营同事看一下这个数据流长啥样?把代码翻译成流程图。
  • 同事说"我想把第三步换成另一个算子"?打开代码,找位置,祈祷没改坏状态。
  • 怀疑某一步是不是在悄悄 hallucinate 算子?grep 一下日志吧。

更糟的是,这些"一次性脚本"会幻觉依赖——引用了平台不存在的算子、用了过时的 API、调用了模型上下文里记着的旧版本行为。等到部署到生产环境,这些隐藏的 bug 会以"训练三周后精度上不去"的形式暴露。

论文把这种问题命名为 NL2Pipeline gap

用户用自然语言表达工作流意图,但生产环境需要的是结构化的、持续的、可视化可编辑的流水线资产

你想想,传统 ETL 里这些都靠"工作流引擎"解决——Airflow 里每个 DAG 节点是注册好的算子,状态可追溯,UI 可拖拽。但 LLM 时代的数据流水线比 ETL 复杂得多——算子要调 LLM、要分块、要重写、要评分,硬套 Airflow 又接不住。

所以问题变成了:怎么让 Agent 搭出来的不是一个 Python 脚本,而是一个平台里的"一等公民"工作流?


二、思路:把 Agent 钉在平台里

DataFlow-Harness 的答案不复杂——别让 Agent 自由发挥写代码,让它在一个受约束的环境里做"类型化增量改写”。整个系统由四个组件构成:

Figure 1: DataFlow-Harness architecture

图 1:DataFlow-Harness 架构。共享的 Pipeline 表示在 Agent runtime 和 DataFlow-WebUI 之间同步;DataFlow-Skills 引导构建过程,Validation Engine 检查 DAG 结构和 Schema 兼容性。

1. Data Pipeline Backend:唯一的真相源

流水线被形式化定义为 \(P = (D, O, E, S, R)\)

  • \(D\):数据源及其 URI
  • \(O\):配置好的算子实例
  • \(E \subseteq O \times O\):有向数据依赖边
  • \(S\):输入/输出字段 Schema
  • \(R\):运行时状态(模型服务端点等)

所有修改都必须通过类型化突变(typed mutations)——加算子、删算子、改参数、连边。提交时系统会校验两个东西:

  1. 改完之后图是不是有向无环图(DAG)
  2. 邻接算子的输出 Schema 是不是和下游输入 Schema 兼容

不通过就被打回。这个设计的关键不是"防止错误",而是让 Agent 只能在一个被良好定义的状态空间里行动——它的工具调用是结构化的,不是"我帮你跑一段代码"。

2. MCP Tools Layer:把平台状态暴露给 Agent

每一步操作都走一个 Request-Validate-Commit 协议:

  • State Retrieval:每次 Agent 决策前,先拉取最新流水线状态(包含人工编辑)
  • Mediated Mutation:Agent 通过 MCP 工具调用(list_pipelines / get_pipeline / update_pipeline)表达修改意图,这些调用是结构化的、基于平台活注册表的元数据
  • Validation:DAG 结构和 Schema 兼容性检查
  • Validated Commitment:通过校验后写入后端,WebSocket 广播给所有客户端

这里 MCP 是个关键设计——它不是把整个 DataFlow 代码库塞进 context(那是 Context-Aware CC baseline 的做法),而是暴露一个最小的、可控的工具面。Agent 看不到全部代码,只能看到它能调的工具和这些工具的参数 schema。

3. DataFlow-Skills:把"老师傅的经验"灌进去

光给工具还不够。MCP 暴露的是"算子能做什么",但不告诉 Agent ”应该怎么做“。

Skills 编码了两类知识:

  • 程序性蓝图(Procedural Blueprints):推荐的构建序列——schema 推断 → 算子选择 → 参数配置 → 服务验证
  • 组合约束(Compositional Constraints):算子兼容性规则——模态匹配、嵌套结构的字段流约定

说穿了,就是把北大 DCAI 团队过去调 DataFlow 的"踩坑经验"沉淀成可复用的 prompt 模块。Agent 在推理时拿到这些 Skills,相当于旁边坐了个老司机在指挥。

4. DataFlow-WebUI:会话和 DAG 的双视图

Figure 2: DataFlow-WebUI dual-modality interface

图 2:DataFlow-WebUI 的双模态界面——左侧可视化 DAG 编辑器,右侧与 Claude Code 的对话流。用户在对话里说"我要做一个 VQA 数据集",右侧助手按步骤添加 Text2MultiHopQAGenerator → PromptedGenerator,并实时显示每一步的算子详情、参数配置、字段流转。

这个图是真正让我觉得作者"懂"的地方——它不是一个 PPT 截图,是一个真实可用的 UI 截图。你看右侧对话里 Claude Code 不仅说"我要加这个算子",还明确给出:

  • Init. Parameters(Text2MultiHopQAGenerator 的初始化参数)
  • Get operator detail(主动调 Get operator detail 工具查算子文档)
  • Get operator detail: Generator(再查一遍)
  • 关键挑战:明确说出"Text2QASampleEvaluator 需要的 input_question_keyinput_answer_key 等字段我还没填,直接跑会炸——必须显式填 questionanswer_parsable 字段"

这段对话让我确信 Skills + MCP 的组合真的能work——Agent 不是在拍脑袋做决定,而是按 Skills 引导、按 MCP 验证、按真实算子文档调参。

而且左侧的可视化 DAG 编辑器和右侧对话是双向同步的——你在 UI 里手动改连线,Agent 下次决策前会通过 State Retrieval 拿到最新状态。这解决了传统 Agent 部署里"Agent 改完人想改怎么办"的死结。


三、实验:12 个任务 + 5 张表说了什么

实验设计上作者设了四个配置,逐步叠加约束来剥离每个组件的贡献:

配置 产物 平台约束 知识引导
Vanilla CC Python 脚本
Context-Aware CC Python 脚本 喂 DataFlow 仓库代码 隐性
MCP-only 平台 DAG MCP 工具
DataFlow-Harness 平台 DAG MCP 工具 Skills

所有配置都用 Claude Opus 4.7,每个任务跑 10 次,共 120 次/方法。这是必要的设计——Agent 行为本身有随机性,10 次平均才有意义。

RQ1:端到端成功率

Method 产物 E2E Pass (%) Tokens (In/Out) Cost ($) Latency (s)
Vanilla CC 脚本 91.7 153,584 / 2,474 0.950 190.7
Context-Aware CC 脚本 94.2 185,626 / 1,140 0.456 115.9
MCP-only DAG 83.3 100,607 / 1,273 0.321 105.5
DataFlow-Harness DAG 93.3 74,958 / 891 0.261 95.5

主结果表(Table 1)。数据说话:

  • 给 Vanilla 喂 DataFlow 仓库做 in-context(Context-Aware CC),通过率提升 2.5 个点,但代价是输入 token 几乎翻倍(153k → 186k)。
  • 光有 MCP 工具不行——MCP-only 把通过率砸到 83.3%,掉了整整 8 个点。原因很直觉:让 Agent 在结构化约束下做选择,比让它自由写代码难得多。
  • DataFlow-Harness 救回来了 10 个点(83.3 → 93.3),几乎追平了 Context-Aware CC 的 94.2,但输入 token 只有它的 40%(75k vs 186k)、成本只有 57%($0.26 vs $0.46)
  • 比 Vanilla CC:成本砍 72.5%,延迟砍 49.9%。

这个数据组合让人眼前一亮的地方在于:它没让 Agent 变笨(通过率没掉),但让 Agent 变省了。原因有两层——

  1. DAG 表示比可执行代码更紧凑。一个有向无环图的拓扑 + 参数配置,比一段 200 行的 Python 脚本信息密度高得多。
  2. Skills 让 Agent 更"直奔主题”。少了"我先 import 哪些库、写个什么 class、handle 哪个 edge case"这种发散。

作者也在文中坦白:"我们没有声明统计等价性"——93.3 vs 94.2 在 120 次试验上差异是显著的(大约 0.9 个点对应 1 次任务失败差异)。所以更公允的说法是:DataFlow-Harness 在通过率上接近 baseline,但工程成本上有质的优势

RQ2:成本/延迟的分解

  • 相对 Vanilla CC:成本 -72.5%,延迟 -49.9%,通过率还高 1.6 个点(93.3 vs 91.7)。
  • 相对 Context-Aware CC:成本 -42.8%,延迟 -17.6%,通过率只低 0.9 个点
  • 成本下降主要来自输入 token 大幅减少(MCP-only 比 Context-Aware CC 减半,DataFlow-Harness 再减 25.5%)。

RQ2 的潜台词:在生产部署里,"省 70% 成本"比"通过率高 0.9 个点"重要得多。LLM API 是按 token 计费的,pipeline 每天跑几百次的话,月度账单差一个数量级。

RQ3:消融——Skills 在哪管用?

这是论文里最有价值的一节,因为它告诉你"什么时候这个方法有效、什么时候没用"。

把 12 个任务分成三组,看 MCP-only 和 DataFlow-Harness 在每组上的差异:

组 1:依赖隐式领域知识(3 个任务) - 1a QA basic:6/10 → 10/10 - 1b QA with filter:6/10 → 9/10 - 3b Text-to-QA chain:6/10 → 10/10 - 小计:18/30 → 29/30

组 2:路由很直接(4 个任务) - 5a Field rename、5b Nested flatten、6a Length filter、6b LLM semantic filter:双方都 10/10

组 3:瓶颈不在合成(5 个任务) - 4a Score and filter、4b Multi-dimensional score:双方都 7/10 - 2a Sentiment:9/10 → 10/10 - 2b Review governance:10/10 → 9/10(Skills 反而拖后腿) - 3a Long-document summary:9/10 → 10/10

三个清晰模式

  1. Skills 最值钱的场景:任务需要"老师傅才知道的程序”——比如 QA 生成时该走"先生成问题 → 检索支撑文档 → 合成答案"还是"先生成问题-答案对 → 反向验证"?这种"流程性知识"光看算子描述是看不出来的。
  2. Skills 没用的场景:路由直接——5a/5b/6a/6b 都是"加个过滤算子、改个字段名"这种机械活,Agent 看算子名字就知道该干啥,不需要程序性引导。
  3. Skills 拖后腿的场景:任务瓶颈不在合成——4a/4b 是评分任务,错的是下游 LLM 评分逻辑,不是 DAG 构不构得对;2b 是 Skills 反而压制了 Agent 的灵活性(10/10 → 9/10),这提醒我们"过度程序化"也有成本。

RQ3 真正教会我们的是:Skills 不是越多越好,而是要看任务本身的"程序性知识密度"。

但我得说一句——这个消融做得很不彻底。它只对比了 MCP-only 和完整系统,没有单独剥离 Skills(也就是没法判断 Skills 单独贡献多少 vs Validation 贡献多少)。作者在论文最后也坦白了这一点:"这个 ablation 没法单独识别 validation 的贡献"。

RQ4:下游训练效用——这是真正"有杀伤力"的数据

前三个 RQ 都在问"你能不能搭出能跑的流水线",但生产里最关心的是"你搭的流水线产出的数据,喂给模型之后,模型能不能更强”

RQ4 跑了两组 case study,每组用同样的 prompt、同样的模型、同样的训练配置,唯一变量是 Agent 用什么工具搭流水线

Case 1:数学推理 pipeline

Pipeline GSM8K MATH AMC23 Olympiad Gaokao24 Minerva AIME24@32 AIME25@32 Avg
1 epoch Vanilla CC 92.3 78.0 47.5 42.8 56.0 35.7 25.1 21.6 49.9
1 epoch DF-Harness 93.9 72.3 72.5 38.7 38.5 26.5 35.9 34.5 51.6
2 epoch Vanilla CC 94.8 84.0 60.0 48.0 53.8 39.7 31.8 24.3 54.5
2 epoch DF-Harness 94.4 76.6 75.0 45.2 42.9 25.7 45.4 40.0 55.7

最炸裂的是 AIME——AIME25@32 在 1 epoch 时从 21.6 拉到 34.5(+12.9 个点)。这是什么概念?AIME 是美国数学奥赛,相当于给高中生做的高难度题,能涨 12 个点是非常显著的。

但你注意看数据——这种提升不是全面的。GSM8K 上 Vanilla 反而更高(92.3 vs 93.9 实际是 Harness 略高,但 2 epoch 时 Vanilla 94.8 > Harness 94.4),MATH 上 Vanilla 也更高。Harness 的优势集中在 AMC23、AIME 这种"难题、可能被污染的题"上

作者的解释是:"DataFlow-Harness 产出的 pipeline 在 verification、filtering、deduplication 阶段做得更严格,所以留下来的数据虽然更少但更干净、更有挑战性"。

Case 2:通用 SFT pipeline(10K 样本)

Pipeline MMLU GSM8K MATH Minerva Olympiad HE HE+ MBPP MBPP+ Avg
Vanilla CC 74.4 82.9 68.2 27.6 35.9 78.0 70.1 64.6 51.6 61.5
DF-Harness 74.2 79.5 70.1 27.6 36.3 80.5 72.6 75.4 58.2 63.8

九项平均涨 2.3 个点(61.5 → 63.8)。涨幅最大的是代码类:MBPP 从 64.6 → 75.4(+10.8),MBPP+ 从 51.6 → 58.2(+6.6)。

作者的解读:"grouned 的 critique-then-rewrite 和 judge 阶段产出了更可执行、字段结构更规整的代码响应"。

但这两个 case study 的局限也很明显——

  • 每个场景只跑了一次 pipeline 构架过程,没做多次独立 pipeline 训练;
  • 训练 seed 也是固定的(42),没看到多 seed 的方差;
  • 2.3 个点的均分提升,到底是 systematic 优势还是随机波动,这个 paper 没给你答案

作者在 Limitations 里也说了:"these results should not be interpreted as a general causal estimate"。坦诚,但同时也在说:这就是 case study,不是 A/B 检验

RQ 之外:Table 2 那个 textbook-to-VQA 的事

论文里还单独跑了 Table 2(textbook-to-VQA 抽取任务),数据也很有意思:

Method Precision Coverage Rate
Vanilla CC 0.621 0.533
Context-Aware CC 0.893 0.801
MCP-only 0.784 0.621
DataFlow-Harness 0.972 0.873

这个任务特别难——要从"长文档 + 图表 + 答案册"里抽取 VQA 数据,跨页、跨模态、跨布局。DataFlow-Harness 在 coverage(召回率)上比 MCP-only 拉了 25 个点(62.1% → 87.3%)。这个差异更直接说明问题——光是"知道有哪些算子"不够,还得知道怎么把它们串起来


四、我的判断:这篇论文值不值得花时间?

真正值钱的地方

  1. 它把"Agent 写代码"和"Agent 在平台里做工程"分开了。在 DataFlow 这种有 200+ 算子的成熟生态里,平台接地的边际收益远大于提升模型本身。这篇 paper 用 12 个任务 + 5 张表非常系统地证明了这件事。

  2. RQ3 的 per-task 消融是真功夫。它没像很多 paper 那样只报"我们的方法全面提升",而是诚实告诉你"在哪儿提升、在哪儿持平、在哪儿反而下降"。承认 Skills 也会拖后腿(2b 任务)这一点很加分

  3. 下游训练评估是个大胆的设计。大多数 code agent paper 只在 benchmark 上比通过率,这篇直接 end-to-end 跑了 SFT 训练看模型精度——虽然 case study 不够 systematic,但方向是对的。RQ4 那个 AIME25 +12.9 的数据如果多次复现成立,会是相当有说服力的论据。

  4. 架构图(Figure 1)和 UI 截图(Figure 2)都很实在。Figure 2 是个真实运行的截图,能看到 Agent 主动调 Get operator detail 查算子文档——这种细节比 PPT 流程图有说服力得多。

让人皱眉的地方

  1. 评估规模太小。12 个任务、10 次重复、1 个模型家族(Claude Opus 4.7),离"production-grade 证据"还有距离。对照 Context-Aware CC 的 94.2 vs Harness 的 93.3——这 0.9 个点的差异在 120 次试验上的标准误大约就在这个量级,说"几乎追平"有点乐观。

  2. 消融做得很不干净。RQ3 只对比 MCP-only 和完整系统,没法判断 Skills 单独贡献多少 vs Validation 单独贡献多少 vs WebUI 同步单独贡献多少。这其实是四五个独立变量,只跑了一个 ablation slot。

  3. 下游训练只是 case study。RQ4 每个场景只跑 1 个 pipeline、1 个 seed,完全没法支撑"grounded 一定能提升训练数据质量"这种因果性结论。作者在 Limitations 里承认了,但通读论文的"亮点"叙事又没把这条限制讲够。

  4. “性价比"提升里有 baseline 选择偏差。Context-Aware CC 的设计是"把整个 DataFlow 仓库塞进 context",这其实是一种 naive 的 in-context learning——真实生产里没人会这么干(成本太高)。选了一个相对弱的对照组,会让"我们成本低很多"显得过于轻松。

  5. 论文的"novelty"有限。MCP、typed mutations、validation 这些都不是新概念,这篇 paper 的贡献更多在"把它们组合起来,在 DataFlow 这个具体平台上验证有效"。这是工程整合的天花板作品,不是底层方法论突破

一个被忽略的关键问题

我读完后最想问作者的是:当 DataFlow 的算子库本身有 bug、或者某个算子的输出 Schema 文档不对时,整个系统会怎样?

Skills 假设"算子按文档说的工作",Validation 假设"Schema 描述 = 实际行为"。但真实平台的算子库一定会漂移——今天这个算子输出多一个字段,明天那个算子换了个底层模型。

这个 paper 没讨论这种"平台一致性漂移"问题。从工程角度说,如果 Skills 是手写维护的(看起来是),那它本身就是个新的"代码债”

给做相关方向的人的工程启发

  • 如果你的产品/平台已经有"算子注册表 + 类型化 API”:考虑加一层 MCP 暴露 + 少量 Skills 引导,Agent 成功率可能立刻上来。这篇 paper 给出了清晰的"低成本路径"——Skills 不需要多,关键的"程序性知识"5-10 条就够
  • 如果你的平台没有现成算子库:DataFlow-Harness 的思路不能直接用——它强依赖"一个成熟的算子生态"。先沉淀算子库,再谈 Agent 接地
  • Skills 的设计哲学:作者明确说"Skills 最有用的是隐式程序性知识"——别试图把所有领域知识都塞进 Skills,那会让 Skills 变成又一份需要维护的文档。聚焦"老师傅才会做、新人容易做错"的那部分。

五、最后的碎碎念

这篇 paper 让我想起一个老问题:“用 LLM 自动化" 和 "让 LLM 在工程系统里当一个组件" 是两件事。前者炫但脆弱,后者扎实但慢。

DataFlow-Harness 走的是第二条路——它没声称"我们的方法让 Claude Code 更聪明了",它说的是"我们把 Claude Code 钉在了一个结构化环境里,让它在一个可控的状态空间里做决定"。

这种思路在 2024 年大家还在追"Agent 自主性"的时候并不时髦,但到了 2026 年大家都开始把 Agent 部署到生产时,它就是真功夫

如果你正在做 LLM 数据工程相关的项目,强烈建议读一下 arXiv:2607.16617 原文,特别是 RQ3 那一节——它告诉你在哪儿给 Agent 加约束、在哪儿让它自由,这是真金白银换不来的工程经验。


参考链接

  • 论文:https://arxiv.org/abs/2607.16617
  • 代码(DataFlow-WebUI):https://github.com/OpenDCAI/DataFlow-WebUI
  • 文档:https://opendcai.github.io/DataFlow-Doc/
  • 前置工作(DataFlow 框架):arXiv:2512.16676

觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我。