هستهٔ قطعی، پوستهٔ ایجنتی؛ ماشین حالت بهعنوان مهار LLM
خلاصهٔ کاملتر
نویسنده از یه نقطهٔ عطف شخصی شروع میکنه: اسکرینکست «هستهٔ تابعی، پوستهٔ دستوری» از گری برنهارت. بینش اون کار این بود که با جدا کردن بخش خالص از بخش دارای اثر جانبی، هم چیزی که مهمه قابلتست میشه و هم پیچیدگی به لبهها رونده میشه. ادعای این مقاله اینه که ما دوباره سر یه نقطهٔ عطف مشابهیم، با یه تفاوت مهم: پوسته دیگه ورودی و خروجی دستوری نیست، پوسته حالا یه مدل زبانیه — یعنی چیزی بهمراتب غیرقابلپیشبینیتر.
نویسنده تعریف میکنه که آشناییش با ماشینهای حالت متناهی از اولین استارتاپش شروع شده، جایی که تیم برای گردشکارهای ناهمگام یه موتور ماشین حالت به زبان پایتون ساخته بود که سال ۲۰۱۱ متنباز شد. ریشهٔ نظری ماجرا هم به مدلهای Mealy و Moore در دههٔ ۱۹۵۰ برمیگرده. نکتهٔ جالبی که مطرح میکنه اینه که یه مقالهٔ ۱۹۹۹ دربارهٔ پیادهسازی ماشینهای حالت، تو بخش کارهای آیندهاش دقیقاً چیزهایی مثل گذارهای شرطی و استیتچارت رو پیشبینی کرده بود که امروز XState با گاردها، حالتهای تودرتو و موازی پیاده کرده.
تجربهٔ دومش تو SurveyMonkey بوده، جایی که کل گردشکار نظرسنجی رو با XState مدل کرده: هر سؤال یه حالت، هر پاسخ یه رویداد و منطق انشعاب یه گارد. جمعبندی سالها تکرار این تجربه رو صریح میگه: اگه یه چکش طلایی هست که ارزش داره به هر کدبیسی بزنی، ماشین حالته. به گفتهٔ او بارها منطق کسبوکاری رو دیده که در واقع یه ماشین حالت بدقواره و پنهان بوده و مهاجرت دادنش به یه ماشین حالت واقعی، تست کردنش رو بیدردسر کرده.
معماری مرجعی که با تیمش روش کار میکنه سه لایه داره: یه پوستهٔ ایجنتی که مدل صوتی و ابزارهاشه، یه لایهٔ پل که نیت ایجنت رو به رویداد ماشین ترجمه میکنه، و یه هستهٔ قطعی که همون ماشین XState ـه با حالتها، گذارها، گاردها و اکشنها. مثالش یه جریان تأیید هویت تلفنیه. گارد isValidId یه تابع خالصه، اکشنها انتسابهای قطعیان و گذارها صریح — یعنی میشه بدون هیچ LLM و هیچ اتصال شبکهای تستش کرد. حرف اصلی اینجاست: مدل تصمیم نمیگیره کاربر تأیید شده یا نه، ماشین تصمیم میگیره. ابزار فقط یه پل نازکه:
execute: async ({ context, runtimeContext }) => {
const sessionActor = runtimeContext.get("sessionActor") as SessionActor;
// نیت ایجنت به رویداد ماشین تبدیل میشه
sessionActor.send({ type: "VERIFY", id: context.id });
const snapshot = sessionActor.getSnapshot();
return { verified: snapshot.value === "verified" };
},جذابترین بخش، ارکستراسیون معکوسه: وضعیت ماشین تعیین میکنه ایجنت چه تواناییهایی داشته باشه. قبل از تأیید هویت، ایجنت فقط ابزار تأیید هویت رو در اختیار داره و دستورالعملش میگه تا وقتی کاربر تأیید نشده دربارهٔ هیچ جزئیات مالی حرف نزنه. لحظهای که ماشین به حالت تأییدشده گذار میکنه، کل پیکربندی ایجنت عوض میشه — دستورالعمل جدید و ابزارهای مالی مثل دریافت تراکنشها و حسابها بهش اضافه میشه. خود گذار قطعی و قابلتسته؛ چیزی که غیرقطعیه فقط جملهبندی ایجنته. نویسنده یه اصل مهندسی دیگه رو هم یادآوری میکنه: وابستگی به فریمورکهای شخص ثالث رو کم نگه دار و بیشترین حجم منطق کسبوکار رو تو کدی بذار که مالکشی.
نکات کلیدی:
- بازخوانی الگوی «هستهٔ تابعی، پوستهٔ دستوری» برای دورانی که پوسته یه LLM ـه
- منطق کسبوکار تو ماشین حالت میشینه: گاردها توابع خالص و گذارها صریح
- ماشین منبع حقیقته، نه مدل؛ ابزار فقط نیت رو به رویداد ترجمه میکنه
- هستهٔ قطعی بدون LLM، شبکه یا اتصال صوتی قابل تست واحده
- وضعیت ماشین تعیین میکنه ایجنت چه دستورالعمل و چه ابزارهایی داشته باشه
- توصیهٔ نویسنده: وابستگی به فریمورک بیرونی رو کم و منطق رو تو کد خودت نگه دار




