Inicio / Artículos

Un segundo cerebro de IA privado: RAG local con AnythingLLM, Ollama y Obsidian

Un segundo cerebro privado: AnythingLLM y un modelo de embedding en una VM Proxmox permiten que Mistral 7B local busque notas de Obsidian a través de Ollama RAG, con un uso real de recursos.

Editor: REACTAPP.TOP8 min de lectura1758 palabras

Fuentes: Giving My Local AI a Memory: Turning It Into a Private AI Second Brain with RAG and AnythingLLM

Un amnésico brillante

Un modelo de lenguaje local puede mantener una conversación, explicar conceptos y ayudar a reflexionar sobre ideas, todo sin que salga ni un solo byte del edificio. Lo que no puede hacer de forma automática es recuperar cualquier cosa que hayas guardado.

Imagina un año de notas acumuladas en Obsidian: enlaces marcados a medianoche, pensamientos a medio formar, un artículo largo sobre motores de búsqueda, anuncios de empleo y notas de talleres. Todo está en una carpeta de una computadora portátil, invisible para una IA que tardó todo un fin de semana en funcionar sin conexión.

El almacenamiento nunca fue el problema. El problema es la recuperación. Obtener la nota correcta en el momento adecuado es lo que convierte una carpeta de enlaces en conocimiento en lugar de un cajón de trastos bien organizado. Por eso, el siguiente paso lógico en una configuración de IA privada es darle acceso a esas notas.

Qué es RAG y por qué es importante

La mayoría de las guías sobre “ejecutar IA localmente” omiten esta parte, probablemente porque los embeddings suenan aburridos. Son un poco aburridos, pero vale la pena entenderlos.

RAG es la abreviatura de Retrieval-Augmented Generation. Permite a un modelo de lenguaje acceder a tus propios documentos, sin necesidad de reentrenamiento ni de subirlos a los servidores de terceros.

Imagina contratar a un bibliotecario muy rápido en lugar de pedirle a la IA que memorice cada libro. El bibliotecario no conoce tus notas de memoria, solo sabe cuál buscar cuando haces una pregunta.

