6. Modelo Chatbot

 

Modelo Chatbot - Creación y Configuración

1. Creación del Modelo Chatbot

1.1. Generar el Modelo con Todos sus Archivos

Ejecutamos el comando para crear el modelo con todos los archivos relacionados:

bash

php artisan make:model Chatbot --all

Archivos generados:

  • app/Models/Chatbot.php - Modelo

  • database/migrations/xxxx_create_chatbots_table.php - Migración

  • database/factories/ChatbotFactory.php - Factory

  • app/Http/Requests/StoreChatbotRequest.php - Request para crear

  • app/Http/Requests/UpdateChatbotRequest.php - Request para actualizar

  • app/Http/Controllers/ChatbotController.php - Controlador

Selección interactiva:
Si usas --all, puedes seleccionar archivos específicos con la barra espaciadora y flechas.


2. Migración del Modelo Chatbot

2.1. Estructura de la Migración

Editamos el archivo de migración en database/migrations/xxxx_create_chatbots_table.php:

php

<?php


use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;


return new class extends Migration

{

    public function up(): void

    {

        Schema::create('chatbots', function (Blueprint $table) {

            // UUID como clave primaria

            $table->uuid('id')->primary();

            

            // Relación con el usuario

            $table->foreignUuid('user_id')

                  ->constrained()

                  ->cascadeOnDelete();

            

            // Campos principales del chatbot

            $table->string('name');

            $table->text('system_prompt');

            $table->string('model');

            $table->float('temperature', 8, 2)->default(0.0);

            

            // Soft deletes para recuperación

            $table->softDeletes();

            

            $table->timestamps();

        });

    }


    public function down(): void

    {

        Schema::dropIfExists('chatbots');

    }

};

2.2. Explicación de Campos

Campo

Tipo

Descripción

id

UUID

Identificador único universal

user_id

UUID

Usuario propietario del chatbot

name

String

Nombre identificativo del chatbot

system_prompt

Text

Instrucciones que guían el comportamiento

model

String

Modelo de IA a utilizar (ej: gpt-3.5-turbo)

temperature

Float

Control de aleatoriedad (0.0 - 1.0)

softDeletes

Timestamp

Para eliminación lógica

2.3. Notas sobre Soft Deletes

Los soft deletes permiten:

  • ✅ Eliminar chatbots sin perder datos

  • ✅ Recuperar chatbots eliminados

  • ✅ Mantener historial de conversaciones

  • ✅ Auditoría de eliminaciones


3. Relaciones del Modelo

3.1. En el Modelo Chatbot (app/Models/Chatbot.php)

php

<?php


namespace App\Models;


use Illuminate\Database\Eloquent\Concerns\HasUuids;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\Relations\BelongsTo;

use Illuminate\Database\Eloquent\SoftDeletes;


class Chatbot extends Model

{

    use HasFactory, HasUuids, SoftDeletes;


    /**

     * Los atributos que son asignables masivamente.

     *

     * @var array<int, string>

     */

    protected $fillable = [

        'name',

        'system_prompt',

        'model',

        'temperature',

        'user_id',

    ];


    /**

     * Los atributos que deben ser convertidos.

     *

     * @var array<string, string>

     */

    protected $casts = [

        'temperature' => 'float',

        'created_at' => 'datetime',

        'updated_at' => 'datetime',

    ];


    /**

     * Relación: Un chatbot pertenece a un usuario.

     */

    public function user(): BelongsTo

    {

        return $this->belongsTo(User::class);

    }

}

3.2. En el Modelo User (app/Models/User.php)

php

<?php


namespace App\Models;


use Illuminate\Database\Eloquent\Concerns\HasUuids;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Relations\HasMany;

use Illuminate\Foundation\Auth\User as Authenticatable;

// ... otros imports


class User extends Authenticatable

{

    use HasFactory, HasUuids;

    // ... otros traits


    /**

     * Relación: Un usuario tiene muchos chatbots.

     */

    public function chatbots(): HasMany

    {

        return $this->hasMany(Chatbot::class);

    }

}

3.3. Diagrama de Relaciones

text

┌─────────────┐          ┌─────────────┐

│    Users    │          │   Chatbots  │

├─────────────┤          ├─────────────┤

│ id (UUID)   │◄─────────│ user_id     │

│ name        │          │ id (UUID)   │

│ email       │          │ name        │

│ ...         │          │ system_prompt│

└─────────────┘          │ model       │

                         │ temperature │

                         │ deleted_at  │

                         └─────────────┘


4. Factory para Datos de Prueba

4.1. Configuración del Factory (database/factories/ChatbotFactory.php)

php

<?php


namespace Database\Factories;


use App\Models\User;

use Illuminate\Database\Eloquent\Factories\Factory;


/**

 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Chatbot>

 */

class ChatbotFactory extends Factory

{

    /**

     * Define el estado por defecto del modelo.

     *

     * @return array<string, mixed>

     */

    public function definition(): array

    {

        return [

            'name' => $this->faker->sentence(3), // Nombre aleatorio

            'user_id' => User::factory(), // Crea un usuario asociado

            'system_prompt' => $this->faker->paragraph(3), // Prompt extenso

            'model' => $this->faker->word(), // Ej: "gpt-3.5-turbo"

            'temperature' => $this->faker->randomFloat(1, 0, 1), // 0.0 a 1.0

        ];

    }

}

4.2. Métodos Útiles del Factory

php

// Crear chatbot con un usuario específico

Chatbot::factory()->create([

    'user_id' => $user->id,

]);


// Crear múltiples chatbots

Chatbot::factory()->count(5)->create();


// Crear chatbots con diferentes temperaturas

Chatbot::factory()->create([

    'temperature' => 0.8, // Más creativo

]);


