استفاده عملی از خروجیهای ساختاریافته در Ollama
اجرای مدلهای زبانی بزرگ (LLM) به صورت محلی اغلب منجر به خطاهای تجزیه (parsing) JSON میشود. شما به مدل میگویید که فقط JSON برگرداند، اما مدل همچنان از مارکدان (markdown fences) یا متنهای اضافی استفاده میکند. این موضوع باعث از کار افتادن کد شما میشود.
از نسخه Ollama 0.3.0 به بعد، میتوانید این مشکل را با استفاده از پارامتر format حل کنید. این کار مدل را مجبور میکند تا از یک طرحواره (schema) JSON پیروی کند. این ویژگی باعث میشود که اضافه کردن متن اضافی یا مارکدان توسط مدل، از نظر فیزیکی غیرممکن شود.
من این قابلیت را با Gemma4 و Ollama 0.30.7 آزمایش کردم. نتایج به شرح زیر است.
مشکل متنهای طبیعی
مدلها برای گفتگو آموزش دیدهاند. آنها تمایل دارند بگویند: "بفرمایید، این هم JSON شما." حتی با وجود دستورات (prompts) سختگیرانه، آنها اغلب پاسخها را در بلوکهای کد قرار میدهند. در این حالت، تابع json.loads() در پایتون هنگام برخورد با این بلوکها با خطا مواجه میشود.
مزیت سرعت
استفاده از پارامتر format بسیار سریعتر است.
- بدون خروجی ساختاریافته: ۳۲ ثانیه
- با خروجی ساختاریافته: ۵ ثانیه
این یعنی بهبود سرعت ۶.۴ برابری. مدل دیگر وقت خود را صرف تصمیمگیری برای نحوه قالببندی متن نمیکند و فقط توکنهایی را تولید میکند که با طرحواره (schema) شما مطابقت دارند.
استفاده از Pydantic برای امنیت نوع (Type Safety) نیازی نیست طرحوارههای JSON را دستی بنویسید. از مدلهای Pydantic برای تولید خودکار آنها استفاده کنید.
۱. مدل Pydantic خود را تعریف کنید.
۲. از model_json_schema() برای ایجاد طرحواره استفاده کنید.
۳. آن طرحواره را به Ollama ارسال کنید.
۴. از model_validate_json() برای تجزیه و اعتبارسنجی همزمان دادهها استفاده کنید.
این رویکرد برای عاملهای هوش مصنوعی (AI agents) عالی است. میتوانید از آن برای تصمیمگیری در مورد اینکه عامل در مرحله بعد باید کدام ابزار را فراخوانی کند، استفاده کنید. اگر مدل سعی کند نام ابزاری را که وجود ندارد اختراع کند، Pydantic بلافاصله آن را شناسایی میکند.
محدودیتهای فعلی
- طرحوارههای بسیار تودرتو (deeply nested) گاهی اوقات در مدلهای کوچکتر ممکن است آرایههای خالی برگردانند.
- فیلدهای اختیاری (Optional) ممکن است به جای
nullرشتههای خالی برگردانند. - طرحوارههای بزرگ، بخش بیشتری از پنجره بافت (context window) شما را اشغال میکنند.
بهترین روشها
- برای مدلهای کوچک از استخراج ساده استفاده کنید.
- برای اعتبارسنجی و انتخاب ابزارِ عامل، از Pydantic استفاده کنید.
- برای دادههای پیچیده و تودرتو، از مدلهای بزرگتر استفاده کنید.
- زمانی که Pydantic خطای اعتبارسنجی میدهد، منطق تلاش مجدد (retry logic) را اضافه کنید.
دیگر به این امیدوار نباشید که دستورات (prompts) شما حتماً درست عمل کنند. از خروجیهای ساختاریافته استفاده کنید تا خط لولههای (pipelines) مدلهای زبانی محلی خود را قابل اعتماد کنید.
جامعه یادگیری اختیاری: https://t.me/GyaanSetuAi