跳至主要内容

为什么 AI Agent 处理数据科学代码比处理软件工程代码更吃力

了解为何 AI 编码代理在软件工程中常显得更能干,而在数据科学工作中却不那么得心应手。
Jason Hillary
Jason Hillary

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

我分析了数百个 GitHub 仓库,试图理解为什么 AI 编码代理在软件工程中往往显得更有能力,而在数据科学工作中则不然。我的发现表明,这不只是工具差距的问题,而是反映了两类代码在“意义”所寄居的地方存在更深层次的差异。

本文关注什么

如果您曾在软件工程的代码库中使用过 AI 编码代理,您很可能见识过它的高效。代理能够在架构中穿梭、遵循抽象,并做出与整个系统惊人契合的修改。

但当您打开一个数据科学笔记本时,体验往往就变了。

代理依然能写出有效代码,也能遵循指令。但它常常无法完全理解关键之处:为什么是这个数据集、为什么用这个筛选、为什么是这个时间窗口、为什么这个输出改变了分析的方向。

它把笔记本当作一个软件项目来处理,而这只是它的一部分属性。

我想弄清原因,因此对数据科学与软件工程领域的数百个 GitHub 仓库进行了分析,测量了熵、引用模式和耦合行为。

结果让我颇为意外,我认为这对任何构建或使用 AI 代理开展分析工作的人都具有现实意义。

熵的反转:数据科学代码并非表面看起来那样

我实际测量了什么

我在三个抽象层级上对每个仓库测量了香农熵:字符层、词元层和 AST(抽象语法树)层。每个层级捕捉代码变异性的不同维度。

代码熵分布:数据科学 vs 软件工程 小提琴图

代码熵分布:数据科学 vs 软件工程 小提琴图

呈现出的模式可称为“熵的反转”。

表面看起来更复杂,结构却往往不是

在字符层,数据科学代码往往比软件工程代码具有更高的熵。这合乎直觉。数据科学工作充斥着多样的列名、数据集标签、临时变量以及领域特定的标识符,使得代码看起来嘈杂而不规则。

在词元层,两者差距要小得多。它们依赖许多相同的语法构件。

但在关注结构多样性的 AST 层,画风却反转了。

软件工程代码往往在结构上编码了更多变化。它通过抽象、接口、模块和内部逻辑,创造出更多彼此区分的行为。

相比之下,数据科学代码常常是在变化的上下文中复用较小的一组操作:加载、筛选、分组、聚合、可视化、检视、调整。

简言之,数据科学代码的表层往往更显复杂,而软件工程代码的复杂性更多地承载在结构之中。

这并非纯粹的风格差异,而是指向两类工作如何存储“意义”的更深层差别。

指示性 vs 符号性:意义安在何处

两种不同的代码

当您思考每种代码实际在做什么时,“熵的反转”就更容易理解了。

在软件工程中,意义常被压缩进结构里。函数、接口、模块、类型和类边界承担了大量工作。一旦这些抽象建立起来,它们会稳定行为并降低未来的不确定性。

许多意义蕴含在代码自身之中。

在数据科学中,意义则更紧密地系于外部语境。它依赖于数据集、列、阶段性输出、某个变换背后的假设,以及分析者试图回答的不断演化的问题。代码不仅是在表达逻辑,它是在指向一个特定的分析情境。

这一差异是理解为什么代理在两大领域表现迥异的最有用方式之一。

从代码“指向”的对象可见端倪

我还测量了两组代码中每 100 行的外部与内部引用密度。

外部与内部引用密度及统计显著性

外部与内部引用密度及统计显著性

差异非常清楚。数据科学代码更频繁地向外部指涉:数据集、表、列、临时对象以及存在于代码之外的状态。

软件工程代码则更倾向于内部自我指涉。它更常通过指向代码库中其他地方定义的函数、类、模块和抽象来构建意义。

数据代码向外指,软件代码向内指。

这对代理很重要。在一种情况下,大部分相关上下文在代码库内部;在另一种情况下,大部分上下文存在于周边的分析状态中。

这为何让抽象表现不同

笔记本中的耦合问题

一个颇有意思的发现与耦合相关。与软件工程代码库相比,笔记本式工作流在每 100 行代码中的耦合明显更紧。

这并不一定是糟糕的设计。它反映了探索性分析的根本特点:问题本身常在变化中。您在检验假设、追踪异常结果、核查边界情况,并在学习中不断调整方向。

在这种情境下,抽象往往无法像在软件工程中那样带来同等收益。过早的结构化可能在您尚未弄清关键点之前就降低了选择空间。更紧的耦合往往是探索的结果,而不只是糟糕工程实践的产物。

注释与状态的作用

两大领域在“如何自我解释”方面也存在重要差异。

在软件工程中,代码常通过结构自我解释。类型、接口和抽象承载了大量意义,注释通常是次要的。

在数据科学中,注释、输出和状态往往承载着部分意义。诸如“移除了高于第 99 百分位的离群点,确认这不影响主队列”这样的备注,并不只是额外文档。

它记录了一项仅凭代码可能无法还原的分析决策。笔记本中途的一张表或一幅图,可能就解释了下一段分析存在的理由。

这对代理同样重要。忽略注释、行内结果和不断演化的状态,就会错过分析的一部分。在软件工程代码库中,这些信息往往是补充性的;在数据科学工作中,却常常不是。

这对 AI 代理意味着什么

