---
title: "Corpus de entrenamiento"
description: "Cómo se exportan los documentos como un conjunto de entrenamiento listo para LoRA y cómo regenerarlo."
---

Cada página de esta documentación también es un **punto de datos de entrenamiento**. Nibiru incluye un script que extrae un corpus JSONL limpio adecuado para el ajuste fino de una modelo de peso abierto — Llama, Mistral, Qwen, Gemma — en conocimientos específicos de Nibiru.

## Ejecútalo
```bash
cd docs
npm run build:corpus
```
Eso escribe:
```
docs/dist/corpus/
├── instructions.jsonl     # instruction → response pairs
├── chat.jsonl             # OpenAI/Anthropic chat-message format
├── completion.jsonl       # plain prompt → completion (legacy)
└── chunks.jsonl           # raw Markdown chunks (one per H2/H3 section)
```
## Formatos

### `instrucciones.jsonl`

Instrucciones de calentamiento amigables para LoRA:
```json
{
  "instruction": "How do I scaffold a new module in Nibiru?",
  "input": "",
  "output": "Run `./nibiru -m <name>`, optionally with `-g` for Graylog hooks. This creates `application/module/<name>/` with traits/, plugins/, interfaces/, settings/<name>.ini and the main `<name>.php` class implementing `IModule`."
}
```
Cada entrada se genera a partir de una sección de documentos con una pregunta clara (derivada del título H2/H3) y el cuerpo de la sección como la respuesta.

### `chat.jsonl`

Formato de OpenAI chat / Mensajes de Anthropic:
```json
{
  "messages": [
    {"role": "system", "content": "You are an expert on the Nibiru PHP framework."},
    {"role": "user", "content": "How do I scaffold a new module?"},
    {"role": "assistant", "content": "Run `./nibiru -m <name>`. …"}
  ]
}
```
Compatible con las ajustes de OpenAI, la API de Anthropic para evaluación y la mayoría de las herramientas LoRA que esperan entradas en formato de chat (plantilla `sharegpt` de Axolotl, Unsloth, LLaMA-Factory).

### `chunks.jsonl`

Fragmentos sin procesar para su uso como datos de recuperación RAG:
```json
{
  "id": "core/modules#observer-pattern",
  "title": "The observer pattern",
  "url": "/core/modules/#the-observer-pattern",
  "section": "core/modules",
  "language": "en",
  "tokens": 412,
  "content": "Modules implementing `SplSubject` can broadcast events…"
}
```
Este es exactamente el archivo que usa internamente [Oracle](/ai/oracle/).

## Cómo se derivan los fragmentos

El constructor de corpus recorre cada archivo `.md` / `.mdx` bajo `src/content/docs/`, lo parsea en un AST y lo divide en bloques a los límites de H2/H3. Impone:

- Un fragmento por sección H2 (o H3 si la H2 está vacía).
- ~200–800 tokens por fragmento (dividir si es más largo, fusionar si es más corto).
- Las barras de código se mantienen intactas — nunca dividir en medio de un bloque.
- Cada fragmento lleva su ruta fuente, URL anclaje y código de idioma.

El script está en `scripts/build-corpus.mjs` y es completamente configurable.

## Receta sugerida para LoRA

Una línea base pragmática para un modelo base de 8 mil millones de parámetros en una sola A100 / 4090:
```yaml
# axolotl.yaml
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
```
Entrena, luego fusiona los pesos de LoRA y sirve mediante Ollama, vLLM o text-generation-inference. Cambia el `MODEL` del Oracle para que apunte a tu punto final local y tendrás una experiencia de usuario de chat completamente nativa de Nibiru.

## Vuelve a ejecutar en cada cambio de documento

Conéctalo a tu CI:
```yaml
- name: Build corpus
  run: cd docs && npm run build:corpus
- name: Upload corpus artifact
  uses: actions/upload-artifact@v4
  with:
    name: nibiru-corpus
    path: docs/dist/corpus/
```
Cuando cambian las documentaciones, el corpus se reconstruye; los consumidores (canales de formación, índices RAG) siempre tienen los datos más recientes.

## Idiomas

El corpus respeta la configuración regional. Las páginas bajo `en/` están etiquetadas como `language: en`, las páginas alemanas como `language: de`, y así sucesivamente. Entrena LORAs monolingües o multilingües filtrando el JSONL en el campo `language`.

## Licencia

La documentación está licenciada bajo la misma BSD-4-Clause que el marco en sí mismo. El corpus exportado hereda esa licencia — tienes libertad para afinar modelos en él con fines comerciales, siempre y cuando se requiera atribución.
