45:57Chase AI
Log in to leave a comment
No posts yet
Al construir un sistema RAG en un entorno local, el primer muro con el que te topas es la capacidad de la VRAM y los persistentes conflictos de versiones entre librerías. Un modelo con cuantización de 8 bits consume aproximadamente 1 GB de VRAM por cada mil millones de parámetros. Considerando el consumo del propio sistema operativo (Windows o macOS), se debe dejar al menos un 20% de espacio libre. Sin esta holgura, verás un rendimiento desastroso donde la generación de tokens se arrastra a un nivel de 2 por segundo. Especialmente, el framework lightrag-hku suele arrojar errores de tiempo de ejecución al encontrarse con las versiones más recientes de numpy 2.x.
Primero, abre la terminal e ingresa pip install numpy==1.26.4 --force-reinstall para fijar la versión. Luego, instala nest_asyncio y escribe nest_asyncio.apply() al principio de tu código. Si no haces esto, el bucle asíncrono se bloqueará en Jupyter Notebook, deteniendo todo el proceso. Si tu memoria GPU es inferior a 8 GB, al inicializar LightRAG, establece embedding_batch_num en 10 o menos, y llm_model_max_async en alrededor de 4. Solo con esta configuración puedes prevenir el fenómeno de OOM (Out Of Memory) donde el sistema muere sin razón aparente y ahorrarte al menos dos horas de trabajo en vano.
Almacenar el texto simplemente en bloques hace que se pierda todo el contexto entre la información. Sin embargo, si parseas correctamente la estructura de wikilinks ([[link]]) de Obsidian, puedes crear un grafo de conocimiento bastante decente. La clave es eliminar los símbolos de Markdown innecesarios antes de que el LLM los lea. Solo con limpiar los símbolos sucios, puedes ahorrar cerca del 30% del consumo de tokens.
Adquiere el hábito de incluir campos como type y domain en el área YAML superior al escribir tus notas. Esto cambia radicalmente la velocidad de filtrado en las búsquedas. Utiliza el patrón r"\[\[(.+?)\]\]" en el módulo re de Python para extraer los vínculos entre documentos y luego conviértelos en un dataset de relaciones en formato JSONL. El nombre del archivo también es importante. En lugar de una fecha como "2024-04-14", utiliza el tema central del conocimiento como título para que los nodos indexados cumplan su función. Los datos conectados de esta manera permiten realizar inferencias que navegan entre conceptos, yendo más allá de una simple búsqueda.
Lo más desperdiciado al ejecutar un LLM local es gastar tiempo recalculando embeddings que ya han sido procesados. El caché básico de Python desaparece al cerrar el programa. Por ello, debes crear un almacenamiento físico utilizando DiskCache basado en SQLite. Diseña el sistema para que, si la similitud de coseno entre preguntas supera 0.95, devuelva directamente la respuesta cacheada sin invocar al LLM. Al aplicar este almacenamiento en caché semántico, puedes reducir el tiempo de respuesta a unos 100 ms.
El método es sencillo. Instala la librería con pip install diskcache y crea una clase que almacene pares de texto de embedding y vectores. Es incluso mejor si mezclas esto con un algoritmo de ponderación temporal.
Se trata de programar la lógica para que la nota que acabas de editar aparezca en la parte superior de los resultados de búsqueda. Si estableces el TTL del caché de embeddings en 1 hora y el del caché de respuestas generadas en 2 horas, podrás tener un sistema de respuesta inmediata para preguntas repetitivas.
Los diagramas de arquitectura o capturas de pantalla dentro de las notas contienen mucha más información que el texto. Dejarlos fuera de la búsqueda es una pérdida. Usando el modelo CLIP, puedes situar imágenes y texto en el mismo espacio vectorial, de modo que al escribir solo "diagrama de flujo de datos", puedas encontrar las imágenes relacionadas. Si no tienes una GPU de alta gama, puedes convertir el modelo CLIP-ViT-B-32 al formato OpenVINO y ejecutarlo en la CPU.
Cuando encuentres una ruta de imagen en un archivo Markdown, agrúpala con unos 200 caracteres de texto anteriores y posteriores. Luego, extrae automáticamente subtítulos de la imagen con un VLM local ligero como Phi-3.5-vision. Almacena este vector de subtítulo junto con el vector de características de la imagen en una DB de vectores local como Qdrant. Tras este proceso, incluso dibujos complejos difíciles de explicar con texto se incluirán en los resultados de búsqueda.
Reindexar todo el almacén cada vez que corriges un archivo es una tarea ineficiente. Con la librería watchdog de Python, puedes detectar el momento en que se guarda un archivo y actualizar solo la parte modificada. No obstante, dado que la CPU sufrirá si la indexación se ejecuta continuamente mientras escribes, el procesamiento de "debouncing" es esencial.
Al escribir el script, haz que vigile la carpeta con watchdog.observers y, si ocurre un evento de modificación, espera unos 5 segundos antes de comenzar la tarea. También debes incluir un proceso para comparar el valor hash SHA-256 de cada archivo y verificar si el contenido realmente ha cambiado. Selecciona solo los archivos cuyo hash haya variado, elimina los nodos antiguos e inserta los nuevos vectores. De esta forma, se completa una base de conocimiento en tiempo real que se refleja en el sistema de búsqueda apenas guardas la nota. Esto significa que no hay necesidad de presionar manualmente un botón de actualización.