تصور کنید به جای اینکه دادهها را از یک انبار دوردست به میز کار خود بیاورید تا روی آنها پردازش کنید، خودِ میز کار را به داخل انبار منتقل کنید. این دقیقاً همان کاری است که Liath برای سادهسازی جریانهای داده در هوش مصنوعی انجام میدهد. یک اسکریپت واحد Lua اکنون میتواند کل چرخه «تولید بازیابیافزا» (RAG) را مدیریت کند، بدون اینکه دادهها هرگز از پایگاهداده خارج شوند. Liath، به عنوان یک ذخیرهساز کلید-مقدار (Key-Value store) جاسازیشده، منطق برنامه را به سمت داده میبرد، به جای اینکه حجم عظیمی از دادهها را به سمت کد اپلیکیشن بکشد.
بسیاری از برنامهنویسان اکنون با «جهنم ارکستراسیون» درگیر هستند؛ جایی که برای یک چرخه ساده، باید دادهای را از یک پایگاهداده برداری، به یک سرویس بردار بفرستی و سپس خروجی را به یک مدل زبانی تحویل دهی. اکثر پایگاههای داده جاسازیشده تنها دو فعل ساده را میشناسند و بقیه موارد را نادیده میگیرند: «قرار دادن یک مقدار» (Put) و «گرفتن یک مقدار» (Get). برای انجام هرگونه فیلتر، تغییر یا ترکیب دادهها، اپلیکیشن باید ابتدا مقدار را بیرون بکشد، آن را در زبانی مانند پایتون پردازش کند و دوباره به دیتابیس بازگرداند. این رفتوبرگشت برای کارهای ابتدایی مناسب است، اما زمانی که منطق برنامه پیچیده میشود — مثلاً زمانی که بخواهید یک شمارنده را به صورت اتمیک (Atomic) افزایش دهید یا یک جستوجوی شباهت برای تغذیه یک مدل LLM انجام دهید — به یک گلوگاه تبدیل میشود. در این حالت، هر مرحله تبدیل به چندین فراخوانی کلاینت میشود و کد اپلیکیشن صرفاً نقش یک «چسب» برای اتصال این قطعات را ایفا میکند.
طبق مستندات فنی این پروژه، Liath با الهام از مدل اثباتشده Redis و Nginx، زبان برنامهنویسی Lua را مستقیماً در هسته ذخیرهساز خود ادغام کرده است. این امر به توسعهدهندگان اجازه میدهد تا چندین عملیات خواندن، نوشتن و تغییر را در یک تکفراخوانی (Single Call) در سمت سرور اجرا کنند و به این ترتیب، تعداد دفعات رفتوبرگشت بین کلاینت و سرور را به شدت کاهش دهند. زبان Lua به این دلیل انتخاب شده است که بسیار کوچک است و به راحتی در سایر سیستمها تعبیه (Embed) میشود.
در بخش هسته، این سیستم بسیار مینیمال است. یک پایگاهداده فعال را میتوان تنها با سه خط کد راهاندازی کرد: وارد کردن EmbeddedLiath ،تعریف مسیر ذخیرهسازی (data_dir) و استفاده از توابع db.put() و db.get().
بر اساس مستندات این ابزار، لایهی ذخیرهسازی ثابت نیست و از طریق پارامتر storage_type قابل پیکربندی است (گزینهها شامل auto ،rocksdb یا leveldb هستند). برای محیطهای توسعه، سیستم از LevelDB استفاده میکند، در حالی که محیطهای عملیاتی (Production) میتوانند برای دستیابی به عملکرد بهتر، صراحتاً به RocksDB اشاره کنند (مثلاً با تنظیم storage_type="rocksdb"). سیستم همچنین از «نامبندی» (Namespace) پشتیبانی میکند که جداسازی کاربران مختلف (Multi-tenant isolation) را ممکن میسازد. با استفاده از توابع db.create_namespace() و db.set_namespace()، کلیدهایی که در فضای نام «تولید» نوشته میشوند، با کلیدهای فضای نام «توسعه» تداخل پیدا نمیکنند.
قدرت واقعی Liath در سیستم پلاگینهای آن است که در قالب یک جدول به نام plugins در محیط Lua در دسترس هستند. برخی پلاگینها همیشه حضور دارند و برخی دیگر به عنوان افزونههای اضافی نصب میشوند. قابلیتهای موجود عبارتند از:
- عملیات Core CRUD (پیشفرض): عملیات استاندارد پایگاهداده.
- فایل (پیشفرض): قابلیتهای خواندن و نوشتن فایل.
- کش (پیشفرض): ذخیرهسازی نتایج پرسوجوها برای سرعت بیشتر.
- پشتیبانگیری (پیشفرض): قابلیتهای Backup و بازیابی دادهها.
- مانیتورینگ (پیشفرض): نظارت بر وضعیت سیستم.
- liath[embed]: تولید بردارهای متن و تصویر (Embeddings) با استفاده از FastEmbed.
- liath[vdb]: پیادهسازی جستوجوی شباهت برداری از طریق USearch.
- liath[llm]: اتصال به OpenAI یا Llama برای تکمیل متن و چت.
با اجرای دستور pip install liath[embed,vdb,llm]، یک ذخیرهساز ساده کلید-مقدار به سیستمی تبدیل میشود که میتواند بردارها را اندکسگذاری کند و مدلهای زبانی را فراخوانی نماید، در حالی که تمام اینها از طریق یک اسکریپت Lua قابل دسترسی هستند.
به گزارش توسعهدهندگان، این یکپارچگی باعث میشود تولید بازیابیافزا (RAG) — که شبیه دانشآموزی است که قبل از جواب دادن، اول کتاب درسی را باز میکند و از آن نقل میآورد — از یک زنجیره پیچیده به یک اسکریپت ساده تبدیل شود. این رویکرد بهینهسازی در بازیابی دادهها، مکمل تغییراتی است که در ابزارهایی مانند Sonn برای جایگزینی بازیابی غیرفعال با لایههای استدلالی پیشرفته دیده شد. در یک پشته (Stack) سنتی، توسعهدهنده باید یک اسکریپت ارکستراتور بنویسد تا یک سرویس بردارسازی، یک پایگاهداده برداری و یک API مدل زبانی را به هم متصل کند. در Liath، این فرآیند در هر فاز به یک اسکریپت Lua خلاصه میشود:
- اندکسگذاری (Indexing): یک اسکریپت واحد از
plugins.vdb.vdb_create_index(با تعیین ابعاد، مثلاً ۳۸۴) استفاده میکند، سند را باdb:putذخیره میکند، بردار معنایی را از طریقplugins.embed.embedتولید میکند و در نهایت آن را باplugins.vdb.vdb_addبه اندکس اضافه میکند. - پرسوجو (Querying): اسکریپت دوم، پرسش کاربر را بردارسازی میکند، ۳ همسایه نزدیک (Top 3 neighbors) را با
plugins.vdb.vdb_searchمییابد، سند متناظر را باdb:getبازیابی میکند، یک Prompt میسازد و پاسخ نهایی را از طریقplugins.llm.llm_completeباز میگرداند.
این ساختار تضمین میکند که چرخه «بازیابی-تقویت-تولید» دقیقاً در جایی اجرا شود که دادهها در آنجا قرار دارند.
با این حال، این معماری بدون چالش نیست و جایگزینی جهانی برای سیستمهای توزیعشده نیست. Liath یک ذخیرهساز جاسازیشده تکگرهای (Single-node) است. اگرچه یک liath-server با APIهای HTTP و یک liath-cli وجود دارد، اما معماری آن یک کلاستر توزیعشده نیست. اگر پروژهای نیاز به مقیاسپذیری افقی (Horizontal Scaling)، تکثیر دادهها (Replication) یا جایگزینی در صورت خرابی (Failover) داشته باشد، این ابزار انتخاب مناسبی نیست.
همچنین، اجرای منطق برنامه در داخل پایگاهداده ریسکهای نگهداری ایجاد میکند. این موضوع همان تنشی را ایجاد میکند که در Lua در Redis یا Store Procedureها در Postgres دیده میشود: منطق برنامه سریع است چون در کنار داده قرار دارد، اما تست کردن، نسخهبندی و دیباگ کردن آن سختتر است. یک رشته Lua که داخل یک فایل پایتون قرار گرفته است، تا زمانی که به طور خاص مدیریت نشود، جزئی از یک مجموعه تست (Test Suite) استاندارد نیست.
علاوه بر این، پلاگینهای AI حالتهای شکست جدیدی را معرفی میکنند. در حالی که مکانیابی مشترک (Co-location)، رفتوبرگشتهای داخلی را حذف میکند، اما یک فراخوانی LLM از داخل اسکریپت Lua همچنان با تأخیرهای شبکه، محدودیتهای نرخ فراخوانی (Rate Limits) و هزینههای مالی مواجه است. همچنین، قدرت بیان بالای Lua میتواند به «طنابی برای خودکشی» تبدیل شود؛ یعنی اگر تیم توسعه نظم کافی نداشته باشد، کدها به سرعت غیرقابل مدیریت میشوند.
برای توسعهدهندگان، این به معنای برخورد با Lua در دیتابیس به عنوان «رویه های ذخیره شده» (Stored Procedures) است. سیستم یک راه فرار (Escape Hatch) ارائه میدهد: کاربران میتوانند پلاگینهای خود را در پایتون با ارثبری از کلاس PluginBase بنویسند، توابع قابل فراخوانی در Lua را تعریف کنند و سپس آنها را از طریق یک plugins_dir بارگذاری کنند.
این تغییر، رویکرد متخصصان به چرخه RAG را تغییر میدهد. با ادغام چرخه بازیابی-تقویت-تولید در یک ذخیرهساز برنامهپذیر، پیچیدگی معماری از «ارکستراسیون شبکه» به «مدیریت اسکریپتها» منتقل میشود. کد منبع و مرجع پلاگینها در آدرس https://github.com/incredlabs/liath در دسترس است.
گام بعدی شما
- اگر در حال ساخت اپلیکیشنهای محلی (Local AI) هستید، بررسی کنید آیا حذف لایهی ارکستراسیون میتواند تأخیر سیستم شما را کاهش دهد.
- مخزن گیتهاب پروژه را برای بررسی نحوه تعریف پلاگینهای شخصی از طریق
PluginBaseمطالعه کنید. - برای سیستمهای با مقیاس بالا، این ابزار را به عنوان لایهی کش یا پردازش محلی در کنار یک دیتابیس توزیعشده به کار ببرید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو