Sentence Transformers : los embeddings en local
Sentence Transformers es una biblioteca de Python que carga un modelo de embeddings desde Hugging Face y convierte textos en vectores con model.encode, en CPU o GPU; model.similarity compara después estos vectores. Para el francés, elige un modelo multilingüe: un modelo orientado al inglés como all-MiniLM-L6-v2 evalúa mal los textos en francés. Mantén tus pasajes por debajo de la longitud máxima del modelo, porque el exceso se trunca sin advertencia.
Esta guía muestra cómo instalar la biblioteca, codificar un corpus, elegir un modelo que entienda el francés, evitar errores silenciosos (límite de longitud, prefijos de consulta, dos modelos mezclados) y acelerar la indexación en tu máquina. También compara Sentence Transformers con la API de embeddings de Ollama, para ayudarte a decidir cuál usar.
#¿Qué es un embedding y qué hace la biblioteca?
Un modelo de embedding convierte un texto en una lista de números, un vector, de modo que dos textos con significados similares tengan vectores cercanos. La documentación de Sentence Transformers describe estos modelos, llamados bi-encoders, como modelos que calculan una representación de tamaño fijo para un texto, con un cálculo de embeddings que suele ser eficiente y un cálculo de similitud muy rápido. Es el componente inicial del RAG: se codifica la pregunta, se buscan los pasajes cuyos vectores están más cerca y se entregan al modelo de lenguaje. Dos consecuencias que conviene recordar: el modelo que codifica los documentos debe ser el mismo que codifica las preguntas, y su noción de «cercano» proviene de su entrenamiento. Un modelo entrenado principalmente con textos en inglés es un juez poco fiable del francés.
Este modelo genera vectores de 384 dimensiones y sirve como punto de partida, pero está diseñado para inglés: para un corpus francés, reemplázalo como se indica más abajo. La biblioteca coloca automáticamente el modelo en el mejor dispositivo disponible (cuda, mps o cpu), y puedes forzar la elección con el parámetro device.
#Instalar y codificar un corpus francés
Tus documentos, tu IA: un RAG local fiable sobre tus PDF, notas y correos — sin enviar nada a la nube.
- Espacio en línea de por vida
- PDF + archivos
- Actualizaciones de por vida
- 01Instalar la bibliotecaUsa pip install -U sentence-transformers en un entorno Python. La versión 6.1.0 salió el 18 de septiembre de 2026 y requiere Python 3.10 o más reciente, según PyPI.
- 02Elegir un modelo multilingüeElige un modelo anunciado como multilingüe (consulta la tabla más abajo), no un modelo all-*, entrenado para el inglés.
- 03Codificar documentos en lotePasa una lista de textos a encode: la biblioteca los procesa por lotes, lo que aprovecha mucho mejor el hardware que una llamada por texto.
- 04Codificar la pregunta con el mismo modeloUsa el mismo modelo y los mismos prefijos que para los documentos, luego compara con similarity.
- 05Guardar el nombre del modelo con el índiceAnótalo en los metadatos: si cambias de modelo, tendrás que volver a codificar todo el corpus.
Los prefijos query: para las preguntas y passage: para los documentos son los que cita la documentación de Sentence Transformers para este modelo. Sin ellos, la recuperación se degrada sin ningún mensaje de error. El parámetro prompt de encode aplica el prefijo a cada texto.
#Elegir un modelo que entienda el francés
La documentación propone modelos originales e invita a consultar la clasificación MTEB como fuente de inspiración, con dos salvedades: descartar los modelos demasiado grandes para tu hardware y experimentar, ya que los modelos bien clasificados no necesariamente funcionan bien en tus propias tareas. La tabla siguiente recoge lo que dice la documentación sobre los modelos mencionados.
| Modelo | Lo que dice la documentación | Para el francés |
|---|---|---|
| all-MiniLM-L6-v2 | Aproximadamente 5 veces más rápido que all-mpnet-base-v2, buena calidad; 384 dimensiones, un máximo de 256 tokens | No: orientado al inglés |
| all-mpnet-base-v2 | Mejor calidad de la familia all-*, modelo generalista | No: orientado al inglés |
| multi-qa-mpnet-base-cos-v1 | Entrenado para la búsqueda semántica con 215 millones de pares pregunta-respuesta | No: orientado al inglés |
| paraphrase-multilingual-MiniLM-L12-v2 | Entrenado con datos paralelos para más de 50 idiomas | Sí, pensado para la similitud de frases |
| paraphrase-multilingual-mpnet-base-v2 | Misma familia, más de 50 idiomas | Sí, más pesado |
| distiluse-base-multilingual-cased-v1 | Soporta 15 idiomas entre ellos el francés | Sí, con una selección limitada de idiomas |
| multilingual-e5-large | Requiere los prefijos query: y passage: (indicados en la documentación) | Sí, recuperación multilingüe |
#Errores que destruyen un corpus sin mensaje de error
- Un modelo anglófono aplicado a textos en francés
- Todo funciona y, sin embargo, los resultados de la recuperación están distorsionados. Es el error más frecuente.
- Pasajes más largos que el límite del modelo
- La documentación especifica que los textos más largos se truncan conservando solo los primeros tokens, hasta el límite definido por max_seq_length: el final de cada pasaje largo queda invisible.
- Un modelo distinto para documentos y preguntas
- Los vectores ya no hablan de lo mismo: resultados anómalos que suelen aparecer al actualizar solo una parte de la cadena.
- Prefijos olvidados
- Algunos modelos requieren un prefijo diferente para preguntas y documentos; omitirlo degrada la recuperación.
- Vectores no normalizados con una función de puntuación inadecuada
- Si el modelo espera una similitud coseno, normaliza los vectores o utiliza la medida correspondiente; de lo contrario, la clasificación se degrada.
#Medir la proximidad: normalización y coseno
Dos vectores se comparan mediante una medida de similitud, normalmente el coseno. La documentación de Ollama indica que su punto de acceso devuelve vectores normalizados y recomienda el coseno para la mayoría de las búsquedas semánticas. Con vectores normalizados, el coseno y el producto escalar dan el mismo orden, lo que permite usar un índice optimizado para el producto escalar. El punto a tener en cuenta es la coherencia: la medida de la base vectorial debe corresponder a la que espera el modelo, y esta se indica en su ficha.
En cuanto a la longitud, la documentación da un orden de magnitud: 512 tokens para muchos modelos de tipo BERT, es decir, entre 300 y 400 palabras en inglés, y 256 tokens para all-MiniLM-L6-v2. El francés consume más tokens por palabra: divide tus pasajes de modo que queden por debajo del límite, dejando un margen, y comprueba model.max_seq_length. Puedes reducirlo, pero no aumentarlo más allá de lo que el modelo admite. La documentación añade que un modelo entrenado con textos cortos representa peor los textos largos.
#Indexar rápidamente en tu máquina
- Procesador o GPU
- El modelo se ejecuta en el mejor dispositivo disponible. Una GPU acelera la indexación masiva y aporta poca diferencia en una consulta aislada.
- Precisión reducida
- En GPU, pasar a float16 o bfloat16 acelera la inferencia con una pérdida mínima de precisión, según la documentación.
- Backends ONNX y OpenVINO
- La documentación indica que es posible obtener aceleraciones de hasta 2 a 3 veces, según el hardware y el backend; pruébalos en tu máquina.
- Varios GPU o procesos
- encode acepta una lista de dispositivos: útil en grandes corpus, menos en pequeños por el costo de arranque.
- Vectores más compactos
- La cuantización binaria o con enteros de los vectores y los modelos cuyas dimensiones se pueden truncar reducen el almacenamiento y el coste de la búsqueda.
- Caché e indexación
- No vuelvas a codificar los documentos que no hayan cambiado: la clave de caché se basa en el contenido, no en el nombre del archivo. En una máquina que también sirve un modelo de lenguaje, indexa cuando nadie lo esté usando.
#¿Cuánto pesa un índice de vectores?
El tamaño de un índice se calcula multiplicando el número de vectores por su dimensión y por cuatro bytes si los números están en formato float32. Un vector de 384 dimensiones ocupa 1.536 bytes: un millón de pasajes representa aproximadamente 1,5 GB. Con 1.024 dimensiones, ese mismo millón ocupa aproximadamente 4 GB. Estos valores excluyen los metadatos y las estructuras de índice de la base vectorial. La elección del modelo tiene, por tanto, una consecuencia directa sobre la memoria RAM necesaria para la búsqueda, y la cuantización de los vectores mencionada anteriormente puede reducir esta huella.
#Sentence Transformers o la API de embeddings de Ollama
Ollama también expone embeddings: la documentación indica que el comando ollama run peut produce vectores y que el punto de acceso api/embed devuelve vectores normalizados en L2. Recomienda los modelos embeddinggemma, qwen3-embedding y all-minilm, con vectores típicamente de 384 a 1.024 dimensiones, y recuerda dos reglas: coseno para la mayoría de las búsquedas, y modelo idéntico para la indexación y la consulta.
| Criterio | Sentence Transformers | API de embeddings de Ollama |
|---|---|---|
| Instalación | Biblioteca de Python que hay que instalar | Ya está presente si usas Ollama |
| Elección de modelos | Todos los modelos compatibles de Hugging Face | Modelos de la biblioteca Ollama |
| Control de prefijos y longitud | Detallado: prompt, max_seq_length, prompts con nombre | Según el modelo y la llamada |
| Entrenamiento o ajuste fino | Sí, la biblioteca lo soporta | No |
| Uso típico | Indexación en masa, experimentos, reordenamiento | Integración sencilla en una cadena ya basada en Ollama |
#El embedding es solo un primer filtro
La documentación de Sentence Transformers describe el bi-encoder como la primera etapa de una búsqueda en dos fases, en la que un cross-encoder, o reranker, reordena los mejores resultados. El cross-encoder lee la pregunta y cada pasaje juntos: es más lento, pero más preciso con un pequeño número de candidatos. Recuperar unos veinte pasajes por similitud y luego reordenarlos para conservar solo algunos es una de las mejoras menos costosas de una cadena RAG. La guía dedicada al reranker detalla su implementación; mide la mejora con tus veinte preguntas antes de conservarlo, ya que añade latencia a cada consulta, un segundo modelo que mantener y un consumo adicional de memoria.
Un buen hábito, antes incluso de comparar modelos, es revisar qué contiene tu corpus: ¿frases cortas y autónomas o párrafos técnicos largos? ¿Preguntas formuladas como palabras clave o frases completas? La respuesta orienta la elección del límite de longitud, la segmentación y el modelo. Un corpus jurídico denso no requiere los mismos ajustes que una base de preguntas y respuestas cortas, y ninguna clasificación pública puede saberlo por ti.
#Evaluar la elección del modelo antes de indexar
- 01Escribir veinte preguntas realesElige preguntas que tus usuarios harán, formuladas con sus propias palabras, no con las del documento.
- 02Anotar el pasaje esperadoPara cada pregunta, identifica el pasaje o los pasajes que contienen la respuesta.
- 03Comparar dos o tres modelosCodifica el mismo corpus con cada modelo y observa si el pasaje correcto aparece entre los cinco primeros resultados.
- 04Volver a ejecutar con cada cambioSi cambias el modelo, la segmentación o el prefijo, vuelve a ejecutar esta pequeña prueba antes de reindexar.
#FAQ
¿Se necesita una GPU para Sentence Transformers?+
¿Qué modelo de Sentence Transformers elegir para el francés?+
¿Puedes usar tu modelo de conversación para codificar?+
¿Qué pasa si cambio de modelo de embedding?+
¿Qué ocurre si mi texto supera la longitud máxima?+
¿Sentence Transformers o Ollama para los embeddings?+
#Para ir más allá
- Los mejores modelos de embeddings para el francés
- BGE-M3: embeddings que realmente entienden el francés
- Añadir un reranker a tu pipeline
- Estrategias de chunking
- Qdrant: la base vectorial de un RAG local
- RAG local: introducción
- Fuente: Sentence Transformers, inicio rápido
- Fuente: Sentence Transformers, cálculo de embeddings
- Fuente: Sentence Transformers, modelos preentrenados
- Fuente: Ollama, embeddings
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.