默认情况下,代理与其中一个领域更“匹配”

实际含义是:当工具与“意义”的栖身之处相匹配时,代理的效果最佳。

在软件工程中,高效的代理会在架构中导航,沿着调用图前进,遵循接口,并在整个代码库中保持改动一致。这奏效是因为大量意义已被编码进结构。

在数据科学中,高效的代理需要做的不止是浏览代码。它需要理解数据实际包含什么,在各步骤间跟踪状态,追溯变量的来源,并能推理为何在几步之前应用了某个变换或筛选。

为软件工程打造的代理并不会自然而然地迁移到数据科学工作中。问题不只是语法,而是底层的信息结构不同。

笔记本式工作流为何长盛不衰

这也有助于解释一个常令工程师困惑的现象:尽管笔记本有明显局限,为何仍处于中心位置。

答案在于:在分析问题仍在演变时,笔记本让意义贴近数据。笔记本并非结构糟糕的 Python 模块,而是为不同工作阶段打造的不同产物。它在分析成形的过程中,让代码、输出与决策彼此贴近。

这就是为什么对深处其境的分析者而言,笔记本直观易用,而对只看代码的代理来说却显得别扭。

在分析问题尚未定型前,就将笔记本重构为整洁、模块化的代码,往往并非改进。它可能会把逻辑和赋予其意义的上下文割裂开来。

机会所在:弥合“走向生产”的鸿沟

AI 代理在数据科学中的真正机会,并非简单复制软件工程中已奏效的做法,而是帮助弥合“走向生产”的鸿沟:即从探索中获得的洞见到可复现、可部署工作流之间的距离。

这一鸿沟之所以存在,是因为笔记本以牺牲结构整洁为代价来保留分析语境。若代理既能理解分析语境,也能理解生产系统的结构要求,就能在不迫使人类分析者过早退出探索模式的情况下,架起这座桥梁。

这比在代码库中导航更难,但也更重要。

要点回顾

对所研究仓库的分析总结如下:

  • 数据科学代码在表层往往具有更高的熵,而软件工程代码在结构层往往具有更高的熵。
  • 数据科学代码更常引用外部状态,如数据集、列、表和中间输出;软件工程代码则更倾向于内部自我指涉。
  • 笔记本式工作流往往呈现更紧的耦合,而这通常是探索造成的后果,而非单纯的不良实践。
  • 注释、输出与不断演化的状态是数据科学工作语义内容的一部分,而非边角料。
  • 为软件工程场景优化的代理,若不能同时在代码结构之外对数据、输出和上下文进行推理,在数据科学中往往表现不佳。

结语

开始这项分析时,我原以为会发现数据科学代码只是比软件工程代码结构更差。结果却发现,前者出于充分理由而采用了不同的结构,且其意义常常安放在不同的地方。

这对任何构建或评估用于分析工作的 AI 代理的人都有实际影响。真正的问题不是代理能否写出正确的 Python,而是它是否理解数据是什么、为何分析呈现出这样的形态,以及有哪些仅凭代码无法看到的沿途决策。

数据科学代码并不是不成熟的软件工程,而是完全不同的优化:在探索阶段更依赖外部状态,较少依靠持久的内部结构,并且同样受上下文塑造如同受代码塑造。

一旦意识到这一点,笔记本看起来就不再像失败的软件项目,而更像其真实面貌:用于在变化数据上进行推理的工作界面。

我正用 1,000 个或更多仓库与附加指标扩展此分析。如果您想更深入了解 AI 代理如何在上下文中与数据协作(包括在会话间保持数据状态的持久化执行架构),DataCamp 的 AI Agent 基础路径是一个很好的起点。

FAQs

什么是代码熵?它为何对 AI 代理重要?

将香农熵用于代码,是在某个抽象层级上衡量变异性或不可预测性的一种方法。结构层的更高熵可能表明代码在表达更广泛的内部行为。对 AI 代理而言,这些模式很重要,因为它们决定了代理需要理解何种类型的上下文。

指示性代码与符号性代码有何区别?

这个区分是有用的速记法。软件工程代码常通过函数、接口和抽象在内部承载更多意义。数据科学代码则更依赖外部语境,如数据集、列、输出以及不断演化的分析状态。

这是否意味着数据科学代码质量低于软件工程代码?

不是。重点不在于孰优孰劣,而在于它们为不同目的而优化。探索性数据科学常优先考虑迭代速度与语境保留,而软件工程通常优先考虑结构、复用与可维护性。

为什么 AI 编码代理在数据科学笔记本中常显得效果不佳?

因为许多现有代理被优化为在代码结构中导航。在数据科学中,大量意义存在于代码之外,如数据状态、输出、注释与分析决策。若代理无法在这些上下文上进行推理,就会遗漏任务的一部分。

什么样的 AI 代理才算“原生于数据科学”?

它需要不仅维护对源代码的认知,还要维护对数据状态、输出和变量溯源的认知。它需要把注释和中间结果视为有意义的上下文,并帮助将探索性工作衔接到可复现的生产工作流中。

Jason Hillary

作者

Jason Hillary

Jason Hillary 是 Zerve 的联合创始人兼首席技术官。Zerve 是一个用于研究与分析的人工智能平台。他在构建机器学习与数据科学系统方面拥有十余年经验,并拥有关于能源效率的应用数学方法博士学位,研究重点包括仿真精度以及将神经网络应用于传感器数据。

主题