Cómo Construir una App RAG con LangChain y Supabase en 2026
Aprende a construir una aplicación de Generación Aumentada por Recuperación (RAG) lista para producción usando LangChain para orquestación y Supabase para almacenamiento vectorial.
La Generación Aumentada por Recuperación (RAG) es el patrón más práctico para construir aplicaciones de IA que necesitan acceso a datos privados o actualizados. En lugar de hacer fine-tuning a un modelo, recuperas contexto relevante en tiempo de consulta y se lo proporcionas al LLM. En esta guía, construiremos un pipeline RAG completo usando LangChain para orquestación y Supabase como nuestro almacén vectorial.
1. ¿Qué es RAG y Por Qué Importa?
Los Modelos de Lenguaje Grande se entrenan con datasets estáticos. No conocen tus documentos de empresa, actualizaciones de producto, ni nada después de su fecha de corte. RAG resuelve esto mediante:
- Indexación: Convertir tus documentos en embeddings vectoriales y almacenarlos en una base de datos.
- Recuperación: Cuando un usuario hace una pregunta, encontrar los documentos semánticamente más similares.
- Generación: Pasar el contexto recuperado al LLM junto con la pregunta para producir una respuesta precisa y fundamentada.
2. Visión General de la Arquitectura
Nuestro stack consiste en cuatro capas:
| Capa | Herramienta | Propósito |
|---|---|---|
| Orquestación | LangChain | Gestión de cadenas, carga de documentos, división de texto |
| Embeddings | OpenAI text-embedding-3-small | Convertir texto a vectores de 1536 dimensiones |
| Almacén Vectorial | Supabase + pgvector | Almacenar y consultar embeddings con SQL |
| LLM | GPT-4o | Generar respuestas a partir del contexto recuperado |
3. Configurando Supabase como Almacén Vectorial
Supabase soporta pgvector nativamente. Habilita la extensión y crea una tabla de documentos:
-- Habilitar la extensión vector
create extension if not exists vector;
-- Crear tabla de documentos
create table documents (
id bigserial primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
4. Indexando Documentos con LangChain
Usa los cargadores de documentos y divisores de texto de LangChain para fragmentar y embebir tus datos:
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { SupabaseVectorStore } from "@langchain/community/vectorstores/supabase";
import { OpenAIEmbeddings } from "@langchain/openai";
import { createClient } from "@supabase/supabase-js";
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
});
const docs = await splitter.createDocuments([rawText]);
await SupabaseVectorStore.fromDocuments(docs, new OpenAIEmbeddings(), {
client: supabase,
tableName: "documents",
});
5. Consultando con RAG
En tiempo de consulta, embebe la pregunta del usuario, recupera fragmentos relevantes y pásalos al LLM.
6. Consideraciones de Producción
- El tamaño del fragmento importa: Muy pequeño pierde contexto, muy grande diluye la relevancia. 500-1000 tokens es un buen punto de partida.
- Usa Row Level Security: Supabase RLS te permite limitar búsquedas vectoriales por usuario.
- Cachea embeddings: No re-embebas documentos sin cambios en cada despliegue.
- Monitorea con LangSmith: Rastrea cada ejecución de cadena para depurar la calidad de recuperación.