5 puntos por GN⁺ 2023-10-25 | 1 comentarios | Compartir por WhatsApp
  • Los embeddings convierten contenido como texto, imágenes o código en arreglos de números de punto flotante de longitud fija, lo que permite encontrar elementos semánticamente cercanos mediante cálculo de distancia
  • En el espacio vectorial creado por un mismo modelo, aunque no se entienda el significado de cada número individual, se pueden comparar documentos relacionados, imágenes similares o fragmentos de código con similitud del coseno
  • En un caso donde se guardaron 472 publicaciones de TIL como vectores de 1,536 dimensiones con OpenAI text-embedding-ada-002, una consulta de búsqueda de artículos relacionados tardó unos 400 ms y el costo total de embedding de 402,500 tokens fue de aproximadamente $0.04
  • Incluso solo con modelos locales y una combinación de herramientas pequeñas se pueden implementar búsquedas en README, búsqueda de código, búsqueda de imágenes, clustering y RAG; se usan como ejemplo LLM, llm-sentence-transformers, Symbex, CLIP y E5-large-v2
  • La búsqueda semántica basada en embeddings no depende de coincidencias exactas de palabras, por lo que se convierte en un medio clave en RAG para preguntas y respuestas sobre documentos internos, al insertar en el prompt del LLM extractos relevantes

Conceptos básicos de los embeddings

  • Un embedding es una forma de convertir una pieza de contenido en un arreglo de números de punto flotante
    • Sin importar la longitud del contenido, la longitud del arreglo siempre es la misma
    • La longitud del arreglo la determina el modelo de embeddings que se use; por ejemplo, puede producir 300, 1,000 o 1,536 números
  • Este arreglo puede verse como una coordenada en un espacio multidimensional
    • La posición dentro del espacio representa el significado del contenido según lo entiende el modelo de embeddings
    • Puede reflejar características del contenido como color, forma o concepto
  • Aunque no se entienda por completo el significado de cada número individual, usando las relaciones de posición se pueden hacer tareas útiles, como encontrar elementos cercanos

Recomendación de contenido relacionado: caso del blog TIL

  • En un sitio TIL con 472 artículos, se calculó un vector de embedding de 1,536 dimensiones para cada artículo con el modelo OpenAI text-embedding-ada-002
    • Los vectores se guardaron en la base de datos SQLite del sitio
    • Los artículos relacionados se encontraban calculando la similitud del coseno entre el vector del artículo objetivo y los vectores de todos los demás, devolviendo los 10 más cercanos
  • Para el artículo de ejemplo “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg”, los principales resultados relacionados estaban compuestos por artículos sobre SQLite, SpatiaLite, GDAL y consultas SQL espaciales
    • La similitud consigo mismo es 1.0
    • sqlite_geopoly.md tiene 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md tiene 0.8813094978399854
  • La consulta para calcular artículos relacionados tardaba alrededor de 400 ms, así que se precalcularon las 10 similitudes principales para todos los artículos y se guardaron en la tabla similarities
  • El costo de la API de embeddings de OpenAI, para el sitio TIL, fue de unos 402,500 tokens a una tarifa de $0.0001 por cada 1,000 tokens, es decir, $0.04
  • Los modelos propietarios requieren atención operativa
    • OpenAI eliminó anteriormente algunos modelos de embeddings antiguos
    • Si hay muchos embeddings guardados con un modelo anterior, puede ser necesario recalcularlos según un modelo compatible para poder generar embeddings del contenido nuevo
    • OpenAI prometió cubrir el costo de re-embeddings con el nuevo modelo, pero sigue existiendo el riesgo de dependencia de un modelo propietario
  • Los modelos con licencia abierta pueden ejecutarse en hardware propio, lo que evita el riesgo de que el modelo sea retirado

