فهرست مطالب ۱۰ بخش
- چرا تست چتبات فارسی با ابزارهای معمولی خطا میدهد؟
- نصب مهارت ParsBench در Claude Code و Cursor
- از دستیار بخواهید برای چتباتتان آزمون بنویسد
- شبیهسازی کاربر ایرانی: تعارف، فینگلیش و ریال و تومان
- چرا آزمون فارسی سبز میشود ولی ربات هنوز خطا دارد؟
- اجرای آزمون فارسی در CI
- اگر از ایران به OpenAI دسترسی ندارید
- بنچمارک مدل زبانی فارسی: کدام مدل فارسی را بهتر میفهمد؟
- پیش از نصب اینها را بدانید
- سؤالهای پرتکرار
چتبات پشتیبانی فروشگاهتان را ساختهاید و چند آزمون هم برایش نوشتهاید. آزمون انتظار دارد ربات بگوید «۲۵۰ هزار تومان» و ربات نوشته «۲٬۵۰۰٬۰۰۰ ریال»: جواب درست است و آزمون قرمز میشود. ربات «می روم» را بدون نیمفاصله نوشته، یا تاریخ ارسال را به ابزار سفارش به شکل 1405-08-10 داده، نه 2026-11-01، و باز همان داستان. بعد از چند بار از این شکستهای بیدلیل، آدم وسوسه میشود آزمون را شلتر کند، و همانجا خطای واقعی هم رد میشود. دردسر همیشگی تست چتبات فارسی همین است.
پاسخ کوتاه: برای تست چتبات فارسی، مهارت (Agent Skill) «ارزیابی چتبات فارسی» را در دستیار برنامهنویسیتان نصب کنید. این مهارت به Claude Code، Cursor، Codex یا Gemini CLI یاد میدهد با کتابخانهٔ پایتون ParsBench برای ربات شما آزمون بنویسد. در این آزمونها ریال و تومان، تاریخ شمسی و میلادی عددی، ارقام فارسی و انگلیسی و نیمفاصله خودبهخود یکی حساب میشوند.
چرا تست چتبات فارسی با ابزارهای معمولی خطا میدهد؟
بیشتر ابزارهای ارزیابی برای متن انگلیسی ساخته شدهاند و دو رشته را حرفبهحرف مقایسه میکنند. در فارسی یک جواب درست را به چند شکل میشود نوشت: «۲۵۰۰۰۰۰» با ارقام فارسی یا انگلیسی، با جداکنندهٔ هزارگان یا بی آن، «ي» عربی یا «ی» فارسی، «میروم» یا «می روم» یا «میروم». مقایسهٔ حرفبهحرف همهٔ اینها را متفاوت میبیند.
ParsBench پیش از هر مقایسه متن را یکسان میکند و این کار تنظیمی ندارد:
- «ي» و «ك» و «ة» به «ی» و «ک» و «ه» تبدیل میشوند.
- ارقام فارسی، عربی و انگلیسی برابرند و جداکنندهٔ هزارگان حذف میشود.
- نیمفاصله با فاصله یکی است.
- مبلغ با هزار و میلیون و میلیارد و واحدش به ریال برگردانده میشود: «۲۵۰ هزار تومان»، «۲٬۵۰۰٬۰۰۰ ریال» و «۲/۵ میلیون تومان» یک عددند.
- تاریخ عددی در هر دو تقویم مقایسه میشود و سال کمتر از ۱۶۰۰ شمسی خوانده میشود، پس 1405-07-05 همان 2026-09-27 است.
اگر خود رباتتان هنوز تاریخ شمسی را اشتباه تبدیل میکند، دقت هوش مصنوعی در تاریخ شمسی را هم ببینید.
نصب مهارت ParsBench در Claude Code و Cursor
نصب دو بخش جدا دارد: خود مهارت، که روش کار را به دستیار یاد میدهد، و کتابخانهٔ پایتون، که آزمونها با آن اجرا میشوند.
۱. مهارت را برای پروژهٔ فعلی نصب کنید. دستور، به نقل از راهنمای سازنده:
npx skills add ParsBench/ParsBenchاگر npx ندارید، پوشهٔ skills/parsbench/ مخزن ParsBench را در پوشهٔ مهارتهای دستیارتان کپی کنید. برای Claude Code این پوشه .claude/skills/ در پروژه است.
۲. کتابخانه را جداگانه نصب کنید:
pip install parsbenchنسخهٔ فعلی پایتون ۳.۱۲ یا ۳.۱۳ میخواهد. روی ۳.۱۰ و ۳.۱۱ فقط نسخهٔ قدیمی ۰.۱.۷ نصب میشود که بخش آزمون برنامه را ندارد. برای دستور parsbench test هم pip install 'parsbench[test]' را بزنید.
مهارت چیست و چه فرقی با سرور MCP دارد؟ این را در تفاوت Skill و MCP مفصل نوشتهایم.
از دستیار بخواهید برای چتباتتان آزمون بنویسد
بعد از نصب، در یک گفتگوی تازه کار را به زبان خودتان بگویید. مثلاً: «برای ربات پیگیری سفارش این پروژه آزمون فارسی بنویس. ربات نباید بدون تأیید کاربر سفارشی را لغو کند و هزینهٔ ارسال را باید درست بگوید.»
دستیار طبق مهارت این کارها را میکند:
- ربات را در تابعی میپیچد که پیام کاربر را میگیرد و پاسخ را برمیگرداند. برای OpenAI Agents SDK، LangGraph، Pydantic AI و Agno رابط آماده دارد و برای CrewAI، LlamaIndex و Google ADK از OpenTelemetry استفاده میکند. ربات پشت یک API یا لاگهای قبلی را هم با ساختن دستی رد اجرا (
Trace) میشود سنجید. - برای هر موقعیت یک «نمونهٔ طلایی» (
Golden) مینویسد. هر فیلدی که پر شود یک بررسی را روشن میکند و فیلد خالی اجرا نمیشود. - آزمونها را در pytest میگذارد و در آخر ابزار مشاهدهٔ نتیجه را معرفی میکند.
یک نمونهٔ طلایی برای همان ربات چنین شکلی دارد (نام ابزارها و مبلغ مال ربات فرضی خودتان است):
from parsbench.appeval import AppEvaluator, Golden, ToolCall
evaluator = AppEvaluator(goldens=[
Golden(
input="سفارشم رو ۱۴۰۵/۰۸/۱۰ ثبت کردم، کی میرسه؟ هزینه ارسالش چقدر شد؟",
tools=[ToolCall("find_order", date="2026-11-01")],
contains=["۴۵ هزار تومان"],
forbidden_tools=["cancel_order"],
),
])
result = evaluator.evaluate(my_bot)
result.assert_passed()اگر ربات تاریخ را به شکل 1405-08-10 به ابزار بدهد و هزینه را «۴۵۰٬۰۰۰ ریال» بگوید، این نمونه قبول میشود. اگر cancel_order را صدا بزند، رد میشود. اگر خود ربات خطا بدهد، فقط همین نمونه با بررسی app_error رد میشود و بقیهٔ آزمونها ادامه پیدا میکنند. assert_passed() هم بررسیهای ردشده را در پیام خطا میآورد، پس مستقیم در pytest کار میکند.
هر فیلد چه چیزی را میسنجد:
| آنچه میخواهید بسنجید | فیلد | مدل داور لازم است؟ |
|---|---|---|
| ابزار درست با آرگومان درست | tools= |
نه |
| کاری که ربات نباید بکند | forbidden_tools=، not_contains= |
نه |
| واقعیتی که باید در پاسخ باشد | contains= |
نه |
| قالب خروجی (طرح pydantic) | format= |
نه |
| سقف گام، زمان و هزینه | max_steps=، max_latency=، max_cost= |
نه |
| درستی کلی پاسخ | output= |
بله |
| وفاداری به متن مرجع | context= |
بله |
| رد کردن درخواست نابجا | refuses=True |
بله |
اگر سؤالهای متداول یا مستندات پشتیبانی دارید، دستیار میتواند با GoldenGenerator از روی همان فایلها نمونهٔ طلایی بسازد، با حالتی که ارقام را قاطی میکند، تاریخ شمسی میآورد و فینگلیش مینویسد. خود مهارت تأکید میکند که این نمونهها را آدم باید بازبینی کند.
شبیهسازی کاربر ایرانی: تعارف، فینگلیش و ریال و تومان
یک سؤال و یک جواب همهٔ ماجرا نیست. کاربر واقعی با «سلام، خسته نباشید، ببخشید مزاحم میشم» شروع میکند، وسط گفتگو فینگلیش مینویسد، تومان و ریال را قاطی میکند یا تاریخ را با نام ماه میگوید. SimulationEvaluator یک مدل زبانی را جای چنین کاربری میگذارد تا چند نوبت با رباتتان حرف بزند.
برای هر گفتگو هدف، سناریو، نتیجهٔ مورد انتظار و چند معیار مینویسید و هر معیار جدا داوری میشود. تلههای آماده از این قرارند:
- تعارف در شروع گفتگو (
taarof_opening) - اشتباه گرفتن تومان و ریال (
toman_rial_confusion) - تاریخ شمسی با نام ماه، مثل «۵ مهر» (
jalali_date) - رفتن به فینگلیش (
finglish_switch) - غلط تایپی (
typos) - کاربر کمحوصله (
impatient) - شماره موبایل و نشانی به شکل ایرانی، با خیابان و کوچه و پلاک (
iran_formats)
سبک گفتار را هم میشود با تلهها ترکیب کرد، مثلاً گفتار محاورهای بهاضافهٔ کاربر کمحوصله. شبیهسازی هم یک مدل برای نقش کاربر میخواهد و هم یک مدل داور، پس هر اجرایش هزینهٔ API دارد.
اگر رباتتان برای پشتیبانی فروشگاه است، پشتیبانی مشتری فروشگاه اینترنتی با هوش مصنوعی طرف دیگر همین کار را نشان میدهد: دستیاری که کمک تیم پشتیبانی است، نه جای آن.
چرا آزمون فارسی سبز میشود ولی ربات هنوز خطا دارد؟
خود مهارت چند دام را صریح گفته است. دانستنشان جلوی سبز شدن الکی را میگیرد:
- بررسیهای داوری بیصدا رد میشوند. اگر مدل داور تنظیم نکرده باشید، بررسیهای
output=وcontext=وrefuses=اجرا نمیشوند و فقط «skipped» علامت میخورند. ممکن است کل آزمون قبول شود بیآنکه این بخشها اصلاً اجرا شده باشند. خروجی را نگاه کنید. - نام ماه برابر حساب نمیشود. «۵ مهر» در پاسخ با تاریخ عددی یکی نیست، نه در
contains=و نه در آرگومان ابزار. - عدد بدون واحد، ریال حساب میشود. اگر ربات فقط «۴۵۰۰۰» بنویسد و منظورش تومان باشد، با «۴۵ هزار تومان» یکی دانسته نمیشود، چون عدد خالی در پاسخ فقط با مقدار دقیق ریالی برابر است. همین قاعده نمیگذارد شمارهٔ سفارش یا تلفن بهجای مبلغ قبول شود.
- داور را با آدم بسنجید.
JudgeCalibratorمیزان توافق داور با برچسبهای انسانی و ضریب کاپای کوهن را میدهد. پیشنهاد خود مهارت برای شروع ۳۰ تا ۵۰ نمونهٔ برچسبخورده است. - مهارت برای نسخهٔ ۰.۳ نوشته شده است. اگر نسخهٔ دیگری نصب دارید، توضیحات را با مستندات کامل ParsBench تطبیق بدهید.
اجرای آزمون فارسی در CI
دستیار نمونههای طلایی را با parametrize در pytest میگذارد تا هر نمونه یک آزمون جدا باشد. دستور parsbench test هم آرگومانهایش را به pytest میدهد.
عاملهای هوش مصنوعی پاسخ ثابت ندارند و یک اجرای موفق چیز زیادی نمیگوید. با n_runs=5 هر نمونه چند بار اجرا میشود و pass_hat_k() احتمال قبول شدن همهٔ اجراها را میدهد. میانگین قبولی ممکن است بالا باشد و این عدد پایین، و ربات واقعی با همین عدد دوم سر و کار دارد، چون هر روز کاربرهای زیادی با آن حرف میزنند.
چند نکتهٔ دیگر برای CI:
- متغیر
PARSBENCH_NO_RECORD=1را بگذارید، وگرنه هر اجرا در پوشهٔ.parsbench/پروژه ذخیره میشود. - با
result.save()نتیجه را نگه دارید و باresult.diff()اجرای تازه را با اجرای پایه مقایسه کنید. - روی کامپیوتر خودتان
parsbench viewنتیجهها را در مرورگر نشانی127.0.0.1:1404نشان میدهد: جدول نمونهها و بررسیها، دلیل داور به فارسی، بازپخش راستبهچپ شبیهسازیها و خروجی JSON و CSV و Markdown.
اگر از ایران به OpenAI دسترسی ندارید
خود مهارت میگوید OpenAI از ایران اغلب در دسترس نیست. داور ParsBench به OpenAI بسته نیست و با هر درگاه سازگار با OpenAI کار میکند:
- متغیر
PARSBENCH_JUDGEرا روی نام مدل داور بگذارید. - متغیرهای
OPENAI_BASE_URLوOPENAI_API_KEYرا به درگاهی مثل AvalAI یا OpenRouter یا Ollama روی کامپیوتر خودتان بدهید. اگر نمیخواهید این دو متغیر با تنظیمات ربات قاطی شود،PARSBENCH_JUDGE_BASE_URLوPARSBENCH_JUDGE_API_KEYمخصوص داورند. - برای دانلود دیتاستهای بنچمارک،
HF_ENDPOINTرا روی یک آینهٔ Hugging Face بگذارید.
پرامپتهای داور هم فارسیاند. یادتان باشد بررسیهای قطعی (ابزار، contains=، قالب، سقف گام) هیچ کلیدی نمیخواهند و رایگان اجرا میشوند. هزینه فقط مال داوری، شبیهسازی و ساخت نمونه از مستندات است.
بنچمارک مدل زبانی فارسی: کدام مدل فارسی را بهتر میفهمد؟
کار دوم ParsBench سنجیدن خود مدلهاست، نه ربات شما. به درد وقتی میخورد که هنوز مدل ربات را انتخاب نکردهاید یا مدلی را برای فارسی تنظیم دقیق (fine-tune) کردهاید. سه نوع مدل را میشود سنجید: هر API سازگار با OpenAI (از جمله Ollama)، مدلهای Anthropic و هر مدل Hugging Face، از جمله مدلی که خودتان تنظیم کردهاید.
سیزده بنچمارک فارسی آماده است:
- شش کار از ParsiNLU: تحلیل احساس، استنتاج، ترجمهٔ انگلیسی به فارسی و فارسی به انگلیسی، پرسش چندگزینهای و درک مطلب
- Persian MMLU (چالش خیام)
- شناسایی موجودیتهای نامدار (PersianNER)
- ریاضی فارسی (PersianMath)، که بستهٔ جداگانهای از مخزن hendrycks/math هم لازم دارد
- استنتاج در ConjNLI و FarsTail
- خلاصهسازی خبر فارسی و XLSummary
از دستیار بخواهید چند مدل را روی همینها اجرا کند. نتیجه به شکل جدول رتبهبندی (pandas) و نمودار راداری یا میلهای میآید. همین ابزار پشت جدول رتبهبندی ParsBench در Hugging Face است، پس پیش از اجرای خودتان نگاهی هم به آن بیندازید.
پیش از نصب اینها را بدانید
- کتابخانه و مهارت را خود پروژهٔ ParsBench با مجوز Apache-2.0 در یک مخزن منتشر کرده است.
- دستیار با این مهارت کد آزمون مینویسد و در پروژهٔ شما اجرا میکند، پس مثل هر کد دیگری پیش از اجرا نگاهش کنید. بررسیهای داوری و شبیهسازی هم متن گفتگوها را برای مدل داور میفرستند؛ درگاه آن را خودتان انتخاب میکنید.
- این مهارت برای دستیارهایی است که در پروژهٔ شما کد مینویسند و اجرا میکنند. چون سرور MCP نیست، در اتصال دستیار و روتر بازارچه هم نمیآید.
اگر ربات فارسیتان آزمون ندارد یا آزمونهایش سر ریال و تومان بیدلیل قرمز میشوند، مهارت ارزیابی چتبات فارسی را دریافت کنید و اولین درخواست را برای یک نمونهٔ طلایی ساده بفرستید.
سؤالهای پرتکرار
برای تست چتبات فارسی با ParsBench چه چیزهایی باید نصب کنم؟
دو چیز جدا. اول خود مهارت، با دستور npx skills add ParsBench/ParsBench که آن را برای پروژهٔ فعلی نصب میکند (بدون npx، پوشهٔ skills/parsbench مخزن را در پوشهٔ مهارتهای دستیار کپی کنید؛ در Claude Code یعنی پوشهٔ .claude/skills). دوم کتابخانهٔ پایتون با pip install parsbench که پایتون ۳.۱۲ یا ۳.۱۳ میخواهد.
این مهارت در کدام برنامهها کار میکند؟
راهنمای ParsBench از Claude Code، Cursor، Codex و Gemini CLI نام میبرد و میگوید در هر دستیاری که از استاندارد Agent Skills پشتیبانی کند کار میکند. کار مهارت نوشتن و اجرای کد پایتون در پروژهٔ شماست، پس برای دستیارهای برنامهنویسی ساخته شده است. راهنمای سازنده روش جداگانهای برای ChatGPT یا claude.ai نمیدهد.
برای اجرای آزمونها کلید API لازم است؟
برای بررسیهای قطعی نه: ابزاری که ربات صدا زده، آرگومانهایش، عبارتهایی که باید یا نباید در پاسخ باشد، قالب خروجی و سقف گام و زمان بدون هیچ کلیدی اجرا میشوند. بررسیهایی که به داور نیاز دارند (درستی کلی پاسخ، وفاداری به متن مرجع، رد کردن درخواست) و شبیهسازی گفتگو یک مدل زبانی و کلید آن را لازم دارند و هزینهٔ API دارند.
آیا ParsBench «۵ مهر» را با تاریخ میلادی برابر میداند؟
نه. فقط تاریخهای عددی برابر دانسته میشوند، مثل ۱۴۰۵/۰۷/۰۵ و 2026-09-27. اگر در آزمون انتظار دارید ربات «۵ مهر» بنویسد، بررسی contains آن را با تاریخ عددی یکی نمیداند. خود مهارت هم توصیه میکند برای نام ماه آزمون ننویسید و آن را به شبیهساز کاربر بسپارید.
از ایران به OpenAI دسترسی ندارم؛ داور آزمون را چه کنم؟
داور ParsBench با هر درگاه سازگار با OpenAI کار میکند. متغیر PARSBENCH_JUDGE را روی نام مدل بگذارید و OPENAI_BASE_URL و OPENAI_API_KEY را به درگاهی مثل AvalAI یا OpenRouter یا Ollama محلی بدهید. برای دیتاستهای بنچمارک هم HF_ENDPOINT را روی یک آینهٔ Hugging Face بگذارید.
ParsBench با سرور MCP چه فرقی دارد؟
این یک مهارت (Agent Skill) است، نه سرور MCP. به دستیار روش نوشتن آزمون با کتابخانهٔ ParsBench را یاد میدهد و به سرویس زندهای وصلش نمیکند. برای همین در روتر MCP بازارچه نیست و آن را از صفحهٔ خودش دریافت میکنید.
