Noticias
Modelos
Productos
keyboard_arrow_down
Lector
Lea las URL y busque en la web para obtener una base más sólida para su LLM.
Incrustaciones
Integraciones multilingües y multimodales de clase mundial.
reclasificador
Recuperador neuronal de clase mundial para maximizar la relevancia de la búsqueda.
Búsqueda profunda
Busca, lee y razona hasta encontrar la mejor respuesta.
Más
keyboard_arrow_down
Clasificador
Clasificación de cero disparos y pocos disparos para imágenes y texto.
Segmentador
Corta el texto largo en fragmentos y haz tokenización.

Documentación de la API
Generación automática de código para su IDE o LLM de Copilot
open_in_new


Compañía
keyboard_arrow_down
Sobre nosotros
Contactar con ventas
Programa de prácticas
Únete a nosotros
open_in_new
Descargar logotipo
open_in_new
Términos y condiciones


Acceso
login
Configuración Experimental
¿Pueden los Modelos Comparar Números Entre [1, 2, 3, ..., 100]?
¿Pueden los Modelos Comparar Números Negativos Entre [-100, -99, -98, ..., -1]?
¿Pueden los Modelos Comparar Números con Intervalos Más Grandes [1000, 2000, 3000, ..., 100000]?
¿Pueden los Modelos Comparar Números de un Rango Arbitrario, por ejemplo [376, 377, 378, ..., 476]?
¿Pueden los Modelos Comparar Números Grandes Entre [4294967296, 4294967297, 4294967298, ..., 4294967396]?
¿Pueden los Modelos Comparar Números Decimales Entre [0.0001, 0.0002, 0.0003, ...,0.1]? (sin dígitos fijos)
¿Pueden los Modelos Comparar Números de Moneda Entre [ 1, 1,2, 3, ..., 3,...,100]?
¿Pueden los Modelos Comparar Fechas Entre [2024-07-24, 2024-07-25, 2024-07-26, ..., 2024-10-31]?
¿Pueden los Modelos Comparar Horas Entre [19:00:07, 19:00:08, 19:00:09,..., 20:39:07]?
Observaciones
Conclusión
Blog de tecnología
julio 24, 2024

¿Pueden los modelos de Embedding/Reranker comparar números?

Muchos LLMs no logran entender que 9.11 es en realidad menor que 9.9. ¿Pueden nuestros modelos de embedding y reranking hacerlo mejor?
Rows of numbered wooden pieces on a white background, ranging from single digits to high numbers.
Han Xiao
Han Xiao • 10 minutos de lectura

Esta fue una pregunta que me hicieron hoy en la conferencia ICML en Viena.

Durante el descanso para el café, un usuario de Jina se me acercó con una pregunta que surgió de discusiones recientes en la comunidad de LLM. Me preguntó si nuestro modelo de embeddings podía determinar que 9.11 es menor que 9.9, una tarea donde muchos LLMs dicen lo contrario.

"Honestamente, no lo sé", respondí. Mientras él explicaba la importancia de esta capacidad para su aplicación y sugería que la tokenización podría ser la raíz del problema, me encontré asintiendo - mi mente ya estaba corriendo con ideas para un experimento para descubrir la respuesta.

En este artículo, quiero probar si nuestro modelo de embeddings, jina-embeddings-v2-base-en (lanzado en octubre de 2023), y el Reranker, jina-reranker-v2-multilingual (lanzado en junio de 2024), pueden comparar números con precisión. Para extender el alcance más allá de la simple comparación de 9.11 y 9.9, he diseñado un conjunto de experimentos que incluyen varios tipos de números: enteros pequeños, números grandes, decimales, números negativos, moneda, fechas y horas. El objetivo es evaluar la efectividad de nuestros modelos en el manejo de diferentes formatos numéricos.

tagConfiguración Experimental

La implementación completa se puede encontrar en el Colab a continuación:

Google Colab

