Intermedio 11 minEmbeddings

Sentence Transformers : los embeddings en local

Respuesta directa

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.

Por Mohamed Meguedmi·Actualización 2026-09-30·Probado en Windows, macOS y Linux

#¿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.

El primer ejemplo de la documentación oficial
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
    "The weather is lovely today.",
    "It's so sunny outside!",
    "He drove to the stadium.",
]
embeddings = model.encode(sentences)
print(embeddings.shape)  # [3, 384]
similarities = model.similarity(embeddings, embeddings)

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

El kit RAG Local

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
  1. 01
    Instalar la biblioteca
    Usa 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.
  2. 02
    Elegir un modelo multilingüe
    Elige un modelo anunciado como multilingüe (consulta la tabla más abajo), no un modelo all-*, entrenado para el inglés.
  3. 03
    Codificar documentos en lote
    Pasa una lista de textos a encode: la biblioteca los procesa por lotes, lo que aprovecha mucho mejor el hardware que una llamada por texto.
  4. 04
    Codificar la pregunta con el mismo modelo
    Usa el mismo modelo y los mismos prefijos que para los documentos, luego compara con similarity.
  5. 05
    Guardar el nombre del modelo con el índice
    Anótalo en los metadatos: si cambias de modelo, tendrás que volver a codificar todo el corpus.
Búsqueda semántica con un modelo multilingüe
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("intfloat/multilingual-e5-large")

docs = [
    "Le contrat peut être résilié avec un préavis de trois mois.",
    "La facture est payable à trente jours fin de mois.",
]
question = "Quel est le délai pour mettre fin au contrat ?"

doc_emb = model.encode(docs, prompt="passage: ", normalize_embeddings=True)
q_emb = model.encode(question, prompt="query: ", normalize_embeddings=True)
print(model.similarity(q_emb, doc_emb))

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.

Modelos citados en la documentación de Sentence Transformers
ModeloLo que dice la documentaciónPara el francés
all-MiniLM-L6-v2Aproximadamente 5 veces más rápido que all-mpnet-base-v2, buena calidad; 384 dimensiones, un máximo de 256 tokensNo: orientado al inglés
all-mpnet-base-v2Mejor calidad de la familia all-*, modelo generalistaNo: orientado al inglés
multi-qa-mpnet-base-cos-v1Entrenado para la búsqueda semántica con 215 millones de pares pregunta-respuestaNo: orientado al inglés
paraphrase-multilingual-MiniLM-L12-v2Entrenado con datos paralelos para más de 50 idiomasSí, pensado para la similitud de frases
paraphrase-multilingual-mpnet-base-v2Misma familia, más de 50 idiomasSí, más pesado
distiluse-base-multilingual-cased-v1Soporta 15 idiomas entre ellos el francésSí, con una selección limitada de idiomas
multilingual-e5-largeRequiere los prefijos query: y passage: (indicados en la documentación)Sí, recuperación multilingüe
i
La similitud de frases y la búsqueda documental no son tareas iguales
Un modelo entrenado para reconocer paráfrasis no es necesariamente el mejor para recuperar un pasaje que responda a una pregunta. Para un RAG, prefiere un modelo entrenado para la búsqueda. Nuestras guías sobre embeddings en francés y sobre BGE-M3 comparan los candidatos.

#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.

¿Qué herramienta para tus embeddings?
CriterioSentence TransformersAPI de embeddings de Ollama
InstalaciónBiblioteca de Python que hay que instalarYa está presente si usas Ollama
Elección de modelosTodos los modelos compatibles de Hugging FaceModelos de la biblioteca Ollama
Control de prefijos y longitudDetallado: prompt, max_seq_length, prompts con nombreSegún el modelo y la llamada
Entrenamiento o ajuste finoSí, la biblioteca lo soportaNo
Uso típicoIndexación en masa, experimentos, reordenamientoIntegració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

  1. 01
    Escribir veinte preguntas reales
    Elige preguntas que tus usuarios harán, formuladas con sus propias palabras, no con las del documento.
  2. 02
    Anotar el pasaje esperado
    Para cada pregunta, identifica el pasaje o los pasajes que contienen la respuesta.
  3. 03
    Comparar dos o tres modelos
    Codifica el mismo corpus con cada modelo y observa si el pasaje correcto aparece entre los cinco primeros resultados.
  4. 04
    Volver a ejecutar con cada cambio
    Si cambias el modelo, la segmentación o el prefijo, vuelve a ejecutar esta pequeña prueba antes de reindexar.

#FAQ

FAQ
¿Se necesita una GPU para Sentence Transformers?+
No. Los modelos de embedding son lo bastante pequeños para ejecutarse en un procesador, y la biblioteca elige automáticamente el mejor dispositivo disponible. Una GPU sirve principalmente para indexar un gran corpus más rápido; para codificar una sola pregunta, la diferencia es pequeña en la mayoría de los casos.
¿Qué modelo de Sentence Transformers elegir para el francés?+
Elige un modelo multilingüe: la documentación menciona paraphrase-multilingual-MiniLM-L12-v2 para más de 50 idiomas, y multilingual-e5-large con los prefijos query: y passage:. Prueba dos o tres candidatos con tus propias preguntas en lugar de confiar únicamente en la clasificación MTEB, cuya documentación recuerda que no predice tus resultados.
¿Puedes usar tu modelo de conversación para codificar?+
No. Un modelo de embeddings se entrena para situar cerca unos de otros los textos de significado similar; un modelo de conversación no está entrenado para ello, y la recuperación resulta mediocre aunque el código parezca funcionar sin errores. Usa un modelo de embeddings específico, distinto del modelo que redacta las respuestas.
¿Qué pasa si cambio de modelo de embedding?+
Hay que volver a codificar todo el corpus, ya que los vectores de dos modelos no son comparables: sus dimensiones y coordenadas difieren. Anota el nombre del modelo junto al índice y prevé tiempo de cálculo para reconstruir la base vectorial antes de cambiar, manteniendo activo el índice anterior durante la operación.
¿Qué ocurre si mi texto supera la longitud máxima?+
Se trunca conservando solo los primeros max_seq_length tokens, sin error: el final del pasaje se ignora en la búsqueda. Con all-MiniLM-L6-v2, el límite es de 256 tokens. Divide tus textos en pasajes más cortos que el límite del modelo, dejando margen.
¿Sentence Transformers o Ollama para los embeddings?+
Sentence Transformers ofrece más control (prefijos, longitud, modelos de Hugging Face, entrenamiento). La API de Ollama es más sencilla si tu cadena ya se basa en Ollama. En ambos casos, utiliza el mismo modelo para la indexación y las consultas, con la medida de similitud recomendada para ese modelo.

#Para ir más allá

¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.