Pedir una persona y recibir un bucle
Pasar a una persona es traspasar una conversación de la función de IA a alguien que puede resolverla. Importa porque una función buena sabe cuándo parar.
Una clienta escribe «quiero hablar con una persona». El chat responde «¡Puedo ayudarte con eso!» y repite la misma pregunta. Ella cierra la aplicación y llama a la tienda.
Al final de esta lección
Nota
Puedo diseñar el punto en que una persona toma el relevo.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Traspaso | pasar una conversación a una persona |
| Disparador | una regla que inicia un traspaso |
| Nota de contexto | lo que se cuenta a la persona para no repetir |
| Cola | la lista de quienes esperan a una persona |
| Devolución | dar la conversación otra vez al modelo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuatro disparadores deciden cuándo pasar
Escribe los disparadores como reglas, para poder probarlos. Hay cuatro habituales. La persona pidió a un humano. El tema es uno que un modelo no debe decidir, como una devolución. La confianza del modelo es baja. La conversación lleva demasiados turnos.
El primero debe funcionar siempre. Nadie debería discutir con una máquina para llegar a una persona.
La nota y la espera
La persona que toma el relevo no debe pedir a la clienta que empiece de nuevo. Pásale una nota corta: los motivos, el último mensaje y el número de turnos.
Di a la clienta cuánto durará la espera, con un número real. Cuando la persona termine, decide si la conversación vuelve al modelo o se cierra.
Un error frecuente
Advertencia
Mucha gente cree que pasar a una persona significa que la función falló, así que dificulta llegar a ella. Es al revés. Un traspaso rápido y claro conserva a la clienta. Facilita pedirlo y manda el contexto con la conversación.
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 revisor de disparadores, parte 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const RULES = { maxTurns: 6, minConfidence: 50, topics: [\"devolución\", \"queja\"] };' 'const CHATS = [' ' { id: \"c1\", turns: 3, confidence: 90, topic: \"horario\", asked: false, last: \"¿A qué hora abren?\" },' ' { id: \"c2\", turns: 4, confidence: 80, topic: \"devolución\", asked: false, last: \"Quiero que me devuelvan el dinero.\" },' ' { id: \"c3\", turns: 8, confidence: 40, topic: \"envío\", asked: false, last: \"Todavía no ha llegado.\" },' ' { id: \"c4\", turns: 2, confidence: 95, topic: \"horario\", asked: true, last: \"Quiero hablar con una persona.\" },' '];' > handover.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 revisor de disparadores, parte 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function reasons(c) {' ' const out = [];' ' if (c.asked) out.push(\"pidió\");' ' if (RULES.topics.includes(c.topic)) out.push(\"tema\");' ' if (c.confidence < RULES.minConfidence) out.push(\"confianza\");' ' if (c.turns > RULES.maxTurns) out.push(\"turnos\");' ' return out;' '}' >> handover.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 revisor de disparadores, parte 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const c of CHATS) {' ' const why = reasons(c);' ' console.log(c.id + \" \" + (why.length > 0 ? \"pasa a una persona \" + why.join(\"+\") : \"sigue con el modelo\"));' ' }' ' const note = CHATS[2];' ' console.log(\"nota \" + JSON.stringify({ id: note.id, reasons: reasons(note), last: note.last, turns: note.turns }));' ' const msg = \"Escribe una frase corta que diga a una clienta que una persona toma el relevo y que no tiene que repetir nada.\";' ' const reply = await ask([{ role: \"user\", content: msg }], \"Ahora te atiende una persona. No hace falta que repitas nada.\", 30);' ' console.log(\"la clienta ve: \" + reply.text);' '}' 'main();' >> handover.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 revisor de disparadores
docker exec -w /home/node/project agent node handover.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 |
|---|---|
| c1 sigue con el modelo | No saltó ningún disparador |
| c2 pasa a una persona tema | Una devolución es un tema para una persona |
| c3 pasa a una persona confianza+turnos | Dos disparadores a la vez |
| c4 pasa a una persona pidió | La clienta lo pidió, así que siempre |
| nota {"id":"c3",...} | Lo que recibe la persona |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.