เจ้าหน้าที่ AI เช่น Codex หรือ Claude Code โดยธรรมชาติสามารถรันคำสั่ง bash ได้ดีมาก . ค้นหาผ่านระบบไฟล์ grepping รับบริบทผ่านเชลล์
ดังนั้นฉันจึงอยากลอง:จะเกิดอะไรขึ้นถ้าระบบไฟล์ทั้งหมดที่เอเจนต์ AI ทำงานอยู่ใน Redis แทนที่จะอยู่บนดิสก์ จะเป็นอย่างไรหากสำหรับเอเจนต์ AI ดูเหมือนว่ากำลังใช้ระบบไฟล์อื่น แต่จริงๆ แล้วมันเป็นที่จัดเก็บในหน่วยความจำที่เร็วมาก
นี่คือวิธีที่ฉันต้องการให้มันทำงาน👇

เมื่อเอเจนต์รันคำสั่ง grep (ซึ่งล้วนเป็นข้อยกเว้น) เราจะสกัดกั้นโดยใช้ 09 ของ Vercel ไลบรารีและแปลเป็นคำค้นหา Redis Search
ด้วยวิธีนี้ เราไม่จำเป็นต้องมีแซนด์บ็อกซ์สำหรับการเข้าถึงแบบอ่านอย่างเดียว และ (ในทางทฤษฎี) มันควรจะ เร็วกว่ามาก . และกลายเป็นว่า Mintlify ได้ทำสิ่งที่คล้ายกันนี้ไปแล้ว
ความคิด
เพื่อดูว่าจะได้ผลหรือไม่ ฉันแบ่งตรรกะออกเป็นสามส่วน
- แต่ละไฟล์เป็นเอกสาร Redis JSON . เราจัดเก็บเส้นทาง เนื้อหา ขนาด การประทับเวลา ทั้งหมดไว้ด้วยกันภายใต้คีย์เดียว
- รายการติดตามแผนผังไดเร็กทอรี . ปุ่ม Redis หนึ่งปุ่มเก็บโครงสร้างโฟลเดอร์ทั้งหมดดังนั้น
17และ26รหัส> ไม่ต้องสแกน - ค้นหา grepping อีกครั้ง . ทางนี้
38ไม่จำเป็นต้องอ่านทุกไฟล์เพื่อค้นหารายการที่ตรงกัน
แค่นั้นแหละ! ด้วยสิ่งเล็กๆ น้อยๆ เหล่านี้ เราจึงสามารถเข้าใกล้ความเท่าเทียมกันของระบบไฟล์ปกติ (อ่านอย่างเดียว) ได้อย่างสมบูรณ์ แต่จะเร็วกว่ามาก ฉันตัดสินใจไม่นำการเขียนไปใช้ในตอนนี้
ความท้าทายที่ยิ่งใหญ่ที่สุด:grepping
คำสั่งเช่น 40 หรือ 57รหัส> ค่อนข้างตรงไปตรงมา เราอาจอ่านไฟล์เดียวทั้งหมดหรือแสดงรายการโครงสร้างไดเร็กทอรี ซึ่งทั้งสองอย่างนี้ทำได้ง่ายด้วย Redis คำสั่งเช่น 67 มีความซับซ้อนกว่าเล็กน้อย แต่เราสามารถทำให้พวกมันทำงานได้โดยใช้ชุดที่เรียงลำดับ
Grepping แตกต่างออกไปเล็กน้อย 74 ปกติ ต้องอ่านทุกไฟล์ในไดเร็กทอรีนั้น ในระบบไฟล์เสมือนซึ่งหมายถึงการดึงเอกสารทุกฉบับออกจาก Redis เพียงเพื่อตรวจสอบว่ามีคำนั้นอยู่หรือไม่ มันช้าและแพงมาก
แต่เราเพิ่งเปิดตัว Upstash Redis Search ซึ่งเป็นวิธีที่ใช้สนิม รวดเร็วและมีประสิทธิภาพในการค้นหาผ่านข้อมูล Redis ด้วย Redis Search เราสามารถสกัดกั้น 82 ได้ ก่อนที่จะทำงาน ให้แปลเป็นการสืบค้น และรับผลลัพธ์ที่รวดเร็วโดยไม่ต้องดึงไฟล์
คำค้นหามีลักษณะดังนี้:
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 },
}); เอเจนต์ยังคงเห็นเอาต์พุตแบบเดียวกับที่เห็นจากเชลล์ปกติ
การให้เชลล์แก่ตัวแทน
ชิ้นสุดท้ายกำลังเดินสายนี้จนถึง 97 เพื่อให้ตัวแทนสามารถรันคำสั่งกับมันได้ ด้วยแรงบันดาลใจจากวิธีที่ Mintlify สร้างระบบไฟล์ของผู้ช่วย เราจึงติดตั้งอะแดปเตอร์ fs ที่สนับสนุน Redis ที่ 101 บน 114 :
import { InMemoryFs, MountableFs } from "just-bash";
const mountableFs = new MountableFs({ base: new InMemoryFs() });
mountableFs.mount("/workspace", redisFs); // redisFs talks to Upstash
const bash = new Bash({ fs: mountableFs, cwd: "/workspace" });
เมื่อตัวแทนรัน 126 นั่นคือ 133 โทรตรงไปยัง Redis 146รหัส> ถูกสกัดกั้นและเปลี่ยนเส้นทางไปยัง Redis Search
จากมุมมองของเจ้าหน้าที่ มันเป็นเพียงเปลือกนอก 153รหัส> , 164รหัส> , 179รหัส> , 187รหัส> มันใช้งานได้ทั้งหมด เมื่อเราใส่สิ่งนั้นลงใน Vercel AI SDK เป็น 196 เครื่องมือ เรามีตัวแทนที่สามารถสำรวจฐานโค้ดที่อยู่ใน Redis ได้ทั้งหมด
ฉันได้แนวคิดนี้มาได้อย่างไร
ประการแรก บทความดีๆ จาก Mintlify ที่ฉันลิงก์ไว้ด้านบน และประการที่สอง แซนด์บ็อกซ์ของตัวแทนส่วนใหญ่มีน้ำหนักมาก เราบูทคอนเทนเนอร์ ติดตั้งดิสก์ และชำระค่าใช้จ่ายทั้งหมดไม่ว่าเอเจนต์จะสัมผัสไฟล์เดียวหรือพันไฟล์ก็ตาม
ระบบไฟล์เสมือนที่มี Redis เปิดอยู่เสมอ มีการจำลองทั่วโลก ทนทาน และการดำเนินการที่แพงที่สุด (การค้นหาข้ามไฟล์) คือสิ่งที่ Redis Search ทำได้ดีเยี่ยม
ไชโย 🙌จอช