Codex나 Claude Code 같은 AI 에이전트는 태생적으로 bash 명령 실행에 매우 능숙합니다. 파일 시스템을 탐색하고, grep으로 검색하고, 셸을 통해 맥락을 파악하는 방식으로 작동하죠.
그래서 한번 시도해 보고 싶었습니다. AI 에이전트가 다루는 파일 시스템 전체를 디스크가 아닌 Redis 위에 올려두면 어떨까? 에이전트 입장에서는 평범한 파일 시스템처럼 보이지만, 실제로는 초고속 인 메모리 저장소인 거죠.
제가 구상한 동작 방식은 다음과 같습니다 👇

에이전트가 grep 명령(모든 에이전트가 특히 잘하는 작업)을 실행하면, Vercel의 just-bash 라이브러리로 이를 가로채 Redis Search 쿼리로 변환합니다.
이렇게 하면 읽기 전용 접근을 위한 샌드박스가 전혀 필요 없고, (이론상으로는) 훨씬 빨라집니다. 실제로 Mintlify에서도 비슷한 방식을 이미 선보인 바 있습니다.
핵심 아이디어
이 개념이 실제로 작동하는지 검증하기 위해, 저는 로직을 세 가지 요소로 나누었습니다.
- 각 파일은 하나의 Redis JSON 문서 — 경로, 내용, 크기, 타임스탬프를 모두 하나의 키 아래에 함께 저장합니다.
- 매니페스트가 디렉터리 트리를 추적 — 단 하나의 Redis 키가 전체 폴더 구조를 담고 있어서,
ls나tree가 굳이 스캔을 수행할 필요가 없습니다. - Redis Search로 grep 처리 — 덕분에
grep이 매칭을 찾기 위해 모든 파일을 읽을 필요가 없습니다.
이게 전부입니다! 이 몇 가지만 갖추면 일반적인 (읽기 전용) 파일 시스템과 거의 완전한 패리티에 근접하면서도 훨씬 빠른 환경을 만들 수 있습니다. 일단은 쓰기(write) 구현은 제외하기로 결정했습니다.
가장 큰 난관: grep
cat이나 ls 같은 명령은 비교적 단순합니다. 파일 하나를 통째로 읽거나 디렉터리 구조를 나열하면 되는데, 두 작업 모두 Redis로 손쉽게 처리할 수 있습니다. sed -n '1,240p' 같은 명령은 조금 더 복잡하지만, Sorted Set을 활용하면 충분히 구현 가능합니다.
문제는 grep입니다. 일반적인 grep -R "oauth" /workspace는 해당 디렉터리 아래의 모든 파일을 읽어야 합니다. 가상 파일 시스템에서는 특정 단어의 포함 여부를 확인하려고 모든 문서를 Redis에서 끌어와야 한다는 뜻이죠. 상당히 느리고 비용도 많이 듭니다.
하지만 저희는 최근 Upstash Redis Search를 출시했습니다. Rust 기반으로 만들어져 Redis 데이터를 매우 빠르고 효율적으로 검색할 수 있는 기능입니다. Redis Search를 활용하면 grep이 실행되기 전에 가로채서 쿼리로 변환하고, 파일을 가져오지 않고도 빠른 결과를 얻을 수 있습니다.
검색 쿼리는 대략 다음과 같은 형태입니다:
import { Redis } from "@upstash/redis";
const redis = new Redis.fromEnv();
const index = redis.search.index({ name: "vfs" });
const matches = await index.query({
filter: {
$must: [
{ workspaceId: "demo" },
{ kind: "file" },
{ content: { $phrase: "oauth" } },
],
},
select: { path: true },
});
에이전트 입장에서는 일반 셸과 완전히 동일한 출력을 받게 됩니다.
에이전트에 셸 제공하기
마지막 조각은 이를 just-bash와 연결해 에이전트가 실제로 명령을 실행할 수 있게 만드는 것입니다. Mintlify가 어시스턴트용 파일 시스템을 구축한 방식에서 영감을 받아, Redis 기반 fs 어댑터를 MountableFs의 /workspace에 마운트합니다:
import { InMemoryFs, MountableFs } from "just-bash";
const mountableFs = new MountableFs({ base: new InMemoryFs() });
mountableFs.mount("/workspace", redisFs); // redisFs는 Upstash와 통신
const bash = new Bash({ fs: mountableFs, cwd: "/workspace" });
에이전트가 cat /workspace/src/index.ts를 실행하면 해당 readFile 호출이 곧바로 Redis로 전달됩니다. grep은 가로채서 Redis Search로 우회됩니다.
에이전트 입장에서는 그저 하나의 셸일 뿐입니다. ls, cat, grep, find 모두 정상적으로 동작합니다. 이를 Vercel AI SDK에 bash 도구로 통합하면, 전체 코드베이스가 Redis 안에 존재하는 에이전트를 만들 수 있습니다.
이 아이디어를 얻게 된 계기
첫 번째 계기는 앞서 소개한 Mintlify의 훌륭한 글이었습니다. 두 번째는 대부분의 에이전트 샌드박스가 너무 무겁다는 점입니다. 컨테이너를 부팅하고 디스크를 마운트하면, 에이전트가 파일 하나를 건드리든 천 개를 건드리든 그 비용을 모두 지불해야 합니다.
반면 Redis 기반 가상 파일 시스템은 항상 가동 중이고, 전역으로 복제되며, 내구성이 뛰어나고, 가장 비용이 큰 연산(파일 전반 검색)이 바로 Redis Search가 가장 잘하는 분야입니다.
즐거운 개발 되세요 🙌
Josh 드림