| فایل اولیهی سؤال را میتوانید از [این لینک](/contest/assignments/103148/download_problem_initial_project/355597/) دانلود کنید. |
|:------------------------------------------------------------------------:|
شرکت «Violeta» دستیار خانهی هوشمندی ساخته است که کاربران با جملههای انگلیسیِ طبیعی آن را کنترل میکنند. یک کاربر ممکن است بگوید «Turn on the lights in all the bedrooms» و کاربر دیگری فقط بگوید «Turn on the light here».
تبدیل چنین جملههایی به یک عمل دقیق، تنها تشخیص چند کلمه نیست. سامانه باید بداند کدام اتاقها واقعاً در خانه هستند، هر اتاق چه دستگاهها و قابلیتهایی دارد، وضعیت فعلی آنها چیست و منظور «here» کدام اتاق است. همچنین نباید درخواست نامعتبر یا خارج از حوزه را بهزور به یک فرمان قابل اجرا تبدیل کند.
شما باید سامانهای بسازید که برای هر فرمان، با توجه به نقشه و وضعیت همان خانه، یک شیء JSON ساختارمند تولید کند.
## دادهها
پروژهی اولیه ساختار زیر را دارد:
```
train/
├── homes/
│ ├── home_000001.txt
│ └── ...
└── instructions.jsonl
test/
├── homes/
│ ├── home_000601.txt
│ └── ...
└── instructions.jsonl
```
هر خط از `test/instructions.jsonl` فقط شامل فیلدهای `home` و `input` است و فیلد `output` ندارد.
نمونهای واقعی از دادهی آموزش:
```
{"home":"home_000001","input":{"instruction":"turn on every light in the bedrooms"},"output":{"action":"turn_on","target":"light","target_type":"capability","scope":"room_type","room_id":null,"room_label":null,"room_type":"bedroom","value":1,"exclude_room_id":null,"status":"ok"}}
```
### نقشهی خانه
```
------ SMART HOME
{BED} 🛏 {SOFA} 🛋 {TBLE} 🍽 {CHR} 🪑
{CLST} 🚪 {CAB} 🗄 {SHELF} 📚 {DSK} 🗂
{SINK} 🚰 {TLT} 🚽 {SHWR} 🚿 {WHTR} ♨
{FRDG} 🧊 {STOV} 🍳 {MWVE} 🍲 {DWSR} 🧼
{WSHR} 🫧 {DRYR} 👕 {BASK} 🧺 {VAC} 🤖
{TV} 📺 {SPKR} 🔊 {MON} 🖥 {PC} 💻
{PRNT} 🖨 {CAM} 📹 {CHRG} 🔌 {CAR} 🚗
{TOOL} 🔧 {BOX} 📦 {BAG} 🧳 {PLNT} 🪴
──────────────────────────────
STATUS DEFINITIONS
──────────────────────────────
TIME:hh:mm → Current time of the home (24-hour format)
H → Human presence detected in the room
L:<0|1> → Light (0: Off, 1: On)
C:<0|1> → Curtain (0: Closed, 1: Open)
AC:<0|1> → Air Conditioner (0: Off, 1: On)
H:<0|1> → Heater (0: Off, 1: On)
F:<0|1> → Fan (0: Off, 1: On)
W:<0|1> → Window (0: Closed, 1: Open)
T:<°C> → Room temperature in Celsius (e.g. T:19.3)
D:<| / \> → Door orientation only; not controllable
Smart Device format: {DEVICE:0|1} e.g. {TV:0} → TV is off, controllable
Furniture format: {FURNITURE} e.g. {BED} → static object, not controllable
──────────────────────────────
SMART HOME LAYOUT
──────────────────────────────
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ GLOBAL │
│ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ TIME:21:07 │ │
│ └─────────────────────────────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│ GUEST ROOM │ LIVING ROOM │ MASTER BEDROOM │
│ room_01 │ room_02 │ room_04 │
│ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │
│ │ {BED} {BAG} │ │ │ {SOFA} {TBLE} {TV:0} │ │ │ {BED} {CLST} {TV:0} │ │
│ │ L:0 T:19.3 C:0 AC:0 H:0 │ │ │ {SPKR:0} │ │ │ L:1 T:19.2 C:0 AC:0 H:0 │ │
│ │ F:1 W:0 │ │ │ L:1 T:19.9 C:1 AC:0 H:0 │ │ │ F:0 W:0 │ │
│ └────────────┬────────────┘ │ │ F:1 W:1 │ │ └────────────┬────────────┘ │
│ D:| │ └────────────┬────────────┘ │ D:\ │
│ │ D:\ │ │
├─────────────────────────────┼─────────────────────────────┼─────────────────────────────┤
│ BATHROOM #1 │ BEDROOM #1 │ STORAGE │
│ room_05 │ room_06 │ room_07 │
│ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │
│ │ {TLT} {SINK} {SHWR:0} │ │ │ {BED} {CLST} │ │ │ {BOX} {SHELF} │ │
│ │ L:0 T:19.2 H:0 F:0 │ │ │ L:0 T:20.9 C:0 AC:0 H:0 │ │ │ L:1 T:21.1 W:0 H │ │
│ │ │ │ │ F:0 W:0 │ │ │ │ │
│ └────────────┬────────────┘ │ └────────────┬────────────┘ │ └────────────┬────────────┘ │
│ D:\ │ D:/ │ D:\ │
├─────────────────────────────┼─────────────────────────────┼─────────────────────────────┤
│ BALCONY │ KITCHEN │ DINING │
│ room_08 │ room_09 │ room_10 │
│ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │ ┌─────────────────────────┐ │
│ │ {CHR} {PLNT} │ │ │ {CAB} {SINK} {FRDG:1} │ │ │ {TBLE} {CHR} │ │
│ │ L:0 T:19.5 │ │ │ {STOV:0} │ │ │ L:0 T:19.8 C:1 AC:0 H:0 │ │
│ │ │ │ │ L:0 T:21.1 AC:0 F:0 W:0 │ │ │ F:0 W:0 │ │
│ └────────────┬────────────┘ │ └────────────┬────────────┘ │ └────────────┬────────────┘ │
│ D:/ │ D:\ │ D:\ │
├─────────────────────────────┴─────────────────────────────┴─────────────────────────────┤
│ GARAGE + WORKSHOP │
│ room_03 │
│ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ {CAR} {TOOL} {CHRG:1} │ │
│ │ L:0 T:21.3 F:0 P:1 │ │
│ │ │ │
│ └──────────────────────────────────────────┬──────────────────────────────────────────┘ │
│ D:\ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
```
### معنای نشانههای وضعیت
| نشانه | معنا
| ------------ | ------------------------------------------------------|
| `L:0,1` | چراغ؛ ۰ خاموش و ۱ روشن
| `C:0,1` | پرده؛ ۰ بسته و ۱ باز
| `AC:0,1` | کولر؛ ۰ خاموش و ۱ روشن
| `H:0,1` | بخاری؛ با `H` تنها که نشانگر حضور انسان است اشتباه نگیرید|
| `F:0,1` | پنکه؛ ۰ خاموش و ۱ روشن
| `W:0,1` | پنجره؛ ۰ بسته و ۱ باز
| `T:<number>` | دمای اتاق بر حسب سلسیوس
| `H` | حضور کاربر در اتاق
### فرمانهای پشتیبانیشده
عملهای مجاز فقط `turn_on`، `turn_off`، `open` و `close` هستند. مقدار `value` برای `turn_on` و `open` برابر عدد `1` و برای `turn_off` و `close` برابر عدد `0` است.
قابلیتها و نامهای گفتاری آنها:
| `target` | عمل مجاز | نمونه نام در فرمان |
| ----------------- | ---------- | ---------------------------------------------- |
| `light` | روشن/خاموش | light, lights, lamp |
| `curtain` | باز/بسته | curtain, curtains, blinds, drapes |
| `air_conditioner` | روشن/خاموش | AC, air conditioner, air conditioning, cooling |
| `heater` | روشن/خاموش | heater, heating |
| `fan` | روشن/خاموش | fan |
| `window` | باز/بسته | window, windows |
دستگاههای قابلکنترل و نامهای گفتاری آنها:
| `target` | نمونه نام در فرمان |
| -------- | ------------------------------- |
| `TV` | TV, television |
| `SPKR` | speaker, speakers, sound system |
| `MON` | monitor |
| `PC` | computer, PC, desktop |
| `PRNT` | printer |
| `CAM` | camera, security camera |
| `CHRG` | charger, EV charger |
| `VAC` | vacuum, robot vacuum |
| `STOV` | stove, cooktop |
| `MWVE` | microwave |
| `DWSR` | dishwasher |
| `WSHR` | washer, washing machine |
| `DRYR` | dryer |
| `SHWR` | shower |
| `WHTR` | water heater |
همهی دستگاههای جدول بالا فقط با `turn_on` و `turn_off` کنترل میشوند. کد `FRDG` در نقشه ممکن است دیده شود، اما target معتبری نیست.
فرمانها میتوانند با فعلها و عبارتهای گوناگون بیان شوند. برای نمونه، `switch on`، `power on`، `flip on`، `kick on` و `activate` هممعنی روشنکردن هستند؛ `power off`، `shut off`، `kill`، `cut`، `deactivate` و `shut down` هممعنی خاموشکردناند. همچنین عبارتهایی مانند `pull open`، `crack open` و `slide open` برای بازکردن و `shut`، `draw closed` و `slide closed` برای بستن بهکار میروند.
نام اتاق نیز ممکن است با صورتهای گوناگون بیاید؛ برای مثال `master bedroom` یا `main bedroom`، `garage` یا `workshop`، `dining area`، `laundry` و شمارهگذاریهایی مانند `bedroom 2`، `bedroom number 2` و `second bedroom`.
عبارتهای ارجاعی مانند `here`، `in here`، `this room`، `current room`، `my room`، `where I am` و `next to me` همگی به اتاقی اشاره میکنند که نشانگر `H` تنها در آن دیده میشود. (فقط یک H میتواند در خانه باشد)
فرمانها در چند الگوی زیر تولید شدهاند:
+ فرمان برای یک اتاق مشخص یا اتاق فعلی کاربر؛ مانند `turn on the TV in the living room` یا `switch on the AC in here`.
+ فرمان ضمنیِ آسایش: گرما به کولر یا پنکه، سرما به بخاری، هوای گرفته به بازکردن پنجره، آفتاب شدید به بستن پرده، تاریکی به روشنکردن چراغ و نور آزاردهنده به خاموشکردن چراغ نگاشت میشود.
+ فرمان فعالیتمحور نیز وجود دارد. این فرمانها، در صورت وجود دستگاه مناسب، همگی به `turn_on` یک دستگاه نگاشت میشوند:
| مفهوم فرمان | `target` | نوع اتاق |
| --------------------------- | -------- | ------------------------------ |
| آشپزی | `STOV` | kitchen |
| کارکردن | `PC` | office |
| دوشگرفتن یا نیاز به آب گرم | `WHTR` | bathroom |
| لباسشستن | `WSHR` | laundry |
| خشککردن لباس | `DRYR` | laundry |
| جاروکردن | `VAC` | living_room |
| موسیقی | `SPKR` | bedroom، living_room یا dining |
| تماشای فیلم یا تلویزیون | `TV` | bedroom یا living_room |
| چاپکردن | `PRNT` | office |
| شستن ظرفها | `DWSR` | kitchen |
| گرمکردن غذا | `MWVE` | kitchen |
| شارژ خودرو | `CHRG` | garage_workshop |
1. «همهچیز» در یک اتاق: اگر کاربر بخواهد همهچیزِ یک اتاق روشن یا خاموش شود، `target` و `target_type` را `all` و `scope` را `room` قرار دهید. منظور از «همهچیز» فقط قابلیتها و دستگاههای قابلکنترلِ همان اتاق است؛ وسایل ثابت و یخچال (`FRDG`) شامل آن نمیشوند.
2. چراغهای همهی اتاقهای یک نوع: این فرمان فقط برای اتاقهای `bedroom` و `bathroom` تولید میشود، آن هم وقتی حداقل دو اتاق از آن نوع در خانه وجود داشته باشد. در این حالت `target=light` و `scope=room_type` است.
3. چراغهای کل خانه: برای روشن یا خاموشکردن همهی چراغهای خانه، `target=light` و `scope=home` است.
4. خاموشکردن همهچیز در کل خانه: برای خاموشکردن همهی قابلیتها و دستگاههای قابلکنترلِ خانه، `target=all`، `scope=home` و `action=turn_off` است. این فرمان شامل وسایل ثابت و یخچال نمیشود.
5. خاموشکردن چراغها بهجز اتاق فعلی کاربر: در این فرمان `target=light`، `scope=home` و `exclude_room_id` برابر شناسهی اتاقی است که در آن `H` دیده میشود.
### وضعیتهای خطا و تکرار
اگر هدف درخواستی از قبل در وضعیت مطلوب باشد، `status` برابر `already_in_state` است؛ بااینحال بقیهی فیلدها همان فرمان تفسیرشده را نگه میدارند. برای فرمان گروهی، این وضعیت فقط زمانی رخ میدهد که **همهی** اعضای گروه در وضعیت مطلوب باشند.
در موارد زیر نیز خروجی دقیقاً از الگوی ژنراتور پیروی میکند:
| وضعیت | شرایط | فیلدهای خروجی |
| ---------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `not_found` | اتاق وجود دارد، اما قابلیت یا دستگاه هدف در آن نیست | `action`، `target`، `target_type`، `scope=room`، `room_id`، `room_label` و `value` پر میشوند؛ `room_type` و `exclude_room_id` برابر `null` هستند. |
| `room_not_found` | نام اتاقی آمده که در این خانه وجود ندارد | `action`، `target`، `target_type`، `scope=room` و `value` پر میشوند؛ `room_id`، `room_label`، `room_type` و `exclude_room_id` برابر `null` هستند. |
| `ambiguous_room` | نام یک نوع اتاقِ چندتایی، بدون شماره یا مشخصکننده، آمده است | `action`، `target`، `target_type`، `scope=room`، `room_type` و `value` پر میشوند؛ `room_id`، `room_label` و `exclude_room_id` برابر `null` هستند. |
| `out_of_domain` | پرسش وضعیت، زمان/هوا، زمانبندی، سطح و دما، قفل/آلارم، یا هر درخواست پشتیبانینشده | همهی فیلدها بهجز `status` برابر `null` هستند و `status=out_of_domain` است. |
## قالب خروجی
خروجی هر دستور باید دقیقاً کلیدهای زیر را داشته باشد:
```
{
"action": "turn_on | turn_off | open | close | null",
"target": "light | curtain | air_conditioner | heater | fan | window | power | TV | SPKR | MON | PC | PRNT | CAM | CHRG | VAC | STOV | MWVE | DWSR | WSHR | DRYR | SHWR | WHTR | all | null",
"target_type": "capability | device | all | null",
"scope": "room | room_type | home | null",
"room_id": "string | null",
"room_label": "string | null",
"room_type": "string | null",
"value": "integer 0 | integer 1 | null",
"exclude_room_id": "string | null",
"status": "ok | already_in_state | not_found | room_not_found | ambiguous_room | out_of_domain"
}
```
برای `scope=room`، معمولاً `room_id` و `room_label` پر و `room_type` تهی است. برای `scope=room_type` فقط `room_type` پر است. برای `scope=home`، `room_id`، `room_label` و `room_type` تهی هستند؛ تنها استثنا فرمان «بهجز اینجا» است که `exclude_room_id` را پر میکند.
## مأموریت شما
با استفاده از دادههای train سامانهای طراحی کنید؛ میتوانید از مدل یادگیری ماشین، روش قاعدهمحور یا ترکیبی از آنها استفاده کنید.
برای هر ردیف از فایل فرمانهای test:
1. خانهی معرفیشده در فیلد `home` را از پوشهی `test/homes/` بخوانید.
2. متن `input.instruction` را تفسیر کنید.
3. خروجی را دقیقاً با شِمای JSON مشخصشده تولید کنید.
فرمانها به انگلیسی هستند و میتوانند با عبارتهای گوناگون، لحن محاورهای، حروف بزرگ و کوچک متفاوت یا سؤال مؤدبانه بیان شوند.
## محدودیت ها
- استفاده از api برای استفاده از LLM مجاز نیست
- استفاده از مدل های کلوز سورس مجاز نیست
- استفاده از مدل های بزرگ تر از 1B مجاز نیست
## موارد مجاز
- استفاده از مدل های پریترین و اپن سورس
- استفاده از کولب و کگل
## نحوهی ارسال
یک فایل `submission.csv` بسازید که دقیقاً این سرستونها را، به همین ترتیب، داشته باشد:
```
action,target,target_type,scope,room_id,room_label,room_type,value,exclude_room_id,status
```
هر ردیف از این فایل مربوط به یک ردیف از `test/instructions.jsonl` است؛ بنابراین تعداد و ترتیب ردیفهای `submission.csv` باید دقیقاً با فایل test یکسان باشد.
برای مثال:
```
action,target,target_type,scope,room_id,room_label,room_type,value,exclude_room_id,status
turn_on,light,capability,room_type,,,bedroom,1,,ok
```
دو فایل زیر را مستقیماً در ریشهی `submission.zip` قرار دهید:
```
submission.zip
├── notebook.ipynb
└── submission.csv
```
نوتبوک باید تمام مراحل کار را نگه دارد: بررسی داده، پاکسازی، مهندسی ویژگی، آموزش مدل و ارزیابی. هنگامی که نوتبوک با گزینهٔ Run All اجرا میشود، باید بدون هیچ خطایی اجرا شده و در پایان، فایل ارسال (submission) را تولید کند.
## معیار ارزیابی
برای ارزیابی این سؤال، از معیار **تطابق کامل (Exact Match)** استفاده میشود. به این معنا که یک پیشبینی تنها در صورتی صحیح در نظر گرفته میشود که مقادیر تمامی ۱۰ فیلد (`action`، `target`، `target_type`، `scope`، `room_id`، `room_label`، `room_type`، `value`، `exclude_room_id` و `status`) در یک ردیف، کاملاً با مقادیر واقعی مطابقت داشته باشند.
امتیاز نهایی، درصد ردیفهایی است که تمامی فیلدهای آنها بهدرستی پیشبینی شدهاند:
$$ \mathrm{Score} = \left( \frac{\text{Total Correct Rows}}{\text{Total Rows}} \right) \times 100 $$
حداقل نمره برای این سؤال ۳۰ از ۱۰۰ است.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.