El espacio vectorial visto con Word2Vec

  • Efficient Estimation of Word Representations in Vector Space de Google Research es el artículo de Word2Vec, publicado el 16 de enero de 2013
  • Word2Vec es un modelo temprano de embeddings que convierte una palabra en un arreglo de 300 números
  • turbomaze.github.io/word2vecjson es una demo que permite explorar 10,000 palabras y el arreglo de 300 números de cada una
    • Entre las palabras cercanas a “france” aparecen french, belgium, paris, germany, italy y spain
  • Las relaciones también se hacen visibles con operaciones vectoriales
    • Si al vector “germany” se le suma “paris” y se le resta “france”, el vector resultante queda más cerca de “berlin”
    • Esto muestra que el modelo capturó relaciones de nacionalidad y geografía dentro del espacio vectorial
  • Word2Vec fue entrenado con contenido de 1.6 mil millones de palabras, y los modelos de embeddings actuales se entrenan con conjuntos de datos mucho mayores, por lo que capturan relaciones más ricas

Calcular embeddings con herramientas LLM

  • LLM es una herramienta de línea de comandos y biblioteca de Python para trabajar con modelos grandes de lenguaje
    • Se puede instalar con pip install llm o brew install llm
    • Por defecto puede usarse con la API de OpenAI
  • Al instalar plugins, se pueden agregar nuevos modelos de lenguaje o de embeddings
  • El plugin llm-sentence-transformers envuelve la biblioteca SentenceTransformers
    • Permite descargar el modelo all-MiniLM-L6-v2 desde Hugging Face y usarlo localmente
    • El comando llm embed imprime el embedding de una oración como un arreglo JSON de números
  • Un embedding por sí solo, como arreglo numérico aislado, no tiene mucho significado; se vuelve útil cuando se guarda y luego se compara
  • llm embed-multi permite generar embeddings de varios contenidos a la vez y guardarlos en una tabla SQLite llamada colección
    • El comando de ejemplo encuentra todos los archivos README.md bajo el directorio home y los guarda en la colección readmes
    • La opción --store también guarda el texto original en la tabla SQLite
    • Como resultado de la ejecución, se almacenaron 16,796 archivos README.md y tomó unos 30 minutos en una computadora local

Búsqueda semántica y “vibes-based search”

  • El comando llm similar encuentra elementos parecidos a una oración de entrada dentro de una colección de embeddings almacenada
  • Si se busca la frase sqlite backup tools en la colección readmes, aparecen arriba README de proyectos de respaldo de SQLite o relacionados, como sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history y sqlite-utils
  • No hay garantía de que los documentos resultado incluyan directamente la palabra “backups”
    • Si el contenido es semánticamente similar a la consulta, puede aparecer como resultado
  • Esta forma de trabajo es búsqueda semántica, y en el texto original se la llama vibes-based search
  • Como no siempre es fácil encontrar lo que una persona busca solo con coincidencias exactas de texto, resulta útil para motores de búsqueda sobre distintos tipos de contenido

Embeddings de código: Symbex y Datasette

  • Symbex es una herramienta para explorar símbolos en bases de código Python
    • Fue creada para encontrar rápidamente funciones y clases de Python y pasarlas a un LLM
    • Después permitió calcular embeddings de todas las funciones de una base de código para construir un motor de búsqueda de código
  • Symbex puede emitir los símbolos encontrados en JSON o CSV, y ese formato puede usarse como entrada para llm embed-multi
  • El ejemplo para generar embeddings de todas las funciones y métodos de clase del proyecto Datasette usa el modelo gte-tiny
    • gte-tiny es un archivo de 60 MB
    • symbex '*' '*:*' --nl imprime funciones y métodos de clase del directorio actual como JSON delimitado por saltos de línea
    • llm embed-multi ... --format nl puede tomar directamente esa salida como entrada para generar embeddings
  • Después, usando Datasette y el plugin datasette-llm-embed, se puede ejecutar búsqueda semántica de código con SQL
  • SQLite se usa como un punto de integración para unir varias herramientas
    • Extrae funciones desde el código
    • Las pasa por el modelo de embeddings
    • Registra el resultado en SQLite
    • Hace la búsqueda con SQL

