---
title: "Entrenamiento nibiru-coder"
description: "Cómo registrar un modelo de chat con sabor a Nibiru en tu propio Ollama. Un archivo Modelfile, un script de shell, sesenta segundos."
---

El modelo de chat predeterminado del marco es **`nibiru-coder:1.0`** — un Qwen 2.5 Coder 14B con sabor a Nibiru que registras en tu servidor Ollama. El pipeline de entrenamiento vive en `application/module/ai/training/`.

## ¿Qué es (y no es) `nibiru-coder`?

`nibiru-coder:1.0` **no es** un ajuste fino de LoRA. Es el mismo peso `qwen2.5-coder:14b` envuelto con un sistema de solicitud integrado que:

- explica MMVC, módulos, el despachador, los singletons,
- impone las convenciones de Nibiru (`pageAction`, `navigationAction`, `View::assign`, `Form::create`, la ortografía de `Pageination`),
- empuja el modelo hacia respuestas idiomáticas de Nibiru en lugar de consejos genéricos de Laravel / Symfony.

La personalización del sistema se ejecuta **instantáneamente** — sin entrenamiento de GPU, sin preparación de conjuntos de datos. Proporciona aproximadamente el 80 % del valor de un LoRA real a costo cero de entrenamiento. Cuando tengas presupuesto para un ajuste real, consulta la *ruta Real LoRA* a continuación.

## Construilo
```bash
./application/module/ai/training/build.sh           # builds nibiru-coder:1.0
./application/module/ai/training/build.sh 1.1       # bump tag for iterations
```
El guion:

1. Lee el archivo Modelfile que está al lado.
2. Realiza una solicitud POST a `${OLLAMA_BASE_URL}/api/create` (por defecto `https://api.neuronetz.ai`).
3. Ejecuta una prueba de humo para la llamada de chat para confirmar que la nueva etiqueta responde.

Después de que se complete con éxito, establezca el modelo en `application/module/ai/settings/ai.ini`:
```ini
[AI]
chat.model          = "nibiru-coder:1.0"
chat.fallback_model = "qwen2.5-coder:14b"
```
…y cada instancia de `\Nibiru\Module\Ai\Ai` en tu aplicación habla con él. El fallback asegura que nada se rompa si aún no has construido la etiqueta.

## Iterar en el sistema de solicitud

El bloque `SYSTEM """ ... """` del archivo Modelfile es el gatillo. Ajusta las convenciones, añade nuevos ejemplos y agrega citas a archivos específicos de marcos. Vuelve a ejecutar `build.sh` con una nueva etiqueta (`1.1`, `1.2`, …) y realiza pruebas A/B contra la etiqueta anterior en tu aplicación.
```bash
./application/module/ai/training/build.sh 1.1
# Edit ai.ini → chat.model = "nibiru-coder:1.1"
# Compare answers in the Oracle widget or via smoke-test.php
```
## Ruta real de LoRA

Cuando deseas un modelo cuyos **pesos** conozcan Nibiru — no solo su sistema de solicitud —, el exportador de corpus te cubre.
```bash
cd docs
npm run build:corpus
```
Genera archivos JSONL en `dist/corpus/`:

| Archivo | Formato | Uso |
|---|---|---|
| `chat.jsonl` | mensajes estilo sharegpt | Axolotl, LLaMA-Factory, Unsloth |
| `instructions.jsonl` | instrucción/entrada/salida | entrenadores estilo Alpaca |
| `completion.jsonl` | indicación/completado | ajustes de texto por completo heredados |
| `chunks.jsonl` | metadatos de fragmentos | RAG / construcción del conjunto de evaluación |

Una receta pragmática para una base de 8B en un solo A100 / 4090:
```yaml
# axolotl.yml
base_model: meta-llama/Llama-3.1-8B-Instruct
adapter: lora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_modules: [q_proj, k_proj, v_proj, o_proj]

datasets:
  - path: docs/dist/corpus/chat.jsonl
    type: sharegpt

sequence_len: 4096
sample_packing: true
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 3
optimizer: adamw_bnb_8bit
learning_rate: 0.0002
warmup_ratio: 0.05
bf16: true
```
Después del entrenamiento:

1. Convierte el LoRA a GGUF (`llama.cpp`'s `convert_hf_to_gguf.py`).
2. Crea un Ollama Modelfile con `FROM ./your-lora.gguf`.
3. `./build.sh 2.0` lo registra como `nibiru-coder:2.0`.

El código del marco no cambia — intercambia `chat.model` en `ai.ini` y ya estás usando los nuevos pesos.

## Prueba de humo
```bash
php application/module/ai/training/smoke-test.php
```
Verifica:

- El servidor de Ollama es accesible.
- El modelo responde a una solicitud de un turno.
- El contexto de conversación multiturno funciona.
- Las incrustaciones funcionan (se omite con un mensaje claro si `nomic-embed-text` no se extrae).

Ejecuta después de cada cambio en el archivo Modelfile, antes de desplegar.

## Trucos comunes

- **El sistema de `Modelfile` tiene un prompt demasiado largo.** Algunas versiones de Ollama tienen límites para los prompts del sistema. Manténgalo por debajo de ~3000 tokens.
- **Olvidar extraer el modelo FROM.** El modelo `qwen2.5-coder:14b` debe estar ya en el servidor. Utiliza `curl ${OLLAMA_BASE_URL}/api/tags` para verificarlo.
- **Colisiones de etiquetas.** Ejecutar nuevamente `build.sh 1.0` sobrescribirá la existente `nibiru-coder:1.0`. Usa nuevas etiquetas para iteraciones; fija etiquetas específicas en `ai.ini` para producción.
- **Confusión con `--no-stream`.** El script de construcción usa `stream: false`, por lo que la respuesta regresa como un solo JSON. Si cambias a streamed, analiza línea por línea.