Así es como ocurre todo en el fondo:

  1. Los documentos se dividen en fragmentos y se convierten en embeddings, representaciones numéricas del significado, que se almacenan en una base de datos vectorial.
  2. Una pregunta también se convierte en un embedding.
  3. La base de datos encuentra los fragmentos cuyo significado es más similar al de la pregunta.
  4. Esos fragmentos se envían al modelo de lenguaje como contexto.
  • El modelo responde a partir de tus documentos reales y no solo de lo que absorbió durante el entrenamiento.
  • La herramienta: AnythingLLM

    AnythingLLM es adecuado para esta configuración por varias razones:

    • Los espacios de trabajo mantienen bases de conocimiento separadas para diferentes contextos, como notas, investigaciones o borradores de blogs.
    • Lee Markdown de forma nativa, por lo que las notas de Obsidian no necesitan conversión.
    • Se conecta directamente a Ollama.
    • Es autohospedado y funciona como un contenedor Docker, sin necesidad de cuenta ni servicios en la nube.
    • También cuenta con una aplicación de escritorio, lo que ayuda a quienes no tienen un homelab.

    No es la única opción. Open WebUI también incluye RAG integrado. Pero el modelo de espacios de trabajo de AnythingLLM se adapta de manera más adecuada a la idea de un “segundo cerebro”, y su interfaz es lo suficientemente amigable como para ser recomendada a lectores no técnicos.

    Configuración del entorno

    Punto de partida

    La configuración parte de una base como esta:

    • un host Proxmox VE en modo bare-metal;
    • una VM con Ubuntu 24.04 que contiene Ollama con Mistral 7B;
    • Open WebUI como interfaz de chat.

    La configuración adicional incluye una segunda VM junto a ella.

    Una nueva VM en Proxmox

    Cree una VM nueva con Ubuntu 24.04 LTS para AnythingLLM. Mantenerla separada de la VM de Ollama permite tomar snapshots, causar fallos intencionadamente y restaurar sin afectar la configuración real de inferencia. Es mejor causar fallos a propósito que hacerlo por accidente más tarde.

    Especificaciones sugeridas:

    • 4 vCPUs
    • 8 GB de RAM
    • 40 GB de disco, ya que las bases de datos vectoriales ocupan espacio

    Nada aquí es difícil. La documentación lo explica todo, además de un poco de prueba y error, especialmente para quienes ya han configurado la VM de Ollama. La verdadera limitación es el hardware disponible, y trabajar dentro de ese límite es el objetivo de este ejercicio.

    Instalación del modelo de embedding

    La mayoría de las guías omiten este paso, y eso es lo que más confusión genera.

    RAG necesita dos modelos. Uno es el modelo de inferencia, que ya proporciona Mistral 7B. El otro es un modelo de embedding, que convierte el texto en vectores. Son cosas diferentes, y pocas guías lo indican desde el principio.

    En la VM de Ollama existente, descargue el modelo de embedding:

    ollama pull nomic-embed-text
    

    nomic-embed-text es de tamaño reducido, aproximadamente 270 MB, funciona rápidamente en una CPU y rinde bien con texto en inglés, por lo que es una opción adecuada para hardware que no cuenta con GPU.

    Otra dificultad: Ollama solo escucha en localhost por defecto. Para que AnythingLLM, ubicado en una VM diferente, pueda conectarse a él, Ollama debe estar vinculado a todas las interfaces. Comience editando el servicio:

    sudo systemctl edit ollama
    

    Luego agregue esta sobrescritura:

    [Service]
    Environment="OLLAMA_HOST=0.0.0.0"
    

    Vuelva a cargar systemd e inicie de nuevo el servicio:

    sudo systemctl daemon-reload
    sudo systemctl restart ollama
    

    A continuación, abra el puerto 11434 en el firewall de Proxmox entre las dos VMs. La lección se repite: el servicio estaba bien y el modelo también. Lo que falló fue la suposición de que todo puede comunicarse con todo por defecto.

    La configuración de red podría ser más estricta, y probablemente debería serlo con el tiempo. Esa es una actitud típica de los aficionados: hacer que funcione, entender cómo está estructurado, y luego desmontarlo para volver a construirlo correctamente.

    AnythingLLM a través de Docker

    En la nueva VM, instale primero Docker:

    # Install Docker
    curl -fsSL <https://get.docker.com> | sh
    sudo usermod -aG docker $USER
    newgrp docker
    

    Luego inicie AnythingLLM:

    # Run AnythingLLM
    docker run -d \
      -p 3001:3001 \
      --name anythingllm \
      -v ~/.anythingllm:/app/server/storage \
      mintplexlabs/anythingllm
    

    Abra http://<new-vm-ip>:3001 en un navegador. La configuración para la primera ejecución es la siguiente:

    • Proveedor de LLM: Ollama, en http://<ollama-vm-ip>:11434
    • Modelo de chat: Mistral 7B
    • Proveedor de embeddings: Ollama, con nomic-embed-text
    • Banco de datos vectorial: LanceDB, que está integrado y no requiere configuración adicional

    Alimentarlo con las notas

    Cree un espacio de trabajo llamado “Second Brain” y dirija AnythingLLM hacia el almacén de Obsidian. Su gestor de documentos acepta subidas de carpetas, así que proporciónele la carpeta con las notas y déjelo procesarlo todo.

    Procesa archivos .md, .txt, .pdf, .docx y .csv. Los archivos de Obsidian Canvas están en formato JSON en su interior, por lo que no causarán errores, pero tampoco proporcionarán información útil.

    Después de la ingestión, el espacio de trabajo muestra el número de fragmentos y el estado de incrustación. Cada nota se divide en fragmentos superpuestos de unos 500 tokens, lo que significa que un artículo largo pegado sobre motores de búsqueda se convierte en docenas de fragmentos que se pueden recuperar por separado.

    El momento en que se hace clic

    La verdadera prueba es una solicitud sencilla, como pedirle al asistente que revise una nota específica llamada “mejoras en el homelab”.

    Encuentra el archivo real, lo cita por nombre y reproduce la línea exacta junto con una marca de tiempo. La cita incluye el nombre del documento de origen y la fecha de publicación. La recuperación funciona tal como se anuncia: el archivo recibe un nombre y se encuentra, sin contenido inventado ni paráfrasis vaga, solo la información correcta más una cita.

    Lo gracioso ocurre cuando el modelo intenta explicar la nota. Describe a Claude Code como una especie de asistente personal o servicio. Mistral 7B, que funciona sin conexión en una máquina doméstica con solo un procesador central, no tiene idea de qué es Claude Code ni de un servidor MCP. Puede recuperar las palabras, pero no logra comprenderlas por completo.

    Esa es la lección más útil: la recuperación de información y la comprensión son problemas separados. RAG pone el contexto adecuado frente al modelo, pero la capacidad de comprender ese contexto sigue estando limitada por el modelo en sí. Con un modelo pequeño de 7 mil millones de parámetros y sin conexión a Internet, ese límite se alcanza rápidamente.

    Qué salió mal y qué nos enseñó

    Algunas suposiciones no resistieron el proceso de desarrollo.

    • RAG no es magia. Solo es tan útil como la información con la que cuenta, y las notas desordenadas generan resultados desordenados. Lo que se ingresa, eso se obtiene.
    • La creación de redes se integra temprano en el proyecto. Una vez que los servicios se distribuyen en varias máquinas, lograr que comuniquen entre sí de manera fiable es tan importante como configurar cada una de ellas.
    • No culpe al modelo demasiado rápido. A veces el problema radica en el contexto proporcionado. Una buena recuperación de información puede hacer que un modelo pequeño sea sorprendentemente útil, pero no puede proporcionar conocimientos que el modelo nunca haya tenido.

    Lo que obtiene al final y su costo

    Los enlaces, ideas y pensamientos inconclusos guardados durante un año se vuelven accesibles, no solo mediante palabras clave sino también de forma semántica. Pregunte por un concepto y aparecerán notas relacionadas que había olvidado que estaban vinculadas, cada una con una referencia al archivo de origen.

    La máquina de pruebas era una EliteDesk con un procesador i5, 32 GB de RAM y sin GPU, y todo funcionaba sin conexión a Internet. Mediciones de esa única ejecución:

    Ítem Resultado
    Tiempo total de la consulta 1 minuto 35.9 segundos, siendo que AnythingLLM indica 41.9 segundos de generación
    Memoria de AnythingLLM en estado inactivo aproximadamente 440 MB de los 7.76 GB asignados
    Memoria de la VM de Ollama en uso 7.8 GB de los 19 GB
    Memoria utilizada por Mistral durante su ejecución aproximadamente 6.5 GB
    nomic-embed-text aproximadamente 360 MB
    Open WebUI aproximadamente 1 GB

    La diferencia de aproximadamente 54 segundos entre los dos tiempos no tiene explicación. Una causa plausible es que Ollama vuelve a cargar el modelo desde el disco duro.

    Nada de esto es rápido, y de hecho no está destinado a serlo aún. Es el primer día de una configuración RAG en un entorno doméstico que todavía está aprendiendo cómo funcionar, y no constituye un punto de referencia para comparar con soluciones serias. Será interesante revisar estos números cuando el hardware local pueda manejar muchos más tokens por segundo.

    Donde te deja esto

    El proyecto comienza con un objetivo sencillo: permitir que una IA local vea tus notas, y enseña mucho más que eso. A lo largo del proceso aprendes cómo funciona RAG, qué hacen las bases de datos vectoriales, qué hace que la recuperación de información sea eficaz, y por qué el contexto adecuado puede ser más importante que un modelo más grande.

    Más importante aún, el resultado es algo que realmente utilizarás. Doce meses de conocimiento guardado dejan de estar dispersos en carpetas y se convierten en algo sobre lo cual puedes hacer preguntas con facilidad. Todo funciona en una laptop de segunda mano en la esquina de la habitación, lo cual no está mal para una máquina que estaba destinada a ser desechada.

    RAG funciona. La comprensión es otra historia.

    Leer más

    La documentación de AnythingLLM, Ollama, LanceDB y Obsidian detalla estos aspectos. El artículo original sobre RAG, “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”, explica la idea que subyace en todo esto. Todo lo descrito funciona en hardware reutilizado, sin necesidad de nube, sin suscripciones y sin que los datos salgan de la red.