Por qué te importa
Cuando le preguntas a LIA «¿qué te había dicho del restaurante de Pablo?», no busca las palabras exactas de tu frase. Busca por el significado. Cada recuerdo, cada nota del diario y cada pasaje de tus documentos se transforma en una serie de números, un embedding, que representa lo que quiere decir. Dos textos cercanos por su significado tienen embeddings cercanos, y su parecido se mide con una puntuación.
Queda decidir a partir de qué puntuación un recuerdo está lo bastante cerca para servir. Demasiado bajo, y LIA mete en su respuesta recuerdos sin relación: la respuesta se enturbia y pagas tokens por ruido. Demasiado alto, y se le escapa lo que en realidad sabe. Este umbral parece un detalle técnico; es lo que decide si LIA recuerda bien.
Lo que quería
Quería un umbral por uso, elegido con pruebas realistas. Encontrar un recuerdo útil, detectar un duplicado entre tus intereses o elegir un pasaje de un documento no son la misma pregunta. Y quería que cada umbral se eligiera según el coste de sus errores.
Cómo funciona
Cada modelo de embeddings codifica el significado a su manera. Cuando LIA pasó al modelo de embeddings de Google, que ya no acerca dos textos sin relación solo porque estén escritos en el mismo idioma, todos los umbrales se recalibraron: los del modelo anterior ya no significaban nada. Para cada uno medí, con conjuntos de prueba, lo que deja pasar por error y lo que se pierde.
- Buscar o deduplicar. Para recuperar un recuerdo basta un umbral moderado. Para decidir que dos intereses son uno solo, tienen que ser casi idénticos. Un recuerdo lleva incluso dos embeddings: uno para su contenido y otro para las palabras clave que deben evocarlo.
- El coste de un error. Para deduplicar tus intereses, dos umbrales cometían exactamente el mismo número de errores. El más bajo fusionaba por error temas distintos, como Android e iOS: tu interés por uno desaparecía dentro del otro, sin vuelta atrás. El más alto dejaba pasar algunos duplicados, visibles y fáciles de corregir. Me quedé con el más alto, porque contar los errores no bastaba: había que mirar cuáles eran. La razón está escrita junto al valor, en el código.
- Seis idiomas, un solo umbral. Para los espacios de conocimiento, el umbral se midió en cada uno de los seis idiomas de LIA, y el mejor valor era el mismo en todos. Viene bien: un documento en alemán puede responder a una pregunta hecha en español, y un umbral por idioma no habría sabido cuál elegir. Una pequeña bonificación premia además las palabras exactas, para que un nombre de producto o una referencia no se pierdan.
- Un umbral que aprende. Para tu diario, un valor fijo no le servía a todo el mundo: las puntuaciones dependen de lo que escribe cada uno y del número de notas. Así que este umbral se ajusta a ti, como mucho un pequeño paso al día, entre dos límites que no puede cruzar. Un interruptor permite fijarlo en su valor por defecto.
Un embedding todavía tiene que llegar
Un umbral bien elegido no sirve de nada si el embedding no se calcula. Ese cálculo pasa por un servicio en línea, que limita el número de llamadas por minuto. Por eso las tareas en segundo plano de LIA arrancan en momentos escalonados, para no salir todas en el mismo segundo. Si aun así el servicio se satura, LIA reintenta un número limitado de veces, y su propia regulación, en caso de duda, deja pasar la petición para que tu respuesta conserve su memoria.
Los límites
- Ningún umbral separa perfectamente lo pertinente del resto. Dos temas distintos pueden parecerse mucho, y dos formulaciones de una misma idea, mucho menos. El umbral sigue siendo un compromiso, y por eso lo elijo del lado del error menos grave.
- Los embeddings de dos modelos distintos no se pueden comparar entre sí: cambiar de modelo obliga a recalibrarlo todo.
- La búsqueda por significado depende hoy de un servicio de Google. No funciona sin conexión.
Para profundizar: Tus documentos, al alcance de una pregunta: los espacios de conocimiento; Mostrar al modelo lo que importa: los servicios que aligeran el trabajo de LIA.
