Tutorial RAG desde Cero: Crea una Base de Conocimiento IA para tu Empresa [2026]
🎓 Este tutorial es la vía técnica completa. Si tu pyme no tiene equipo para montar y mantener esta arquitectura, es exactamente lo que entregamos llave en mano en Javadex con Cortex — tu ChatGPT corporativo con tu marca y RAG sobre tus documentos, desde 5.000 € con el primer valor funcional en 2-4 semanas; el desglose está al final del post. También puedes seguir a Javier Santos en LinkedIn.
TL;DR - Resumen Rápido#
- RAG = Retrieval Augmented Generation = ChatGPT + TUS documentos
- Problema que resuelve: LLMs no conocen tu información privada
- Cómo funciona: Busca info relevante → La pasa al LLM → Respuesta contextualizada
- Stack recomendado 2026: LangChain + OpenAI + Pinecone/Qdrant
- Tiempo de implementación: 2-4 horas para un MVP básico
- Coste: Desde $0 (modelos locales) hasta ~$50/mes (cloud)
- Sin equipo técnico: es lo que montamos llave en mano en Javadex con Cortex (Javier Santos Criado) — desde 5.000 € y con el primer valor funcional en 2-4 semanas
Qué es RAG y Por Qué lo Necesitas en 2026#
El Problema#
ChatGPT es increíble, pero tiene una limitación enorme: no conoce tu información.
Imagina que quieres un chatbot que:
- Responda preguntas sobre tus productos
- Ayude a empleados con procesos internos
- Atienda clientes con info actualizada de tu empresa
ChatGPT no puede hacer esto porque:
- No tiene acceso a tus documentos
- Su conocimiento tiene fecha de corte
- Se inventa cosas cuando no sabe (alucinaciones)
La Solución: RAG#
RAG (Retrieval Augmented Generation) resuelve esto añadiendo un paso previo:
1Usuario pregunta → Buscar info relevante en TUS documentos → Pasar contexto al LLM → Respuesta basada en TU información
Es como darle a ChatGPT un "chuleta" con la información que necesita para responder correctamente.
Casos de Uso Reales#
| Caso de Uso | Documentos | Beneficio |
|---|---|---|
| Soporte al cliente | FAQs, manuales, tickets previos | -70% tickets repetitivos |
| Asistente interno | Políticas, procesos, wikis | Empleados encuentran info en segundos |
| Ventas | Catálogos, fichas técnicas | Vendedores responden al instante |
| Legal | Contratos, normativas | Búsqueda instantánea en 1000s de docs |
| Onboarding | Guías, tutoriales | Nuevos empleados autónomos |
Arquitectura RAG Explicada#
Los 4 Componentes#
1┌─────────────────────────────────────────────────────────────┐2│ ARQUITECTURA RAG │3├─────────────────────────────────────────────────────────────┤4│ │5│ 1. DOCUMENTOS 2. EMBEDDINGS 3. VECTOR DB │6│ ┌──────────┐ ┌──────────────┐ ┌───────────┐ │7│ │ PDFs │ │ text-embed- │ │ Pinecone │ │8│ │ Docs │───────▶ │ ding-3-large │────▶ │ Qdrant │ │9│ │ Web │ │ (OpenAI) │ │ Chroma │ │10│ └──────────┘ └──────────────┘ └─────┬─────┘ │11│ │ │12│ ▼ │13│ 4. GENERACIÓN Búsqueda │14│ ┌──────────────┐ ┌──────────────┐ semántica │15│ │ Usuario │────▶│ Embedding │──────────┘ │16│ │ pregunta │ │ de query │ │17│ └──────────────┘ └──────┬───────┘ │18│ │ │19│ ▼ │20│ ┌─────────────────┐ │21│ │ Contexto + LLM │ │22│ │ (GPT-4/Claude) │ │23│ └────────┬────────┘ │24│ │ │25│ ▼ │26│ ┌─────────────────┐ │27│ │ Respuesta │ │28│ │ fundamentada │ │29│ └─────────────────┘ │30│ │31└─────────────────────────────────────────────────────────────┘
1. Documentos (Tu Información)#
Todo lo que quieres que el chatbot "sepa":
- PDFs (manuales, contratos, reportes)
- Documentos Word/Google Docs
- Páginas web (tu sitio, documentación)
- Bases de datos (productos, clientes)
- Emails, tickets de soporte previos
2. Embeddings (Vectores Numéricos)#
Los embeddings convierten texto en números que capturan el significado semántico.
1# "Cómo devolver un producto" y "proceso de devolución"2# tienen embeddings MUY similares aunque las palabras sean diferentes
Modelos de embedding recomendados 2026:
| Modelo | Proveedor | Dimensiones | Precio | Calidad |
|---|---|---|---|---|
| text-embedding-3-large | OpenAI | 3072 | $0.13/1M tokens | ⭐⭐⭐⭐⭐ |
| text-embedding-3-small | OpenAI | 1536 | $0.02/1M tokens | ⭐⭐⭐⭐ |
| voyage-large-2 | Voyage AI | 1536 | $0.12/1M tokens | ⭐⭐⭐⭐⭐ |
| bge-large-en-v1.5 | BAAI | 1024 | Gratis (local) | ⭐⭐⭐⭐ |
3. Vector Database (Almacenamiento)#
Donde guardas los embeddings para búsqueda rápida.
Opciones 2026:
| Database | Tipo | Precio | Mejor Para |
|---|---|---|---|
| Pinecone | Cloud | Gratis hasta 100K vectores | Producción, scaling |
| Qdrant | Self-hosted/Cloud | Gratis self-hosted | Control total |
| Chroma | Local/Embebido | Gratis | Prototipos, MVPs |
| Weaviate | Cloud/Self-hosted | Tier gratis | Multimodal |
| pgvector | Extensión Postgres | Tu coste Postgres | Ya usas Postgres |
4. LLM (Generación)#
El modelo que genera la respuesta final con el contexto.
Modelos recomendados:
| Modelo | Mejor Para | Precio |
|---|---|---|
| GPT-4o | Calidad máxima | $5/1M input |
| GPT-4o-mini | Balance coste/calidad | $0.15/1M input |
| Claude 3.5 Sonnet | Contexto largo | $3/1M input |
| Llama 3.1 70B | Self-hosted, privacidad | Gratis (compute) |
Tutorial Práctico: RAG en 30 Minutos#
Vamos a crear un chatbot que responda preguntas sobre documentación técnica.
Requisitos Previos#
1# Python 3.10+2python --version3 4# Crear entorno virtual5python -m venv rag-env6source rag-env/bin/activate # Linux/Mac7# rag-env\Scripts\activate # Windows8 9# Instalar dependencias10pip install langchain langchain-openai langchain-community11pip install chromadb pypdf python-dotenv
Estructura del Proyecto#
1rag-tutorial/2├── .env # API keys3├── documents/ # Tus PDFs/docs4│ ├── manual.pdf5│ └── faqs.txt6├── ingest.py # Procesar documentos7├── query.py # Hacer preguntas8└── requirements.txt
Paso 1: Configurar API Keys#
1# .env2OPENAI_API_KEY=sk-tu-api-key-aqui
Paso 2: Procesar Documentos (ingest.py)#
1"""2ingest.py - Procesa documentos y crea la base de conocimiento3"""4import os5from dotenv import load_dotenv6from langchain_community.document_loaders import (7 PyPDFLoader,8 TextLoader,9 DirectoryLoader10)11from langchain.text_splitter import RecursiveCharacterTextSplitter12from langchain_openai import OpenAIEmbeddings13from langchain_community.vectorstores import Chroma14 15load_dotenv()16 17# 1. Cargar documentos18def load_documents(docs_path: str = "./documents"):19 """Carga PDFs y archivos de texto"""20 21 # Loader para PDFs22 pdf_loader = DirectoryLoader(23 docs_path,24 glob="**/*.pdf",25 loader_cls=PyPDFLoader26 )27 28 # Loader para texto29 txt_loader = DirectoryLoader(30 docs_path,31 glob="**/*.txt",32 loader_cls=TextLoader33 )34 35 documents = []36 documents.extend(pdf_loader.load())37 documents.extend(txt_loader.load())38 39 print(f"✅ Cargados {len(documents)} documentos")40 return documents41 42# 2. Dividir en chunks43def split_documents(documents):44 """Divide documentos en fragmentos manejables"""45 46 splitter = RecursiveCharacterTextSplitter(47 chunk_size=1000, # Tamaño de cada chunk48 chunk_overlap=200, # Solapamiento para contexto49 separators=["\n\n", "\n", ".", "!", "?", ",", " "]50 )51 52 chunks = splitter.split_documents(documents)53 print(f"✅ Creados {len(chunks)} chunks")54 return chunks55 56# 3. Crear embeddings y guardar en vector store57def create_vectorstore(chunks, persist_directory: str = "./chroma_db"):58 """Crea embeddings y guarda en ChromaDB"""59 60 embeddings = OpenAIEmbeddings(61 model="text-embedding-3-small" # Más barato para empezar62 )63 64 vectorstore = Chroma.from_documents(65 documents=chunks,66 embedding=embeddings,67 persist_directory=persist_directory68 )69 70 print(f"✅ Vector store creado en {persist_directory}")71 return vectorstore72 73# Ejecutar pipeline74if __name__ == "__main__":75 print("🚀 Iniciando ingesta de documentos...")76 77 docs = load_documents()78 chunks = split_documents(docs)79 vectorstore = create_vectorstore(chunks)80 81 print("✅ ¡Base de conocimiento lista!")
Paso 3: Crear el Chatbot (query.py)#
1"""2query.py - Chatbot RAG que responde preguntas3"""4import os5from dotenv import load_dotenv6from langchain_openai import OpenAIEmbeddings, ChatOpenAI7from langchain_community.vectorstores import Chroma8from langchain.chains import RetrievalQA9from langchain.prompts import PromptTemplate10 11load_dotenv()12 13# Cargar vector store existente14def load_vectorstore(persist_directory: str = "./chroma_db"):15 embeddings = OpenAIEmbeddings(model="text-embedding-3-small")16 return Chroma(17 persist_directory=persist_directory,18 embedding_function=embeddings19 )20 21# Crear cadena de RAG22def create_rag_chain(vectorstore):23 24 # Prompt personalizado25 template = """Eres un asistente experto de nuestra empresa. 26 Usa SOLO la siguiente información para responder.27 Si no encuentras la respuesta en el contexto, di "No tengo información sobre eso".28 29 Contexto:30 {context}31 32 Pregunta: {question}33 34 Respuesta útil y concisa:"""35 36 prompt = PromptTemplate(37 template=template,38 input_variables=["context", "question"]39 )40 41 # Configurar LLM42 llm = ChatOpenAI(43 model="gpt-4o-mini", # Buena relación calidad/precio44 temperature=0 # Respuestas consistentes45 )46 47 # Crear cadena48 qa_chain = RetrievalQA.from_chain_type(49 llm=llm,50 chain_type="stuff",51 retriever=vectorstore.as_retriever(52 search_kwargs={"k": 4} # Top 4 documentos relevantes53 ),54 chain_type_kwargs={"prompt": prompt},55 return_source_documents=True56 )57 58 return qa_chain59 60# Interfaz de chat61def chat():62 print("🤖 Chatbot RAG iniciado. Escribe 'salir' para terminar.\n")63 64 vectorstore = load_vectorstore()65 qa_chain = create_rag_chain(vectorstore)66 67 while True:68 question = input("Tú: ").strip()69 70 if question.lower() in ['salir', 'exit', 'quit']:71 print("👋 ¡Hasta luego!")72 break73 74 if not question:75 continue76 77 # Obtener respuesta78 result = qa_chain.invoke({"query": question})79 80 print(f"\n🤖 Asistente: {result['result']}\n")81 82 # Mostrar fuentes (opcional)83 if result.get('source_documents'):84 print("📚 Fuentes consultadas:")85 for i, doc in enumerate(result['source_documents'][:2], 1):86 source = doc.metadata.get('source', 'Desconocido')87 print(f" {i}. {source}")88 print()89 90if __name__ == "__main__":91 chat()
Paso 4: Probar#
1# Primero, procesar documentos2python ingest.py3 4# Luego, chatear5python query.py
Ejemplo de conversación:
1Tú: ¿Cuál es la política de devoluciones?2 3🤖 Asistente: Según nuestra política, los clientes pueden devolver 4productos en un plazo de 30 días desde la compra. El producto debe 5estar sin usar y en su embalaje original. Para iniciar una devolución, 6contacta con soporte@empresa.com con tu número de pedido.7 8📚 Fuentes consultadas:9 1. documents/politicas.pdf10 2. documents/faqs.txt
Optimizaciones Avanzadas#
1. Chunking Inteligente#
El chunking básico corta por número de caracteres. Mejor:
1from langchain.text_splitter import MarkdownTextSplitter2 3# Para documentación en Markdown4splitter = MarkdownTextSplitter(5 chunk_size=1000,6 chunk_overlap=1007)8 9# Respeta la estructura de headers
2. Hybrid Search (Keyword + Semantic)#
Combina búsqueda tradicional con semántica:
1from langchain.retrievers import BM25Retriever, EnsembleRetriever2 3# BM25 para keywords exactos4bm25_retriever = BM25Retriever.from_documents(documents)5bm25_retriever.k = 46 7# Semantic para significado8semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})9 10# Combinar ambos11ensemble_retriever = EnsembleRetriever(12 retrievers=[bm25_retriever, semantic_retriever],13 weights=[0.3, 0.7] # 70% semántico, 30% keywords14)
3. Reranking para Mejor Precisión#
1from langchain.retrievers import ContextualCompressionRetriever2from langchain_cohere import CohereRerank3 4# Reranker de Cohere5reranker = CohereRerank(model="rerank-multilingual-v3.0")6 7compression_retriever = ContextualCompressionRetriever(8 base_compressor=reranker,9 base_retriever=vectorstore.as_retriever(search_kwargs={"k": 20})10)11 12# Busca 20 docs, reordena, devuelve top 4
4. Metadata Filtering#
1# Al ingestar, añade metadata2doc.metadata["department"] = "ventas"3doc.metadata["year"] = 20264 5# Al buscar, filtra6retriever = vectorstore.as_retriever(7 search_kwargs={8 "k": 4,9 "filter": {"department": "ventas"}10 }11)
Stack de Producción Recomendado 2026#
Para una implementación seria en producción:
| Componente | Desarrollo | Producción |
|---|---|---|
| Vector DB | ChromaDB (local) | Pinecone / Qdrant Cloud |
| Embeddings | text-embedding-3-small | text-embedding-3-large |
| LLM | GPT-4o-mini | GPT-4o / Claude 3.5 |
| Framework | LangChain | LangChain + LangSmith |
| Hosting | Local | AWS/GCP + Docker |
| Monitoring | Prints | LangSmith + Sentry |
Costes Estimados (1000 queries/día)#
| Componente | Coste Mensual |
|---|---|
| OpenAI Embeddings | ~$5 |
| OpenAI LLM (GPT-4o-mini) | ~$15 |
| Pinecone (1M vectores) | $70 |
| Hosting (pequeño) | ~$20 |
| Total | ~$110/mes |
Con GPT-4o en vez de mini: ~$200/mes
Errores Comunes y Cómo Evitarlos#
Error 1: Chunks Demasiado Pequeños/Grandes#
Problema: Chunks pequeños = contexto insuficiente. Grandes = ruido.
Solución:
- Empieza con 1000 chars, 200 overlap
- Ajusta según resultados
- Considera semantic chunking
Error 2: No Actualizar la Base de Conocimiento#
Problema: Documentos cambian, vector store queda obsoleto.
Solución: Pipeline de actualización periódica o webhooks.
Error 3: Ignorar las Alucinaciones#
Problema: El LLM a veces se inventa cosas.
Solución:
- Prompt estricto: "Solo usa el contexto proporcionado"
- Temperatura = 0
- Mostrar siempre las fuentes
- Validación humana para casos críticos
Error 4: No Medir el Rendimiento#
Problema: No sabes si las respuestas son buenas.
Solución:
- Crea un set de test con preguntas y respuestas correctas
- Mide hit rate, precision, user satisfaction
- Usa LangSmith para trazabilidad
Caso Práctico: Chatbot de Soporte#
🎓 Este caso práctico está completo en este post, con arquitectura, prompt del sistema y métricas de evaluación.
Contexto#
- Empresa: E-commerce de electrónica
- Problema: 500 tickets/día, 70% son preguntas repetitivas
- Objetivo: Reducir tickets en 50%
Documentos Indexados#
- FAQs (200 preguntas)
- Manual de usuario (50 páginas)
- Políticas (devoluciones, garantías, envíos)
- Especificaciones de productos (500 productos)
Resultados#
| Métrica | Antes | Después |
|---|---|---|
| Tickets/día | 500 | 180 |
| Tiempo respuesta | 4 horas | Instantáneo |
| Satisfacción cliente | 3.2/5 | 4.5/5 |
| Coste soporte mensual | €8,000 | €3,500 |
Próximos Pasos#
Si Eres Developer#
- Implementa el tutorial básico (30 min)
- Prueba con tus propios documentos
- Añade las optimizaciones una por una
- Mide y mejora
Si Quieres Implementarlo en tu Empresa#
- Identifica el caso de uso con mayor ROI
- Recopila documentos relevantes
- Prototipa con este tutorial
- Mide resultados antes de escalar
Si Quieres Ir Más Rápido#
- ✅ Empieza por un solo caso de uso: un chatbot sobre una colección de 20-50 documentos enseña más que un proyecto panorámico.
- ✅ Prototipa con el stack de arriba y mide resultados antes de escalar.
- ✅ Si no hay equipo técnico, la alternativa llave en mano está al final de este tutorial.
Recursos Adicionales#
Artículos Relacionados#
- Qué es RAG - Explicación conceptual
- RAG para Documentación de Empresa
- Agentes de IA: Guía Completa
- Cómo Implementar RAG desde Cero
Herramientas#
- LangChain Docs
- Pinecone
- ChromaDB
- LangSmith (monitoring)
¿Puedo montar esto sin equipo técnico?#
El tutorial es honesto: sí, si tienes una persona que sepa Python y DBs vectoriales, y semanas para iterar. Si no, lo realista es que lo monte un proveedor llave en mano.
En Javadex entregamos exactamente esto como servicio con Cortex, la plataforma de IA privada multi-modelo: tu ChatGPT corporativo con tu marca, RAG sobre tus documentos con cita a la fuente, multi-modelo (Claude, GPT, Gemini y otros según el caso) y datos en Europa, sin lock-in. Un copiloto interno con RAG sobre la documentación de una pyme española cuesta entre 5.000 € y 20.000 € (septiembre 2026), con el primer valor funcional en 2-4 semanas.
→ Cuéntame qué documentos tendría que consultar tu equipo
Antes de hablar, puedes leer las dos preguntas que más me llegan:

