Flex؛ وقتی بهینهساز خودِ کد رو بازنویسی میکنه
خلاصهٔ کاملتر
تو این پست مهمان که مایکل آیزاک، دانشجوی دکترای مهندسی نرمافزار دانشگاه کارنگی ملون، برای بلاگ cmpnd نوشته اومده که تاریخچهٔ بهینهسازهای DSPy در واقع تاریخچهٔ توانایی مدلهاست: اول باید نمونه بهشون نشون میدادیم، بعد خودشون پرامپتنویسهای خوبی شدن، و حالا برنامهنویسهای خوبی هستن. ماژول تازهٔ Flex روی همین موج سواره و به جای پرامپت، خود کد رو دست بهینهساز میده.
dspy.Flex رو میشه مستقیم جای Predict یا ReAct گذاشت و قبل از بهینهسازی هم دقیقاً مثل Predict رفتار میکنه:
my_signature = "question -> answer"
my_program = dspy.Predict(my_signature)
# Make it Flex!
my_program = dspy.Flex(my_signature)فرقش اینه که Flex سورس خودش رو هم در معرض بهینهساز میذاره؛ اونوقت dspy.GEPA میتونه برنامه رو بشکنه، تابع کمکی بنویسه، منطق مسیریابی بسازه و در کنارش پرامپتها رو هم بازنویسی کنه.
محک کار یه تسک تطبیق مکان بوده: تصمیمگیری دربارهٔ اینکه دو لیستینگ به یه مکان فیزیکی اشاره میکنن یا نه، با ۱۰۲۹ نمونهٔ برچسبخورده و ۲۴۰ رکورد تست. خط پایه با dspy.Predict دقت ۹۰.۴٪ و هزینهٔ ۰.۹۸ دلار بهازای هزار رکورد داشت. بهینهسازی فقط پرامپت دقت رو به ۹۲.۵٪ رسوند، ولی چون دستورالعمل خیلی طولانیتر شد هزینه به ۲.۸۸ دلار رفت و اجرا ۴۸٪ کندتر شد. با Flex دقت شد ۹۵٪ با هزینهٔ ۰.۷ دلار.
دلیلش اینه که مدل بازتابی کد نوشت تا موارد ساده با تابعهای پایتون حل بشن و ۷۵٪ کمتر به LLM زنگ بخوره. متریک GEPA هم میتونه تعداد فراخوانی مدل رو ببینه و جریمهش کنه:
score = max(0.0, correct - PENALTY * n_llm_calls)نویسنده میگه با بالا بردن این جریمه تا λ=۰.۴، برنامه تو کل ۲۴۰ رکورد فقط یک بار سراغ مدل رفت و دقت روی ۹۲.۱٪ موند؛ یعنی عملاً همتراز خط پایه با حدود یکصدم هزینه.
کدی که مدل مینویسه همچنان کد نامعتمده، برای همین Flex سورس تولیدشده رو بهصورت پیشفرض تو یه مفسر سندباکسشده اجرا میکنه و فقط فراخوانی predictor و ابزارهایی که خودت صریحاً دادی به پروسهٔ میزبان وصل میشن، اون هم با سقف max_predictor_calls. تو یه آزمایش مقدماتی روی SWE-bench Pro هم گزارش شده که Haiku 4.5 بدون بهینهسازی ۰ از ۱۲ ایشو رو حل کرد و بعد از GEPA روی برنامهٔ Flex به ۴ از ۱۲ رسید — که نویسنده تأکید میکنه فقط یه پایلوته.
نکات کلیدی:
- Flex یه ماژول DSPyه که علاوه بر دستورالعمل، سورسکد خودش رو هم در معرض بهینهساز میذاره
- GEPA با این اهرم تازه برنامه رو تجزیه میکنه، مسیر ساده رو به پایتون میسپاره و مدل رو برای ابهام واقعی نگه میداره
- تو تسک تطبیق مکان: دقت ۹۰.۴٪ → ۹۵٪، هزینه ۲۸٪ کمتر، اجرا ۴۰٪ سریعتر
- با جریمهکردن تعداد فراخوانی تو متریک، میشه دقت رو همتراز خط پایه نگه داشت با کسری از هزینه
- کد تولیدشده تو سندباکس اجرا میشه و تعداد پلزدن به پروسهٔ میزبان سقف داره




