Embeddings y bases de datos vectoriales: test de bge-m3
Qué son los embeddings y las bases vectoriales sin rodeos matemáticos. Probamos bge-m3 frente a nomic-embed-text en casos reales: 8 de 10 aciertos frente a 4.
👁 114 lecturas
Un embedding es la conversion de un texto en una lista de numeros (vector), donde textos con significado similar reciben cifras cercanas. Una base de datos vectorial almacena estos vectores y encuentra con rapidez los mas proximos a tu consulta. En esto se fundamentan la busqueda semantica, el RAG y la memoria de los agentes de IA. A continuacion te lo explico sin formulas matematicas complejas y te muestro una prueba de dos modelos gratuitos ejecutados sobre un corpus de textos legales polacos: uno localizo la norma correcta en 8 de cada 10 casos, mientras que el otro solo acerto en 4. Este contenido forma parte de la serie Agentes de IA desde cero.
Estado a 4 de octubre de 2026
- He evaluado dos modelos ejecutados de forma local mediante Ollama 0.35.1 en una grafica RTX 4090:
bge-m3(licencia MIT) ynomic-embed-text(licencia Apache 2.0). Ambos son aptos para proyectos comerciales. - Banco de pruebas: 5 frases para medir distancias semanticas y 10 preguntas dirigidas a 920 fragmentos de tres leyes polacas.
- Coste: 0 EUR, procesado integro en mi propio equipo.
- El código fuente utilizado se encuentra disponible en el paquete de inicio (
04_rag.py).
Que es un embedding de forma sencilla
Imagina un mapa en el que cada frase representa un punto determinado. Las frases sobre la fianza de un alquiler estaran muy proximas entre si, las relativas a las vacaciones un poco mas apartadas y las referidas al pronostico del tiempo en el extremo opuesto. El embedding no es otra cosa que las coordenadas de una oracion en dicho mapa. La unica diferencia reside en que no trabajamos en dos dimensiones, sino en varios cientos o mas de un millar.
Así empieza el vector calculado por el modelo bge-m3 para la frase traducida «Cual es la fianza para el alquiler de una vivienda?» (en la prueba original ejecutada en polaco: «Ile wynosi kaucja za wynajem mieszkania?»):
[-0.0375, 0.0463, -0.0196, -0.0042, 0.0015, ... ] (1024 numeros en total)
Un valor numerico individual y aislado carece de sentido. Lo verdaderamente util es calcular la distancia espacial entre vectores. La metrica mas comun es la similaridad del coseno: un valor de 1 representa una direccion identica (significado equivalente), mientras que un resultado proximo a 0 indica ausencia total de vinculo semantico.
Test de similaridad con cinco frases
Compare la frase de referencia («Cual es la fianza para el alquiler de una vivienda?», probada originalmente en polaco) frente a otras cuatro variantes. Un modelo solvente debe catalogar como mas proxima aquella oracion que comparta significado, aunque recurra a palabras distintas o a otro idioma. Los textos indicados en la tabla son traducciones del material original utilizado en la evaluacion:
| Frase comparada (traduccion del test en polaco) | bge-m3 | nomic-embed-text |
|---|---|---|
| How much is the rental deposit for a flat? (mismo sentido, en ingles) | 0,736 | 0,416 |
| Que deposito abona el arrendatario de un inmueble? (traduccion: misma idea, distinto vocabulario) | 0,678 | 0,665 |
| Fianza por botellas retornables en la tienda (traduccion: misma palabra, distinto contexto) | 0,569 | 0,713 |
| Cuantos dias de vacaciones anuales me corresponden? (traduccion: tema no relacionado) | 0,442 | 0,755 |
El modelo bge-m3 clasifico las oraciones de la misma forma que lo haria un lector humano: asigno la mayor cercania a la traduccion al ingles, situo despues la parabola explicativa, a continuacion el caso de los envases retornables y, en el extremo mas lejano, la consulta laboral. Por contra, nomic-embed-text decretó que la duda sobre las vacaciones era la más afín a la fianza inmobiliaria y relegó al último puesto la versión en inglés. Se trata de un modelo optimizado prioritariamente para el idioma inglés, por lo que en polaco tiende a guiarse por patrones sintácticos superficiales en lugar de extraer el concepto profundo.
Test con leyes y textos normativos
En la guia RAG paso a paso configuré un buscador sobre 920 fragmentos de normativas polacas (el Código de Trabajo, la ley de arrendamientos y los derechos del paciente). Efectué 10 consultas en lenguaje cotidiano en polaco y verifiqué en qué posición del ranking aparecía el artículo legal pertinente.
| Caracteristica | bge-m3 | nomic-embed-text |
|---|---|---|
| Articulo exacto en 1.a posicion | 5 de 10 | 2 de 10 |
| Artículo exacto dentro del top 5 | 8 de 10 | 4 de 10 |
| Dimensiones del vector | 1024 | 768 |
| Longitud maxima (ventana de contexto en Ollama) | 8192 tokens | 2048 tokens |
| VRAM ocupada tras la carga en tarjeta | 664 MB | 323 MB |
| Tamano del indice de 920 fragmentos | 8,5 MB | 7,5 MB |
| Tiempo requerido para indexar los 920 fragmentos* | 155 s | 105 s |
| Separacion de similaridad (consulta ajena vs fragmento idoneo) | 0,43 vs 0,64-0,72 | 0,69 vs 0,69-0,77 |
| Licencia de uso | MIT | Apache 2.0 |
* Durante las mediciones la GPU atendia tareas complementarias en paralelo, de modo que estos tiempos tienen un caracter meramente orientativo. En reposo total, ambos sistemas reducen sus marcas.
El dato de dispersion de similaridad es tan crucial como la propia precision. En bge-m3, una pregunta trampa sobre los límites de velocidad en autopista (ausente en las leyes indexadas) registró una afinidad máxima de solo 0,43, distanciándose claramente de las respuestas correctas. Esto permite establecer un umbral mínimo para devolver un mensaje del tipo «no dispongo de esa información» sin consumir llamadas adicionales. En nomic-embed-text, practicamente todas las consultas arrojan valores en torno a 0,7, imposibilitando fijar un filtro discriminador eficaz.
Para que sirve una base de datos vectorial
Una base vectorial almacena los embeddings junto con el contenido original y sus metadatos (archivo de origen, identificador de artículo o fechas), facilitando la localización inmediata de los vectores más cercanos mediante índices especializados. Para volúmenes reducidos basta un array en numpy: mis 920 vectores suponen 8,5 MB y su análisis se resuelve con un cálculo matricial directo. Conviene migrar a una base de datos dedicada en estos casos:
- Manejamos cientos de miles de textos y los calculos en memoria sobrecargan el sistema.
- Necesitas aplicar filtros sobre los metadatos («buscar solo en legislacion laboral» o «restringir a documentos de 2026»).
- Se incorporan nuevos textos continuamente y deseas evitar el reprocesamiento completo del indice.
- Multiples usuarios realizan peticiones concurrentes contra el sistema.
| Solucion | Entorno de ejecucion | Perfil de aplicacion |
|---|---|---|
| numpy (fichero .npz) | Directamente en tu propio script | Fase de aprendizaje, colecciones de pocas decenas de miles de fragmentos |
| Chroma | En local, en disco o desplegado en servidor | Prototipado rápido y primeras implementaciones |
| pgvector (PostgreSQL) | Instancia existente de PostgreSQL | Infraestructuras con PostgreSQL operativo que buscan centralizar datos |
| Qdrant, Weaviate, Milvus | Servidores dedicados o nubes gestionadas | Entornos corporativos de gran escala y alta demanda |
Verifique que Chroma 1.5.9 arroja exactamente las mismas respuestas cuantitativas que un array de numpy sobre mis datos. La base vectorial aporta escalabilidad operativa y organizacion, no incrementa por si misma la agudeza del rastreo. La precision final dependera siempre de la calidad intrinseca del modelo de embeddings y del criterio adoptado al dividir los fragmentos de texto.
Criterios para seleccionar un modelo de embeddings
- Prioriza modelos multilingues probados si trabajas con idiomas distintos al ingles; en mis pruebas locales,
bge-m3mostro un comportamiento solido. - Define una bateria de evaluacion propia: redacta entre 10 y 20 cuestiones cuya respuesta precisa conozcas de antemano. Sin este paso, cualquier decision es ciega.
- Mide la tasa de acierto dentro de los primeros 5 resultados, ya que ese suele ser el margen habitual que se inyecta en el prompt de un flujo RAG.
- Observa la dispersion numerica al plantear consultas no relacionadas con el dominio para comprobar si es factible delimitar respuestas negativas de forma fiable.
- Presta atencion a los prefijos de consulta:
nomic-embed-textexige anteponersearch_query:en las preguntas ysearch_document:en los textos a indexar; omitirlos degrada sensiblemente los resultados.
Si prefieres no gestionar hardware local, existen API en la nube (como las de OpenAI, Google, Mistral o Cohere). En ese caso facturas segun el volumen de procesamiento y transfieres tus documentos a sus plataformas. Si necesitas mas detalles sobre la conversion y medicion de costes, puedes consultar la guia sobre tokens.
Casos de uso para embeddings mas alla de RAG
- Buscadores inteligentes en catalogos y bases de conocimiento: capaces de asociar la busqueda «calzado para la lluvia» con articulos categorizados como «botas impermeables».
- Deteccion y descarte de duplicados: agrupacion de tickets de soporte repetidos o preguntas redundantes en foros.
- Clustering tematico: organizacion de opiniones y comentarios de usuarios en bloques de interes sin recurrir al etiquetado manual.
- Persistencia de memoria en agentes autonomos: el agente registra sus reflexiones como vectores y recupera precedentes relevantes ante nuevos problemas. Tienes mas ejemplos en 12 ejemplos practicos de agentes de IA.
Preguntas frecuentes
Que es un embedding explicado en una sola frase?
Una secuencia de valores numericos que captura el significado de un texto para que una aplicacion pueda comparar ideas en lugar de limitarse a coincidir caracteres literales.
Que diferencia existe entre un token y un embedding?
Un token es una fraccion de texto (a menudo una silaba o raiz) en la que se fragmenta un parrafo. El embedding es el vector global resultante que codifica la semantica de toda la secuencia unificada. El modelo segmenta primero el contenido en tokens y luego genera dicho vector condensado.
Es imprescindible disponer de tarjeta grafica para calcular embeddings?
No. Los modelos ligeros funcionan adecuadamente sobre la CPU, aunque la velocidad de indexacion se reduzca. Durante mis pruebas, bge-m3 requirio solo 664 MB de memoria de video, una cifra asumible para la inmensa mayoria de tarjetas graficas del mercado.
Se pueden combinar embeddings procedentes de modelos distintos?
En absoluto. Cada modelo proyecta su propio espacio vectorial independiente. Tanto las preguntas del usuario como los documentos deben transformarse obligatoriamente con el mismo algoritmo. Modificar el modelo de embeddings exige recalcular todo el indice desde cero.
Cuando compensa una base vectorial frente a una relacional clasica?
Las bases convencionales filtran por coincidencia exacta o rangos de texto, mientras que las vectoriales operan por similitud conceptual. En la practica, los mejores desempenos provienen de la busqueda hibrida: los terminos clave localizan identificadores tecnicos y referencias explicitas, mientras que los vectores resuelven sinonimos y conceptos equivalentes.
Cual es el coste habitual de generar embeddings?
Si optas por una instalacion local, el unico gasto corresponde al suministro electrico del equipo. En servicios mediante API, suele ser una de las modalidades de computacion mas asequibles, tasandose con frecuencia en fracciones minimas de dolar por cada millon de tokens procesados. Revisa siempre las tarifas vigentes del proveedor que elijas.
Google · Tus fuentesBrilla más alto en tu Google - con un solo clicAñadir a fuentes preferidas →Fuentes consultadas y detalles de la prueba
- Fichas oficiales de bge-m3 y nomic-embed-text en el repositorio de Ollama (revisado el 4 de octubre de 2026).
- Documentacion tecnica de Chroma.
- Parámetros de medición: estación de trabajo propia (tarjeta RTX 4090, sistema operativo Windows 11, Ollama versión 0.35.1), 4 de octubre de 2026, entre las 14:30 y las 15:00.