Embedding de texto e imágenes en el mismo espacio con CLIP

  • CLIP es un modelo presentado por OpenAI en enero de 2021 que puede generar embeddings tanto de texto como de imágenes
  • La clave es que coloca texto e imágenes en un mismo espacio vectorial
    • La posición del embedding de la cadena “dog” queda cerca de la posición del embedding de la foto de un perro dentro del mismo espacio
    • Se pueden encontrar imágenes relacionadas a partir de texto, o textos relacionados a partir de imágenes
  • La demo de CLIP que corre en el navegador fue creada como un notebook de Observable y ejecuta el modelo CLIP dentro del navegador
    • La página carga 158 MB de recursos
    • El modelo de texto de CLIP pesa 64.6 MB y el modelo de imagen 87.6 MB
  • Hay un ejemplo que calcula puntajes de similitud por texto para una foto de playa
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • Más que preguntar la similitud entre una foto cualquiera y una sola palabra, lo importante es construir una interfaz de búsqueda por encima de eso

Faucet Finder: búsqueda de imágenes basada en CLIP

  • Faucet Finder es una herramienta de búsqueda personalizada para encontrar fotos de grifos de baño
  • Drew Breunig recopiló 20,000 fotos de grifos de proveedores y calculó embeddings con CLIP
    • En la implementación se usaron LLM y el plugin llm-clip
    • Se desplegó con Datasette
  • Esta herramienta permite encontrar otros grifos visualmente parecidos a uno específico
    • Si te gusta un grifo caro, puedes encontrar alternativas más baratas que se le parezcan visualmente
  • La demo de Drew muestra resultados similares usando embeddings precalculados, sin ejecutar el modelo CLIP en el servidor
  • Luego se desplegó un modelo CLIP del lado del servidor en Fly.io y se creó una demo en Observable notebook combinando una API para embeddings de cadenas de texto con una API de tabla de embeddings de grifos
    • Permite hacer búsquedas semánticas de imágenes de grifos con consultas como “gold purple”

Clustering y visualización en 2D

  • Los embeddings se pueden usar no solo para recomendar contenido relacionado y para búsqueda semántica, sino también para clustering
  • llm-cluster es un plugin que implementa clustering usando sklearn.cluster de scikit-learn
  • Usando la API de issues de GitHub y paginate-json, se pueden crear títulos de issues del repositorio simonw/llm en una colección llm-issues y generar 10 clústeres
  • La opción llm cluster llm-issues 10 --summary pasa el texto del clúster a un LLM para generar nombres descriptivos
    • Algunos ejemplos de nombres son “Log Management and Interactive Prompt Tracking” y “Continuing Conversation Mechanism and Management”
  • Los espacios de alta dimensión son difíciles de visualizar, por lo que se puede reducir la dimensionalidad con análisis de componentes principales (PCA)
    • Matt Webb creó embeddings con OpenAI para descripciones de episodios del podcast In Our Time de la BBC y generó una visualización 2D con PCA
    • Incluso al reducir 1,536 dimensiones a 2, los episodios sobre guerras históricas o descubrimientos científicos modernos siguen apareciendo cerca entre sí

Clasificar oraciones por posición promedio

  • Los embeddings también pueden usarse para clasificación
    • Primero se calcula la posición promedio de grupos de embeddings ya clasificados de cierta manera
    • Luego se compara dónde cae un embedding nuevo respecto de esas posiciones para asignarle una categoría
  • Getting creative with embeddings de Amelia Wattenberger muestra un caso donde se puntúa si una oración es concreta o abstracta
  • Se crean muestras de oraciones concretas y abstractas, y se calcula la posición promedio de cada grupo
  • Una oración nueva recibe una puntuación según a cuál de las dos posiciones promedio queda más cerca
  • Esa puntuación también puede convertirse en un color que represente de forma flexible qué tan abstracta o concreta es la oración

RAG: preguntas y respuestas con documentos personales e internos

  • Quienes han usado ChatGPT suelen preguntarse cómo hacer que responda preguntas basadas en notas personales o documentos internos de una empresa
  • La respuesta puede no ser un entrenamiento costoso de un modelo personalizado, sino una combinación de LLM ya disponible con generación aumentada por recuperación (RAG)
  • El procedimiento básico de RAG es simple
    • La persona usuaria hace una pregunta
    • Se busca contenido de documentos personales que parezca relacionado con la pregunta
    • Respetando el límite de tamaño del LLM, se colocan en el prompt extractos relevantes junto con la pregunta original
    • El LLM responde basándose en el contenido adicional proporcionado
  • Un límite de tamaño habitual ronda entre 3,000 y 6,000 palabras
  • La parte difícil en RAG es encontrar los mejores extractos para incluir en el prompt
    • La búsqueda semántica basada en embeddings es adecuada para reunir contenido con alta probabilidad de ser relevante

