---
# System prepended metadata

title: Manual Técnico Proyecto 2

---

# Manual Técnico Chatbot

## Integrantes

* Steven Facundo Mejía Xolop - 202104160
* Eduardo Josué González Cifuentes - 201900647
* Jeackelin Sofía Montenegro Chamalé - 201612120

## 1. Descripción General del Proyecto

### 1.1 Propósito
Este proyecto consiste en el desarrollo de un chatbot que responde a consultas básicas en idioma español. El chatbot es capaz de responder preguntas sobre materias, especializaciones, proyectos, oportunidades laborales, entre otros temas, utilizando un modelo entrenado en base a ejemplos de preguntas y respuestas.

### 1.2 Funcionalidad
- Maneja varias intenciones como "saludo", "despedida", "consultas académicas", entre otras.
- Utiliza un modelo de Machine Learning entrenado en un conjunto de datos en formato JSON.



## 2. Arquitectura del Proyecto

### 2.1 Estructura de Archivos
La estructura del proyecto está organizada en distintos archivos que cumplen funciones específicas dentro del sistema. A continuación, se detallan los archivos clave del proyecto:

* `data.json`: Contiene los ejemplos de preguntas y respuestas para cada intención (saludo, despedida, etc.).
* `chatbot.js`: Archivo principal donde el chatbot interactúa con el usuario y responde a las consultas.
* `package.json`: Contiene las dependencias y configuraciones del proyecto.
* `App.jsx`: Archivo donde se implementa la interfaz de usuario de React.
* `index.html`: Archivo HTML que estructura la página y carga la aplicación React.

### 2.2 Diagrama de Flujo
1. **Entrenamiento:**
El modelo se entrena utilizando los datos de data.json. Este proceso se realiza previamente antes de la interacción con el usuario y no requiere intervención directa en el proyecto actual.
2. **Interacción con el Usuario**:
* El archivo chatbot.js gestiona la interacción entre el usuario y el chatbot.
* El modelo entrenado se utiliza para predecir la intención de las preguntas del usuario y generar respuestas adecuadas.
3. **Respuesta de Intenciones**:
* El chatbot utiliza la función predict_intent en chatbot.js para detectar la intención de la consulta del usuario.
* Luego, el chatbot responde utilizando la función get_response, que selecciona la respuesta adecuada de acuerdo con la intención detectada.



## 3. Instalación y Configuración
### 3.1 Requisitos Previos
* **Node.js:** Se requiere tener Node.js instalado para ejecutar los archivos `.js`.
* **npm:** Necesario para instalar las dependencias del proyecto.
* **React:** Se requiere un entorno de desarrollo de React (utilizando Vite en este caso).
### 3.2 Instalación del Proyecto
Clonar el repositorio:

```bash
git clone <URL_del_repositorio>
cd <nombre_del_repositorio>
```
Instalar las dependencias: Asegúrate de tener npm instalado en tu máquina. Luego, ejecuta el siguiente comando para instalar las dependencias necesarias:

```bash
npm install
```
Instalar las dependencias adicionales:

```bash
npm install compromise
```
    
## 4. Uso del Chatbot

### 4.1 Interacción con el Chatbot
El chatbot te permitirá hacer preguntas y recibir respuestas basadas en el modelo entrenado. Simplemente escribe tu pregunta en el campo de texto y presiona "Enviar". La interfaz gráfica muestra tanto las preguntas como las respuestas en el chat.

### 4.2 Ejemplo de Interacción
* Usuario: "Hola"
* Chatbot: "¡Hola! ¿Todo bien?"

## 5. Detalles Técnicos
### 5.1 Modelo de Machine Learning
El modelo es un modelo de clasificación de texto basado en redes neuronales. Se entrena utilizando los datos de data.json y se ajusta para detectar la intención de la pregunta del usuario.

El modelo es capaz de clasificar varias intenciones como:

* **Saludo**: Cuando el usuario saluda al chatbot.
* **Despedida**: Cuando el usuario se despide del chatbot.
* **Consultas generales**: Preguntas relacionadas con temas académicos, generales o de interés.

### 5.2 Funciones Principales en chatbot.js
predict_intent(user_input): Esta función toma el mensaje del usuario, lo procesa y predice la intención del mensaje.

```javascript
function predict_intent(user_input) {
    sequences = tokenizer.texts_to_sequences([user_input]);
    padded_sequences = pad_sequences(sequences, { maxlen: 10 });

    prediction = model.predict(padded_sequences);
    intent_index = np.argmax(prediction);
    confidence = np.max(prediction);
    console.log(`Confianza: ${confidence}`);

    if (confidence < 0.6) {
        return "no_reconocido";
    }

    intent = label_encoder.inverse_transform([intent_index])[0];
    return intent;
}
```
**Explicación**: Esta función transforma la entrada del usuario en una secuencia numérica, la procesa con el modelo y calcula la confianza de la predicción. Si la confianza es baja (por debajo de 0.6), se devuelve la intención "no_reconocido", de lo contrario, se devuelve la intención predicha.

**get_response(intent)**: Esta función devuelve la respuesta correspondiente según la intención predicha.

```javascript
function get_response(intent) {
    with open("data/data.json", "r", encoding="utf-8") as file {
        data = json.load(file);
    }
    
    for (item in data["intents"]) {
        if (item["intent"] === intent) {
            return np.random.choice(item["responses"]);
        }
    }
    
    return "Lo siento, no te entendí.";
}
```
**Explicación**: Esta función busca en el archivo data.json la intención correspondiente y devuelve una de las respuestas asociadas a esa intención. Si no se encuentra la intención, devuelve un mensaje predeterminado.

### 5.3 data.json
Este archivo contiene las intenciones y las respuestas del chatbot. Cada intención tiene ejemplos de preguntas y respuestas que el chatbot utiliza para responder a las consultas.

Ejemplo de data.json:

```json
{
  "intents": [
    {
      "intent": "saludo",
      "examples": [
        "Hola", "Buenas tardes", "¿Qué tal?"
      ],
      "responses": [
        "¡Hola! ¿Cómo estás?", "¡Hola! ¿Todo bien?"
      ]
    },
    {
      "intent": "despedida",
      "examples": [
        "Adiós", "Hasta luego", "Nos vemos"
      ],
      "responses": [
        "¡Hasta luego!", "¡Nos vemos pronto!"
      ]
    }
  ]
}
```
**Explicación**: Cada intención en data.json tiene una lista de ejemplos (preguntas que el chatbot puede recibir) y respuestas (respuestas posibles que el chatbot puede dar).


## 6. Mantenimiento y Actualización
### 6.1 Añadir Nuevas Intenciones
Para añadir nuevas intenciones, debes seguir los siguientes pasos:

1. Edita el archivo data.json y agrega nuevas intenciones con sus ejemplos y respuestas.
2. El chatbot procesará automáticamente estas nuevas intenciones sin necesidad de reentrenar el modelo, ya que las respuestas se seleccionan dinámicamente.
### 6.2 Actualizar el Modelo
Aunque el modelo no se actualiza automáticamente con las nuevas intenciones, si se desea mejorar la precisión del modelo o cambiar su comportamiento:

1. Entrenar el modelo nuevamente con un conjunto de datos actualizado.
2. Reemplazar el modelo existente con el nuevo modelo entrenado.

## 7. Errores Comunes

* Problemas con `compromise`: Si no se puede cargar `compromise`, asegúrate de que esté correctamente instalado ejecutando:
    ```bash
    npm install compromise
    ```
