AgentFS:AI代理的文件系统

随着越来越多的开发者构建AI代理和自主系统,通常是在沙盒环境中,一个挑战尤为突出:如何有效地管理代理状态,同时保持信任和可审计性?AI代理的不可预测性使这尤其具有挑战性,因此你真的希望了解每一个决策、每一个创建的文件以及每一次状态变化。虽然你可以限制代理可以做的事情(在许多情况下需要这样做),但通常是一个好的策略让代理做它需要做的事情,只要你可以捕获它的状态,审计状态,并对其进行迭代。

一个SQLite数据库本身只是一个文件,非常适合捕获代理状态。但在与代理开发人员交谈后,我们发现人们更倾向于以更高层次的抽象来使用SQLite。这就是为什么我们构建了AgentFS SDK,一个代理文件系统抽象。AgentFS为代理提供了一个统一的接口,以便在一个SQLite数据库中管理所有状态,使其可以通过SQL查询,跨环境可移植,并且完全可审计。而不是拼凑数据库、日志系统和文件存储,你可以得到一个地方:用于工件的类POSIX文件系统,用于代理状态的键值存储,以及自动工具调用跟踪以实现完整的可观测性。

有了AgentFS,你可以通过复制一个文件来快照代理的整个运行时,使用SQL查询调试复杂的行为,并重现精确的执行状态进行测试。这是处理代理沙箱中数据挑战所缺少的关键部分。

1、问题:管理不可预测的AI系统

从根本上说,像AI代理这样的自主系统本质上是不可预测的。它们的决策过程涉及复杂的推理链和与环境的交互,可能导致意想不到的结果。虽然你可以对它们的行为施加限制,但你真正需要的是当它们偏离预期路径时对其操作的可见性。

这种对代理操作的可见性对于开发和调试之外的原因至关重要,以了解代理为何做出特定决策。例如,你需要可观测性来:

  • 法规合规:满足AI驱动流程的审计要求
  • 责任:在代理做出昂贵错误时拥有明确的记录
  • 持续改进:分析过去的行为以改进未来的表现
  • 可再现性:重新创建精确的条件进行测试和验证

然而,许多传统方法不足,因为它们涉及拼凑多个工具:用于状态存储的数据库、用于审计跟踪的日志系统、传统的本地文件系统用于工件,以及用于历史版本控制的工具。状态的碎片化不仅增加了复杂性,还留下了可观测性的空白。此外,本地文件系统本身也可能存在问题:有时某些沙盒环境没有本地文件系统,即使有,大规模地操作持久卷也不是什么有趣的事情。

2、代理文件系统抽象

为了解决代理可观测性的问题,我们谈到的开发人员一致指出:他们想要一个专门为代理设计的文件系统抽象。以下需求不断出现:

  • 可查询性:快速找到特定的状态转换或决策点
  • 版本控制:了解状态随时间的变化
  • 可移植性:无缝地在不同环境中移动状态
  • 持久性:确保状态在崩溃和重启后仍然存在

有趣的是,开发人员不断提到SQLite似乎非常适合这个代理文件系统,但不清楚如何有效地利用它来满足代理的具体需求。因此,我们构建了AgentFS,一个建立在Turso(一个兼容SQLite的数据库)之上的SDK,为AI代理提供全面的文件系统抽象。

3、架构:SQLite作为基础

AgentFS SDK为代理提供了三个基本接口:

  • 文件系统:用于文件和目录的类POSIX虚拟文件系统
  • 键值:用于代理状态和上下文的键值存储
  • 工具调用:用于调试和分析的审计跟踪工具。

AgentFS的核心是一个基于SQLite数据库实现的代理专用文件系统。代理所做的每一件事——它创建的每个文件、存储的每个状态、调用的每个工具——都存储在一个单一的SQLite数据库文件中,如图1所示。

图1:AgentFS架构图

这种设计选择带来了几个优势:

  • 单个文件的简单性:整个代理运行时——文件、状态、历史——都存储在一个SQLite文件中。你可以将其在机器之间移动,将其提交到版本控制中,或者部署到任何地方。
  • 内置的可审计性:每次文件操作、工具调用和状态更改都会被记录在SQLite中。使用SQL查询你的代理的完整历史记录,以调试问题、分析行为或满足合规要求。
  • 瞬时可再现性:通过复制SQLite数据库文件,在任何时刻快照代理的状态。以后可以恢复它以重现精确的执行状态,测试假设情景,或回滚错误。
  • SQL驱动的分析:由于一切都在SQLite中,你可以使用标准SQL查询来分析代理行为,提取指标或构建自定义的可观测性工具。

AgentFS SDK由两部分组成:状态捕获和状态管理。状态捕获提供了代理用来与系统交互的SDK接口。状态管理实现了代理文件系统规范,该规范定义了一个用于代理文件系统的SQLite模式,使用Turso数据库。

