enunciados + leetcode
Enunciados como los de una entrevista real para resolver por tu cuenta, con el tiempo que te darían, y problemas de LeetCode recomendados para cada tecnología y seniority. Nada se corrige acá: resolvelo en tu editor, en voz alta, y marcá lo que ya practicaste.
El equipo quiere cambiar el prompt de un extractor que, dado un email, devuelve { intent: "refund" | "question" | "complaint", orderId: string | null }. Tenés un dataset de 20 casos { input: string, expected: { intent, orderId } } y dos variantes de prompt. El modelo es un mock determinístico model(prompt, input) con respuestas pregrabadas por variante y caso, y algunas respuestas son JSON inválido.
Construí un harness que corra las dos variantes sobre todo el dataset con concurrencia limitada, puntúe cada salida y genere un reporte comparativo: accuracy de intent, exact match de orderId, tasa de JSON inválido, latencia p50 y p95, y la lista de casos donde una variante acierta y la otra no.
# requisitos
# si te sobra tiempo, te van a preguntar
expected exacto? ¿Qué riesgos tiene usar un LLM como juez?Tu producto llama a dos proveedores de LLM. Cada uno se expone como provider.complete(request): Promise<Response> y puede fallar con { status: 429, retryAfterMs }, { status: 500 } o un timeout. Te dan mocks configurables para simular cada falla.
Implementá LlmClient.complete(request) que use el proveedor primario, reintente con backoff exponencial y jitter los errores transitorios, respete retryAfterMs en los 429, caiga al proveedor secundario cuando el primario no responde y abra un circuit breaker por proveedor tras 5 fallas consecutivas, que se mantenga abierto 30 segundos antes de probar con una sola request (half-open).
# requisitos
# si te sobra tiempo, te van a preguntar
Para bajar costos, querés reutilizar respuestas de preguntas muy parecidas. Tenés un mock embed(text): number[] y un mock model(question): Promise<string>. Diseñá e implementá SemanticCache con get(question) y set(question, answer), y una función answer(question) que consulte el cache antes de llamar al modelo.
Una entrada se considera hit si la similitud coseno entre embeddings es mayor o igual a un umbral configurable (por ejemplo 0.92). El cache tiene capacidad máxima con política LRU y un TTL por entrada. Ejemplo: si se guardó "¿Cuál es el horario de atención?", la pregunta "¿En qué horario atienden?" debería ser hit, pero "¿Cuál es el horario de envíos?" no.
# requisitos
# si te sobra tiempo, te van a preguntar