Este repositorio deja montado un ejemplo completo de chatbot con RAG pensado para despliegue sencillo en Windows y Linux.
llama.cppcomo servidor del modelo local en Docker.- Una app FastAPI que:
- carga una base de conocimiento desde
docs/Documento_base.txt - indexa los fragmentos en Chroma
- recupera los fragmentos más relevantes
- construye un prompt contextualizado
- llama al modelo vía API OpenAI-compatible
- carga una base de conocimiento desde
- Una interfaz web mínima en
http://localhost:8000 docker-compose.ymlpara levantar todo con un solo comando- Scripts de arranque para Windows y Linux
rag-llama-cpp-starter/
├── app/
│ ├── main.py
│ └── static/
│ ├── app.js
│ ├── index.html
│ └── styles.css
├── data/
│ └── chroma/
├── docs/
│ └── Documento_base.txt
├── models/
│ └── (aquí va tu modelo .gguf)
├── scripts/
│ ├── start-linux.sh
│ ├── start-windows.ps1
│ ├── test-model-linux.sh
│ └── test-model-windows.ps1
├── .env.example
├── .gitignore
├── Dockerfile.app
├── docker-compose.yml
├── README.md
└── requirements.txt
- Docker y Docker Compose
- Un modelo GGUF dentro de la carpeta
models/
- Windows con Docker Desktop
- Linux con Docker Engine o Docker Desktop
Ejemplo de nombre de fichero:
Llama-3.2-3B-Instruct-Q4_K_M.gguf
En el caso de querer utilizar un modelo de HugginFace:
pip install -U "huggingface_hub[cli]"
hf download bartowski/Llama-3.2-3B-Instruct-GGUF \
--include "Llama-3.2-3B-Instruct-Q4_K_M.gguf" \
--local-dir /models
``
Coloca ese fichero dentro de:
```text
models/De modo que quede así:
models/Llama-3.2-3B-Instruct-Q4_K_M.gguf
Importante: el modelo no se sube normalmente al repositorio GitHub. Por eso
models/*.ggufestá incluido en.gitignore.
git clone <TU-REPO>
cd rag-llama-cpp-startercp .env.example .envCopy-Item .env.example .envContenido por defecto: Parametrizamos los valores para lanzar nuestro sistema dockerizado. Especificando que modelo queremos lanzar, con que memoria RAM queremos ejecutar dicho modelo, cuales es el nº de fragmentos a recuperar de Chroma más importantes, con que temperatura queremos que funcione el modelo y por último que imagen de llama.cpp queremos levantar como contenedor.
MODEL_FILE=Llama-3.2-3B-Instruct-Q4_K_M.gguf
CTX_SIZE=4096
TOP_K=2
TEMPERATURE=0.3
LLAMA_IMAGE=ghcr.io/ggml-org/llama.cpp:serverAsegúrate de que MODEL_FILE coincide exactamente con el nombre del archivo que hayas copiado a models/.
./scripts/start-linux.sh./scripts/start-windows.ps1También puedes hacerlo manualmente:
docker compose up --buildUna vez arrancado:
- App RAG:
http://localhost:8000 - Servidor del modelo:
http://localhost:8080 - Estado de la app:
http://localhost:8000/health
- La app lee
docs/Documento_base.txt - Divide el contenido por bloques separados por líneas en blanco
- Guarda esos bloques en Chroma
- Cuando el usuario pregunta algo:
- se recuperan los
TOP_Kfragmentos más relevantes - se construye un prompt con ese contexto
- se llama al modelo servido por
llama.cpp
- se recuperan los
- La respuesta vuelve a la interfaz web
Edita este fichero:
docs/Documento_base.txt
Regla simple de este ejemplo:
- cada bloque separado por una línea en blanco se considera un fragmento distinto
Ejemplo:
I.E.S. Ataulfo Argenta ofrece servicios y productos para informática corporativa.
I.E.S. Ataulfo Argenta desarrolla aplicaciones y tiendas online.
I.E.S. Ataulfo Argenta imparte formación en IA, Data y DevOps.
Después de modificarlo, recarga la base de conocimiento con:
curl -X POST http://localhost:8000/reloadEn PowerShell:
Invoke-RestMethod -Uri "http://localhost:8000/reload" -Method Post./scripts/test-model-linux.sh./scripts/test-model-windows.ps1docker psdocker compose logs -fdocker compose downMODEL_FILE: nombre del modelo.ggufCTX_SIZE: contexto del servidorllama.cppTOP_K: número de fragmentos recuperados por ChromaTEMPERATURE: creatividad del modelo
Puedes cambiarlo desde la variable SYSTEM_PROMPT en docker-compose.yml o directamente dentro de app/main.py.
Si quieres usar Docker solo para llama.cpp y arrancar la app Python localmente:
python -m venv .venv
source .venv/bin/activatepython -m venv .venv
.\.venv\Scripts\Activate.ps1pip install -r requirements.txtpython -m app.mainEn este caso el modelo debe seguir disponible en:
http://127.0.0.1:8080/v1
Revisa:
- que el fichero
.ggufexista enmodels/ - que
MODEL_FILEcoincida exactamente con el nombre real - que el contenedor
llama-serveresté activo
Revisa:
- que
docker psmuestrellama-serveryrag-app - que
http://localhost:8080/v1/modelsresponda - que
http://localhost:8000/healthdevuelvastatus: ok
Prueba a:
- mejorar
docs/Documento_base.txt - aumentar
TOP_K - dividir mejor los fragmentos
- ajustar el prompt del sistema
Usa Invoke-RestMethod en lugar de curl si el alias de PowerShell te da problemas.
- Levantar el sistema con Docker Compose
- Probar que el modelo responde
- Editar
Documento_base.txt - Recargar la base de conocimiento
- Hacer preguntas en la web
- Explicar que el RAG:
- busca contexto
- construye un prompt mejor
- llama al LLM
- carga de PDFs
- chunking más avanzado
- reranking
- historial de conversación persistente
- streaming de tokens
- autenticación
- despliegue en servidor remoto
El código del repositorio puede publicarse sin incluir los pesos del modelo. Asegúrate de respetar la licencia del modelo GGUF que utilices.