5. Seeder con Relaciones

5.1. Configurar Database Seeder (database/seeders/DatabaseSeeder.php)

php

<?php


namespace Database\Seeders;


use App\Models\User;

use Illuminate\Database\Seeder;


class DatabaseSeeder extends Seeder

{

    public function run(): void

    {

        // Crear usuario con chatbots asociados

        User::factory()

            ->hasChatbots(1) // Crear 1 chatbot asociado

            ->create([

                'name' => 'Usuario Prueba',

                'email' => 'usuario@prueba.com',

            ]);


        // Para crear 2 chatbots:

        // User::factory()

        //     ->hasChatbots(2)

        //     ->create([...]);


        // Crear varios usuarios con chatbots

        // User::factory()

        //     ->count(3)

        //     ->hasChatbots(2)

        //     ->create();

    }

}

5.2. Explicación del Método hasChatbots()

Este método mágico funciona porque:

  1. La relación chatbots() está definida en el modelo User

  2. Laravel detecta automáticamente la relación

  3. Crea y asocia los chatbots al usuario


6. Verificación en la Base de Datos

6.1. Ejecutar Migraciones y Seeders

bash

php artisan migrate:fresh --seed

O usando el alias:

bash

mfs

6.2. Verificar la Tabla Chatbots

Consultas SQL de verificación:

sql

-- Ver estructura de la tabla

DESCRIBE chatbots;

Resultado esperado:

text

+----------------+-------------+------+-----+---------+-------+

| Field          | Type        | Null | Key | Default | Extra |

+----------------+-------------+------+-----+---------+-------+

| id             | char(36)    | NO   | PRI | NULL    |       |

| user_id        | char(36)    | NO   | MUL | NULL    |       |

| name           | varchar(255)| NO   |     | NULL    |       |

| system_prompt  | text        | NO   |     | NULL    |       |

| model          | varchar(255)| NO   |     | NULL    |       |

| temperature    | double      | YES  |     | 0       |       |

| deleted_at     | timestamp   | YES  |     | NULL    |       |

| created_at     | timestamp   | YES  |     | NULL    |       |

| updated_at     | timestamp   | YES  |     | NULL    |       |

+----------------+-------------+------+-----+---------+-------+

Ver datos:

sql

SELECT 

    c.id, 

    c.name, 

    u.name as owner,

    c.model,

    c.temperature

FROM chatbots c

JOIN users u ON c.user_id = u.id;


7. Funcionalidades Adicionales

7.1. Scopes para Consultas Comunes

Agregar en el modelo Chatbot:

php

/**

 * Scope para chatbots activos (no eliminados)

 */

public function scopeActive($query)

{

    return $query->whereNull('deleted_at');

}


/**

 * Scope para chatbots de un usuario específico

 */

public function scopeForUser($query, $userId)

{

    return $query->where('user_id', $userId);

}

7.2. Métodos de Ayuda

php

/**

 * Verificar si el chatbot está eliminado

 */

public function isDeleted(): bool

{

    return $this->trashed();

}


/**

 * Obtener el nombre del modelo de IA

 */

public function getModelDisplayName(): string

{

    $models = [

        'gpt-3.5-turbo' => 'GPT-3.5 Turbo',

        'gpt-4' => 'GPT-4',

        'gpt-4-turbo' => 'GPT-4 Turbo',

    ];

    

    return $models[$this->model] ?? $this->model;

}


8. Ejemplos de Uso

8.1. Crear un Chatbot desde el Código

php

use App\Models\Chatbot;


$chatbot = Chatbot::create([

    'user_id' => auth()->id(),

    'name' => 'Chef Ecuador',

    'system_prompt' => 'Eres un experto en gastronomía ecuatoriana...',

    'model' => 'gpt-3.5-turbo',

    'temperature' => 0.0,

]);

8.2. Obtener Chatbots del Usuario Autenticado

php

// En un controlador

$chatbots = auth()->user()->chatbots;


// O usando el scope

$chatbots = Chatbot::forUser(auth()->id())->get();

8.3. Eliminación Lógica y Recuperación

php

// Eliminar (soft delete)

$chatbot->delete();


// Verificar si está eliminado

if ($chatbot->trashed()) {

    // Restaurar

    $chatbot->restore();

}


// Forzar eliminación permanente

$chatbot->forceDelete();


9. Resumen de Archivos Creados

9.1. Estructura de Archivos

text

app/Models/

└── Chatbot.php


app/Http/Controllers/

└── ChatbotController.php


app/Http/Requests/

├── StoreChatbotRequest.php

└── UpdateChatbotRequest.php


database/migrations/

└── xxxx_create_chatbots_table.php


database/factories/

└── ChatbotFactory.php


database/seeders/

└── DatabaseSeeder.php (modificado)

9.2. Configuraciones Aplicadas

Elemento

Configuración

ID

UUID en lugar de ID incremental

Relaciones

belongsTo User, hasMany Chatbots

Soft Deletes

Habilitados para eliminación lógica

Factory

Datos de prueba generados automáticamente

Seeder

Usuario con chatbot asociado


10. Próximos Pasos

Con el modelo Chatbot configurado, ahora podemos:

  1. ✅ Crear la interfaz de usuario para gestionar chatbots

  2. ✅ Implementar la lógica para chatear con la IA

  3. ✅ Añadir fuentes de conocimiento (PDFs, URLs)

  4. ✅ Gestionar múltiples conversaciones

¡El modelo base está listo para comenzar a construir la funcionalidad principal! 🚀


Comentarios

Entradas más populares de este blog

1. Introducción al curso de Chatbots personalizados con Laravel & OpenAI

2. Prerequisitos para el Curso de Chatbots con Laravel y OpenAI

4. Herramientas de Calidad