Sentence-BERT (SBERT) es BERT ajustado para que una oración entera se convierta en un único vector, de modo que dos oraciones puedan compararse con una simple similitud coseno. Lo presentaron Nils Reimers e Iryna Gurevych en 2019 (Reimers y Gurevych, 2019), y su biblioteca, sentence-transformers, se volvió una de las herramientas más usadas para producir embeddings de texto (Alammar y Grootendorst, 2024, pp. 62, 293).
El problema: BERT compara bien, pero caro
BERT funciona como un cross-encoder: para medir cuán parecidas son dos oraciones hay que dárselas juntas, separadas por un token [SEP]. Es preciso, pero no escala: encontrar el par más parecido entre 10.000 oraciones exige unos 50 millones de pasadas por la red, unas 65 horas en una GPU V100 (Reimers y Gurevych, 2019, p. 3982; Alammar y Grootendorst, 2024, p. 294). La alternativa obvia, pasar cada oración sola y promediar sus vectores o usar el de [CLS], da malos embeddings de oración: en siete tareas de similitud semántica ambos rinden peor que el simple promedio de vectores GloVe, y el de [CLS] es el peor de todos (Reimers y Gurevych, 2019, pp. 3982, 3985).
Cómo funciona
SBERT agrega una capa de pooling (por defecto, el promedio de los vectores de salida) y ajusta BERT dentro de una red siamesa: dos copias con los mismos pesos procesan cada oración por separado y producen los vectores u y v (Reimers y Gurevych, 2019, p. 3984; Alammar y Grootendorst, 2024, pp. 294–295). Durante el ajuste, un clasificador recibe (u, v, |u − v|) y debe decidir si el par es de implicación, contradicción o neutral, con los datos de inferencia en lenguaje natural de SNLI (570.000 pares) y MultiNLI (430.000) (Reimers y Gurevych, 2019, pp. 3984–3985). Alcanza una época, menos de 20 minutos de cómputo (2019, pp. 3984–3985). El componente decisivo resultó ser la diferencia |u − v|, que empuja a los pares similares a acercarse y a los distintos a alejarse (2019, pp. 3988–3989). Después, el clasificador se descarta: en uso solo quedan los vectores y el coseno. Es un caso de aprendizaje contrastivo: el modelo aprende qué hace parecidos a dos textos viendo pares parecidos y pares distintos (Alammar y Grootendorst, 2024, pp. 292–295).
Qué cambió
El resultado es un bi-encoder: cada texto se codifica una sola vez y queda guardado. Encontrar el par más parecido entre 10.000 oraciones pasa de 65 horas a unos 5 segundos, más 0,01 segundos de cosenos; con índices adecuados, buscar entre millones de preguntas lleva milisegundos (Reimers y Gurevych, 2019, p. 3983). En similitud semántica, además, SBERT superó a los mejores modelos de embeddings de oración de la época, InferSent y el Universal Sentence Encoder (2019, pp. 3983, 3985).
Esa arquitectura es la base de la búsqueda semántica densa: la consulta y los documentos se proyectan en el mismo espacio y se devuelven los vecinos más cercanos (Alammar y Grootendorst, 2024, pp. 226–228), guardados en una base de datos vectorial. Es el recuperador típico de Generación aumentada por recuperación (RAG).
Límites
El bi-encoder es rápido pero menos preciso que el cross-encoder, que lee ambos textos a la vez; por eso los buscadores suelen encadenarlos: SBERT recupera candidatos y un cross-encoder los reordena (Alammar y Grootendorst, 2024, pp. 226, 244, 295). Hereda la ventana de BERT, así que los documentos largos hay que partirlos (2024, p. 235). Y la similitud que aprende depende de sus datos: ajustado con NLI, rindió peor que el Universal Sentence Encoder en SICK-R y en la clasificación de preguntas de TREC, dominios más cercanos a los datos de este último (Reimers y Gurevych, 2019, pp. 3985, 3988).