diff --git a/.gitignore b/.gitignore index 8d64c32..fef15e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -HELP.md +README.md .mvn diff --git a/README.md b/README.md new file mode 100644 index 0000000..e92e8a7 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# 🤖 Proyecto IA - Asistente Personal "Asistente Pablo" + +--- + +## 🚀 Descripción + +Este proyecto implementa un **asistente personal basado en IA** totalmente offline, integrado en una aplicación Spring Boot. Utiliza un modelo de lenguaje local (`llama.cpp` / `llama-java`) para ofrecer respuestas naturales, útiles y personalizadas, con un diseño centrado en la arquitectura limpia y extensible. + +El asistente está pensado para entender tus gustos, estilo y necesidades, respondiendo siempre en español con un tono cercano y amigable. + +--- + +## 🧩 Características principales + +- 🧠 Modelo LLM local (`openchat-3.5-0106.Q4_K_M.gguf`) ejecutado en CPU o GPU (Metal en Macs M1/M2). +- 🏗️ Arquitectura limpia basada en capas: dominio, aplicación, infraestructura y presentación. +- 📜 Historial de conversación gestionado en sesión HTTP (con opción a persistencia futura). +- 📝 Construcción dinámica de prompts a partir de definiciones JSON estructuradas y multilingües. +- 🌐 API REST para interacción con el asistente. +- 💻 Frontend con Thymeleaf para una interfaz web simple y eficaz. +- 📊 Logging avanzado con Log4j2, con logs a consola y fichero. +- 🔄 Extensible para múltiples perfiles de prompt y configuración personalizada. + +--- + +## ⚙️ Requisitos técnicos + +- Java 21+ +- Maven 4+ +- Spring Boot 3+ +- Dependencias principales: + - `llama-java` para LLM local + - Jackson para JSON + - Log4j2 para logging +- Modelo `openchat-3.5-0106.Q4_K_M.gguf` en carpeta `models/` + +--- + +## 🛠️ Instalación y ejecución + +1. Clonar el repositorio: + + ```bash + git clone https://github.com/tuusuario/ia-asistente-personal.git + cd ia-asistente-personal + ``` + +2. Colocar el modelo en `models/`: + + ```bash + mkdir models + # Copia aquí openchat-3.5-0106.Q4_K_M.gguf + ``` + +3. Compilar con Maven: + + ```bash + mvn clean package + ``` + +4. Crear carpeta de logs: + + ```bash + mkdir logs + ``` + +5. Ejecutar la aplicación: + + ```bash + java -jar target/ia-asistente-personal.jar + ``` + +6. Abrir en el navegador: + + ``` + http://localhost:8080/ + ``` + +--- + +## 🎯 Uso + +- En la web puedes chatear con tu asistente personalizado. +- El historial de la conversación se mantiene en sesión. +- Las respuestas se generan localmente, sin conexión a internet. +- Puedes cambiar el perfil de prompt editando los JSON en `src/main/resources/prompts/`. + +--- + +## 🎥 Demostración + +![Demo de funcionamiento](demo.gif) + +*Reemplaza la URL anterior con el enlace a tu GIF de demostración.* + +--- + +## 🧪 Configuración avanzada + +- **GPU Metal** en macOS M1/M2: configura el backend llama.cpp con soporte Metal y coloca el shader `ggml-metal.metal` en la ruta correcta. +- **Logs:** configurados con Log4j2, salida a consola y a `logs/app.log`. +- **Múltiples perfiles:** cambia el prompt cargando otros JSONs como `developer_prompt.json`. + +--- + +## 📚 Recursos + +| Herramienta | Enlace | +| ---------------- | ------------------------------------------------ | +| llama.cpp | [https://github.com/ggerganov/llama.cpp](https://github.com/ggerganov/llama.cpp) | +| llama-java | [https://github.com/kherud/llama-java](https://github.com/kherud/llama-java) | +| Spring Boot | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) | + +--- + +## 🤝 Contribuciones + +¿Quieres mejorar el proyecto? ¡Bienvenido! +Por favor, abre un issue o pull request con tus mejoras. + +--- + +## ⚠️ Licencia + +MIT License © Pablo de la Torre Jamardo + +--- + +*¡Gracias por usar el Asistente Pablo!* + diff --git a/demo.gif b/demo.gif new file mode 100644 index 0000000..c86035a Binary files /dev/null and b/demo.gif differ diff --git a/llama.log b/llama.log index c22929b..d232899 100644 --- a/llama.log +++ b/llama.log @@ -1 +1 @@ -[1751134161] warming up the model with an empty run +[1751135918] warming up the model with an empty run diff --git a/src/main/java/com/pablotj/ia/chat/boot/infraestructure/llm/LlmModelLoader.java b/src/main/java/com/pablotj/ia/chat/boot/infraestructure/llm/LlmModelLoader.java index fde43b3..a56e55e 100644 --- a/src/main/java/com/pablotj/ia/chat/boot/infraestructure/llm/LlmModelLoader.java +++ b/src/main/java/com/pablotj/ia/chat/boot/infraestructure/llm/LlmModelLoader.java @@ -4,18 +4,22 @@ import com.pablotj.ia.chat.boot.domain.exception.BusinessLogicException; import de.kherud.llama.LlamaModel; import de.kherud.llama.ModelParameters; import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class LlmModelLoader implements AutoCloseable { + @Value(value = "${model.gguf.name}") + private String modelName; + private LlamaModel model; @PostConstruct public void init() { try { ModelParameters params = new ModelParameters() - .setModelFilePath("models/openchat-3.5-0106.Q4_K_M.gguf") + .setModelFilePath(String.format("models/%s.gguf", modelName)) .setSeed(42) .setNThreads(8) .setNGpuLayers(0) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2845910..99e9cca 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,5 @@ spring.application.name = ia-chat-boot server.port = 8080 + +! Model +model.gguf.name = openchat-3.5-0106.Q4_K_M \ No newline at end of file