Publicado por Lino Uruñuela (2024-11-08)
El otro día, mientras navegaba por Twitter, me encontré con un hilo interesante donde DEJAN mostraba lo que parecía ser el código de cómo Google obtiene los pasajes de los resultados de búsqueda. Me llamó la atención porque siempre he tenido curiosidad sobre cómo Google es capaz de responder a preguntas de los usuarios basándose en los textos de los propios documentos que aparecen en los resultados.
Cuando el usuario realiza una búsqueda en Google, el sistema no solo recupera las páginas más relevantes, sino que también escoge fragmentos específicos dentro de esas páginas para mostrar respuestas concisas. Esto se hace con un proceso que combina métodos tradicionales de recuperación de información y técnicas avanzadas de embeddings.
Una vez que Google recupera un conjunto inicial de documentos relevantes, por ejemplo, los "Top 10,000", el siguiente paso es buscar el fragmento exacto de texto que mejor responde a tu consulta. Para ello, Google parece realizar los siguientes pasos:
Y ya que estamos en faena voy a intentar explicar lo que son los tokenizadores. Creo que mucha gente no sabe de su importancia, ya que los tokens son a los grandes modelos de lenguaje (LLMs) lo que los aminoácidos al ADN, piezas pequeños, que uno por si solo no es relevante pero todos juntos lo son todo ...
El proceso descompone el texto en unidades más pequeñas y manejables llamadas tokens. Estos tokens, que pueden ser desde caracteres individuales hasta palabras completas, permiten que los modelos neuronales comprendan y procesen mejor el lenguaje humano.
La tokenización puede ser un proceso complejo; manejar diferentes tipos de datos de texto, como puntuación, números y caracteres especiales, y determinar cómo dividirlos en unidades significativas no es sencillo. La tokenización también puede ser diferente según el caso de uso que vayamos a darle. Por ejemplo, puede ser necesario dividir palabras en subpalabras más pequeñas para manejar palabras que no están presentes en un vocabulario entrenado previamente.
Existen varias estrategias de tokenización, cada una con sus propias ventajas y desventajas:
CREO que esta técnica también se usa como complemento a otros modelos como BERT o GPT... no lo tengo muy claro.
Cuando escribí el artículo sobre cómo crear un buscador semántico para buscar contenidos dentro de los vídeos de YouTube, aprendí que una de las tareas más complicadas al crear un sistema de búsqueda semántica y/o un sistema de preguntas y respuestas (Question & Answering) fue decidir cómo fragmentar los textos.
Para generar los embeddings primero tienes que decidir qué tipo de modelo de lenguaje o algoritmo vas a usar. Dependiendo del caso de uso deberías escoger uno u otro. Por ejemplo, para hacer preguntas y respuestas hay unos tipos de modelos, y para hacer búsquedas semánticas hay otros. Antes de empezar, es importante saber qué quieres hacer e informarte sobre qué modelos podrías usar para conseguir ese fin.
Una vez que hayamos estudiado y decidido qué modelo es más apropiado para nuestro caso de uso, toca dividir el texto de cada vídeo / documento en "cachos" más pequeños. Dependiendo del tipo de modelo y cómo haya sido entrenado, admitirá más o menos texto. Y es aquí donde surge la pregunta: ¿cómo podemos dividir todo nuestro texto para generar estos embeddings?.
Podríamos segmentar el texto en base a frases, identificando un punto '.' seguido de un espacio y una letra mayúscula. O podríamos hacerlo por párrafos, identificando donde haya saltos de línea; también podríamos darle el texto del documento / vídeo entero (pocos modelos tienen la capacidad de admitir tanta cantidad de texto). Y fue ahí donde me di cuenta de cómo Google podría estar realizando las respuestas a consultas de los usuarios, generando embeddings por cada fragmento de texto en cada página, pero sabiendo que de alguna manera tenía que realizar una suma o cálculo entre los fragmentos y otros elementos de una misma URL.
Cuando probé mi sistema, me di cuenta de que muchos fragmentos podrían ser candidatos a muchas respuestas, por lo que probé diferentes metodologías. Por ejemplo, calcular la similitud entre el embedding de la consulta del usuario y el embedding de la concatenación del título y el texto del fragmento candidato. Y es este tipo de procesos los que te hacen ver la luz, o al menos tener una idea realista de cómo lo podría estar realizando Google.