Unix 革命建立在一个核心原则之上:一切皆文件。如今,随着 AI 智能体(Agents)的兴起,大语言模型(LLMs)得以接触半个世纪以来基于文件的那些深奥知识。结果如何?一切正再次回归于文件。
![]()
作者:Glauber Costa
原文:turso.tech/blog/nothing-new-under-the-sun
转自:https://weibo.com/2194035935/QnmFpbeBp(微博:蚁工厂)
----------------------------------
我第一次接触电脑是在 11 岁那年。那时我有一台运行着 MS-DOS 5.2 和 Windows 3.1 的旧 PC,主要用来玩游戏。不过,让如今身为专业人士的我(30 年后)感到欣慰的是,在那个年代光是玩游戏就需要了解 x86 的内存分段机制。
那是一段有趣的时光,但我甚至不把那视为引我走向编程的“入门毒药”。真正让我上瘾的是后来遇到的东西:Unix。直到高中一年级我才发现了 Linux。上了大学后,我的兴趣真正被点燃了。很快,我就全身心地投入到了 Unix 的历史中,并且会找任何借口去把玩那台停放在材料系里的 SPARC Solaris 工作站。
如果没有 Unix,我们就不会有今天的成就。如果你未曾经历过那个旧时代,可能很容易低估 Unix 的重要性。除了 C 语言这个“副作用”之外,Unix 还给了世界两样东西:
- “先发布(Ship it)”的理念:Unix 引入了 man 手册(man pages)来记录工具的局限性,而不是为了追求完美而推迟发布。
- “一切皆文件”的抽象,以及用管道(pipes)将工具粘合在一起的概念。
文件的力量
当我把无聊的朋友都换成 Unix 狂热信徒后(我喜欢这样讲这个故事——其实真相是他们都不理我了,因为我总是喋喋不休地谈论 Unix),我不断听到这句话:“sed awk cut grep is all you need(你只需要 sed、awk、cut 和 grep)”。这是一个美丽的抽象概念。半个世纪后的今天,它听起来显而易见(就像大多数伟大的想法一样),但在当时,这绝非显而易见。
每个程序都能理解文件。它们可以写入文件,也可以从文件读取。这意味着突然之间,你在整个系统中拥有了一个统一的接口。这是一个所有人共同遵守的契约,确保每一个应用程序都能消费其他任何应用程序的结果。
这个简单的抽象——文件,让另一个强大的 Unix 原则得以实现:“做一件事,并把它做好(Do one thing, and one thing well)。” 每个工具不必构建成一个庞大的应用程序,而是可以高度专业化。它们之所以能做到这一点,是因为它们都在通过文件输入和输出工作结果。
这引发了可能性的组合爆炸,而这一切都通过文件契约发生。这里写几个字节,那里读几个字节,再用管道将它们粘合在一起。
人们通常理解的文件是存储设备中的东西,比如 PDF 或电子表格文档。但文件之所以如此强大,是因为它们是一个非常简单的抽象:一组可以被读取和写入的字节集合。很快,Unix 世界里到处都是虚拟文件。最终,在 Unix 世界里,甚至网络连接也可以被表示为文件。
超越 Unix
Linux 将这一概念推向了极致。Linux 有一个 /proc 虚拟文件系统,包含关于内核的各种信息,而你读取这些信息的方式是……读取虚拟文件。(proc 文件系统在最初的 Unix 中就已存在,但正如其名,它主要包含关于运行进程的简单信息)。
还有一个 /sys 虚拟文件系统,你可以从中获取关于设备驱动程序和硬件系统的各种信息。而你与它交互的方式,你猜对了,还是读写文件。
我们在这一基础之上构建了我们的世界。后来,我们在其他层面上(比如 API)看到了类似的契约,但文件依然无处不在。即使在基于 API 的系统中,文件仍然被用于配置系统、存储代码、提供资源等。
复用性至关重要
快进到 AI 时代,有一件事变得清晰起来:大语言模型(LLM)虽然不错、整洁且可爱,但光靠它们带你去不了任何地方。真正解锁 AI 潜力的关键是智能体(Agents)——这不过是“在大语言模型使用工具外层套了个 for 循环”的花哨说法。
事实证明,LLM 非常、非常擅长使用那些伴随 Unix 存在了半个世纪的工具。这些工具通过文件抽象完美地组合在一起。在 Unix 的半个世纪里,我们已经为每一个能想到的工作积累了相应的工具。由于智能体本质上就是文本流的推动者,它们非常擅长使用这些工具。
当然,我们可以重建一切。我们可以给智能体提供“智能体原生”的专用工具。但这将意味着把我们在这个漫长过程中积累的所有资本投入虚空……仅仅为了换取微不足道的收益。我们在电源插头的形状上没有这样做,SQL 也依然占据统治地位(尽管每个开发人员似乎都认为自己知道如何做得更好)。
现代、更丰富的文件系统
相反,智能体将会拥抱文件系统。这已经在发生了,像 Claude Code 这样的工具正严重依赖它,而且这种趋势还会加剧。
然而,这并不意味着文件系统将保持不变。行业中目前有两个特定趋势正以文件系统的形式施加压力。
第一是 TypeScript 和基于浏览器的环境正作为智能体的部署载体而流行。 浏览器并没有一种简单的方法可以接入标准文件系统,而基于 TypeScript 的智能体通常部署在临时环境(ephemeral environments)中,在那里面文件系统并非理所当然的存在。这是因为这些平台演变为提供类似函数的环境,通过网络连接数据库来满足数据需求。
第二是沙盒(Sandbox)作为隔离智能体工作负载的首选方式正在兴起。 沙盒将虚拟化环境提升到了一个新的水平。环境需要在毫秒级上线,因为智能体会生成子智能体去探索解决方案空间。将传统文件系统附加到这些沙盒上,对于它们所需的运行速度来说实在是太慢了。
有两个试图解决这个问题的有趣工具值得一提。第一个是 Vercel 的 just-bash。该工具为用 TypeScript 编写的智能体提供了一个模拟的类 bash 环境,允许智能体像在普通 Unix shell 中一样使用工具,无论它们在哪里执行:
import { Bash } from "just-bash";
const env = new Bash();
await env.exec('echo "Hello" > greeting.txt');
const result = await env.exec("cat greeting.txt");
console.log(result.stdout); // "Hello\n"
console.log(result.exitCode); // 0
console.log(result.env); // Final environment after execution
第二个是我们自己的 AgentFS,这是一个将整个文件系统映射到 SQLite 文件的工具。文件系统可以在智能体之间隔离(更改会被捕获到文件中,而不损害原始文件系统)。
这确保了:a) 智能体只能访问它应该访问的上下文部分;b) 它可以自由地操作资产,因为它知道更改是非破坏性的。
SQLite 文件可以被沙盒复制或部分复制,并在智能体执行时即时可用。这支持了快照(snapshotting)(即智能体可以保存自己的状态,执行一步操作,如果犯错则回滚到之前的文件),以及在智能体组之间共享状态。
结论
周而复始,循环往复。当我们周围的世界发生剧变时,有一件事不会改变:我们在前人的基础上构建,若要从头重建则后果自负。Unix 革命给了我们文件抽象,半个世纪以来,我们一直建立在它之上。
对于 AI 智能体而言,问题将是:我们要利用过去 50 年编写的所有工具的巨大潜力,还是重建一切?
答案正变得显而易见。