Pylarion Logo Pylarion Logo Pylarion
DESARROLLO WEB
12 MIN READ

Implementación de RAG y Embeddings con pgvector en Laravel 13

Pylarion Pylarion

Pylarion

Equipo de Pylarion. Construimos software confiable donde la tecnología no puede fallar. • 28 de abril de 2026

Implementación de RAG y Embeddings con pgvector en Laravel 13

Implementación de RAG y Embeddings con pgvector en Laravel 13: Arquitectura de IA para Agentes de Soporte Confiables

El auge de los modelos de lenguaje de gran escala (LLM) ha abierto posibilidades extraordinarias para el desarrollo de aplicaciones inteligentes, pero también ha expuesto una debilidad estructural crítica: las alucinaciones. Cuando un agente de soporte responde con información inventada pero plausible, las consecuencias van desde la pérdida de confianza del usuario hasta riesgos legales derivados de políticas malinterpretadas. En el ecosistema Laravel, la versión 13 introduce herramientas nativas que permiten atacar este problema de raíz mediante la técnica RAG (Retrieval-Augmented Generation), combinada con embeddings vectoriales y la extensión pgvector de PostgreSQL.

Este artículo desglosa técnicamente cómo construir una base de conocimientos semántica dentro de una aplicación Laravel 13, convirtiendo documentos de texto plano en representaciones vectoriales de alta dimensionalidad. El objetivo no es simplemente conectar un LLM a una aplicación web, sino dotar al agente de soporte de un mecanismo de recuperación de información que consulte primero la documentación oficial de la empresa antes de generar cualquier respuesta. De esta forma, cada salida del modelo queda anclada a una fuente verificable y controlada.

¿Qué es RAG y por qué es indispensable en agentes de soporte?

RAG es un patrón arquitectónico que separa el proceso de generación de texto del proceso de recuperación de información relevante. En lugar de depender exclusivamente del conocimiento interno del modelo —que puede estar desactualizado o simplemente incorrecto para un dominio específico—, el sistema primero recupera fragmentos de documentación pertinente y los inyecta como contexto en el prompt antes de solicitar la respuesta al LLM. El modelo, entonces, genera texto fundamentado en evidencia real y no en probabilidades estadísticas abstractas.

En el contexto de un agente de soporte empresarial, esto es determinante. Las políticas de reembolso, los términos de servicio, los procedimientos de garantía o los acuerdos de nivel de servicio (SLA) cambian con frecuencia. Un modelo entrenado hace seis meses no conoce las actualizaciones recientes. Con RAG, basta con actualizar los documentos en la base de conocimientos para que el agente refleje instantáneamente la información correcta, sin necesidad de reentrenar ningún modelo ni modificar el código de inferencia.

pgvector: Búsqueda Semántica Directamente en PostgreSQL

La extensión pgvector transforma PostgreSQL en una base de datos vectorial de primera clase, capaz de almacenar y comparar representaciones de alta dimensionalidad mediante métricas como la similitud coseno, el producto interno o la distancia euclidiana. Esto elimina la necesidad de infraestructura adicional como Pinecone, Weaviate o Qdrant en proyectos que ya utilizan PostgreSQL, reduciendo la complejidad operacional y los costes de mantenimiento.

Para habilitar la extensión en una migración de Laravel, el proceso es directo:

// database/migrations/xxxx_xx_xx_create_knowledge_base_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
    public function up(): void
    {
        DB::statement('CREATE EXTENSION IF NOT EXISTS vector');

        Schema::create('knowledge_documents', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->string('source')->nullable();
            $table->vector('embedding', 1536); // Dimensiones para text-embedding-3-small de OpenAI
            $table->timestamps();
        });

        // Índice HNSW para búsquedas aproximadas de alta velocidad
        DB::statement(
            'CREATE INDEX ON knowledge_documents 
             USING hnsw (embedding vector_cosine_ops)'
        );
    }

    public function down(): void
    {
        Schema::dropIfExists('knowledge_documents');
    }
};

El tipo de columna vector(1536) corresponde a las dimensiones producidas por el modelo text-embedding-3-small de OpenAI, que ofrece un balance óptimo entre coste computacional y calidad semántica. El índice HNSW (Hierarchical Navigable Small World) garantiza que las búsquedas de vecinos más cercanos escalen eficientemente incluso con millones de documentos almacenados.

Generación de Embeddings con el SDK de IA de Laravel 13

Laravel 13 incorpora soporte nativo para el SDK de IA mediante el paquete laravel/ai, que abstrae las llamadas a proveedores como OpenAI, Anthropic o Mistral bajo una interfaz unificada. Para generar embeddings de un documento, se utiliza la clase Embeddings del SDK:

// app/Services/KnowledgeBaseService.php
namespace App\Services;

use App\Models\KnowledgeDocument;
use Illuminate\Support\Facades\AI;

