- Mevcut RAG tabanlı arama yaklaşımının sınırlarını aşmak için, dokümanlar dosya ve dizinlerden oluşan bir sanal dosya sistemi yapısına dönüştürüldü
- Gerçek dosya kopyalamadan, Chroma veritabanı üzerinde
grep,cat,ls,findkomutlarını çalıştırabilen ChromaFs hayata geçirildi - Bu yaklaşımla oturum oluşturma süresi 46 saniyeden 100 milisaniyeye indi, ek işlem maliyeti ise yaklaşık 0 dolar seviyesine düştü
- Erişim denetimi, dosya yolu metaverilerindeki RBAC filtrelemesi ile sağlanıyor; böylece ayrı container veya kullanıcı grubu yönetimi gerekmiyor
- Sonuç olarak Mintlify doküman asistanı, anında yanıt veren, düşük maliyetli, stateless bir mimariyle büyük ölçekte işletilebilir hale geldi
RAG'in sınırlarını aşan sanal dosya sistemi yaklaşımı
- Geleneksel RAG tabanlı doküman araması, yalnızca sorguyla eşleşen metin parçalarını döndürdüğü için birden fazla sayfaya yayılan yanıtlar veya hassas ifade aramaları zordu
- Bunu çözmek için doküman yapısı, dosya sistemi gibi gezilebilen bir forma dönüştürüldü; her doküman sayfası bir dosyaya, bölümler ise dizinlere eşlendi
- Ajan,
grep,cat,ls,findkomutlarıyla dokümanları doğrudan gezebiliyor; böylece geliştiricilerin bir kod tabanını ele alması gibi dokümanları arayabildiği bir yapı tasarlandı
Container darboğazı sorunu
- Yaygın yaklaşım, ajana gerçek bir dosya sistemi sunmak için izole edilmiş sandbox ortamı oluşturmak ve depoyu kopyalamak
- Ancak frontend asistanında oturum oluşturma gecikmesi ciddi hale geliyor ve p90 oturum oluşturma süresi yaklaşık 46 saniyeye ulaşıyor
- Aylık 850 bin görüşme baz alındığında, en düşük yapılandırmada bile (1 vCPU, 2GiB RAM, 5 dakikalık oturum süresi) yıllık 70 bin doların üzerinde altyapı maliyeti oluşuyor
- Bu darboğazı kaldırmak için anında tepki veren ve düşük maliyetli çalışan bir sanal dosya sistemi gerekiyordu
Sanal kabuk uygulaması — ChromaFs
- Gerçek bir dosya sistemi yerine yalnızca sanal bir dosya sistemi illüzyonu sunuluyor
- Mevcut doküman verileri zaten Chroma veritabanında indekslenmiş olduğundan, bunun üzerine ChromaFs kuruldu
- ChromaFs, UNIX komutlarını yakalayıp Chroma sorgularına dönüştürüyor
- Sonuç olarak oturum oluşturma süresi 46 saniyeden 100 milisaniyeye düştü, ek işlem maliyeti ise yaklaşık 0 dolar oldu
| Metric | Sandbox | ChromaFs |
|---|---|---|
| P90 Boot Time | ~46 saniye | ~100ms |
| Marginal Compute Cost | ~$0.0137/görüşme | ~$0 |
| Search Mechanism | disk taraması | DB metaveri sorgusu |
| Infrastructure | Daytona gibi harici sandbox'lar | mevcut DB'nin yeniden kullanımı |
- just-bash (Vercel Labs) tabanlı olarak geliştirildi ve
grep,cat,ls,find,cdkomutlarını destekliyor - just-bash'in
IFileSystemarayüzü kullanılarak, boru hattı işleme ve flag mantığı korunurken dosya erişim çağrıları Chroma sorgularına dönüştürülüyor
Dizin ağacını bootstrap etme
- ChromaFs'in çalışmadan önce hangi dosyaların var olduğunu bilmesi gerektiğinden, tüm dosya ağacı Chroma koleksiyonunda sıkıştırılmış JSON(
__path_tree__) biçiminde saklanıyor - Sunucu başlatılırken bu veri alınıp iki bellek yapısına geri yükleniyor
- dosya yolları için
Set<string> - her dizinin çocuk listesi için
Map<string, string[]>
- dosya yolları için
- Sonrasında
ls,cd,findkomutları ağ çağrısı olmadan yerel bellekte anında işleniyor ve aynı site için sonraki oturumlarda önbelleğe alınmış ağaç yeniden kullanılıyor
Erişim denetimi
- Yol ağacında
isPublicvegroupsalanları bulunuyor; kullanıcı oturum token'ına göre yalnızca erişilebilen dosyalar bırakılıyor - Erişim yetkisi olmayan dosyalar ağaçtan tamamen çıkarılıyor; böylece ajan bu yolların varlığından haberdar olmuyor
- Mevcut sandbox yaklaşımında bunun için Linux kullanıcı grupları,
chmod, container ayrımı gibi unsurlar yönetilmek zorundaydı; ChromaFs'te ise yalnızca basit filtreleme mantığıyla RBAC uygulanıyor
| Path | Access | Visible |
|---|---|---|
| /auth/oauth.mdx | public | ✓ |
| /auth/api-keys.mdx | public | ✓ |
| /internal/billing.mdx | admin, billing | ✗ |
| /api-reference/users.mdx | public | ✓ |
| /api-reference/payments.mdx | billing | ✗ |
Doküman parçalarını yeniden birleştirme
- Chroma'da saklanan dokümanlar, embedding için birden fazla parçaya bölünmüş durumda
cat /auth/oauth.mdxçalıştırıldığında, aynıpageslug'ına sahip tüm parçalar alınarakchunk_indexsırasına göre sıralanıp birleştiriliyor- Sonuç önbelleğe alınıyor; böylece tekrarlanan
grepiş akışlarında veritabanına yeniden sorgu gönderilmiyor - Büyük OpenAPI spesifikasyonları gibi içerikler lazy file pointer olarak kaydediliyor ve yalnızca erişildiğinde S3'ten getiriliyor
- Tüm yazma işlemleri
EROFS(salt okunur dosya sistemi) hatası döndürerek stateless ve güvenli yapıyı koruyor
Grep optimizasyonu
grep -rkomutu basit ağ taramalarında çok yavaş olduğundan, iki aşamalı filtreleme yapısıyla optimize edildi-
- aşama: Chroma sorguları (
$contains,$regex) ile aday dosyalar seçiliyor
- aşama: Chroma sorguları (
-
- aşama: Bu dosyalar Redis önbelleğine önceden çekilip,
just-bashiçinde bellek içi hassas filtreleme yapılıyor
- aşama: Bu dosyalar Redis önbelleğine önceden çekilip,
-
- Böylece büyük ölçekli recursive aramalar bile milisaniyeler içinde tamamlanabiliyor
Sonuç
- ChromaFs, günde 30 binden fazla isteği ve yüz binlerce kullanıcıyı barındıran Mintlify doküman asistanını çalıştırıyor
- Sandbox'ların yerini alarak anında oturum oluşturma, 0'a yakın ek maliyet, yerleşik RBAC ve stateless mimari sağlıyor
- Mintlify'nin tüm doküman sitelerinde doğrudan kullanılabiliyor (mintlify.com/docs)
1 yorum
Hacker News görüşleri
Dosya sistemi tabanlı aramaya yeniden ilgi gösterilmesinin nedeni, embedding tabanlı olmayan anlamsal arama biçimini yeniden keşfediyor olmamız
Bir kütüphane görevlisinin kitapları konuya göre raflara dizmesi gibi, dosyaları alan bazında düzenlemek daha yorumlanabilir
Bu arama yöntemi çok eskiden beri vardı, ama değerini ancak şimdi yeniden fark ediyoruz
İlgili blog yazısı
Pixar'ın Ralph Wrecks The Internet filminde de bu kavram iyi ifade edilmişti
İlgili tweet 1, İlgili tweet 2
Bunun yerine ajanı doğrudan dizin ağacını keşfetmeye yönlendirdiğimde, 30 saniye içinde modül yapısını anlayıp doğru dosyaları istemeye başladı
Dizin hiyerarşisinin başlı başına insanlar tarafından oluşturulmuş bir bilgi grafiği olduğunu unutmuştuk
Bu, Google'ın inverted index kavramıyla aynı şey; yani aslında tamamen yeni değil
RAG bana içeriği doğrudan okuma imkanı vermedi
Bu yüzden artık bilgiyi Markdown tabanlı statik sayfalarda birleştiriyor, düzenledikten sonra bir JSON dosyası oluşturup ajanın bu kaynağı sorgulamasını sağlıyorum
Açıklama bağlantısı
Dosya sistemi aramasının RAG'den daha iyi olduğu iddiası kafa karıştırıcı
grep gibi anahtar kelime aramaları eski yöntemler, RAG ise vektör araması kullanıyor
Ama veritabanlarında içerik hiyerarşi, etiketler ve keyfi yapılarla indekslenebilir
Arama da anahtar kelime, vektör, tf-idf, BM25 gibi farklı kombinasyonlarla yapılabilir
Dosya sistemine geri dönmek, 60'ların teknolojisine dönüyormuşuz gibi hissettiriyor
CLI tabanlı kodlama ajanları dosyalara erişirken çok daha akıllı davranıyor
Buradaki kilit nokta, ajanın çeşitli ad-hoc sorguları doğrudan çalıştırabilmesi
Embedding ve tam metin aramasını birlikte destekleyen bir DB'de ajan özgürce sorgu çalıştırabiliyorsa bu yeterince agentic oluyor
Dosya sistemini DB gibi kullanmak yeni bir şey değil
Aylık 850 bin görüşmenin yılda 70 bin dolardan fazlaya mal olduğu hesabı tuhaf geldi
CPU ve belleğin nereye gittiğini merak etmiştim; sebep Vercel Labs'ın just-bash tabanlı ChromaFs imiş
CLI uygulamalarının yeniden yükselişe geçtiği bir dönemin tadını çıkarıyorum
FUSE ile Mac'in gerçek dosya sistemini yansıtan bir sanal dosya sistemi kurup ajanı yalnızca o ağaçla sınırlıyorum
Her repo için uzun süre çalışan bir ajan var ve yetkiler sanal dosya sistemi üzerinden kontrol ediliyor
bashguard projesi
Biz hem sanal dosya sistemi (VFS) hem de RAG kullanıyoruz
RAG'in özünde veri kalitesi var; belgeleri anlamsal birimlere bölüp metadata ve linkler üretiyoruz
voyage contextual embedding ile her parçayı belgeyle birlikte embedding'e dönüştürüyoruz
Arama sırasında ajan bağlantıları takip edebiliyor veya orijinal metni analiz edebiliyor
reranking kalitesi performansı ciddi biçimde etkiliyor
grep, bm25, jq, önizleme araçları gibi şeyleri destekliyor ve Pydantic AI üzerinde çalışıyor
POSIX shell'i TypeScript ile emüle ederek hiyerarşik arama yapmak aşırı mühendislik gibi görünüyor
Her seferinde ls ya da grep çalıştırıldığında çıkarım döngüsü arttığı için gecikme (latency) yükseliyor
Teknik yığını tam bilmiyorum ama neden özellikle sahte bir shell yaptıklarını merak ettim
FUSE çözümü daha doğal görünüyor
Tam POSIX uyumluluğu gerekmiyordu; yalnızca salt okunur belge keşfi gerekiyordu
Bu yüzden yalnızca bazı bash komutlarını destekleyen bir yaklaşım daha basitti
Belgeleri dosya sistemi araçlarıyla erişilebilir kılma bağlamında, Vercel'in AI SDK yaklaşımı ilginç
npm paketinin köküne .mdx belgeleri ekleyip ajanın önce yerel belgelerde grep yapmasını teşvik ediyor
SKILL.md örneği
Mintlify gibi startup'lar için iyi bir yaklaşım olabilir ama karmaşık organizasyonlarda pratikliği düşebilir
Yapının hiyerarşik olmadığı ya da belgelerin birbirine karıştığı ortamlarda RAG daha faydalı olabilir
RAG her işe uyan sihirli çözüm değil ve Claude Code ekibi de aynı sonuca varmış