El diseño del experimento es bastante sencillo. Por ejemplo, para verificar si el modelo de embeddings entiende números entre [1, 100]. Los pasos son los siguientes:

  1. Construir Documentos: Generar documentos de "literales de cadena" para cada número desde 1 hasta 100.
  2. Enviar a la API de Embeddings: Usar la API de Embeddings para obtener embeddings para cada documento.
  3. Calcular Similitud del Coseno: Calcular la similitud del coseno por pares para cada dos documentos para crear una matriz de similitud.
  4. Hacer Gráfico de Dispersión: Visualizar los resultados usando un gráfico de dispersión. Cada elemento (i,j)(i, j)(i,j) en la matriz de similitud se mapea a un punto con: Eje X: (i−j)(i - j)(i−j); Eje Y: el valor de similitud de (i,j)(i, j)(i,j)

Si el delta (i−j)(i - j)(i−j) es cero, es decir, i=ji = ji=j, entonces la similitud semántica debería ser la más alta. A medida que el delta (i−j)(i - j)(i−j) aumenta, la similitud debería disminuir. Idealmente, la similitud debería ser linealmente proporcional al valor delta. Si no podemos observar tal linealidad, entonces es probable que el modelo no pueda entender los números y pueda producir errores como que 9.11 es mayor que 9.9.

El modelo Reranker sigue un procedimiento similar. La diferencia clave es que iteramos a través de los documentos construidos, estableciendo cada uno como query anteponiendo el prompt "what is the closest item to..." y clasificando todos los demás como documents. La puntuación de relevancia devuelta por la API del Reranker se usa directamente como medida de similitud semántica. La implementación central se ve así.

def rerank_documents(documents):
    reranker_url = "https://api.jina.ai/v1/rerank"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {token}"
    }

    # Initialize similarity matrix
    similarity_matrix = np.zeros((len(documents), len(documents)))

    for idx, d in enumerate(documents):
        payload = {
            "model": "jina-reranker-v2-base-multilingual",
            "query": f"what is the closest item to {d}?",
            "top_n": len(documents),
            "documents": documents
        }
    ...

tag¿Pueden los Modelos Comparar Números Entre [1, 2, 3, ..., 100]?

Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual. documents = [str(i) for i in range(1, 101)]

tagCómo Leer Estos Gráficos

Antes de continuar con más experimentos, permítanme primero explicar cómo leer correctamente estos gráficos. En primer lugar, mi observación de los dos gráficos anteriores es que el modelo de embeddings funciona bien, mientras que el modelo reranker no lo hace tan bien. Entonces, ¿qué estamos viendo y por qué?

El eje X representa el delta de los índices (i,j)(i,j)(i,j), o i−ji-ji−j, cuando muestreamos uniformemente did_idi​ y djd_jdj​ de nuestros conjuntos de documentos. Este delta varía de [−100,100][-100, 100][−100,100]. Dado que nuestro conjunto de documentos está ordenado por construcción, es decir, cuanto menor sea ∣i−j∣|i-j|∣i−j∣, más cercanos son semánticamente did_idi​ y djd_jdj​; cuanto más alejados estén iii y jjj, menor será la similitud entre did_idi​ y djd_jdj​. Por eso ves que la similitud (representada por el eje Y) se dispara en X=0X=0X=0 y luego cae linealmente al moverte a izquierda y derecha.

Idealmente, esto debería crear un pico pronunciado o una forma de "flecha hacia arriba" como ^. Sin embargo, ese no es siempre el caso. Si fijas el eje X en un punto, digamos X=25X=25X=25, y miras a lo largo del eje Y, encontrarás valores de similitud que van de 0.80 a 0.95. Eso significa que sim(d27,d2)\mathrm{sim}(d_27, d_2)sim(d2​7,d2​) puede ser 0.81 mientras que sim(d42,d17)\mathrm{sim}(d_42, d_17)sim(d4​2,d1​7) puede ser 0.91 a pesar de que sus deltas son todos 25.

La línea de tendencia cian muestra la similitud media en cada valor X con la desviación estándar. Además, nota que la similitud debería caer linealmente porque nuestro conjunto de documentos está espaciado uniformemente, asegurando intervalos iguales entre documentos contiguos.