Implementar preguntas y respuestas offline basadas en un blog con E5-large-v2

  • Un ejemplo de RAG basado en contenido de blog usa E5-large-v2
  • Como las preguntas y las respuestas tienen gramáticas distintas, una pregunta no siempre queda semánticamente cerca del documento que contiene la respuesta
  • E5-large-v2 soporta dos tipos de contenido
    • Las factual sentence se embeben como phrase
    • Las question se embeben como query
    • Esto se parece a cómo CLIP coloca imágenes y texto en el mismo espacio
  • Se generan embeddings como phrase para 19,000 párrafos del blog y embeddings como query para las preguntas, a fin de encontrar los párrafos más cercanos a la respuesta
  • El ejemplo implementa RAG con un script Bash de una sola línea
    • Usa llm similar para encontrar párrafos relacionados
    • Usa jq para extraer el contenido
    • Envía la pregunta y los párrafos a un modelo Llama 2 Chat 7B ejecutándose en una laptop local
  • Para la pregunta What is shot-scraper?, genera una respuesta indicando que shot-scraper es una utilidad de Python que envuelve Playwright y automatiza capturas de pantalla de páginas web y scraping basado en JavaScript mediante una interfaz de línea de comandos y un flujo de configuración basado en YAML
  • La respuesta generada no coincidía exactamente con una oración existente del blog

Opciones ajustables en la práctica

  • LangChain es un framework para implementar funciones sobre LLM, y RAG es una de sus funciones centrales
    • Se podría construir la misma funcionalidad sobre LangChain, pero entenderlo requiere una inversión considerable
    • Aquí se prefiere un conjunto de herramientas pequeñas que se combinan entre sí, en vez de un único framework que pretenda resolverlo todo
  • La función de distancia que se usa por defecto es la similitud del coseno
    • Aún no se han probado otras funciones de distancia
    • RAG tiene muchos elementos ajustables: función de distancia, modelo de embeddings, estrategia de prompt, LLM, etc.
  • Los ejemplos llegaban como máximo a una escala de unas 20,000 embeddings, y a ese tamaño todavía es razonable obtener resultados en tiempo aceptable calculando similitud del coseno por fuerza bruta contra todo el conjunto
  • Para datos mucho mayores, como 1,000 millones de objetos, una opción es usar bases de datos vectoriales o extensiones de bases de datos existentes
  • Las tendencias prometedoras hacia adelante son los modelos multimodales y los modelos más pequeños
    • ImageBind de Facebook aprende embeddings conjuntos de 6 modalidades de datos: imágenes, texto, audio, profundidad, térmico e IMU
    • Modelos cada vez más pequeños, como gte-tiny de 60 MB, aumentan la posibilidad de ejecutarlos en dispositivos limitados o en el navegador

Lecturas recomendadas