class KnowledgeBaseService
{
    /**
     * Indexa un documento convirtiéndolo en un vector de embedding.
     */
    public function indexDocument(string $title, string $content, ?string $source = null): KnowledgeDocument
    {
        // Solicitar embedding al proveedor de IA configurado
        $embeddingResponse = AI::embeddings()
            ->model('text-embedding-3-small')
            ->input($content)
            ->create();

        $vector = $embeddingResponse->embeddings[0]->embedding;

        return KnowledgeDocument::create([
            'title'     => $title,
            'content'   => $content,
            'source'    => $source,
            'embedding' => $vector, // Array de 1536 flotantes
        ]);
    }

    /**
     * Recupera los N documentos más relevantes para una consulta dada.
     */
    public function retrieveRelevant(string $query, int $limit = 5): \Illuminate\Database\Eloquent\Collection
    {
        $queryEmbedding = AI::embeddings()
            ->model('text-embedding-3-small')
            ->input($query)
            ->create()
            ->embeddings[0]
            ->embedding;

        // whereVectorSimilarTo: nuevo método nativo de Laravel 13
        return KnowledgeDocument::query()
            ->whereVectorSimilarTo('embedding', $queryEmbedding)
            ->orderByVectorDistance('embedding', $queryEmbedding, 'cosine')
            ->limit($limit)
            ->get();
    }
}

El método whereVectorSimilarTo, introducido en Laravel 13, simplifica drásticamente lo que antes requería raw SQL o paquetes de terceros. Internamente genera la expresión de PostgreSQL <=> (distancia coseno) o sus equivalentes para otras métricas, manteniéndose dentro de la API fluida del Query Builder de Eloquent.

Arquitectura del Agente de Soporte con RAG

El flujo completo del agente de soporte con RAG sigue una secuencia bien definida que garantiza que ninguna respuesta se genere sin consultar previamente la base de conocimientos:

  1. Recepción de la consulta: El usuario envía una pregunta a través de la interfaz de soporte.
  2. Embedding de la consulta: La pregunta se transforma en un vector de 1.536 dimensiones usando el mismo modelo de embeddings empleado durante la indexación.
  3. Búsqueda semántica: Se ejecuta whereVectorSimilarTo contra la tabla knowledge_documents para recuperar los fragmentos más relevantes.
  4. Construcción del contexto: Los fragmentos recuperados se concatenan y se inyectan en el system prompt del LLM.
  5. Generación de respuesta: El modelo genera una respuesta basada exclusivamente en el contexto proporcionado.
  6. Validación opcional: Se puede aplicar un paso de verificación que confirme que la respuesta hace referencia a los documentos recuperados.

La implementación del controlador que orquesta este flujo es la siguiente:

// app/Http/Controllers/SupportAgentController.php
namespace App\Http\Controllers;

use App\Services\KnowledgeBaseService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\AI;

class SupportAgentController extends Controller
{
    public function __construct(
        private readonly KnowledgeBaseService $knowledgeBase
    ) {}

    public function chat(Request $request)
    {
        $request->validate(['message' => 'required|string|max:1000']);

        $userQuery = $request->input('message');

        // Paso 1: Recuperar documentos relevantes
        $relevantDocs = $this->knowledgeBase->retrieveRelevant($userQuery, limit: 4);

        // Paso 2: Construir el contexto con los documentos recuperados
        $context = $relevantDocs->map(fn($doc) => 
            "### {$doc->title}\n{$doc->content}"
        )->implode("\n\n---\n\n");

        // Paso 3: Construir el prompt con RAG
        $systemPrompt = <<<PROMPT
        Eres un agente de soporte especializado. Responde ÚNICAMENTE basándote en 
        la documentación oficial proporcionada a continuación. Si la información 
        no está en el contexto, indica que no dispones de esa información y 
        sugiere contactar con el equipo de soporte directamente.

        DOCUMENTACIÓN OFICIAL:
        {$context}
        PROMPT;

        // Paso 4: Generar respuesta con el LLM
        $response = AI::chat()
            ->model('gpt-4o-mini')
            ->system($systemPrompt)
            ->user($userQuery)
            ->temperature(0.2) // Baja temperatura para respuestas más deterministas
            ->create();

        return response()->json([
            'response'  => $response->choices[0]->message->content,
            'sources'   => $relevantDocs->pluck('title', 'source'),
        ]);
    }
}

Consideraciones de Rendimiento y Escalabilidad

A medida que la base de conocimientos crece, la eficiencia de las búsquedas vectoriales se convierte en un factor crítico. El índice HNSW creado durante la migración garantiza una complejidad de búsqueda aproximada de O(log n), pero existen otras optimizaciones que deben considerarse en entornos de producción de alta carga:

  • Chunking inteligente: Los documentos extensos deben dividirse en fragmentos de entre 500 y 1.000 tokens con solapamiento para preservar el contexto entre segmentos adyacentes.
  • Caché de embeddings: Las consultas repetitivas pueden cachearse usando Redis para evitar llamadas redundantes a la API de embeddings, reduciendo costes y latencia.
  • Filtrado por metadatos: Combinar búsqueda vectorial con filtros convencionales (categoría, fecha de vigencia, idioma) mejora la precisión sin sacrificar velocidad.
  • Procesamiento asíncrono: La indexación de nuevos documentos debe realizarse mediante Jobs de Laravel en colas, evitando bloquear las solicitudes HTTP.
  • Reranking: Implementar un segundo paso de reordenación con modelos especializados (cross-encoders) mejora significativamente la relevancia de los documentos recuperados.
  • Monitorización de distancias: Establecer un umbral mínimo de similitud coseno (por ejemplo, 0.75) para filtrar documentos potencialmente irrelevantes antes de incluirlos en el contexto.

