Base de Conocimiento (KB) - Perfex AI
Inicio Documentación Módulo AI Documento

Base de Conocimiento (KB) - Perfex AI

MD 11 secciones
Resumen

Documentación interna del módulo Perfex AI [hash:a68180358f33f74dcfc037eda73f4e3b]

# Base de Conocimiento (KB) - Perfex AI

Sección 1
**Modelo:** `Knowledge_base_model.php` | **Controlador:** `Knowledge_base.php`

---

## Concepto

Sección 2
La KB permite subir documentos (PDF, TXT, CSV, DOCX, XLSX, MD) que se trocean en chunks y se indexan con FULLTEXT. Cuando la IA necesita contexto, busca en la KB y usa los fragmentos más relevantes como contexto.

### tblperfex_ai_kb_categories

Sección 3
| Columna | Tipo | Descripción |
|---------|------|-------------|
| `id` | INT UNSIGNED PK | Auto-increment |
| `name` | VARCHAR(100) | Nombre de la categoría |
| `description` | TEXT | Descripción |
| `icon` | VARCHAR(50) | Icono FontAwesome (default: fa-folder) |
| `color` | VARCHAR(20) | Color hex (default: #6c757d) |
| `sort_order` | INT | Orden de visualización |
| `is_active` | TINYINT | 0/1 |
| `created_at` | DATETIME | Timestamp |

### tblperfex_ai_kb_documents

Sección 4
| Columna | Tipo | Descripción |
|---------|------|-------------|
| `id` | INT UNSIGNED PK | Auto-increment |
| `category_id` | INT UNSIGNED FK | → kb_categories (ON DELETE RESTRICT) |
| `title` | VARCHAR(255) | Título del documento |
| `description` | TEXT | Descripción |
| `original_filename` | VARCHAR(255) | Nombre del archivo original |
| `file_path` | VARCHAR(500) | Ruta absoluta al archivo |
| `file_type` | VARCHAR(50) | Extensión (pdf, txt, md, csv...) |
| `file_size` | INT | Tamaño en bytes |
| `mime_type` | VARCHAR(100) | MIME type |
| `status` | ENUM | pending, processing, indexed, failed |
| `priority` | TINYINT | 1-10 (mayor = más relevante en búsquedas) |
| `is_active` | TINYINT | 0/1 |
| `valid_from` | DATE | Fecha inicio validez (NULL = siempre) |
| `valid_until` | DATE | Fecha fin validez (NULL = siempre) |
| `total_chunks` | INT | Número de chunks generados |
| `total_tokens` | INT | Tokens estimados totales |
| `processing_error` | TEXT | Error si status=failed |

### tblperfex_ai_kb_documents

Sección 5
| `uploaded_by` | INT | Staff user ID |
| `created_at` | DATETIME | Timestamp |
| `updated_at` | DATETIME | Auto-update |
| `indexed_at` | DATETIME | Cuando se indexó |

### tblperfex_ai_kb_chunks

Sección 6
| Columna | Tipo | Descripción |
|---------|------|-------------|
| `id` | INT UNSIGNED PK | Auto-increment |
| `document_id` | INT UNSIGNED FK | → kb_documents (ON DELETE CASCADE) |
| `chunk_index` | INT | Orden del fragmento |
| `content` | TEXT | Contenido del fragmento (**FULLTEXT INDEX**) |
| `content_hash` | VARCHAR(64) | SHA256 para deduplicación |
| `tokens_count` | INT | Tokens estimados (~4 chars/token) |
| `page_number` | INT | Página (para PDFs) |
| `section_title` | VARCHAR(255) | Título de la sección |
| `created_at` | DATETIME | Timestamp |

## Flujo de Indexación

Sección 7
1. **Subir documento** → `create_document()` → status = `pending`
2. **Procesar** → `Kb_processor` extrae texto del archivo
3. **Trocear** → Dividir en chunks de ~1000 chars respetando párrafos
4. **Deduplicar** → SHA256 hash evita chunks duplicados
5. **Indexar** → `add_chunk()` con FULLTEXT index
6. **Actualizar** → `update_document_status('indexed')`, `update_document_chunk_stats()`

### FULLTEXT (principal)

Sección 8
```php
$results = $this->knowledge_base_model->search('cómo calcular precio vidrio', [
'max_results' => 5,
'category_id' => null, // todas las categorías
'min_priority' => 1,
]);
```
- Usa `MATCH...AGAINST` en modo NATURAL LANGUAGE
- Ordena por prioridad del documento + relevancia FULLTEXT
- Solo documentos activos, indexados y dentro de fechas de validez

### Keywords (fallback)

Sección 9
```php
$results = $this->knowledge_base_model->search_keywords('precio vidrio');
```
- Usa `LIKE` por cada keyword ≥3 caracteres
- Backup cuando FULLTEXT no devuelve resultados

## Métodos Principales

Sección 10
| Método | Descripción |
|--------|-------------|
| `get_categories($active_only)` | Listar categorías |
| `create_category($data)` | Crear categoría |
| `get_documents($filters)` | Listar documentos con filtros |
| `create_document($data)` | Crear documento (status=pending) |
| `delete_document($id)` | Eliminar doc + archivo + chunks |
| `add_chunk($doc_id, $content, $index)` | Añadir chunk (con dedup SHA256) |
| `search($query, $options)` | Búsqueda FULLTEXT |
| `search_keywords($query, $options)` | Búsqueda por keywords |
| `get_stats()` | Estadísticas globales de la KB |

## Documentos Relacionados

Sección 11
- [Arquitectura](modulo_arquitectura.md) - Estructura general
- [Conversaciones](modulo_conversaciones.md) - Exportación de conversaciones a KB
- [Configuración](modulo_configuracion.md) - Settings kb_*
- [Cron Jobs](modulo_cron_jobs.md) - Indexación automática