Añadir un reranker a tu pipeline
Un reranker es un cross-encoder que relee cada par pregunta-pasaje y reordena los candidatos devueltos por la búsqueda vectorial: se recupera un conjunto amplio (de 20 a 100 pasajes) y se conservan los 3 a 5 mejores para el modelo. Para el francés, BAAI/bge-reranker-v2-m3 (licencia Apache 2.0, aproximadamente 568 millones de parámetros) es el punto de partida más sencillo, en local, con GPU o incluso con CPU si el volumen sigue siendo modesto.
Los embeddings encuentran pasajes cercanos a una pregunta, no necesariamente pasajes que la respondan. El reranker corrige este defecto evaluando cada par pregunta-pasaje en un solo cálculo. Esta guía explica cuándo compensa su coste, qué modelo elegir en francés, cómo integrarlo en treinta líneas y cómo comprobar en tus propios documentos que realmente mejora los resultados.
#Reranker: para qué sirve en un pipeline RAG
Un reranker recibe la pregunta y un pasaje, los lee juntos y devuelve una puntuación de relevancia; luego se ordenan los candidatos por puntuación decreciente y se envían solo los mejores al modelo de lenguaje. En un pipeline RAG local, se inserta entre la base vectorial (ChromaDB, Qdrant, Weaviate) y el LLM: la búsqueda vectorial, por ejemplo, devuelve 30 pasajes, y el reranker selecciona 5. La ficha oficial de BAAI lo describe así: a diferencia de un modelo de embedding, el reranker recibe la pregunta y el documento como entrada y produce directamente una similitud, en lugar de un vector. El beneficio es más notable cuando la respuesta correcta está entre los candidatos pero no en las primeras posiciones: pasajes que hablan del tema general correcto pero que no responden a la pregunta específica ocupan los primeros lugares, y el modelo genera entonces una respuesta que no responde a la pregunta o es inventada. Si la respuesta correcta no está entre los candidatos, un reranker no puede hacer nada: no busca, solo ordena.
Un embedding genera un vector para cada documento, independientemente de la pregunta planteada, y la distancia mide una proximidad temática global. Dos pasajes sobre el mismo tema pueden obtener puntuaciones similares aunque solo uno contenga la respuesta. El cross-encoder examina el par completo: comprueba si la fecha, el nombre o la condición solicitados figuran en el pasaje. Es más preciso en esta evaluación local y más costoso, porque requiere una pasada por el transformer por cada par, en lugar de un solo cálculo por documento.
#Bi-encoder y cross-encoder: por qué se combinan ambos
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
- Reembolsado 30 j
- Bi-encoder (embedding)
- Codifica la pregunta y cada documento por separado; los vectores de los documentos se calculan una sola vez durante la indexación, la búsqueda se reduce a una comparación de vectores. Rápido, adecuado para millones de pasajes.
- Cross-encoder (reranker)
- Codifica la pregunta y el pasaje juntos y devuelve una puntuación. Ningún cálculo se puede reutilizar: hay que hacerlo de nuevo para cada pregunta y cada candidato. Preciso, pero imposible de aplicar a todo el corpus.
La documentación de Sentence Transformers explica el razonamiento: evaluar miles o millones de pares sería bastante lento, por lo que se utiliza el retriever para generar un conjunto de candidatos, por ejemplo un centenar, que luego el cross-encoder reordena. El esquema en dos etapas es el mismo que el de los motores de búsqueda clásicos. También explica el ajuste principal: el número de candidatos recuperados controla tanto la exhaustividad (recall) —cuantos más candidatos se recuperan, más probabilidades hay de que el conjunto contenga la respuesta correcta— como la latencia (cada candidato adicional requiere una pasada por el cross-encoder).
#¿Qué modelo de reranking elegir en francés?
La decisión se basa en tres criterios: el idioma, la licencia y la memoria. Los tamaños indicados a continuación provienen de las fichas de Hugging Face; ten en cuenta que el tamaño del archivo depende de la precisión de los pesos, F32 para bge-reranker-v2-m3 (aproximadamente 4 bytes por parámetro), F16 para mxbai.
| Modelo | Idiomas | Tamaño anunciado | Licencia | Veredicto para el francés |
|---|---|---|---|---|
| BAAI/bge-reranker-v2-m3 | Multilingüe | 0,6 mil millones de parámetros, peso en F32 (aproximadamente 2,3 GB) | Apache 2.0 | Opción predeterminada: multilingüe, ligera y con buen soporte de herramientas |
| BAAI/bge-reranker-v2-gemma | Multilingüe | 3 mil millones de parámetros, pesos en F32 (aproximadamente 10 GB) | Apache 2.0 | Reservado para casos exigentes con GPU dedicado; reranker basado en Gemma-2B |
| mixedbread-ai/mxbai-rerank-large-v1 | Inglés | 0,4 mil millones de parámetros, pesos en F16 | Apache 2.0 | Evitar para un corpus francés: la ficha indica inglés |
| Cohere Rerank | Multilingüe | Servicio alojado | Comercial | No es adecuado para un pipeline 100 % local: los pasajes salen de tu máquina |
La ficha de bge-reranker-v2-m3 lo presenta como un reranker ligero, con sólidas capacidades multilingües, fácil de desplegar y rápido en inferencia; la ficha de bge-reranker-v2-gemma lo orienta a contextos multilingües, con buenos resultados tanto en inglés como en tareas multilingües. Dos correcciones útiles respecto a lo que se lee a menudo: el archivo de bge-reranker-v2-m3 pesa más de 2 GB, no 560 MB (568 millones de parámetros en F32), y mxbai-rerank-large-v1 es un modelo para inglés que no debe elegirse para documentos en francés. Una vez cargado en media precisión, el modelo m3 ocupa aproximadamente 1,1 GB para los pesos (568 millones de parámetros × 2 bytes, cálculo de esta guía), a los que se suman las activaciones del lote procesado.
#El pipeline antes y después de añadir un reranker
Dos parámetros regulan el proceso: k_retrieve, el número de candidatos que devuelve la base vectorial, y k_final, el número de pasajes enviados al LLM. Un k_final de 3 a 5 es adecuado para la mayoría de los modelos locales de 7 a 14 mil millones de parámetros; por encima de eso, se llena la ventana de contexto sin ganancia neta y el tiempo de procesamiento del prompt aumenta. El k_retrieve depende de la dificultad del corpus: 20 es un buen primer intento, 50 a 100 si las preguntas son vagas o si el corpus contiene muchos pasajes cercanos. La guía sobre la ventana de contexto explica el costo de pasajes adicionales en el prompt.
#Implementación: sentence-transformers, FlagEmbedding, llama.cpp
#Con sentence-transformers
La clase CrossEncoder carga el modelo y evalúa pares. Su método rank acepta directamente la pregunta y la lista de documentos y devuelve los mejores; el parámetro top_k limita el número de resultados (sin él, se devuelven todos los documentos).
#Con FlagEmbedding, la biblioteca de los autores del modelo
La ficha del modelo utiliza la biblioteca FlagEmbedding. Especifica que la puntuación bruta puede transformarse en un valor entre 0 y 1 mediante una función sigmoide con normalize=True, y que use_fp16=True acelera el cálculo a costa de una ligera disminución de calidad. Ten en cuenta que la puntuación bruta es un valor sin escala absoluta, a menudo negativo para los pasajes que no son pertinentes; solo importa el orden, salvo que establezcas un umbral.
#Con llama.cpp, sin Python
El servidor llama.cpp ofrece un punto de acceso de reranking, desactivado por defecto. La documentación indica que requiere un modelo de reranking, cita bge-reranker-v2-m3 como ejemplo y que el servidor se inicia con las opciones --embedding y --pooling rank. Se necesita una versión GGUF del modelo. Esta es la opción que conviene elegir si tu pila ya está construida alrededor de llama.cpp y quieres evitar instalar PyTorch. Comprueba la opción exacta en la versión instalada: la documentación advierte que este punto de acceso podría evolucionar.
#Con LlamaIndex
#Costo: latencia, memoria, longitud de pasajes
No se garantiza ninguna cifra de latencia: depende de la tarjeta, de la precisión (FP16 o FP32), del número de candidatos y de la longitud de los pasajes. Ten en cuenta las proporciones. El tiempo de reranking crece linealmente con el número de pares: pasar de 20 a 100 candidatos multiplica el trabajo por cinco. También crece con la longitud del pasaje, ya que cada par se codifica por completo. Mide en tu máquina con tus pasajes en lugar de fiarte de una cifra de un blog: cronometra cien consultas reales y observa la mediana del tiempo y el peor caso.
- Número de candidatos
- Primera palanca de ajuste. Empieza con 20, mide el recall y sube a 50 solo si siguen quedando buenas respuestas fuera del conjunto.
- Precisión
- use_fp16=True (FlagEmbedding) o cargar en media precisión reduce el uso de memoria y acelera el cálculo, con una ligera disminución del rendimiento según la ficha del modelo.
- Tamaño del lote
- El método rank de sentence-transformers procesa 32 pares por lote por defecto. Reduce el tamaño del lote a 8 o 16 si falta memoria y auméntalo si la GPU está infrautilizada.
- Longitud máxima
- 512 tokens por par de entrada (valor max_length de los ejemplos oficiales). Un fragmento más largo se recorta: si tus chunks superan este tamaño, la parte final del fragmento no se lee. Acorta los chunks antes de aumentar el límite.
- CPU o GPU
- En CPU, el reranker funciona, pero cada consulta con entre 20 y 50 candidatos requiere segundos de procesamiento; es aceptable para un asistente documental interno, menos para un chat interactivo.
#Reranker y segmentación: los dos ajustes interactúan
Un cross-encoder evalúa un pasaje completo. Si el pasaje mezcla tres temas, su puntuación será intermedia para las tres preguntas correspondientes; si es demasiado corto, pierde el contexto que permitiría reconocerlo como respuesta. La división en pasajes de tamaño medio, con un ligero solapamiento, proporciona al reranker contenido con el que trabajar sin superar su longitud máxima. Si cambias el tamaño de los chunks, repite la prueba de recuperación: tanto el valor óptimo de k_retrieve como la mejora que aporta el reranker cambian con ese tamaño. La guía sobre estrategias de chunking detalla estas opciones.
Otra interacción: la búsqueda híbrida. Cuando la búsqueda por palabras clave (BM25) y la búsqueda vectorial se combinan, el conjunto de candidatos es más diverso, lo que da al reranker más posibilidades de encontrar una buena respuesta que cada método por separado habría pasado por alto. El reranker es la última etapa y la búsqueda híbrida, la segunda: se complementan en lugar de sustituirse.
#Medir la mejora con tus documentos
La mejora anunciada en los blogs oscila entre una y cinco veces según el corpus, y ninguna cifra general es aplicable al tuyo. En un corpus muy estructurado (documentación técnica limpia), la búsqueda vectorial por sí sola ya funciona bien; en un corpus con ruido (correos, notas, PDF mal extraídos), la diferencia es más marcada. La única manera de saberlo es evaluar.
- 01Reunir entre 30 y 50 preguntasToma preguntas reales de usuarios y, para cada una, indica el pasaje que contiene la respuesta (basta con un identificador).
- 02Medir el recall@5 sin rerankerPara cada pregunta, revisa si el fragmento adecuado aparece en los 5 primeros resultados de la base vectorial.
- 03Medir el recall@5 con rerankerRecupera 20 candidatos, reordénalos y cuenta de nuevo los pasajes relevantes entre los 5 primeros.
- 04Comparar también la latenciaAnota la mediana del tiempo de extremo a extremo. Una mejora de unos pocos puntos en la exhaustividad (recall) no justifica necesariamente un segundo de espera adicional.
- 05Ver los erroresPara cada pregunta mal respondida, comprueba si la respuesta correcta estaba entre los 20 candidatos. Si no, el problema está en una etapa anterior: segmentación, embeddings o extracción del texto.
#¿Se necesita un reranker? Criterios para decidir
| Situación | Decisión |
|---|---|
| Corpus de unos pocos decenas de documentos limpios, top-5 vectorial ya bueno | No, mide primero |
| La respuesta correcta aparece con frecuencia entre el 6.º y el 30.º puesto | Sí: es el caso de uso típico |
| Preguntas vagas, corpus ruidoso o muy heterogéneo | Sí, con entre 30 y 50 candidatos |
| Chat interactivo en máquina sin GPU | Precaución: mide la latencia en la CPU y reduce el número de candidatos a entre 10 y 20. |
| Buena respuesta ausente incluso entre los 50 primeros candidatos | No: corrige primero la división en fragmentos, los embeddings o la extracción |
#Preguntas frecuentes sobre el reranking
¿Reemplaza un reranker la búsqueda vectorial?+
¿Qué reranker elegir para documentos en francés?+
¿Cuántos candidatos se deben reclasificar?+
¿Se necesita un GPU para un reranker?+
¿Se puede usar un reranker con Ollama?+
¿Cómo saber si el reranker mejora realmente mis resultados?+
- Búsqueda híbrida: BM25 + vectorial
- Estrategias de chunking
- Los mejores modelos de embeddings en francés
- Comprender la ventana de contexto
- RAG local con ChromaDB y Ollama
- Fuente: ficha de Hugging Face de BAAI/bge-reranker-v2-m3
- Fuente: ficha de BAAI/bge-reranker-v2-gemma
- Fuente: Sentence Transformers, Retrieve & Re-Rank
- Fuente: documentación del servidor llama.cpp
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.