From f84714a726f378db95fd2cccb3c1464452a58692 Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Date: Sat, 28 Jun 2025 10:45:42 +0200 Subject: [PATCH] Add simple user interface --- llama.log | 2 +- pom.xml | 97 +++++++++++-------- .../pablotj/ia/chat/boot/ChatController.java | 32 ++++-- .../com/pablotj/ia/chat/boot/ChatMessage.java | 19 ++++ .../pablotj/ia/chat/boot/LlamaService.java | 17 +++- .../pablotj/ia/chat/boot/PromptBuilder.java | 12 ++- src/main/resources/templates/chat.html | 28 ++++++ 7 files changed, 147 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/pablotj/ia/chat/boot/ChatMessage.java create mode 100644 src/main/resources/templates/chat.html diff --git a/llama.log b/llama.log index 28f7e50..024a473 100644 --- a/llama.log +++ b/llama.log @@ -1 +1 @@ -[1751004438] warming up the model with an empty run +[1751008457] warming up the model with an empty run diff --git a/pom.xml b/pom.xml index c15205b..1ead6fe 100644 --- a/pom.xml +++ b/pom.xml @@ -1,46 +1,61 @@ - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.5.3 - - - com.pablotj - ia-chat-boot - 0.0.1-SNAPSHOT - ia-chat-boot - Project IA chat boot + + 4.0.0 - - 17 - + + org.springframework.boot + spring-boot-starter-parent + 3.5.3 + + - - - de.kherud - llama - 3.4.1 - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - + com.pablotj + ia-chat-boot + 0.0.1-SNAPSHOT + ia-chat-boot + Project IA chat boot - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + 17 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + de.kherud + llama + 3.4.1 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/src/main/java/com/pablotj/ia/chat/boot/ChatController.java b/src/main/java/com/pablotj/ia/chat/boot/ChatController.java index 2f35cf3..92faacb 100644 --- a/src/main/java/com/pablotj/ia/chat/boot/ChatController.java +++ b/src/main/java/com/pablotj/ia/chat/boot/ChatController.java @@ -1,21 +1,35 @@ package com.pablotj.ia.chat.boot; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; -@RestController -@RequestMapping("/chat") +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequestMapping("/") public class ChatController { + + private final List messages = new ArrayList<>(); private final LlamaService llamaService; public ChatController(LlamaService llamaService) { this.llamaService = llamaService; } - @GetMapping - public String chat(@RequestParam String prompt) { - return llamaService.chat(prompt); + @GetMapping("/chat") + public String showChat(Model model) { + model.addAttribute("messages", messages); + return "chat"; + } + + @PostMapping("/chat") + public String handleChat(@RequestParam("prompt") String prompt, Model model) { + messages.add(new ChatMessage("user", prompt)); + String reply = llamaService.chat(prompt); + messages.add(new ChatMessage("bot", reply)); + model.addAttribute("messages", messages); + return "chat"; } } diff --git a/src/main/java/com/pablotj/ia/chat/boot/ChatMessage.java b/src/main/java/com/pablotj/ia/chat/boot/ChatMessage.java new file mode 100644 index 0000000..8ad4397 --- /dev/null +++ b/src/main/java/com/pablotj/ia/chat/boot/ChatMessage.java @@ -0,0 +1,19 @@ +package com.pablotj.ia.chat.boot; + +public class ChatMessage { + private String role; // "user" o "bot" + private String text; + + public ChatMessage(String role, String text) { + this.role = role; + this.text = text; + } + + public String getRole() { + return role; + } + + public String getText() { + return text; + } +} diff --git a/src/main/java/com/pablotj/ia/chat/boot/LlamaService.java b/src/main/java/com/pablotj/ia/chat/boot/LlamaService.java index e62d538..be47042 100644 --- a/src/main/java/com/pablotj/ia/chat/boot/LlamaService.java +++ b/src/main/java/com/pablotj/ia/chat/boot/LlamaService.java @@ -15,7 +15,14 @@ public class LlamaService implements AutoCloseable { public void init() { try { ModelParameters params = new ModelParameters() - .setModelFilePath("models/openchat-3.5-0106.Q4_K_M.gguf"); + .setModelFilePath("models/ggml-model-q3_k.gguf") + .setSeed(42) + .setNThreads(8) // usa 8 hilos CPU (ajusta según tu CPU) + .setNGpuLayers(0) // no usar GPU + .setMainGpu(-1) // deshabilitar GPU principal + .setNoKvOffload(true) // no descargar KV, evitar errores GPU + .setUseMmap(true) // mejorar gestión memoria + .setNPredict(128); model = new LlamaModel(params); } catch (Exception e) { throw new RuntimeException("Error cargando el modelo", e); @@ -33,9 +40,11 @@ public class LlamaService implements AutoCloseable { String finalPrompt = chat.build(); InferenceParameters inf = new InferenceParameters(finalPrompt) - .setTemperature(0.7f) - .setTopP(0.9f) - .setTopK(40); + .setNPredict(200) + .setTemperature(0.7f) + .setTopP(0.9f) + .setTopK(40) + .setUseChatTemplate(true); StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/com/pablotj/ia/chat/boot/PromptBuilder.java b/src/main/java/com/pablotj/ia/chat/boot/PromptBuilder.java index 4f7f4c9..8985f2c 100644 --- a/src/main/java/com/pablotj/ia/chat/boot/PromptBuilder.java +++ b/src/main/java/com/pablotj/ia/chat/boot/PromptBuilder.java @@ -13,21 +13,23 @@ public class PromptBuilder { } public void user(String message) { - turns.add("GPT4 Correct User: " + message + "<|end_of_turn|>"); + turns.add("<|im_start|>user\n" + message + "\n<|im_end|>"); } public void assistant(String message) { - turns.add("GPT4 Correct Assistant: " + message + "<|end_of_turn|>"); + turns.add("<|im_start|>assistant\n" + message + "\n<|im_end|>"); } public String build() { StringBuilder sb = new StringBuilder(); - sb.append(systemPrompt).append("<|end_of_turn|>\n"); + sb.append("<|im_start|>system\n") + .append(systemPrompt) + .append("\n<|im_end|>\n"); for (String turn : turns) { sb.append(turn).append("\n"); } - // Deja el último turno preparado para que el modelo continúe como "Assistant" - sb.append("GPT4 Correct Assistant: "); + // Deja listo para que el modelo continúe como assistant generando respuesta: + sb.append("<|im_start|>assistant\n"); return sb.toString(); } } \ No newline at end of file diff --git a/src/main/resources/templates/chat.html b/src/main/resources/templates/chat.html new file mode 100644 index 0000000..c9d9df1 --- /dev/null +++ b/src/main/resources/templates/chat.html @@ -0,0 +1,28 @@ + + + + + Chat con IA Offline + + + +

Chat con IA Offline

+ +
+
🧑‍💻:
+
🤖:
+
+ +
+
+ +
+ +