00:00:00让 AI 智能体变得更强大的最简单方法之一,就是给它们
00:00:03访问 Bash 的权限,但这操作起来可能有点复杂。你需要真实的 Shell、文件系统、
00:00:09服务器和容器,总之需要大量的底层架构。至少以前是这样的。
00:00:13但如果我告诉你有一种更简单的方法呢?你其实可以直接使用 Typescript 实现的
00:00:18Bash 环境。听起来可能有点疯狂,但相信我,这超级酷,
00:00:22甚至还能帮你省钱。让我带你看看是怎么回事。
00:00:30这是一个名为 justbash 的新软件包,你可以在自述文件中看到,它被描述为“一个
00:00:34用 Typescript 编写的、带有内存虚拟文件系统的模拟 Bash 环境”。这是
00:00:38专门为需要安全、沙盒化 Bash 环境的 AI 智能体设计的。
00:00:42但在展示如何将其连接到 AI 智能体以增强其能力之前,
00:00:45我想先给你看一些非常简单的代码,让你了解一下它的运行原理。
00:00:48这里我通过 justbash 软件包启动了一个新的 Bash 环境,
00:00:53我们可以在其中运行 Bash 命令。这里我们调用 env.exec,
00:00:57运行 Bash 命令 echo hello,并将其保存到名为
00:01:01greeting.txt 的文件中。接下来的下一行,我在同一个环境中再次运行 exec,
00:01:06读取那个 greeting.txt 文件。你可以看到我们实际上可以打印出
00:01:10返回结果的标准输出、退出码以及环境变量。
00:01:14当我运行这段代码时,可以看到它成功写入了文件并读取了它。
00:01:18我们得到了退出码 0,还有模拟 Bash Shell 中的环境变量。
00:01:22但这里要记住的关键点是,正如我所说,这只是一个模拟的
00:01:26Bash Shell,它其实就是用 Typescript 重新实现的一套 Bash 命令。
00:01:30所以它并没有连接到任何真实的 Shell,只是单纯地将我们给出的命令
00:01:34转换成 Typescript 并运行。那个叫 greeting.txt 的文件
00:01:39也不存在于任何真实文件系统中,它其实是在内存里的虚拟文件系统,虽然你
00:01:44也可以选择连接到真实系统。理解它工作原理的一个简单方法是,
00:01:47它只是提取我们在 exec 函数中编写的 Bash 命令,
00:01:51并将其转换为一个 Javascript 函数来运行,这意味着它不需要
00:01:55真实的 Shell。我们可以在代码库中看到这一点。当我把 echo 放入
00:01:59exec 时,它实际上运行的是这个 Javascript 函数。我们可以看到这段逻辑
00:02:03只是在解析 Bash 中 echo 命令的各种参数,并将它们转换为 Javascript,
00:02:08然后直接打印出 echo 之后的内容。你可以看到
00:02:11它最后返回一个对象,包含标准输出的 Javascript 字符串、标准错误和退出码。
00:02:15如果你觉得它无法处理 Bash 的所有基础功能,你可以看看这个
00:02:19受支持命令的列表,它真的支持很多命令,比如 cat、copy、awk、
00:02:23base64,还有像 jq、python 3 和 sqlite 这样用于数据处理的高级工具,
00:02:27你甚至可以使用 curl 来运行网络请求。你可以设置白名单,
00:02:33所以它是非常安全的。下面还有 Shell 特性,比如管道、重定向、
00:02:36命令链,它真的提供了基础 Bash Shell 拥有的一切。
00:02:41所以你可以看到这个包非常酷,功能也很强大。但你可能还在
00:02:45纳闷,为什么需要用 Typescript 实现 Bash,以及这如何帮助你的智能体
00:02:48并为你省钱。为了回答这个问题,让我用一个非常简单的聊天应用展示它的一个用例。
00:02:53假设在这个聊天应用中,我想讨论这个 JSON 文件,
00:02:57这个文件包含大量记录,我想让 AI 检索其中的
00:03:02特定信息,或者对某些字段进行分析。你可以看到
00:03:06这是一个非常巨大的文件。实现这一目标最简单但绝对错误的方法之一,
00:03:11就是把整个文件的内容都塞进提示词里。这里
00:03:15我使用了 AI SDK 和 GPT 5.2。如果我们运行这个智能体
00:03:19并让它获取特定的记录,你可以看到助手会给出回复。
00:03:24我可以确认这是正确的,因为这些大模型非常擅长从
00:03:28超长上下文中检索数值。但问题是,这消耗了 133,000 个 Token。
00:03:33而且如果你问一些更高级的问题,比如进行数据操作
00:03:39或询问特定范围内的数据,这种方法就会开始失效。
00:03:43正如我所说,那显然是错误的做法。接下来你可能尝试过
00:03:48RAG 方法,甚至是给智能体一个沙盒,让它运行 Bash 命令
00:03:51来处理数据。但这些方法的缺点是,你需要大量的底层设施支持。
00:03:56相反,让我们用 justbash 来模拟这一切。要在 AI SDK 中实现这一点,
00:04:00你可以直接使用基于 justbash 构建的 bash-tool 包。
00:04:05它允许我们在聊天的 API 端点中创建一个新的 Bash 工具,
00:04:09传入任何我们想要放入模拟 Bash 环境的文件。在我的案例中,
00:04:13我传入了之前那个巨大的 JSON 文件,然后我也设置了
00:04:17这些文件的存放路径,它们会进入模拟的 /workspace 目录。
00:04:21之后,我们只需要在 AI SDK 的流处理中
00:04:26把 Bash 工具传进去就行。我也传了一些
00:04:31智能体指令,你可以在 node_modules 文件夹中找到。这些只是
00:04:34该软件包提供的简单指令,能帮助你的 AI 智能体理解如何使用
00:04:39这个 Bash 工具。现在,通过这种简单的设置,如果我们问助手
00:04:42完全相同的问题,即从 JSON 文件中获取一条信息,
00:04:46它不再使用自己的上下文去大海捞针,
00:04:50而是直接去运行一些 Bash 命令。同样,这是在我们的模拟 Typescript 环境中运行的。
00:04:54在这个例子中,它尝试运行 jq 命令但报错了,所以
00:04:58接着它运行了 head 命令来查看文件的实际格式,
00:05:02这样它就获取了正确的格式,修正了 jq 命令并给出了答案。
00:05:06虽然我们得到了相同的答案,而且可能耗时稍长了一点点,但关键点在于
00:05:10你可以看到它只用了 6,000 个输入 Token,而另一种方法用了
00:05:15133,000 个。这绝对是处理长上下文的一种更优方法。
00:05:19而且这还不是它唯一的优势。当你开始问一些
00:05:24更深入的数据问题时,它会变得更加强大。例如,如果我问
00:05:28在 1000 到 2500 之间有多少条记录的 metadata.active 为 true,
00:05:33它只需要运行一条 Bash 命令就能立即给出答案。如果你在
00:05:37另一个版本中尝试这样做,首先它会占用大量上下文,其次
00:05:41它很可能只是基于猜测给你一个错误的答案。而这种方法
00:05:45会准确得多,因为你本质上是在告诉智能体:“嘿,你可以完全访问 Bash Shell”,
00:05:49即使技术上它并没有。说实话,这真是一个简单且免费的增值功能,
00:05:53可以让你的智能体更强大,且不需要额外的基础设施。
00:05:57这就是我非常喜欢它的原因。希望我已经展示了它的其中一个用例,
00:06:01但相信我,还有更多用例。正如我们之前看到的,
00:06:05你可以运行基础的 Python、SQL 和 curl 命令,
00:06:10如果你愿意,你还可以将其连接到真实的文件系统。欢迎在评论区
00:06:14告诉我你对 justbash 的看法。顺便订阅一下,
00:06:18咱们下期视频见。