El asistente que se inventó la tarifa
Una comercializadora eléctrica pone un asistente en su web. Un cliente pregunta qué día llega su factura.
El asistente responde con seguridad: el día 15. Es falso, llega el día 5.
El modelo nunca había leído el manual de la empresa. Hoy ves cómo una aplicación le da los datos correctos antes de que responda.
Al final de esta lección
Nota
Puedo explicar cómo una aplicación da a un modelo de lenguaje los datos correctos.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Modelo de lenguaje | una red que escribe texto a partir de un texto | |
| Instrucción | el texto que la aplicación envía al modelo | el prompt |
| Fragmento | un trozo corto de un documento | |
| Recuperación | buscar los fragmentos útiles antes de preguntar | |
| Vector | una lista de números que resume un texto | |
| Invención | una respuesta segura pero falsa |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El modelo solo sabe lo que leyó
Un modelo de lenguaje es una red neuronal muy grande. Aprendió a escribir leyendo muchísimo texto público.
No ha leído los documentos internos de tu empresa. Tampoco sabe lo que cambió después de su entrenamiento.
Si le preguntas por ellos, suele responder igual de seguro. A veces se inventa la respuesta. Eso es una invención, y en atención al cliente sale cara.
Primero buscar, después preguntar
La solución habitual se llama recuperación, o RAG por sus siglas en inglés.
La aplicación guarda el manual partido en fragmentos. Cuando llega una pregunta, busca los fragmentos que más se parecen.
Después escribe la instrucción para el modelo: estos fragmentos, la pregunta y una orden. Por ejemplo: responde solo con este texto. Así el modelo responde con los datos de la empresa.
Busca el fragmento y monta la instrucción
# Fragmentos del manual de atención al cliente de una eléctrica.
docs = [
"La tarifa por horas es más barata de 0 a 8 de la mañana.",
"Para cambiar el titular del contrato hace falta el DNI de los dos.",
"La factura llega cada mes por correo electrónico el día 5.",
]
question = "¿Qué día llega la factura?"
def words(text):
clean = text.lower().replace("¿", "").replace("?", "").replace(".", "")
return clean.split()
def score(q, doc):
# Cuenta las palabras de la pregunta que aparecen en el fragmento.
shared = 0
for w in words(q):
if w in words(doc):
shared = shared + 1
return shared
best = docs[0]
for doc in docs:
if score(question, doc) > score(question, best):
best = doc
prompt = "Responde solo con este texto: " + best + "\nPregunta: " + question
print(prompt)
Buscar por significado con vectores
Contar palabras en común falla pronto. ¿Cuándo me cobráis? y fecha de la factura no comparten ninguna palabra.
Por eso las aplicaciones reales convierten cada fragmento en un vector, una lista de números. Textos que significan lo mismo dan listas parecidas.
La pregunta también se convierte en vector. La búsqueda elige los fragmentos con los números más cercanos.
Un error frecuente
Advertencia
Mucha gente cree que, para que el modelo conozca tus datos, hay que volver a entrenarlo. Casi nunca hace falta: basta con darle los fragmentos correctos en la instrucción. Es más barato, y cuando cambia el manual solo cambias los fragmentos.