12. Optimización Avanzada de RAG: Reranking y Prevención de Alucinaciones
Soluciona el problema de "Lost in the Middle" aplicando modelos de Reranking (Cohere / Cross-Encoders) y verificación estricta de citas.
El Fenómeno "Lost in the Middle" (Perdido en el Medio)
Investigaciones rigurosas en procesamiento del lenguaje (Stanford University) demostraron que los LLMs sufren del fenómeno Lost in the Middle: cuando les suministras 10 o 15 fragmentos de contexto en el prompt, el modelo recuerda con alta precisión los datos situados al principio y al final del texto, pero ignora o alucina con frecuencia sobre la información ubicada en el centro.
Por tanto, inyectar demasiados fragmentos no mejora el sistema; lo degrada y encarece la factura. La solución es el Patrón de Dos Fases (Two-Stage Retrieval): recuperar un grupo amplio de candidatos con búsqueda vectorial y luego reordenarlos con un Modelo de Reranking (Cross-Encoder).
Bi-Encoders (Embeddings) vs Cross-Encoders (Rerankers)
| Tecnología | Cómo Procesa los Textos | Velocidad & Precisión |
|---|---|---|
| Bi-Encoder (Embeddings Clásicos) | Calcula el vector de la pregunta y del documento por separado. No se "miran" entre sí hasta el cálculo del coseno. | Ultrarrápido (<10 ms en BD). Ideal para filtrar de 1 millón a los Top 20 candidatos. |
| Cross-Encoder (Reranker como Cohere Rerank) | Evalúa la pregunta y cada fragmento juntos capa por capa en una red de atención completa. | Un poco más lento (~50 ms), pero de precisión quirúrgica. Ideal para filtrar los 20 candidatos a los Top 3 definitivos. |
⚡ Pipeline de Dos Fases con Reranking de Cohere en PHP 8.3
Toma 10 resultados preliminares de la base de datos y utiliza la API de Cohere Rerank para seleccionar los 3 fragmentos matemáticamente más relevantes.
<?php
declare(strict_types=1);
namespace App\Services;
class RerankService
{
private string $cohereApiKey;
public function __construct(string $cohereApiKey)
{
$this->cohereApiKey = $cohereApiKey;
}
/**
* Reordena los candidatos utilizando un Cross-Encoder para máxima precisión semántica.
*
* @param string $query Pregunta exacta del usuario
* @param array<int, string> $candidateDocuments Lista de textos recuperados previamente
* @param int $topN Cantidad de fragmentos definitivos a retener (ej. 3)
* @return array<int, array{index: int, score: float, document: string}>
*/
public function rerank(string $query, array $candidateDocuments, int $topN = 3): array
{
$ch = curl_init('https://api.cohere.com/v1/rerank');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->cohereApiKey
],
CURLOPT_POSTFIELDS => json_encode([
'model' => 'rerank-v3.5',
'query' => $query,
'documents' => $candidateDocuments,
'top_n' => $topN,
'return_documents' => false
]),
CURLOPT_TIMEOUT => 10
]);
$raw = curl_exec($ch);
curl_close($ch);
$response = json_decode((string)$raw, true);
$results = [];
foreach ($response['results'] ?? [] as $item) {
$idx = (int)$item['index'];
$relevanceScore = (float)$item['relevance_score'];
// Filtro de umbral de confianza: descartar candidatos con baja afinidad
if ($relevanceScore >= 0.55) {
$results[] = [
'index' => $idx,
'score' => $relevanceScore,
'document' => $candidateDocuments[$idx] ?? ''
];
}
}
return $results;
}
}
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Qué problema resuelve el uso de un modelo de Reranking (Cross-Encoder) en una arquitectura RAG?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar IA Aplicada a Desarrollo Web: APIs, RAG & Agentes y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.