// ExamSim exam file (format 2). Pure JSON inside ExamSim.register(...); validate with: node tools/validate-exam.js demo.exam ExamSim.register({ "format": 2, "id": "demo", "code": "DEMO", "title": { "en": "Engine Demo — all question types", "it": "Demo del motore — tutti i tipi di domanda" }, "description": { "en": "A tiny exam that shows every question type, localized content, difficulty levels and custom modes.", "it": "Un piccolo esame che mostra ogni tipo di domanda, contenuti localizzati, livelli di difficoltà e modalità personalizzate." }, "version": "1.0", "settings": { "passThreshold": 70, "timePerQuestionSec": 45 }, "topics": { "basics": { "en": "Basics", "it": "Fondamenti" }, "network": { "en": "Networking", "it": "Reti" }, "scenarios": { "en": "Scenarios", "it": "Scenari" } }, "modes": [ { "id": "quick", "name": { "en": "Quick check (6 questions)", "it": "Verifica rapida (6 domande)" }, "selection": "balanced", "count": 6 }, { "id": "mock", "name": { "en": "Mini exam (10 questions, 5 min)", "it": "Mini esame (10 domande, 5 min)" }, "selection": "weighted", "exam": true, "count": 10, "timeSec": 300, "passThreshold": 60, "groups": [ { "topics": ["basics"], "weight": 4 }, { "topics": ["network"], "weight": 4 }, { "topics": ["scenarios"], "weight": 2 } ] }, { "id": "strict", "name": { "en": "Strict mini exam (1 pause, clock keeps running)", "it": "Mini esame rigoroso (1 pausa, il tempo scorre)" }, "selection": "random", "exam": true, "count": 6, "timeSec": 120, "passThreshold": 60, "pauses": 1, "strictTime": true, "scoring": { "partialCredit": true, "wrongPenalty": 0.25 } } ], "questions": [ { "id": 1, "topic": "basics", "type": "single", "difficulty": 1, "tags": ["ai"], "source": "Engine demo", "text": { "en": "Which approach learns from labeled examples?", "it": "Quale approccio impara da esempi etichettati?" }, "options": [ { "en": "Supervised learning", "it": "Apprendimento supervisionato" }, { "en": "Unsupervised learning", "it": "Apprendimento non supervisionato" }, { "en": "Reinforcement learning", "it": "Apprendimento per rinforzo" }, { "en": "Random search", "it": "Ricerca casuale" } ], "answer": [0], "explanation": { "en": "Supervised learning uses labeled data.", "it": "L'apprendimento supervisionato usa dati etichettati." } }, { "id": 2, "topic": "basics", "type": "multiple", "difficulty": 2, "text": { "en": "Which TWO are components of a RAG pipeline?", "it": "Quali DUE sono componenti di una pipeline RAG?" }, "options": [ { "en": "Embedding model", "it": "Modello di embedding" }, { "en": "Vector index", "it": "Indice vettoriale" }, { "en": "RAID controller", "it": "Controller RAID" }, { "en": "DNS server", "it": "Server DNS" } ], "answer": [0, 1], "explanation": { "en": "RAG needs embeddings and a vector index to retrieve context.", "it": "RAG richiede embedding e un indice vettoriale per recuperare il contesto." }, "mandatory": true }, { "id": 3, "topic": "basics", "type": "truefalse", "difficulty": 1, "text": { "en": "Inference means running a trained model on new inputs.", "it": "Inferenza significa eseguire un modello addestrato su nuovi input." }, "answer": true, "explanation": { "en": "Correct: inference uses a trained model to produce predictions.", "it": "Corretto: l'inferenza usa un modello addestrato per produrre predizioni." } }, { "id": 4, "topic": "basics", "type": "truefalse", "difficulty": 1, "text": { "en": "Fine-tuning always requires training from scratch.", "it": "Il fine-tuning richiede sempre di addestrare da zero." }, "answer": false, "explanation": { "en": "Fine-tuning adapts a pretrained model.", "it": "Il fine-tuning adatta un modello già addestrato." } }, { "id": 5, "topic": "network", "type": "ordering", "difficulty": 2, "text": { "en": "Put the RAG steps in the correct order.", "it": "Metti nell'ordine corretto i passaggi di RAG." }, "items": [ { "en": "Embed the user query", "it": "Calcola l'embedding della domanda" }, { "en": "Retrieve relevant passages", "it": "Recupera i passaggi rilevanti" }, { "en": "Rerank the candidates", "it": "Riordina i candidati" }, { "en": "Generate the answer", "it": "Genera la risposta" } ], "explanation": { "en": "Embed → retrieve → rerank → generate.", "it": "Embedding → recupero → riordino → generazione." } }, { "id": 6, "topic": "network", "type": "matching", "difficulty": 2, "text": { "en": "Match each port with its role in multi-node inference.", "it": "Abbina ogni porta al suo ruolo nell'inferenza multi-nodo." }, "pairs": [ { "left": "6379", "right": "Ray GCS" }, { "left": "29500", "right": { "en": "vLLM coordination", "it": "Coordinamento vLLM" } }, { "left": "8080", "right": { "en": "Inference API / health", "it": "API di inferenza / health" } } ], "explanation": { "en": "6379 Ray GCS, 29500 vLLM coordination, 8080 inference API.", "it": "6379 Ray GCS, 29500 coordinamento vLLM, 8080 API di inferenza." } }, { "id": 7, "topic": "network", "type": "numeric", "difficulty": 2, "text": { "en": "Pipeline parallelism = 2 and tensor parallelism = 4. How many GPUs are required?", "it": "Pipeline parallelism = 2 e tensor parallelism = 4. Quante GPU servono?" }, "answer": { "value": 8, "unit": "GPU" }, "explanation": { "en": "GPUs = PP × TP = 8.", "it": "GPU = PP × TP = 8." } }, { "id": 8, "topic": "network", "type": "numeric", "difficulty": 3, "text": { "en": "A link carries 400 Gb/s. How many GB/s is that (approximately, 1 byte = 8 bits)?", "it": "Un collegamento da 400 Gb/s. Quanti GB/s sono (circa, 1 byte = 8 bit)?" }, "answer": { "value": 50, "tolerance": 1, "unit": "GB/s" }, "explanation": { "en": "400 / 8 = 50 GB/s.", "it": "400 / 8 = 50 GB/s." } }, { "id": 9, "topic": "network", "type": "single", "difficulty": 3, "text": { "en": "A distributed workload scales badly when nodes are added. What should be investigated first?", "it": "Un workload distribuito scala male aggiungendo nodi. Cosa va verificato per primo?" }, "options": [ { "en": "Interconnect bandwidth and latency", "it": "Banda e latenza dell'interconnessione" }, { "en": "The color of the racks", "it": "Il colore dei rack" }, { "en": "The user's browser", "it": "Il browser dell'utente" }, { "en": "The DNS suffix", "it": "Il suffisso DNS" } ], "answer": [0], "explanation": { "en": "Communication between nodes is the usual bottleneck.", "it": "La comunicazione tra nodi è di solito il collo di bottiglia." } }, { "id": 10, "topic": "scenarios", "type": "scenario", "difficulty": 3, "text": { "en": "Private AI platform scenario", "it": "Scenario piattaforma AI privata" }, "context": { "en": "A customer wants RAG over confidential documents, several independent AI teams, and an air-gapped deployment. Expected load: 100 concurrent users.", "it": "Un cliente vuole RAG su documenti riservati, più team AI indipendenti e un deployment air-gapped. Carico atteso: 100 utenti concorrenti." }, "parts": [ { "text": { "en": "Which mechanism separates the teams?", "it": "Quale meccanismo separa i team?" }, "options": [ { "en": "Projects with quotas and RBAC", "it": "Progetti con quote e RBAC" }, { "en": "One shared namespace", "it": "Un unico namespace condiviso" } ], "answer": [0] }, { "text": { "en": "The deployment is air-gapped: true or false — models can be pulled directly from the public registry.", "it": "Il deployment è air-gapped: vero o falso — i modelli si possono scaricare direttamente dal registry pubblico." }, "type": "truefalse", "answer": false }, { "text": { "en": "How many teams share the platform if each of the 4 projects has one team?", "it": "Quanti team condividono la piattaforma se ognuno dei 4 progetti ha un team?" }, "type": "numeric", "answer": 4 } ], "explanation": { "en": "All three parts must be right.", "it": "Tutte e tre le parti devono essere corrette." } }, { "id": 11, "topic": "scenarios", "type": "single", "difficulty": 2, "text": "Which GPU memory component is shared across a project quota? (plain-string question)", "options": [ "None — quotas count GPUs, not memory", "HBM only, attached to each GPU", "System RAM of the host server", "NVLink bandwidth between GPUs" ], "answer": [0], "explanation": "Quotas are expressed in GPUs." }, { "id": 12, "topic": "scenarios", "type": "multiple", "difficulty": 3, "text": "Select THREE prerequisites of an air-gapped NIM deployment.", "options": [ "Private registry holds the NIM image", "NIM profiles are in a local S3 bucket", "isAirGapped=true", "Direct access to the public registry", "Internet access from the cluster" ], "answer": [0, 1, 2], "explanation": "Image in a private registry, profiles in local S3, isAirGapped=true." }, { "id": 13, "topic": "basics", "type": "single", "difficulty": 2, "tags": ["rich"], "text": { "en": "Look at the diagram.\n\n![RAG flow](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgOTAiPjxyZWN0IHg9IjQiIHk9IjIwIiB3aWR0aD0iODAiIGhlaWdodD0iNTAiIHJ4PSI4IiBmaWxsPSIjZTNmN2YxIiBzdHJva2U9IiMwMGE2N2UiIHN0cm9rZS13aWR0aD0iMyIvPjx0ZXh0IHg9IjQ0IiB5PSI1MSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMGYxNzJhIj5RdWVyeTwvdGV4dD48cGF0aCBkPSJNODQgNDVoNDAiIHN0cm9rZT0iIzAwYTY3ZSIgc3Ryb2tlLXdpZHRoPSIzIi8+PHJlY3QgeD0iMTI0IiB5PSIyMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2UzZjdmMSIgc3Ryb2tlPSIjMDBhNjdlIiBzdHJva2Utd2lkdGg9IjMiLz48dGV4dCB4PSIxNjQiIHk9IjUxIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwZjE3MmEiPlJldHJpZXZlPC90ZXh0PjxwYXRoIGQ9Ik0yMDQgNDVoNDAiIHN0cm9rZT0iIzAwYTY3ZSIgc3Ryb2tlLXdpZHRoPSIzIi8+PHJlY3QgeD0iMjQ0IiB5PSIyMCIgd2lkdGg9IjcyIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2UzZjdmMSIgc3Ryb2tlPSIjMDBhNjdlIiBzdHJva2Utd2lkdGg9IjMiLz48dGV4dCB4PSIyODAiIHk9IjUxIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwZjE3MmEiPkxMTTwvdGV4dD48L3N2Zz4=)\n\nWhich component is missing between the retriever and the user's answer?", "it": "Osserva lo schema.\n\n![Flusso RAG](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgOTAiPjxyZWN0IHg9IjQiIHk9IjIwIiB3aWR0aD0iODAiIGhlaWdodD0iNTAiIHJ4PSI4IiBmaWxsPSIjZTNmN2YxIiBzdHJva2U9IiMwMGE2N2UiIHN0cm9rZS13aWR0aD0iMyIvPjx0ZXh0IHg9IjQ0IiB5PSI1MSIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXNpemU9IjE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMGYxNzJhIj5RdWVyeTwvdGV4dD48cGF0aCBkPSJNODQgNDVoNDAiIHN0cm9rZT0iIzAwYTY3ZSIgc3Ryb2tlLXdpZHRoPSIzIi8+PHJlY3QgeD0iMTI0IiB5PSIyMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2UzZjdmMSIgc3Ryb2tlPSIjMDBhNjdlIiBzdHJva2Utd2lkdGg9IjMiLz48dGV4dCB4PSIxNjQiIHk9IjUxIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwZjE3MmEiPlJldHJpZXZlPC90ZXh0PjxwYXRoIGQ9Ik0yMDQgNDVoNDAiIHN0cm9rZT0iIzAwYTY3ZSIgc3Ryb2tlLXdpZHRoPSIzIi8+PHJlY3QgeD0iMjQ0IiB5PSIyMCIgd2lkdGg9IjcyIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2UzZjdmMSIgc3Ryb2tlPSIjMDBhNjdlIiBzdHJva2Utd2lkdGg9IjMiLz48dGV4dCB4PSIyODAiIHk9IjUxIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwZjE3MmEiPkxMTTwvdGV4dD48L3N2Zz4=)\n\nQuale componente manca tra il recupero e la risposta all'utente?" }, "options": [ "Embedding of the **answer**", "The **LLM** that generates the answer", "`DROP TABLE` statement", "Tape drive" ], "answer": [1], "explanation": { "en": "The **LLM** generates the final answer from the retrieved context.\n\n```python\ncontext = retrieve(query)\nanswer = llm(query, context)\n```", "it": "L'**LLM** genera la risposta finale dal contesto recuperato." } }, { "id": 14, "topic": "network", "type": "numeric", "difficulty": 2, "tags": ["rich", "math"], "text": "A model has $P = 70 \\times 10^{9}$ parameters stored in 16-bit (2 bytes) format. How many GB of memory do the weights alone need?\n\n$$\\text{GB} = \\frac{P \\times 2}{10^{9}}$$", "answer": { "value": 140, "tolerance": 1, "unit": "GB" }, "explanation": "70e9 × 2 bytes = 140 GB." }, { "id": 15, "topic": "basics", "type": "single", "difficulty": 1, "tags": ["rich"], "text": "Which row of the table is correct?\n\n| Config | GPUs |\n|---|---|\n| Developer | 2 |\n| Medium | 8 |\n| Large | 16 |\n\nPick the largest configuration:", "options": ["Developer", "Medium", "Large", "Small"], "answer": [2], "explanation": "Large has 16 GPUs in this made-up table." } ] });