Ir al contenido principal
Javadex

Tutorial RAG desde Cero: Crea una Base de Conocimiento IA para tu Empresa [2026]

Actualizado el
25 min

Aprende a implementar RAG desde cero. Tutorial práctico para crear chatbots que responden con TU información: documentos, manuales, FAQs. Con código Python.

Aplicarlo en mi empresa Diagnóstico de 30 min · sin compromiso
Índice del artículo11 secciones

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:

  1. No tiene acceso a tus documentos
  2. Su conocimiento tiene fecha de corte
  3. Se inventa cosas cuando no sabe (alucinaciones)

La Solución: RAG#

RAG (Retrieval Augmented Generation) resuelve esto añadiendo un paso previo:

code
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 UsoDocumentosBeneficio
Soporte al clienteFAQs, manuales, tickets previos-70% tickets repetitivos
Asistente internoPolíticas, procesos, wikisEmpleados encuentran info en segundos
VentasCatálogos, fichas técnicasVendedores responden al instante
LegalContratos, normativasBúsqueda instantánea en 1000s de docs
OnboardingGuías, tutorialesNuevos empleados autónomos

Arquitectura RAG Explicada#

Los 4 Componentes#

code
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.

python
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:

ModeloProveedorDimensionesPrecioCalidad
text-embedding-3-largeOpenAI3072$0.13/1M tokens⭐⭐⭐⭐⭐
text-embedding-3-smallOpenAI1536$0.02/1M tokens⭐⭐⭐⭐
voyage-large-2Voyage AI1536$0.12/1M tokens⭐⭐⭐⭐⭐
bge-large-en-v1.5BAAI1024Gratis (local)⭐⭐⭐⭐

3. Vector Database (Almacenamiento)#

Donde guardas los embeddings para búsqueda rápida.

Opciones 2026:

DatabaseTipoPrecioMejor Para
PineconeCloudGratis hasta 100K vectoresProducción, scaling
QdrantSelf-hosted/CloudGratis self-hostedControl total
ChromaLocal/EmbebidoGratisPrototipos, MVPs
WeaviateCloud/Self-hostedTier gratisMultimodal
pgvectorExtensión PostgresTu coste PostgresYa usas Postgres

4. LLM (Generación)#

El modelo que genera la respuesta final con el contexto.

Modelos recomendados:

ModeloMejor ParaPrecio
GPT-4oCalidad máxima$5/1M input
GPT-4o-miniBalance coste/calidad$0.15/1M input
Claude 3.5 SonnetContexto largo$3/1M input
Llama 3.1 70BSelf-hosted, privacidadGratis (compute)

Tutorial Práctico: RAG en 30 Minutos#

Vamos a crear un chatbot que responda preguntas sobre documentación técnica.

Requisitos Previos#

bash
1# Python 3.10+
2python --version
3 
4# Crear entorno virtual
5python -m venv rag-env
6source rag-env/bin/activate # Linux/Mac
7# rag-env\Scripts\activate # Windows
8 
9# Instalar dependencias
10pip install langchain langchain-openai langchain-community
11pip install chromadb pypdf python-dotenv

Estructura del Proyecto#

code
1rag-tutorial/
2├── .env # API keys
3├── documents/ # Tus PDFs/docs
4│ ├── manual.pdf
5│ └── faqs.txt
6├── ingest.py # Procesar documentos
7├── query.py # Hacer preguntas
8└── requirements.txt

Paso 1: Configurar API Keys#

bash
1# .env
2OPENAI_API_KEY=sk-tu-api-key-aqui

Paso 2: Procesar Documentos (ingest.py)#

python
1"""
2ingest.py - Procesa documentos y crea la base de conocimiento
3"""
4import os
5from dotenv import load_dotenv
6from langchain_community.document_loaders import (
7 PyPDFLoader,
8 TextLoader,
9 DirectoryLoader
10)
11from langchain.text_splitter import RecursiveCharacterTextSplitter
12from langchain_openai import OpenAIEmbeddings
13from langchain_community.vectorstores import Chroma
14 
15load_dotenv()
16 
17# 1. Cargar documentos
18def load_documents(docs_path: str = "./documents"):
19 """Carga PDFs y archivos de texto"""
20
21 # Loader para PDFs
22 pdf_loader = DirectoryLoader(
23 docs_path,
24 glob="**/*.pdf",
25 loader_cls=PyPDFLoader
26 )
27
28 # Loader para texto
29 txt_loader = DirectoryLoader(
30 docs_path,
31 glob="**/*.txt",
32 loader_cls=TextLoader
33 )
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 documents
41 
42# 2. Dividir en chunks
43def split_documents(documents):
44 """Divide documentos en fragmentos manejables"""
45
46 splitter = RecursiveCharacterTextSplitter(
47 chunk_size=1000, # Tamaño de cada chunk
48 chunk_overlap=200, # Solapamiento para contexto
49 separators=["\n\n", "\n", ".", "!", "?", ",", " "]
50 )
51
52 chunks = splitter.split_documents(documents)
53 print(f"✅ Creados {len(chunks)} chunks")
54 return chunks
55 
56# 3. Crear embeddings y guardar en vector store
57def 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 empezar
62 )
63
64 vectorstore = Chroma.from_documents(
65 documents=chunks,
66 embedding=embeddings,
67 persist_directory=persist_directory
68 )
69
70 print(f"✅ Vector store creado en {persist_directory}")
71 return vectorstore
72 
73# Ejecutar pipeline
74if __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)#

