عامل هوش مصنوعی که عرضه کردم، ۲۳ تست واحد (unit test) را پشت سر گذاشت، اما در کمتر از یک ساعت پس از عملیاتی شدن، یک ویژگی محصول را از خودش درآورد و قیمتی را اعلام کرد که سه برابر کمتر از واقعیت بود. وقتی کاربر به آن اعتراض کرد، ربات بر حرف خود پافشاری کرد، گفتگو تمام شد و من یک مشتری را از دست دادم. این اشتباه ثابت کرد که مجموعهای از تستهای واحدِ قطعی (deterministic) نمیتوانند قابلیت اطمینان یک عامل را تضمین کنند.
چرا تستهای واحد برای عاملهای هوش مصنوعی کافی نیستند
تستهای واحد برای کدهای سنتی کار میکنند زیرا ورودی یکسان همیشه خروجی یکسانی تولید میکند. «۲ + ۲ = ۴» تضمینی است که میتوانید با یک بررسی سادهی برابری آن را تأیید کنید. با این حال، یک عامل مبتنی بر LLM، خروجی خود را با پرامپت، بافت (context) اطراف و وضعیت هر یک از ابزارهای خارجی که فراخوانی میکند، تغییر میدهد. تستی که فقط برابری دقیق رشتهها را بررسی میکند، از توهمات (hallucinations)، تغییرات لحن یا نقض محدودیتها (guardrails) غافل میماند. آن شکست خاموش که باعث از دست رفتن مشتری شد، نشان میدهد که شما باید کل تعامل را ارزیابی کنید، نه فقط توابع مجزا را.
ساخت یک چارچوب ارزیابی پیش از نوشتن کدهای ویژگی
من ترتیب توسعه را تغییر دادم: ابتدا یک چارچوب ارزیابی (evaluation harness) چهارلایه طراحی کردم و سپس عامل را نوشتم. این چارچوب ۱۳۱ تست را در یک مرحله اجرا میکند، هزینه هر بار اجرا تقریباً سه سنت است و حدود یازده دقیقه طول میکشد. من هر تست را به کوچکترین مدلی که بتواند آن را مدیریت کند اختصاص میدهم و مدلهای بزرگتر و گرانتر را برای لحظاتی رزرو میکنم که واقعاً ارزش افزوده دارند.
لایه ۱ – عملکرد ابزارها
خط اول دفاع، بررسی میکند که آیا عامل میتواند ابزارهای خود را به درستی فراخوانی کند یا خیر. تستها شامل جستجوهای موفق، پرسوجوهای عمدتاً بدشکل و شکستهای شبیهسازیشدهی API هستند. از آنجایی که استفاده از ابزار تا حد زیادی قطعی (deterministic) است — یا درخواست به درستی شکل میگیرد یا API یک خطا برمیگرداند — دستورات سادهی assert در پایتون کافی هستند. شناسایی یک درخواست بدشکل در این مرحله، از سردرگمی در مراحل بعدی جلوگیری میکند.
لایه ۲ – پیروی از دستورالعملها
در مرحله بعد، چارچوب تأیید میکند که عامل به محدودیتها (guardrails) احترام میگذارد. یک LLM کوچکتر به عنوان ارزیاب عمل میکند و پاسخ عامل را برای انطباق اسکن میکند: حفظ شخصیت، اجتناب از موضوعات ممنوعه و تولید طرحواره (schema) JSON مورد نیاز. این لایه، انحراف معنایی (semantic drift) را که تستهای واحد متوجه آن نمیشوند، مانند لغزش به یک شخصیت ناخواسته یا نشت پرامپتهای داخلی، شناسایی میکند.
لایه ۳ – رفتار هدفمحور
لایه سوم حیاتیترین لایه است. این لایه میپرسد که آیا عامل واقعاً هدف خود را محقق میکند یا خیر. برای یک ربات تولید لید (lead-generation)، این به معنای تأیید این است که ربات سوالات تعیین صلاحیت درست را میپرسد و در صورت لزوم کار را به انسان ارجاع میدهد. من در اینجا از یک مدل مبتنی بر استدلال (reasoning-oriented) استفاده میکنم زیرا میتواند جریان کلی را بدون افزایش هزینهها ارزیابی کند. اگر ربات در دستیابی به هدف خود شکست بخورد — حتی اگر دو لایه اول را پشت سر گذاشته باشد — برای بازطراحی علامتگذاری میشود.
لایه ۴ – عملکرد
در نهایت، چارچوب تأخیر (latency) و سرعت تولید توکن را ثبت میکند. پاسخهای کند تجربه کاربری را تخریب میکند، بهویژه در چتهای بلادرنگ. با ردیابی این معیارها در کنار صحت عملکرد، اطمینان حاصل میکنم که عامل هم دقیق و هم پاسخگو است.
انتخابهای کاهشدهنده هزینه
رقم ۰.۰۳ دلار برای هر اجرا یک ترفند تبلیغاتی نیست؛ بلکه از تطبیق پیچیدگی تست با اندازه مدل حاصل شده است. بررسیهای قطعیِ ابزارها روی ارزانترین محیط اجرا انجام میشوند، انطباق با دستورالعملها از یک مدل سبک استفاده میکند و تنها ارزیابیهای هدفمحور از یک مدل توانمندتر، هرچند گرانتر، استفاده میکنند. این رویکرد چندلایه، هزینه کل را به اندازهای پایین نگه میدارد که بتوان مجموعه کامل تستها را با هر تغییر در کد اجرا کرد.
موازنه: سرعت در برابر ایمنی
معرفی یک چارچوب ارزیابی، در ابتدا باعث ایجاد اصطکاک شد. چرخههای توسعه طولانیتر شدند و زمانبندی عرضه به تأخیر افتاد.
آنچه باید در آینده زیر نظر داشت
- ارزیابهای مدلمحور: با بهبود LLMها، ارزیاب در لایه ۲ میتواند دقیقتر شود و ضمن شناسایی نقضهای ظریف سیاستها، موارد مثبت کاذب (false positives) را کاهش دهد.
نتیجهگیری
اگر برای محیط عملیاتی (production) عاملهای هوش مصنوعی میسازید، یک چارچوب ارزیابی چندلایه اختیاری نیست؛ بلکه بنیادی است. با انتقال هزینهی تستهای جامع به مراحل اولیه — ۰.۰۳ دلار برای هر اجرا، یازده دقیقه برای هر مجموعه — شما در برابر شکستهای خاموشی که تستهای واحد به سادگی قادر به تشخیص آنها نیستند، محافظت میشوید.
