تصور کنید برنامهنویسی هستید که با چالش یک شناسه سفارش (Order ID) واحد روبروست: پیدا کردن خودِ سفارش آسان است، اما دانستن اینکه کدام پروفایل مشتری، کدام سیاست بازپرداخت وجه و کدام لاگهای ارسال باید همراه با آن سفارش جابهجا شوند، نقطهای است که اکثر پایگاهدادهها در آن شکست میخورند. KoutenDB این مشکل را با تغییر نگاه به استقرار دادهها حل میکند؛ به جای اینکه استقرار دادهها را صرفاً یک مکانیسم برای مقیاسپذیری (Scaling) ببیند، آن را به عنوان یک ابزار بازیابی (Retrieval Tool) به کار میگیرد. در واقع، تمرکز از «مرکز» یک پرسوجو به «مرز» آن منتقل میشود.
مسئلهی مرزهای ناشناخته
مدلهای فعلی پایگاهداده معمولاً از اپلیکیشن میخواهند که پاسخ دقیق مورد نظر خود را از طریق گزارههای SQL، کلیدهای اصلی (Primary Keys)، عبارات جستوجو یا جایگذاریهای برداری (Vector Embeddings) توصیف کند. این مدل برای جستوجوهای دقیق (Exact Lookups) بسیار عالی عمل میکند، اما شکلِ تمام درخواستهای یک اپلیکیشن اینگونه نیست. بسیاری از درخواستها با یک مرکز شناختهشده شروع میشوند، اما مرز کامل اطلاعات مفیدی که باید در اطراف آن مرکز باشد، در ابتدا نامشخص است. با تکیه بر پوشش قبلی ما در مورد اینکه چگونه پشتههای هوش مصنوعی اغلب دچار «نشت عملکرد» میشوند، میبینیم که این رویکرد سنتی، توسعهدهندگان را مجبور میکند تا برای هر درخواست واحد، «محلهی» دادههای مرتبط را بهصورت دستی بازسازی کنند.
بهطور معمول، اپلیکیشنها این بافت (Context) را با استفاده از روشهای متعددی و پراکنده جمعآوری میکنند: Joinهای SQL، چندین جستوجوی سند (Document Lookups)، لیستهای ID که توسط اپلیکیشن نگهداری میشوند، پیمایشهای گراف (Graph Traversals)، فیلترهای متادیتا، جستوجوهای متنکامل یا برداری، و یا یک حافظهی پنهان (Cache) که تنها برای یک شکل پاسخ خاص ساخته شده است. اگرچه این راهکارها معتبر هستند، اما اپلیکیشن را مجبور میکنند تا هر بار که دادهای را میخواند، محلهی مرتبط با آن را از نو بسازد. KoutenDB پرسش متفاوتی را مطرح میکند: چه میشد اگر پایگاهداده «محلیت» (Locality) مفید را در لحظه نوشتن دادهها حفظ میکرد تا در زمان خواندن، مستقیماً از همان محلیت شروع شود؟
برای یک سیستم تولید بازیابیافزا (RAG) — که شبیه دانشآموزی است که قبل از جواب دادن، اول کتاب درسی را باز میکند و از آن نقل میآورد — این بدان معناست که اپلیکیشن باید مدام تصمیم بگیرد کدام مستندات، خلاصهها، متادیتای منابع یا قطعات دانش پیوستشده، پیش از آنکه مدل زبانی بزرگ (LLM) — همان کتابخانهداری که میلیاردها صفحه خوانده و حالا با همان لحن جواب میدهد — آنها را ببیند، مرتبط هستند. به همین ترتیب، بررسی یک حادثه (Incident Investigation) ممکن است با یک سرویس و یک نقطهی زمانی خاص شروع شود، اما برای اینکه مفید باشد، احتمالاً به لاگهای خطا، متریکها، استقرارهای (Deployments) نزدیک و رویدادهای مرتبط با آن سرویس نیاز دارد. در محیطهای بازی (Gaming)، درخواستی که با یک بازیکن یا یک مکان شروع میشود، ممکن است به موجودات اطراف، موجودی بازیکن (Inventory)، ماموریتها و وضعیت فعلی منطقه نیاز داشته باشد.
برای درک بهتر، فرض کنید یک راهنمای سفر برای شهر کیوتو میسازید. توریستی که مقابل معبد کیومیزو-درا (Kiyomizu-dera) ایستاده، فقط به رکورد معبد نیاز ندارد؛ او رستورانهای نزدیک، اطلاعات دسترسی و رویدادهای جاری آن منطقه را هم میخواهد. یک خانواده، یک مسافر تکپر یا کسی که برای یک بعدازظهر بارانی برنامهریزی میکند، ممکن است همگی به بخشهای مختلفی از همان اطلاعات محیطی نیاز داشته باشند. در یک پایگاهداده استاندارد، شما یا باید چندین جستوجوی مجزا انجام دهید یا به یک سلسلهمراتب صلب تکیه کنید که با نیازهای هر کاربر سازگار نیست. مشکل این است که هیچ «مرز دائمی» واحدی برای آن بافت اطلاعاتی وجود ندارد.
مکانیسم حلقه و لنز ستارهای
KoutenDB ایندکسهای استاندارد را با یک سیستم مختصاتی به نام «حلقه» (Ring) جایگزین کرده است. یک حلقه همزمان به عنوان نشانگر استقرار داده و مسیر خواندن عمل میکند و به پایگاهداده اجازه میدهد محلیت را در لحظه نوشتن حفظ کند.
- حلقهها (Rings): اینها مسیرهای سلسلهمراتبی خوانا هستند. نمونههایی مانند
users/123،users/123/orders،users/123/support،shops/1123،orders/A-001وproducts/sku-9/docs. این نامها خوانا هستند، اما خوانایی هدف اصلی آنها نیست. اگر یک پرسوجو ازusers/123شروع شود، پایگاهداده میتواند بدون لمس مجموعههای جهانی و نامرتبط، سلسلهمراتب محلی را بررسی کند. اگر ازorders/A-001شروع شود، میتواند از یک نمای «سفارش-محور» استفاده کند. این کار باعث میشود محلیتی که برای اپلیکیشن شناختهشده است، به اطلاعات بازیابی تبدیل شود که پایگاهداده میتواند آن را حفظ کند. - لنزهای ستارهای (Stellar Lenses): از آنجا که بافتهای مرتبط همیشه در یک سلسلهمراتب دائمی جای نمیگیرند (مثلاً یک سفارش همزمان متعلق به یک مشتری، یک فروشگاه و یک محصول است)، KoutenDB از «لنز ستارهای» استفاده میکند. این مکانیسم اجازه میدهد حلقههای موجود به یک مرکز جدید متصل شوند، بدون اینکه محتوای (Payload) آنها کپی شود. این امر باعث میشود یک رکورد بهطور همزمان از چندین مرکز دیده شود، بدون اینکه دادهها تکرار شوند.
برای پیادهسازی این مدل، توسعهدهنده ابتدا رکوردها را در حلقههای اصلی (Canonical Rings) قرار میدهد:kouten put --ring=users/123 --payload='{"kind":"user","name":"Alice"}' --codec=json'kouten put --ring=shops/1123 --payload='{"kind":"shop","name":"Orbit Store"}' --codec=json'kouten put --ring=orders/A-001 --payload='{"kind":"order","orderNo":"A-001","total":42}' --codec=json'
سپس، از لنز ستارهای برای ایجاد یک محلهی مرتبط استفاده میکنند:kouten stellar attach --stellar=commerce/order/A-001 --ring=users/123kouten stellar attach --stellar=commerce/order/A-001 --ring=shops/1123kouten stellar attach --stellar=commerce/order/A-001 --ring=orders/A-001
اکنون، اپلیکیشن میتواند با استفاده از دستور kouten get --stellar=commerce/order/A-001 دادهها را بخواند، در حالی که سفارش مرکز توجه است. رکوردهای اصلی در حلقههای اولیه خود باقی میمانند؛ متصل کردن یا جدا کردن یک حلقه فقط «آنچه لنز میبیند» را تغییر میدهد و باعث حذف یا تکرار محتوا نمیشود. این رویکرد از کارهای دشوار مربوط به همگامسازی و یکپارچگی (Consistency) که هنگام تکرار رکوردها در مسیرهای مختلف رخ میدهد، جلوگیری میکند.
مثالهای کاربردی: گردشگری و تجارت
در سناریوی سفر کیوتو، یک واردکننده داده میتواند مکانها را در حلقههای اصلی مانند landmarks/kyoto/kiyomizudera، landmarks/kyoto/yasaka-pagoda، restaurants/kyoto/gion، culture/kyoto/national-museum و events/kyoto/2026-07-22 نگه دارد. سپس این موارد به یک لنز محور-منطقه متصل میشوند:
kouten stellar attach --stellar=travel/kyoto/higashiyama --ring=landmarks/kyoto/kiyomizuderakouten stellar attach --stellar=travel/kyoto/higashiyama --ring=landmarks/kyoto/yasaka-pagodakouten stellar attach --stellar=travel/kyoto/higashiyama --ring=restaurants/kyoto/gionkouten stellar attach --stellar=travel/kyoto/higashiyama --ring=culture/kyoto/national-museumkouten stellar attach --stellar=travel/kyoto/higashiyama --ring=events/kyoto/2026-07-22
اپلیکیشن سپس میتواند کل بافت گردشگری را از طریق kouten get --stellar=travel/kyoto/higashiyama بازیابی کند. متناوباً، میتواند با استفاده از «زیر-حلقهها» (Subrings)، میدان دید خود را به دستههای خاص محدود کند:
kouten get --stellar=travel/kyoto/higashiyama --subring=restaurantskouten get --stellar=travel/kyoto/higashiyama --subring=culture
یک رستوران واحد میتواند همزمان به لنز travel/kyoto/rainy-day (روز بارانی)، یک لنز محور-ایستگاه، یا یک لنز برنامهی روزانه متصل شود. KoutenDB بهطور خودکار ارتباط جغرافیایی را استنتاج نمیکند؛ بلکه اپلیکیشن یا فرآیند کیوریشن (Curation) تصمیم میگیرد کدام مختصات در یک محله قرار بگیرند. نقش پایگاهداده حفظ آن تصمیم و فراهم کردن امکان خواندن مستقیم آن در آینده است. فراخواننده از یک نقطه مفید شروع میکند و دستههایی از بافتهای نزدیک را بدون نیاز به لیست کردن تکتک مکانها در درخواست، دریافت میکند.
فراتر از مسیرهای ساده و جستوجوی برداری
اگرچه نحو (Syntax) حلقه شبیه به یک مسیر فایل استاندارد است، اما بهطور مستقیم با موتور بازیابی ادغام شده است. یک رشتهی مسیر ساده تنها سلسلهمراتب را فراهم میکند. اگر تمام دادهها زیر یک درخت بودند، اپلیکیشن میتوانست پیشوندی مانند travel/kyoto/higashiyama/* را بخواند، اما این فقط زمانی کار میکند که هر رابطه در یک سلسلهمراتب دائمی جای بگیرد. KoutenDB دو مورد حیاتی را به نحو مسیر اضافه میکند:
۱. سلسلهمراتب در سطح موتور: سلسلهمراتب حلقه توسط موتور بازیابی درک میشود و میتوان آن را با کنترلهای صریح پیمایش کرد: عمق (Depth)، بودجهی شاخه (Branch Budget)، محدودیتهای هر حلقه، مرتبسازی، فیلترها و تصویرسازی (Projection).
۲. متادیتای ستارهای: این ویژگی حلقهها را از سلسلهمراتبهای مختلف به یک نمای محور-مختصاتی متصل میکند بدون اینکه مسیرهای اصلی را تغییر دهد. لنز ستارهای یک «رابطهی رویت» ذخیرهشده است، نه صرفاً یک دایرکتوری دیگر.
برخلاف جستوجوی برداری — که موارد را بر اساس شباهت معنایی پیدا میکند — KoutenDB بر «ارتباط عملیاتی» (Operational Relevance) تمرکز دارد. سیاست بازپرداخت وجه و آخرین سفارش یک مشتری از نظر عملیاتی مرتبط هستند، حتی اگر جاسازیهای برداری (Vector Embeddings) آنها در یک مجموعه جهانی بسیار از هم فاصله داشته باشند. این به توسعهدهندگان اجازه میدهد تا از سیستم مختصاتی به عنوان یک فیلتر مرحله اول استفاده کنند و مجموعه دادههای کاری را پیش از اعمال رتبهبندیهای برداری گرانقیمت یا پردازش توسط LLM محدود کنند.
برای سیستمهای هوش مصنوعی محلی و RAG، این موضوع حیاتی است. کارهای هزینهبر تنها به فراخوانی نهایی LLM محدود نمیشود. بارگذاری کاندیدها، مقایسهی بردارها، رتبهبندی مجدد تکهها (Chunks)، انتقال محتوا و پر کردن پنجره متنی (Context Window) — که شبیه میز کاری است که فقط جای چند ورق دارد — همگی هزینه دارند. با شروع از یک مختصات شناختهشده (مثلاً یک پروژه، یک مستاجر/Tenant، یا یک پنجره زمانی)، KoutenDB یک مجموعه کاری اولیه کوچکتر فراهم میکند و فشار روی کل خطلوله را کاهش میدهد. بردارها همچنان مفید هستند، اما به جای اینکه تنها راه کشف بافت باشند، به گزینهای اختیاری تبدیل میشوند.
کارایی هزینه و عملکرد
طبق مستندات فنی KoutenDB، هدف اصلی این است که اطمینان حاصل شود هزینهی درخواستها تابع «مجموعه کاری محلی» (k رکورد) باشد و نه «کل مجموعه داده» (N رکورد). بسیاری از سیستمها از یک ایندکس یا فیلتر مرحله اول برای اجتناب از عملیات روی N استفاده میکنند، اما KoutenDB استقرار معنادار دادهها را مستقیماً به بخشی از آن مرحله اول تبدیل میکند.
با تبدیل «محلیت» به یک شهروند درجه اول، سیستم نیاز به موارد زیر را کاهش میدهد:
- Joinهای پیچیده SQL در چندین جدول.
- لیستهای ID مرتبط که توسط اپلیکیشن نگهداری میشوند.
- خواندنهای مکرر و پراکنده (Fan-out Reads) که باعث افزایش تأخیر میشوند.
- ساختارهای کش (Cache) که تنها برای یک شکل پاسخ خاص ساخته شدهاند.
این معماری همچنین اجازه میدهد تا یک مختصات واحد به عنوان مرزی برای محدوده مجوزدهی (Authorization Scope)، مرزهای استخراج/وارد کردن (Dump/Import)، استقرار و فشردهسازی (Compaction)، و همگامسازی تأخیری بین توپولوژیها عمل کند. این امر چرخه عمر داده را تحت یک مفهوم واحد از «محلیت» یکپارچه میکند، به جای اینکه قوانین را در کد و زیرساخت پراکنده کند. هدف این است که هزینه درخواست از k (مجموعه کاری محلی مفید) پیروی کند، به جای اینکه هر بار محلیت را از کل مجموعه داده N دوباره کشف کند.
سبکسنگینها و موارد استفاده در اپلیکیشن
این تغییر، فرض بنیادین در معماریهای RAG را دگرگون میکند. به جای اینکه با پایگاهداده به عنوان یک سطل غیرفعال از تکههای متنی که توسط یک ایندکس برداری فیلتر میشوند برخورد شود، KoutenDB با آن به عنوان نقشهای از «روابط عمدی» برخورد میکند. بار تعریف اینکه چه چیزی «نزدیک» است، از منطق زمان پرسوجو به کیوریشن زمان ورود داده منتقل میشود.
برای یک توسعهدهنده کاربردی، این به معنای کاهش چشمگیر «کدهای چسب» (Glue Code) است. دیگر نیازی به نگهداری جداول Join مجزا نیست؛ پایگاهداده به یاد دارد که رستوران در landmarks/kyoto/gion برای لنز travel/kyoto/rainy-day مرتبط است. اپلیکیشن صرفاً یک مرکز معنادار و یک مرز هزینه را ارائه میدهد. این کار از «پرسوجوهای نامحدود» (Unbounded Queries) جلوگیری میکند، زیرا فراخواننده میتواند میدان دید را با استفاده از موارد زیر کنترل کند:
- زیر-حلقهها (Subrings)
- عمق سلسلهمراتب
- بودجههای شاخه (Branch Budgets)
- محدودیتهای هر حلقه
- انتخاب فیلد (مثلاً:
kouten get --stellar=commerce/order/A-001 --selection='{ kind name orderNo total }')
KoutenDB بهطور خاص برای مواردی در نظر گرفته شده است که:
۱. درخواستها بهطور طبیعی از یک مختصات شناخته شده شروع میشوند (مثلاً یک کاربر احراز هویت شده، یک مستاجر، یک سفارش، یک محصول، یک پروژه، یک منطقه، یا یک سرویس در یک پنجره زمانی خاص).
۲. اپلیکیشن مکرراً به بافت پیرامونی نیاز دارد، نه فقط یک رکورد دقیق.
۳. بافت مفید میتواند پیش از وقوع درخواست، بهطور معناداری جایگذاری یا متصل شود.
اگر حجم کاری شما شامل تحلیلهای جهانی (Global Analytics)، جستوجوهای متنکامل دلخواه در کل مجموعه داده، جستوجوهای مستقل در هر فیلد، یا محدودیتهای رابطهای سختگیرانه باشد، این مدل کمتر مرتبط است. با این حال، برای هر اپلیکیشنی که با یک «مرکز» شروع میشود، مدل مختصاتی مسیر مقیاسپذیرتری را ارائه میدهد. KoutenDB وجود دارد تا آن مرکز را مفید سازد.
گام بعدی شما
- اگر از سامانههای RAG با حجم داده بالا استفاده میکنید، بررسی کنید آیا بسیاری از درخواستهای شما با یک «مرکز» (مانند UserID یا ProjectID) شروع میشوند.
- هزینههای استنتاج خود را تحلیل کنید تا ببینید چه مقدار از منابع شما صرف بازیابی کاندیداهای نامرتبط در مرحله اول میشود.
- مدلهای جایگزین برای مدیریت روابط عملیاتی (Operational Relevance) را به جای تکیه مطلق بر بردارها بررسی کنید.
اما تأثیر این مدل بر مدیریت حافظه در مقیاس پترابایتها حتی پیچیدهتر است — به بررسی ما درباره بهینهسازیهای KV Cache مراجعه کنید.




گفتگو