1 comentarios

 
GN⁺ 2023-10-25
Opiniones de Hacker News
  • Después de publicar este artículo, encontré algunos recursos más útiles para entender los embeddings a un nivel más bajo
    Mi artículo fue intencionalmente de muy alto nivel y se enfocó principalmente en las aplicaciones
    Text Embeddings Visually Explained de Cohere: https://txt.cohere.com/text-embeddings/
    Herramienta Tensorflow Embedding Projector: https://projector.tensorflow.org/
    También vale la pena ver What are embeddings? de Vicki Boykis: https://vickiboykis.com/what_are_embeddings/
    Planeo agregarlos a “further reading” al final de la página

    • Antes intenté una idea casi igual: https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      Usé embeddings para aumentar la interacción con artículos relacionados y, personalmente, considero que los embeddings son una herramienta poderosa y subestimada
      Se pueden usar para navegar por similitud entre documentos o extractos, o al contrario, para encontrar contenido singular; además son bastante “seguros” porque no hay que preocuparse por alucinaciones
    • Me gusta que esté escrito de una forma accesible incluso para personas con poca experiencia en IA, machine learning o LLM
      También podría ser interesante cómo se crean los embeddings. Por ejemplo, métodos como cortar la capa de clasificación después del entrenamiento, o enfoques como EfficientNet
    • Me pregunto si hay recursos que traten la historia de los embeddings y su uso en ciencias de la computación y LLM
      Se están convirtiendo en una base central del machine learning
  • En visión por computadora y algoritmos de SLAM visual, los embeddings se han convertido en el método estándar de facto para reconocimiento de lugares, y es muy parecido a lo que describe este artículo
    Se le llama “bag-of-word place recognition” y hoy se usa en casi todas las bibliotecas open source
    La idea central es pasar cada imagen por un pipeline de extracción de características y descriptores, e “incrustarla” en un vector que contiene las N características principales
    Mientras la cámara se mueve, se crea una base de datos de imágenes llamadas keyframes, y las imágenes se almacenan como vectores de mucha menor dimensión
    Luego se consulta la base de datos con todas las imágenes y se encuentra la mejor coincidencia en la base de datos vectorial mediante métodos como la similitud coseno
    Si hay una coincidencia, se pueden calcular las restricciones estéreo entre la imagen de consulta y la imagen coincidente para actualizar el mapa
    El artículo original es [1] y la implementación más famosa es https://github.com/dorian3d/DBoW2
    [1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • Es una excelente referencia introductoria
    Hace tiempo hice mi propia app de notas para iOS, y agregar embeddings a la búsqueda de texto completo existente fue 1) sorprendentemente fácil y 2) mucho más potente de lo que esperaba al principio
    Sabía que al buscar “dog” también aparecerían notas que contuvieran “canine”, pero recién lo entendí al probar búsquedas como “mascotas que podrían gustarme” y ver que encontraba varias notas relacionadas con animales con un sentimiento positivo
    Ese fue mi primer gran momento de “ajá”
    En ese momento, el PR de DocsGPT de Supabase me sirvió como código de ejemplo: https://github.com/supabase/supabase/pull/12056

    • La expresión “agregar a la búsqueda de texto completo existente” es sutilmente importante. Los embeddings ofrecen búsqueda semántica que complementa los algoritmos de búsqueda tradicionales
      Muchas aplicaciones dependen mucho de nombres o nombres propios, y a menudo les falta contexto
      Si te refieres a tu perro solo por su nombre, sin describirlo, ciertos modelos de embeddings podrían no captarlo
      Los nombres propios de personas, lugares y calles pueden ser muy importantes para anclar búsquedas personalizadas o específicas de un dominio, pero los modelos de lenguaje generales no los conocen
      Me pregunto si hay métodos concretos para abordar este problema
    • Estoy trabajando en algo parecido para notas de Logseq
      Ahora mismo, la pregunta más importante es cuánto texto convertir en un solo embedding
      Estoy considerando si hacerlo por oración, o tomar como uno solo todos los bloques de oraciones pertenecientes a una página de una app de notas
    • Me pregunto si para generar embeddings se usa una API fuera del dispositivo, y si la búsqueda se hace dentro del dispositivo
  • El ejemplo representativo de embeddings de palabras es el famoso King - Man + Woman = Queen.
    Funciona bien en el espacio vectorial, pero al proyectarlo a 2 dimensiones no resulta visualmente muy intuitivo.
    En mi experiencia, pasó lo mismo con PCA, MDS y t-SNE: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    Es un JupyterLite Notebook que ejecuta embeddings de palabras en el navegador, y es mejor no correrlo en un smartphone.
    Me pregunto si alguien conoce una buena forma de visualizar de manera clara el ejemplo representativo de embeddings de palabras.

    • Si entendí bien, se puede visualizar en un espacio 2D poniendo “king” en el origen, con el eje X como “king”-“man” y el eje Y como “king”-“woman”.
      Si de verdad quieres ortogonalidad, puedes usar Gram-Schmidt.
      En 3D, se puede agregar otro eje Z como “king”-“queen”, y la versión ortogonalizada se acerca más al concepto de distancia que ve el modelo.
      En 2D, no se puede mostrar cuánto se aleja de “queen” al calcular “king”-“man”+“woman”, pero sí se puede obtener con precisión la distancia restante.
      En 3D, debería poder dar la distancia exacta.
      “queen” normalmente se elige porque es la palabra cuyo embedding es más cercano a X="king"-"man"+"woman".
      En el gráfico 2D también se pueden mostrar algunas de las siguientes palabras más cercanas y adjuntar a cada una su distancia ortogonal respecto del plano 2D.
      Entonces “queen” debería ser la palabra con la menor suma entre la distancia cuadrática respecto de X y la distancia ortogonal cuadrática respecto del plano, así que también se podría verificar visualmente hasta cierto punto.
    • Sería bueno probar UMAP.
    • Mientras buscaba un chiste de matemáticos sobre visualizar altas dimensiones, le pregunté a ChatGPT, y creó un chiste al estilo de Richard Feynman que no se puede encontrar en Google.
      Era algo como “No se puede visualizar la cuarta dimensión… al menos yo no puedo. Solo tengo tres branes”, un juego de palabras entre branes y brains.
      Después, ChatGPT admitió que lo había inventado y se disculpó.
      Luego sacó citas de John von Neumann, H. G. Wells e Ian Stewart, y al final dio una respuesta del tipo “para visualizar la cuarta dimensión, visualiza la tercera y luego di ‘n+1’”, que era lo más parecido al chiste que recordaba, pero menos gracioso.
      Así que le pedí que inventara citas alucinadas al estilo de Deepak Chopra sobre visualizar espacios de alta dimensión, y produjo un montón de citas falsas pero plausibles mezclando expresiones como septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle y Shannon entropy.
  • Un error común en la trigonometría práctica es hacer cálculos de raíz cuadrada innecesarios.
    En el código de ejemplo, magnitude_a = sum(x * x for x in a) * 0.5 y magnitude_b = sum(x * x for x in b) * 0.5 no necesitan *0.5.
    Si vas a comparar cosenos, puedes comparar los valores al cuadrado y evitar el costoso cálculo de raíces.
    De manera similar, en criptografía de curvas elípticas, operaciones caras como el cálculo de inversos se posponen todo lo posible, o cuando solo se comparan dos puntos, a veces se evita directamente calcular el valor canónico.

    • Ese código está escrito para que sea fácil de entender.
      Si no fuera así, lo habría reemplazado por código SIMD de bajo nivel.
  • dot_product = sum(x * y for x, y in zip(a, b)); me sorprende que lo hagan así y no usen operaciones vectorizadas de numpy.
    Lo entendí al ver la parte que decía que “le pedí a ChatGPT que escribiera varias versiones del código de similitud coseno”.

    • Hay dos razones.
      Primero, al explicárselo a la gente, siento que la sintaxis de numpy más bien estorba.
      Segundo, numpy no es la dependencia más liviana.
      Lo uso cuando necesito rendimiento, pero no quiero tomarlo como opción predeterminada.
  • Si quieres ver artículos de Show HN, startups de ProductHunt, empresas de YC o repositorios de Github relacionados con embeddings de LLM, puedes encontrarlos rápido en el MVP de motor de búsqueda basado en LLM-Embeddings que acabo de lanzar.
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • Está bien.
      Esperaba que al pulsar los distintos botones de filtro los resultados de búsqueda se actualizaran de inmediato, y no sabía que había que volver a buscar.
      Entiendo por qué lo hicieron así.
    • Mi artículo de Show HN está aquí: https://news.ycombinator.com/item?id=38011802
  • Es lo más interesante que he leído sobre “IA” en los últimos meses.
    Cada vez que veía modelos de embedding en una lista, me preguntaba qué eran, y también me preguntaba por qué todo el mundo hablaba de bases de datos vectoriales.
    Se me ocurre de inmediato una forma de aplicarlo a un side project que llevo mucho tiempo desarrollando.
    Si todos los documentos tienen embeddings, quizá sea realmente viable hacer una clusterización útil de los datos de los usuarios.

  • Me da curiosidad si alguien ha usado embeddings en la práctica para algo que no sea vecinos más cercanos aproximados y clustering.
    Las posibilidades que se me ocurren son proyección, indexación y ordenamiento sobre ejes arbitrarios. Por ejemplo, ejes como “caliente-frío”, “felicidad-tristeza”, “ciencia ficción-realismo”, “literariedad-comercialidad”.
    También debería haber formas de entrenar embeddings directamente, además de hacer clasificación tipo SVM en el espacio de embeddings, inferencias tipo word2vec como woman-man+king=queen, o tomar una capa de un LLM.
    Sé que se usa el aprendizaje contrastivo, pero parece valer la pena explorar otros métodos, como aprender embeddings junto con una red neuronal de funciones y generar ecuaciones funcionales para calcular una pérdida de error cuadrático medio.
    Me sorprende que todo parezca estar tan concentrado en la búsqueda semántica, y seguro debe haber otras aplicaciones interesantes.

    • Me confunde un poco, porque todos los ejemplos que das parecen tareas relativamente comunes.
      La primera y la tercera son básicamente lo mismo.
      En visión por computadora, podrías querer modificar semánticamente una imagen, como agregarle lentes a una foto, y las tareas que se ven en anuncios de Google son ejemplos de eso.
      Ese tipo de trabajo se hace en el espacio latente.
      En los flujos normalizantes es particularmente claro, porque transforman el espacio en uno gaussiano.
      Los modelos de difusión hacen algo similar como método aproximado, aunque no son invertibles; sí se pueden revertir.
      Proyectas la imagen, oración o datos que quieres manipular, los manipulas en el espacio gaussiano y luego los devuelves al espacio objetivo.
      Aunque quizá la confusión venga de que la palabra embedding es un término sobrecargado con demasiados significados.
      Tal vez estés pensando solo en el primer bloque que convierte tokens enteros discretos en valores continuos de punto flotante.
      Pero ese embedding también se aprende, así que aunque termine pareciéndose a una tabla de consulta, sigue siendo un proceso de red neuronal.
      También se usan SVM en este espacio.
      Lo veo parecido al espacio latente, pero un poco más abstracto.
      Como mínimo, un embedding debería ser inyectivo. Matemáticamente sí, aunque…
    • La clasificación tipo SVM en el espacio de embeddings es una técnica muy básica en NLP y machine learning en la industria.
      Entrenar embeddings directamente es, literalmente, el modelo de embeddings original: Word2Vec.
    • También he creado un espacio de embeddings word2vec basado en resúmenes de PubMed.
      Encontré muchas variantes y abreviaturas de nombres químicos y bioquímicos: con guion, sin guion y con espacios.
      Probablemente también se podría haber creado un diccionario de términos técnicos.
      No sé hasta dónde se habría podido llegar con definiciones, pero aunque solo con vectores hay límites, sirve como punto de partida.
      Es muy probable que otras personas hayan construido diccionarios de esta manera.
    • Los embeddings multilingües, en los que se crea un espacio de embeddings para cada idioma y se alinean los espacios con un diccionario semilla, tienen aplicaciones reales o potenciales en búsqueda multilingüe y traducción automática.
    • También se pueden usar para deduplicación de datos.
  • He experimentado con embeddings y también he creado algunos casos de uso en producción; son una herramienta excelente que habilita muchas aplicaciones interesantes.
    Pero al construir para un dominio específico, uno se topa con las limitaciones de los modelos de embeddings listos para usar.
    Los modelos listos tienen muchas dimensiones, pero algunas de esas dimensiones pueden ser importantes para la clasificación, similitud de contenido o clustering de mi aplicación, y otras no.
    En otras palabras, dos vectores pueden parecer cercanos porque están cerca en dimensiones que no me interesan.
    Espero que aparezcan mejores herramientas y literatura para el fine-tuning de modelos de embeddings.

    • Ajustar todo el modelo de lenguaje para resolver este problema es como usar un mazo para clavar un clavo.
      Estas herramientas existen desde hace mucho; por ejemplo, etiquetas un poco de datos y luego entrenas un SVM de clasificación sobre el espacio de embeddings.
    • sentence-transformers tiene herramientas bastante bien desarrolladas para esto.