3.1 捕获代理状态

当代理执行操作时,我们需要捕获它们以便以后分析。例如,你可能想要捕获:

  • 决策树和推理路径 - 每个动作背后的逻辑
  • 中间计算 - 为未来决策提供信息的结果
  • 外部API响应 - 从其他系统检索的数据
  • 用户交互 - 命令、反馈和修正
  • 错误状态和恢复尝试 - 出现了什么问题以及代理如何应对
  • 文件操作 - 每次读取、写入和修改
  • 配置更改 - 代理设置随时间的变化

你使用AgentFS SDK进行状态捕获。你进行的综合状态捕获越多,对代理行为的深入洞察就越深,使得调试和改进更加系统化。AgentFS项目还包括一个高度实验性的沙盒,旨在自动捕获状态,面向代理基础设施构建者。

3.2 存储代理状态

SQLite文件中的存储布局由代理文件系统规范定义。该模式包含多个表,为文件、键值对和工具调用审计提供高效的存储。

文件系统存储使用两个主要的SQLite表来进行文件组织:inode表和dentry表。dentry(目录项)表负责存储文件和目录路径。它基本上跟踪所有内容的名称及其在文件夹结构中的位置。为了更快的查找,该表被单独保留。然而,inode表是实际文件内容和元数据(如大小、权限和时间戳)存储的关键。每个文件都有一个inode,其中包含其数据和属性。简而言之,dentries管理名称和组织,而inodes处理实际内容和文件信息,类似于操作系统内核所做的。

另外两个接口,键值和工具调用审计日志,是直接的。键值存储由一个SQLite表组成,将每个键映射到其JSON序列化的值。工具调用审计日志表示为一个单向追加表。换句话说,与文件系统和键值存储表不同,工具调用表的行不会被修改;只有新行被插入。这确保了在代理做出意外行为时的可审计性。

4、AgentFS SDK

AgentFS SDK通过熟悉的API提供了对所有代理文件系统功能的程序访问。

如果你使用TypeScript或JavaScript,可以在你的项目中安装SDK:

npm install agentfs-sdk

对于Rust项目,请运行:

cargo add agentfs-sdk

SDK提供了不同类型的州的接口。例如,你会在代理代码中使用TypeScript SDK如下:

import { AgentFS } from 'agentfs-sdk';

const agent = await AgentFS.open('./agent.db');

// 键值操作
await agent.kv.set('user:preferences', { theme: 'dark' });
const prefs = await agent.kv.get('user:preferences');

// 文件系统操作
await agent.fs.writeFile('/output/report.pdf', pdfBuffer);
const files = await agent.fs.readdir('/output');

// 工具调用跟踪
await agent.tools.record(
  'web_search',
  Date.now() / 1000,
  Date.now() / 1000 + 1.5,
  { query: 'AI' },
  { results: [...] }
);

换句话说,你首先使用AgentFS.open方法使用Turso打开一个SQLite数据库文件,然后从AgentFS对象中使用不同的接口,包括文件系统、键值和工具调用。

5、示例:研究助理代理

为了展示AgentFS的实际应用,我们构建了一个研究助理代理,它可以回答关于数据库研究的问题。该代理搜索顶级数据库会议(VLDB和SIGMOD)的论文,以提供有根据的研究答案。

该研究助理是使用Mastra AI代理框架构建的,遵循一个简单的流程:

  1. 搜索相关论文 - 查询Semantic Scholar的API以找到匹配研究问题的论文
  2. 下载并提取内容 - 获取相关论文的PDF并提取其文本
  3. 持久化到文件系统 - 将论文内容存储在AgentFS中以便于检索和缓存
  4. 生成针对性摘要 - 分析存储的论文并合成针对原始研究问题的答案

这个例子展示了AgentFS如何处理现实世界的代理任务:管理下载的文件,缓存处理后的内容,并在多次操作中维护状态。文件系统抽象使得存储和检索研究论文变得简单,而不必担心底层存储实现。

你可以在Github上找到示例的完整源代码。

6、结束语

代理文件系统抽象解决了AI代理开发中的一个根本性挑战:在不可预测的自主系统中管理状态。通过在SQLite之上构建,而不是分散的文件和临时解决方案,你得到了:

  • 所有内容在一个SQLite文件中
  • 快照和版本控制免费
  • 使用SQL查询进行调试和分析
  • 易于再现用于测试和开发

代理文件系统的强大之处在于其简单性——所有内容都在一个地方,可以用SQL查询,作为一个文件可移植。将代理状态视为文件系统,但将其实施为数据库。这为你提供了文件的简单性和结构化数据的力量。当你的代理需要在运行之间维护复杂状态、与其他代理协调,或者当你需要调试生产中发生的问题时,这特别有用。


原文链接:The Missing Abstraction for AI Agents: The Agent Filesystem

汇智网翻译整理,转载请标明出处