使用 FUSE 构建沙箱代理:将任何内容转换为文件系统
本文探讨了将代理置于沙箱环境(包含 shell 和文件系统)中的最新趋势,并介绍了使用 FUSE (Filesystem in Userspace) 将任何数据结构转化为文件系统的方法。这种方法借鉴了大型实验室在编码任务中对沙箱环境的广泛应用,并将其优势扩展到其他问题领域。
背景与优势:
- 借鉴编码领域的优势: 大型实验室利用强化学习在沙箱环境中训练编码代理,将代理与类似环境结合可以带来收益。
- 简化工具空间: 使用单一的 Bash 工具取代多个搜索、写入、移动和列出工具,可以显著减少工具空间,并让代理能够直观地链式操作。
- 自然涌现的模式: 文件系统带来了诸如计划/草稿文件和长期上下文处理等自然模式,无需额外设计工具。
挑战:
将现有应用集成到沙箱文件系统中面临挑战,例如:
- 何时复制文件?
- 复制所有文件还是部分文件?
- 如何将代理的更新写入回数据库?
- 如何同步人工编辑?
- 如何逐步展示文件夹/文件?
解决方案:FUSE
FUSE 允许在用户空间实现文件系统,而内核将其视为“真实”文件系统。 开发者只需编写用户空间的实现,处理诸如 lookup、open、read、write 和 readdir 等操作。
示例:电子邮件代理
文章以构建 AI 驱动的电子邮件平台为例,展示了 FUSE 的应用:
- 架构: 传统的应用路径是用户界面 -> 后端 -> 数据库。 新的代理路径是代理在沙箱中运行,通过 FUSE 层与后端交互,将数据库查询转化为文件系统操作。
- 文件布局: 代理沙箱中的文件布局定义了电子邮件和文件夹的组织方式。
- 实现: 使用 Typescript 和
fuse-native 库实现了文件系统操作,例如 readdir (列出目录) 和 read (读取文件)。
- 虚拟文件夹: 引入了“已标记” (Starred) 和“待处理” (Needs_Action) 虚拟文件夹的概念,通过创建符号链接来表示已标记的邮件。
代理交互:
- 系统提示: 为代理提供了一个清晰的系统提示,指导其在文件系统环境中操作邮件。
- 演示: 展示了代理如何使用
ls、mv 和 cat 等命令浏览、移动和读取邮件,以及如何自动组织邮箱。
总结与展望:
文章总结了 FUSE 在构建沙箱代理方面的优势,并预测未来会出现更高级的 API,简化文件系统集成,例如:
new Agent({
tool: [...]
sandbox: {
filesystem: {
'/emails': (folder) => listEmails(folder),
'/old_conversations': () => listOldConversations(),
}
}
}
})
这种方法为上下文工程提供了巨大的潜力,可以显著提高代理的效率和可用性。