CyberRAG — RAG 100% local (Ollama) sobre apuntes y libros de ciberseguridad: recuperación híbrida, respuestas con citas, asistente de pentest por fases y monitor de reindex. Sin frameworks pesados.
Sistema RAG (Retrieval-Augmented Generation) para consultar tus notas de ciberseguridad (vault Obsidian, writeups HTB, apuntes) con lenguaje natural. Todo corre en tu máquina: embeddings y generación usan Ollama local, sin ningún dato que salga de tu red. Y sin langchain: cada pieza es código propio entendible.
Documentación técnica completa →
docs/ARQUITECTURA.mdCubre los conceptos de fondo (RAG, embeddings, búsqueda híbrida, reparto justo, rerank), la arquitectura por capas, la extracción de formatos, el índice incremental, los espacios de conocimiento y la capacidad de cómputo.Asistente de pentest por fases →
docs/ASISTENTE-PENTEST.mdMentor de HTB por fase (Recon / Enumeración / Explotación / Privesc / Post / Reporte) y vector (web, SMB, AD, Linux, Windows…), con nivel de ayuda (empuja/explica/directo) para entender manual sin autopiloto, y campo de estado de máquina para pegar tus puertos/servicios. Pensado para trabajo ofensivo autorizado + reporte ISO 27001.Informe de arquitectura (para L2/aprendiz) →
docs/INFORME-ARQUITECTURA.mdPanorama en una sola lectura: qué es, cómo está armado por dentro y cómo se usa, más un plan para enseñarlo en 20 minutos.Runbook del servidor →
docs/RUNBOOK-SERVIDOR.mdOperación del host: reglas no negociables, red/firewall, xRDP/faillock y recuperación de la GPU (Xid 31).Monitor del reindex →
web/monitor.py(dashboard en el navegador: progreso, ritmo, ETA, GPU y modelos en vivo, sin tocar la GPU).
numpy + la API HTTP de Ollama.Tus documentos (.md/.txt/.log)
│
▼
┌────────────┐ chunking con solape ┌──────────────────┐
│ Chunks │ ─────────────────────▶ │ Embeddings │
│ (pedazos) │ │ nomic-embed-text│
└────────────┘ └────────┬─────────┘
▼
┌──────────────┐
│ Índice .npz │ (output/indice.npz)
└──────┬───────┘
┌───────────────────────┘
▼
Pregunta ───▶ vector ──▶ similitud coseno ──▶ top-k chunks
│
▼
Respuesta ◀── generación con contexto ◀───────────┘
(qwen2.5-coder / mistral, local)
Las 3 piezas del RAG:
search_document: ) que aumenta la
calidad del embedding en la búsqueda.nomic-embed-text, local). Ante una pregunta (vectorizada como
search_query: ), buscás los chunks con mayor similitud coseno combinada
con coincidencia léxica de palabras (búsqueda híbrida). El coseno solo no
alcanza para preguntas de comparación; el componente léxico rescata el chunk
exacto donde están los términos.127.0.0.1:11434nomic-embed-text (setup.sh lo descarga automáticamente)qwen2.5-coder:7b. Es el que responde la
teoría (citando ISO/libros) Y los temas ofensivos de laboratorios (HTB) sin
negarse. Cambiable sin tocar código con la env var RAG_CHAT_MODEL
(p. ej. RAG_CHAT_MODEL=llama3.1:8b rag web para prosa teórica fina — aunque
con contenido ofensivo se autorrestringe; mistral:latest cita bien pero a
veces pega contexto crudo).pdftotext (poppler-utils) si querés indexar PDFs./setup.sh
# Indexar los documentos de ejemplo en document[o]s/
python3 rag_ollama.py index
# Indexar otra carpeta (ej.: tu vault de Obsidian) — en vivo, sin copiar
python3 rag_ollama.py --docs-dir ~/vault index
# Preguntar (usá SIEMPRE el mismo --docs-dir que el index)
python3 rag_ollama.py --docs-dir ~/vault ask "¿Qué flag de hashcat crackea un hash ASREProast?"
# Chat continuo contra tu base — sin repetir el comando
python3 rag_ollama.py --docs-dir ~/vault interactive
# Estadísticas del índice
python3 rag_ollama.py stats
En este equipo hay además el alias rag, que mantiene dos espacios de
conocimiento: tus apuntes (vault) y la biblioteca curada de libros (libros).
rag "pregunta sobre tus apuntes" # espacio vault (default)
rag libros "pregunta sobre libros" # espacio libros (PDFs curados)
rag --rerank "pregunta" # con reranker local (reordena fuentes)
rag chat # modo interactivo (vault)
rag chat libros # modo interactivo (libros)
rag index # reindexar VAULT (incremental: rápido)
rag index libros # reindexar libros (tarda minutos)
rag stats # estado del índice del vault
rag analizar # dupes + solapamiento + temas (vault)
rag fuentes "término" # en qué documentos aparece el término
Los dos espacios se guardan en output/indices/indice_<espacio>.npz y no se
pisan entre sí.
rag web # → http://localhost:8787 (alias local en /etc/hosts)
# o: RAG_HOST=0.0.0.0 rag web para exponerlo a la LAN (con UFW)
La UI (server puro de la stdlib de Python, cero dependencias) ofrece:
.md/.pdf citados.02-redhat-security-rh342.pdf) se muestran y citan por su título humano
("Red Hat RH342 — Security: hardening de servidores"); el prompt le pide al
modelo citar la fuente de cada idea.biblioteca), libros
(biblioteca-libros) o todo (ambos combinados, el default). En modo
todo la búsqueda reparte la cuota entre los dos índices — un espacio con
muchos chunks (~138k libros) no aplasta al chico (581 apuntes) — y cada fuente
se etiqueta con su procedencia (📚 libro / 📝 apunte).web/web.py (API + static), web/index.html, web/style.css,
web/app.js — todo editable en caliente.libros)