RAG casero: que tu IA responda con TUS documentos
Monta un asistente que conoce tus PDFs, notas y documentos con embeddings y un LLM local. Sin API obligatoria: el límite práctico será tu disco, memoria y revisión.

Dificultadmedia
Tiempo1 hora
IngredientesOllama · nomic-embed-text · Python · ChromaDB
La pregunta más repetida del IA local: “¿Puedo darle mis documentos a ChatGPT?” Sí, pero ¿y si no quieres subir tus documentos a la nube? RAG en local es la respuesta.
¿Qué es RAG en 20 segundos?
- Cortas tus documentos en trozos y los conviertes en vectores (embeddings).
- Cuando preguntas algo, se buscan los trozos más parecidos a tu pregunta.
- Se le dan esos trozos al LLM como contexto: responde basándose en TUS documentos.
Ingredientes
- Ollama instalado (receta de inicio)
pip install chromadb ollama
Pasos
-
Descarga los modelos:
ollama pull nomic-embed-text # embeddings ollama pull qwen2.5:7b # el cerebro -
Indexa tus documentos:
import chromadb, ollama, pathlib client = chromadb.PersistentClient("mi-base") col = client.get_or_create_collection("docs") for archivo in pathlib.Path("mis-documentos").glob("*.txt"): texto = archivo.read_text(encoding="utf-8") # trocea cada ~500 caracteres (lo más simple; mejor por párrafos, ver abajo) trozos = [texto[i:i+500] for i in range(0, len(texto), 500)] for n, trozo in enumerate(trozos): emb = ollama.embed(model="nomic-embed-text", input=trozo)["embeddings"][0] col.add(ids=[f"{archivo.name}-{n}"], documents=[trozo], embeddings=[emb]) -
Pregunta con contexto:
pregunta = "¿Qué decidimos sobre el presupuesto?" emb = ollama.embed(model="nomic-embed-text", input=pregunta)["embeddings"][0] resultados = col.query(query_embeddings=[emb], n_results=3) contexto = "\n---\n".join(resultados["documents"][0]) respuesta = ollama.chat(model="qwen2.5:7b", messages=[ {"role": "system", "content": "Responde SOLO con el contexto dado. Si no está, dilo."}, {"role": "user", "content": f"Contexto:\n{contexto}\n\nPregunta: {pregunta}"}, ]) print(respuesta["message"]["content"])
Resultado esperado
Respuestas que recuperan fragmentos de TU información. Con los modelos pequeños hay que exigirles en el system prompt que no inventen — y aun así, revisa las citas y los permisos de la carpeta indexada.
Trucos
- El tamaño de trozo importa: 300-800 caracteres suele ir bien. Demasiado grande = contexto diluido; demasiado pequeño = sin contexto.
- Para PDFs:
pymupdfextrae texto en 3 líneas. - Si las respuestas son malas, inspecciona primero el retrieval (los trozos recuperados), pero comprueba también el modelo, el prompt y la extracción de documentos. Depura mirando qué contexto se está pasando. Los fallos típicos, con su arreglo, están en RAG bien hecho: los 7 errores.
- ChromaDB persiste en la ruta que configures. Si quieres que tus documentos no salgan de tu disco, no añadas proveedores externos al flujo, protege el directorio y limpia las copias temporales. El límite práctico es tu disco, memoria y tiempo de mantenimiento. 🔒