Naturaleza Open Source y Roadmap Futuro

El proyecto descrito en este tutorial está publicado como código abierto bajo licencia MIT, lo que significa que cualquier organización puede adoptarlo, auditarlo y adaptarlo a sus necesidades específicas sin restricciones comerciales. Esta transparencia es especialmente valiosa en implementaciones de IA empresarial, donde la auditabilidad del código que procesa información sensible de clientes es un requisito de cumplimiento normativo en muchas jurisdicciones.

Entre las integraciones planificadas para iteraciones futuras se encuentran el soporte para múltiples proveedores de embeddings de forma simultánea (permitiendo comparar calidad semántica), la implementación de pipelines de evaluación automática de la calidad de las respuestas mediante métricas como RAGAS, y la integración con sistemas de ticketing para cerrar el ciclo de soporte de extremo a extremo. La arquitectura modular adoptada desde el inicio —con servicios desacoplados y contratos bien definidos— está diseñada precisamente para absorber estos crecimientos sin refactorizaciones disruptivas.

"La diferencia entre un agente de IA que da respuestas plausibles y uno que da respuestas verificables no reside en el modelo de lenguaje, sino en la arquitectura de recuperación de información que lo alimenta. RAG con pgvector en Laravel 13 convierte la segunda opción en una implementación accesible para cualquier equipo de desarrollo web."

La implementación de RAG con pgvector en Laravel 13 representa un salto cualitativo en la forma en que los desarrolladores PHP abordan la integración de IA en aplicaciones de producción. Al aprovechar infraestructura existente —PostgreSQL— y las abstracciones nativas del framework, se reduce la curva de aprendizaje y se mantiene la cohesión arquitectónica del proyecto. El resultado es un agente de soporte que no solo responde, sino que responde con precisión, trazabilidad y responsabilidad técnica.

2
Pylarion Pylarion

Pylarion

Desarrollo Web Expert

Equipo de Pylarion. Construimos software confiable donde la tecnología no puede fallar.

Blog / Desarrollo Web / Implementación de RAG y Embeddings con pgvector en Laravel 13

Comentarios

(0)
Categoría: Desarrollo Web

Artículos Recomendados

SaaSykit: El Starter Kit de Laravel para Acelerar el Desarrollo SaaS
Desarrollo Web
1
1
0

SaaSykit: El Starter Kit de Laravel para Acelerar el Desarrollo SaaS

SaaSykit es un completo 'starter kit' basado en Laravel diseñado para acelerar la creación de aplicaciones SaaS, evitando que los desarrolladores empiecen desde cero. Proporciona todos los componentes esenciales, como integraciones de pasarelas de pago (Stripe, Paddle, Lemon Squeezy), gestión de suscripciones, métodos de autenticación avanzados, paneles de administración con FilamentPHP y landing pages personalizables. Su versión extendida, SaaSykit Tenancy, ofrece soporte multi-inquilino, permitiendo cobros por usuario, múltiples bases de datos y gestión de roles por equipo. Para celebrar su segundo aniversario y sus más de 860 clientes, la plataforma ofrece un 20% de descuento temporal con un código promocional. SaaSykit destaca por sus actualizaciones regulares, código limpio, procesos automatizados y despliegue rápido, permitiendo a los equipos delegar la infraestructura base y enfocarse exclusivamente en desarrollar las características únicas y el valor central de su producto de software.

Leer artículo
Nuevos API Starter Kits para Laravel en camino
Desarrollo Web
1
0
0

Nuevos API Starter Kits para Laravel en camino

Los tan esperados API Starter Kits de Laravel están oficialmente en desarrollo. Durante un reciente livestream, Leah y Wendell confirmaron que se está trabajando en esta funcionalidad para responder a las constantes peticiones de la comunidad. Actualmente, los 'pull requests' se encuentran en fase de borrador dentro de Maestro, el repositorio orquestador utilizado para compilar estos kits. Existen dos propuestas principales en proceso: una API base sin estado (stateless) que incluirá autenticación y las métricas estándar esperadas, y una variante adicional que integrará soporte para la gestión de Equipos (Teams). Aunque todavía no se ha anunciado una fecha oficial de lanzamiento, ya que el núcleo del equipo necesita revisar, pulir el código y recopilar retroalimentación interna, su llegada es inminente. Los desarrolladores interesados pueden acceder directamente al repositorio Maestro para visualizar un adelanto y dejar sus comentarios constructivos en los PR.

Leer artículo