python
1"""
2query.py - Chatbot RAG que responde preguntas
3"""
4import os
5from dotenv import load_dotenv
6from langchain_openai import OpenAIEmbeddings, ChatOpenAI
7from langchain_community.vectorstores import Chroma
8from langchain.chains import RetrievalQA
9from langchain.prompts import PromptTemplate
10 
11load_dotenv()
12 
13# Cargar vector store existente
14def 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=embeddings
19 )
20 
21# Crear cadena de RAG
22def create_rag_chain(vectorstore):
23
24 # Prompt personalizado
25 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 LLM
42 llm = ChatOpenAI(
43 model="gpt-4o-mini", # Buena relación calidad/precio
44 temperature=0 # Respuestas consistentes
45 )
46
47 # Crear cadena
48 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 relevantes
53 ),
54 chain_type_kwargs={"prompt": prompt},
55 return_source_documents=True
56 )
57
58 return qa_chain
59 
60# Interfaz de chat
61def 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 break
73
74 if not question:
75 continue
76
77 # Obtener respuesta
78 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#

bash
1# Primero, procesar documentos
2python ingest.py
3 
4# Luego, chatear
5python query.py

Ejemplo de conversación:

code
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.pdf
10 2. documents/faqs.txt


Optimizaciones Avanzadas#

1. Chunking Inteligente#

El chunking básico corta por número de caracteres. Mejor:

python
1from langchain.text_splitter import MarkdownTextSplitter
2 
3# Para documentación en Markdown
4splitter = MarkdownTextSplitter(
5 chunk_size=1000,
6 chunk_overlap=100
7)
8 
9# Respeta la estructura de headers

2. Hybrid Search (Keyword + Semantic)#

Combina búsqueda tradicional con semántica:

python
1from langchain.retrievers import BM25Retriever, EnsembleRetriever
2 
3# BM25 para keywords exactos
4bm25_retriever = BM25Retriever.from_documents(documents)
5bm25_retriever.k = 4
6 
7# Semantic para significado
8semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
9 
10# Combinar ambos
11ensemble_retriever = EnsembleRetriever(
12 retrievers=[bm25_retriever, semantic_retriever],
13 weights=[0.3, 0.7] # 70% semántico, 30% keywords
14)

3. Reranking para Mejor Precisión#

python
1from langchain.retrievers import ContextualCompressionRetriever
2from langchain_cohere import CohereRerank
3 
4# Reranker de Cohere
5reranker = 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#

python
1# Al ingestar, añade metadata
2doc.metadata["department"] = "ventas"
3doc.metadata["year"] = 2026
4 
5# Al buscar, filtra
6retriever = 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:

ComponenteDesarrolloProducción
Vector DBChromaDB (local)Pinecone / Qdrant Cloud
Embeddingstext-embedding-3-smalltext-embedding-3-large
LLMGPT-4o-miniGPT-4o / Claude 3.5
FrameworkLangChainLangChain + LangSmith
HostingLocalAWS/GCP + Docker
MonitoringPrintsLangSmith + Sentry

Costes Estimados (1000 queries/día)#

ComponenteCoste 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étricaAntesDespués
Tickets/día500180
Tiempo respuesta4 horasInstantáneo
Satisfacción cliente3.2/54.5/5
Coste soporte mensual€8,000€3,500
ROI: La implementación costó €2,000 y se amortizó en 2 semanas.


Próximos Pasos#

Si Eres Developer#

  1. Implementa el tutorial básico (30 min)
  2. Prueba con tus propios documentos
  3. Añade las optimizaciones una por una
  4. Mide y mejora

Si Quieres Implementarlo en tu Empresa#

  1. Identifica el caso de uso con mayor ROI
  2. Recopila documentos relevantes
  3. Prototipa con este tutorial
  4. 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#

Herramientas#


¿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:

¿Quieres un copiloto interno sobre TUS documentos?

Construyo un asistente con memoria sobre tu documentación: normativas, manuales, contratos, base de conocimiento. Tu equipo pregunta y recibe respuesta con cita a la fuente. RAG empresarial llave en mano. Desde 5.000€.

Quiero el copilotojavi@javadex.es
Javier Santos - Especialista en IA & Machine Learning

Javier Santos

Consultor de IA para empresas. Comparto contenido sobre inteligencia artificial, automatización y desarrollo cada semana.