Pulgares que nadie pulsa
Pedir opinión es dejar que una persona diga si una respuesta le sirvió, con el menor esfuerzo posible. Importa porque una opinión que nadie da no enseña nada.
Una función de chat muestra un pulgar arriba y otro abajo bajo cada respuesta. Al cabo de un mes, solo una de cada cincuenta personas ha pulsado algo. El equipo no sabe qué falla.
Al final de esta lección
Nota
Puedo recoger opiniones que la gente da de verdad.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Opinión | lo que una persona te dice de una respuesta | |
| Motivo | por qué una persona no quedó contenta | demasiado larga |
| Tasa de respuesta | la parte de personas que contestan | |
| Pregunta | el texto que pide la opinión | |
| Lista de pendientes | los arreglos que esperan su turno |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Que lo primero sea un toque
Pide primero un voto. Cuesta un toque. Solo después de un pulgar abajo, ofrece una lista corta de motivos para tocar: incorrecta, demasiado larga, no era lo que pedí.
Un cuadro de texto libre, solo, recoge casi nada. Una lista de motivos consigue un motivo de mucha más gente, y se puede contar.
Cuenta y actúa sobre el mayor
Cuenta los motivos de los pulgares abajo. Arregla primero el mayor. Avisa cuando lo hayas hecho, porque quien ve que se usa su opinión da más.
No preguntes siempre. Una regla como «preguntar cada cinco respuestas» mantiene bajo el coste para la persona.
Un error frecuente
Advertencia
Mucha gente cree que cuanta más opinión, mejor, y pregunta en cada respuesta. Entonces la gente deja de contestar. Pregunta pocas veces y con un toque. Juzga el diseño por su tasa de respuesta: la parte de personas que contestaron.
Escribe el ayudante del modelo, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' ' return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el ayudante del modelo, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"estado \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' ' } catch (error) {' ' console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' ' return { text: sample, inTokens: null, outTokens: null, recorded: true };' ' }' '}' 'module.exports = { ask };' >> model.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de opiniones, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const VOTES = [' ' { vote: \"arriba\", reason: \"\" },' ' { vote: \"abajo\", reason: \"incorrecta\" },' ' { vote: \"abajo\", reason: \"demasiado larga\" },' ' { vote: \"arriba\", reason: \"\" },' ' { vote: \"abajo\", reason: \"incorrecta\" },' ' { vote: \"abajo\", reason: \"\" },' ' { vote: \"arriba\", reason: \"\" },' ' { vote: \"abajo\", reason: \"incorrecta\" },' ' { vote: \"abajo\", reason: \"demasiado larga\" },' ' { vote: \"arriba\", reason: \"\" },' '];' > feedback.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de opiniones, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function countReasons(votes) {' ' const counts = {};' ' for (const v of votes) {' ' if (v.vote === \"abajo\" && v.reason.length > 0) {' ' counts[v.reason] = (counts[v.reason] || 0) + 1;' ' }' ' }' ' return counts;' '}' >> feedback.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe el contador de opiniones, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const counts = countReasons(VOTES);' ' const downs = VOTES.filter(function (v) { return v.vote === \"abajo\"; }).length;' ' const named = Object.values(counts).reduce(function (a, b) { return a + b; }, 0);' ' console.log(\"votos \" + VOTES.length + \" abajo \" + downs + \" con motivo \" + named);' ' console.log(\"tasa de respuesta \" + Math.floor((named * 100) / downs) + \" por ciento\");' ' console.log(\"motivos \" + JSON.stringify(counts));' ' const msg = \"Escribe una pregunta corta que pida por qué una respuesta no fue útil.\";' ' const reply = await ask([{ role: \"user\", content: msg }], \"¿Qué le pasaba a esta respuesta?\", 25);' ' console.log(\"pregunta: \" + reply.text);' '}' 'main();' >> feedback.js"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta el contador de opiniones
docker exec -w /home/node/project agent node feedback.jsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué imprime el Run
| Línea | Qué muestra |
|---|---|
| votos 10 abajo 6 con motivo 5 | Seis pulgares abajo, cinco dieron motivo |
| tasa de respuesta 83 por ciento | 5 de 6 personas lo dieron, redondeado hacia abajo |
| motivos {"incorrecta":3,"demasiado larga":2} | Incorrecta es el mayor, así que se arregla primero |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.