به عنوان توسعهدهندگان، ما بر پایه قطعیت رشد میکنیم. یک تست واحد یا بر اساس منطق سختگیرانه و قطعی پاس میشود یا شکست میخورد. اگر add(2, 2) مقدار 4 را برگرداند، تست پاس میشود. اگر مقدار 5 را برگرداند، شکست میخورد. این چارچوب دودویی دههها به مهندسی نرمافزار خدمت کرده است. با این حال، با ادغام فزاینده مدلهای زبانی بزرگ (LLM) در برنامههایمان، این ذهنیت دودویی فرو میریزد. خروجیهای هوش مصنوعی احتمالی، غیرقطعی و اغلب ذهنی هستند. چگونه میتوانیم سیستمی را تست کنیم که میتواند به یک سوال را به هزار روش صحیح مختلف پاسخ دهد؟
تست هوش مصنوعی، یا ارزیابی LLM، درباره یافتن باگها در کد نیست؛ بلکه درباره سنجش کیفیت، ایمنی و مفید بودن خروجیهای مولد است. این پست به بررسی تغییرات معماری مورد نیاز برای ارزیابی مؤثر سیستمهای هوش مصنوعی میپردازد.
تغییر پارادایم: از قطعی به احتمالی
چالش اصلی در تست هوش مصنوعی، دوری از تطبیق دقیق رشتهها (exact string matching) است. در تستهای سنتی، ما خروجی مورد انتظار را با خروجی واقعی مقایسه میکنیم. در تست هوش مصنوعی، ما نیاز داریم شباهت معنایی، لحن، واقعیتنمایی و پایبندی به محدودیتها را ارزیابی کنیم. این امر نیازمند یک ابزار جدید است. به جای استفاده از ادعاهای ساده (assertions)، ما به چارچوبهای ارزیابی تکیه میکنیم که میتوانند پاسخهای زبان طبیعی را تجزیه کرده و آنها را بر اساس یک معیار نمرهدهی ارزیابی کنند.
یکی از الگوهای قدرتمند در حال ظهور در صنعت، رویکرد LLM-as-a-Judge (هوش مصنوعی به عنوان داور) است. در این الگو، ما از یک LLM با قابلیت بالا برای ارزیابی خروجی یک LLM دیگر استفاده میکنیم. این کار به ما اجازه میدهد ارزیابی معیارهای پیچیده مانند مفید بودن، دقت یا لحن برند را خودکار کنیم که با عبارات باقاعده (regex) یا بررسیهای تساوی ساده غیرممکن است.
پیادهسازی LLM-as-a-Judge با پایتون
بیایید به یک پیادهسازی عملی با استفاده از پایتون نگاهی بیندازیم. میتوانیم یک تابع ارزیابی ساده ایجاد کنیم که یک پاسخ تولید شده و یک معیار مرجع را دریافت کند، سپس از یک LLM ارزیاب بخواهد که به پاسخ نمره دهد. این کار اغلب با استفاده از ویژگیهای خروجی ساختاریافته (مانند حالت JSON) برای اطمینان از تجزیه سازگار پیادهسازی میشود.
import openai
def evaluate_response_with_llm(user_query, generated_response, rubric="score 1-5"):
"""
از یک LLM برای نمرهدهی به یک پاسخ تولید شده بر اساس یک معیار استفاده میکند.
"""
prompt = f"""
شما یک ارزیاب متخصص هستید. وظیفه شما نمرهدهی به پاسخ زیر
نسبت به سوال کاربر بر اساس معیار است.
معیار: {rubric}
سوال کاربر: {user_query}
پاسخ تولید شده: {generated_response}
ارزیابی خود را به صورت یک شیء JSON با 'score' (عدد صحیح) و 'reason' (رشته) برگردانید.
"""
response = openai.chat.completions.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": prompt}],
response_format={ "type": "json_object" }
)
return response.choices[0].message.content
# مثال استفاده
query = "اتصال کوانتومی را برای یک کودک ۵ ساله توضیح دهید."
response_text = "اتصال کوانتومی مثل زمانی است که دو سکه جادویی به هم متصل هستند. اگر یکی را پرتاب کنید و شیر بیاید، دیگری بلافاصله میداند که باید خط بیاید، حتی اگر در طرفین مخالف جهان باشند!"
result = evaluate_response_with_llm(query, response_text)
print(result)
در این مثال، تابع evaluate_response_with_llm به عنوان یک اوراکل تست پویا عمل میکند. این تابع فقط بررسی نمیکند که آیا کلمه "سکه" وجود دارد یا خیر؛ بلکه ارزیابی میکند که آیا این تشبیه برای یک کودک پنج ساله مناسب است یا خیر، که این یک محدودیت ضمنی سوال است.
بهترین شیوهها برای ارزیابی مستحکم
برای ساخت پایپلاینهای تست هوش مصنوعی قابل اعتماد، موارد زیر را در نظر بگیرید:
- مجموعه تست خود را متنوع کنید: هرگز به یک مورد تست تکیه نکنید. یک مجموعه طلایی شامل ورودیهای متنوع، از جمله موارد حاشیهای، پرامپتهای تهاجمی و پرسشهای خنثی ایجاد کنید.
- روشها را ترکیب کنید: از یک رویکرد ترکیبی استفاده کنید. از بررسیهای قطعی برای محدودیتهای سخت (مثلاً "پاسخ باید شامل یک تاریخ با فرمت YYYY-MM-DD باشد") و از LLM-as-a-Judge برای محدودیتهای نرم (مثلاً "لحن باید همدلانه باشد") استفاده کنید.
- در CI/CD خودکارسازی کنید: مجموعه ارزیابی خود را مانند کد در نظر بگیرید. مجموعههای ارزیابی را به طور خودکار روی هر درخواست ادغام (pull request) اجرا کنید. اگر نسخه جدید مدل بر اساس معیار نمره کمتری نسبت به خط مبنا کسب کند، پایپلاین باید شکست بخورد.
- انحراف (Drift) را پایش کنید: پس از استقرار، تغییرات در خروجیهای LLM را به طور مداوم پایش کنید. تغییرات ناگهانی در احساسات یا ساختار ممکن است نشاندهنده نیاز به بازآموزی یا تنظیم پرامپت باشد.
نتیجهگیری
تست برنامههای هوش مصنوعی نیازمند بازاندیشی بنیادین در تضمین کیفیت است. ما دیگر نمیتوانیم به ادعاهای ایستا تکیه کنیم. در عوض، باید ارزیابی احتمالی را بپذیریم و با بهرهگیری از LLMها و معیارهای شباهت معنایی، کیفیت ظریف خروجیهای مولد را بسنجیم. با ادغام این شیوهها در جریان توسعه خود، میتوانید برنامههای هوش مصنوعیمحوری بسازید که نه تنها هوشمند، بلکه قابل اعتماد، ایمن و قابل اطمینان باشند. دوران تستهای قطعی در حال تکامل است، اما تعهد به کیفیت ثابت باقی میماند.