Ten en cuenta que los gráficos de embeddings serán siempre simétricos, con el valor Y más grande de 1.0 en X=0X=0X=0. Esto es porque la similitud del coseno es simétrica para did_idi​ y djd_jdj​, y cos⁡(0)=1\cos(0)=1cos(0)=1.

Por otro lado, los gráficos del reranker son siempre asimétricos debido a los diferentes roles de la consulta y los documentos en el modelo reranker. El valor máximo probablemente no sea 1.0 porque X=0X=0X=0 significa que usamos el reranker para calcular la puntuación de relevancia de "what is the closest item to 4" vs "4". Si lo piensas, no hay garantía de que X=0X=0X=0 lleve al valor Y máximo.

tag¿Pueden los Modelos Comparar Números Negativos Entre [-100, -99, -98, ..., -1]?

Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual. Aquí queremos probar si el modelo puede determinar la similitud semántica en el espacio negativo. documents = [str(-i) for i in range(1, 101)]

tag¿Pueden los Modelos Comparar Números con Intervalos Más Grandes [1000, 2000, 3000, ..., 100000]?

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos números con un intervalo de 1000. documents = [str(i*1000) for i in range(1, 101)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Números de un Rango Arbitrario, por ejemplo [376, 377, 378, ..., 476]?

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos números en un rango arbitrario, así que movemos los números a un rango aleatorio documents = [str(i+375) for i in range(1, 101)]. Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Números Grandes Entre [4294967296, 4294967297, 4294967298, ..., 4294967396]?

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos números muy grandes. Similar a la idea del último experimento, movemos el rango más allá a un número grande. documents = [str(i+4294967296) for i in range(1, 101)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Números Decimales Entre [0.0001, 0.0002, 0.0003, ...,0.1]? (sin dígitos fijos)

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos decimales. documents = [str(i/1000) for i in range(1, 101)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Números de Moneda Entre [1,1, 1,2, 3,...,3, ..., 3,...,100]?

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos números en formato de moneda. documents = ['$'+str(i) for i in range(1, 101)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Fechas Entre [2024-07-24, 2024-07-25, 2024-07-26, ..., 2024-10-31]?

Aquí queremos probar si el modelo puede determinar la similitud semántica cuando comparamos números en formato de fecha, es decir, AAAA-MM-DD. today = datetime.today(); documents = [(today + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(100)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tag¿Pueden los Modelos Comparar Horas Entre [19:00:07, 19:00:08, 19:00:09,..., 20:39:07]?

Aquí queremos probar si el modelo puede detectar la similitud semántica cuando comparamos números en formato de tiempo, es decir, hh:mm:ss. now = datetime.now(); documents = [(now + timedelta(minutes=i)).strftime('%H:%M:%S') for i in range(100)] Gráfico de dispersión con media y varianza en cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tagObservaciones

Aquí hay algunas observaciones de los gráficos anteriores:

tagModelos Reranker

  • Los modelos reranker tienen dificultades para comparar números. Incluso en el caso más simple de comparar números entre [1, 100], su rendimiento es deficiente.
  • Es importante notar la construcción especial de prompt utilizada para las consultas en nuestro uso del reranker, es decir, what is the closest item to x, ya que esto también puede impactar los resultados.

tagModelos de Embedding

  • Los modelos de embedding tienen un rendimiento razonablemente bueno al comparar números enteros pequeños en el rango [1, 100] o números negativos en [-100, 1]. Sin embargo, su rendimiento se degrada significativamente al desplazar este intervalo a otros valores, agregar más intervalos o tratar con flotantes más grandes o más pequeños.
  • Se pueden observar picos regulares en ciertos intervalos, generalmente cada 10 pasos. Este comportamiento puede estar relacionado con cómo el tokenizer procesa las cadenas, potencialmente tokenizando una cadena en "10" o "1" y "0".

tagComprensión de Fecha y Hora

  • Curiosamente, los modelos de embedding parecen tener una buena comprensión de fechas y horas, comparándolas correctamente la mayoría del tiempo. Para los gráficos de fechas, aparecen picos cada 30/31 pasos, correspondientes al número de días en un mes. Para los gráficos de tiempo, aparecen picos cada 60 pasos, correspondientes a los minutos en una hora.
  • Los modelos reranker también parecen captar esta comprensión hasta cierto punto.

tagVisualización de la Similitud con "Cero"

Actualizado el 29 de julio de 2024
Google Colab

Otro experimento interesante, que es probablemente más intuitivo, es visualizar directamente la puntuación de similitud o relevancia entre cualquier número y cero (es decir, el origen). Al fijar el punto de referencia como el embedding de cero, queremos ver si la similitud semántica disminuye linealmente a medida que los números se hacen más grandes. Para el reranker, podemos fijar la consulta a "0" o "What is the closest number to number zero?" y clasificar todos los números para ver si sus puntuaciones de relevancia disminuyen a medida que los números aumentan. Los resultados se muestran a continuación:

Aquí, fijamos el "embedding de origen" al embedding de "cero" y comprobamos si la similitud semántica entre cualquier número y cero es proporcional al valor del número. Específicamente, usamos documents = [str(i) for i in range(2048)]. Se muestra el gráfico de dispersión con media y varianza para cada delta. Izquierda: jina-embeddings-v2-base-en; Derecha: jina-reranker-v2-multilingual.

tagConclusión

Este artículo ilustra cómo nuestros modelos actuales de embedding y reranker manejan las comparaciones numéricas. A pesar de la configuración experimental relativamente simple, expone algunas fallas fundamentales en los modelos actuales y proporciona información valiosa para el desarrollo de nuestro próximo embedding y reranker.

Dos factores clave determinan si un modelo puede comparar números con precisión:

Primero, la tokenización: Si el vocabulario solo incluye dígitos 0-9, entonces 11 podría tokenizarse en tokens separados 1 y 1, o como un solo token 11. Esta elección impacta la comprensión del modelo de los valores numéricos.

Diferentes tokenizers resultan en diferentes interpretaciones de 9.11. Esto puede afectar el aprendizaje contextual posterior. Fuente: The Tokenizer Playground en HuggingFace.

Segundo, los datos de entrenamiento: El corpus de entrenamiento influye significativamente en las capacidades de razonamiento numérico del modelo. Por ejemplo, si los datos de entrenamiento incluyen principalmente documentación de software o repositorios de GitHub donde el versionado semántico es común, el modelo podría interpretar que 9.11 es mayor que 9.9, ya que 9.11 es la versión menor que sigue a 9.9.

La capacidad aritmética de los modelos de recuperación densa, como embeddings y rerankers, es crucial para tareas que involucran RAG y recuperación y razonamiento avanzados. Las fuertes capacidades de razonamiento numérico pueden mejorar significativamente la calidad de búsqueda, particularmente cuando se trata de datos estructurados como JSON.

Categorías:
Blog de tecnología
rss_feed
Oficinas
location_on
Sunnyvale, California
710 Lakeway Dr, Ste 200, Sunnyvale, CA 94085, EE. UU.
location_on
Berlín, Alemania (sede central)
Prinzessinnenstraße 19-20, 10969 Berlín, Alemania
location_on
Beijing, China
Piso 5, Edificio 6, No.48 Haidian West St. Pekín, China
location_on
Shenzhen, China
Piso 402, Edificio de Tecnología Fu'an, Shenzhen, China
Fundación de búsqueda
Lector
Incrustaciones
reclasificador
Búsqueda profunda
Clasificador
Segmentador
Documentación API
Obtener la clave API de Jina
Límite de velocidad
Estado de la API
Compañía
Sobre nosotros
Contactar con ventas
Sala de prensa
Programa de prácticas
Únete a nosotros
open_in_new
Descargar logotipo
open_in_new
Términos
Seguridad
Términos y condiciones
Privacidad
Administrar cookies
email
Jina AI © 2020-2025.