استخراج JSON تا ۷ برابر سریعتر روی اپل سیلیکون
خلاصهٔ کاملتر
تولید ساختاریافتهٔ معمولی، حتی با JSON mode یا گرامر، هنوز autoregressive هست: مدل یه توکن پیشبینی میکنه، میچسبونتش به دنباله و دوباره تکرار میکنه. یه آبجکت چهار فیلدی ممکنه ۱۵۰ تا ۵۰۰ بار forward pass لازم داشته باشه و هر کدوم یه رفتوبرگشت جدا به حافظهٔ GPU یا NPU هست. روشی که تو این مقاله معرفی شده، parallel constrained decoding، این مسئله رو از نو میچینه و روی یه M4 Max بین ۵٫۶ تا ۷ برابر تأخیر رو پایین آورده.
پایهٔ ایده یه ویژگی سادهست: تو کارهای دستهبندی و استخراج، جواب هر فیلد از یه مجموعهٔ کوچیک و از قبل معلوم میاد. فیلد risk_level فقط HIGH یا MEDIUM یا LOW هست و requires_review هم فقط یه boolean. پس موتور یه بار کل متن و توضیح فیلدها رو prefill میکنه، همون KV-cache رو بین همهٔ فیلدها پخش میکنه، و برای هر فیلد فقط توکنهای مجاز رو امتیاز میده و بقیهٔ واژگان رو قبل از softmax ماسک میکنه. وقتی دو گزینه پیشوند مشترک دارن، یه مرحلهٔ ادامهٔ کوتاه روی برشهای همون cache اجرا میشه.
چون مقدار هر فیلد از یه لیست تأییدشده انتخاب میشه، JSON نهایی بهصورت برنامهای سرهم میشه نه اینکه از متن تولیدشده پارس بشه، و همین چیزیه که ادعای ۱۰۰ درصد مطابقت با schema رو میسازه. softmax هم فقط روی همون برش کاندیدها اجرا میشه، پس هر فیلد یه احتمال کالیبره و یه لیست رتبهبندیشده از گزینههای جایگزین همراهش داره؛ چیزی که برای علامت زدن موارد کماطمینان و فرستادنشون برای بازبینی انسانی به درد میخوره.
عددهای بنچمارک روی M4 Max و با مدل ۴ بیتی mlx-community/Qwen2.5-1.5B-Instruct-4bit گرفته شدن. مسیریابی تقلب مالی با ۴ فیلد از ۴۲۰ به ۷۵ میلیثانیه رسیده، ممیزی امنیتی کد با ۴ فیلد از ۳۸۰ به ۶۸، طبقهبندی تعرفه با یه فیلد و ۲۵۵ گزینه از ۵۰۰ به ۸۹، و تریاژ پشتیبانی سازمانی با ۲۸ فیلد از ۱۹۰۰ به ۲۷۰ میلیثانیه. هرچی فیلدها بیشتر، سود روش هم بیشتر، چون تأخیر روش قدیمی با تعداد توکنهای خروجی بالا میره ولی این یکی نزدیک یه prefill میمونه.
نویسنده محدودیتها رو هم صریح میگه. این روش فقط برای فیلدهاییه که مقدارشون enum یا boolean با مجموعهٔ محدوده و سقف هر فیلد ۲۵۵ گزینهست؛ برای متن آزاد مثل خلاصهنویسی همون دیکود معمولی ابزار درسته. پیادهسازی منتشرشده هم به MLX و مک اپل سیلیکون (M1 تا M4، macOS 14 به بالا و پایتون ۳٫۱۰ به بالا) گره خورده و بنچمارک فقط برای همون یه مدل و همون سختافزار منتشر شده. برای بقیهٔ فیلدها هم میشه یه ترکیب دوگانه چید و این روش رو فقط برای بخش دستهای schema نگه داشت.
نکات کلیدی:
- یه بار prefill، بعد پخش همون KV-cache بین همهٔ فیلدهای schema بهجای تولید ترتیبی توکن
- سرعت روی M4 Max: ۵٫۶ برابر روی schemaهای ۴ فیلدی و ۷ برابر روی schema ۲۸ فیلدی
- بزرگترین نمونه از ۱۹۰۰ میلیثانیه به ۲۷۰ میلیثانیه رسیده
- JSON برنامهای از مقادیر تأییدشده ساخته میشه، پس تو همهٔ تستها ۱۰۰ درصد معتبر بوده
- هر فیلد یه احتمال کالیبره و لیست گزینههای جایگزین داره
- فقط enum و boolean، سقف ۲۵۵ گزینه برای هر فیلد، و فقط روی MLX و اپل سیلیکون تست شده




