milton124 commited on
Commit
dd4ac0c
·
verified ·
1 Parent(s): 6922200

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -52
app.py CHANGED
@@ -1,67 +1,78 @@
1
- import os
2
- from fastapi import FastAPI
3
- from pydantic import BaseModel
4
- from llama_cpp import Llama
5
  from huggingface_hub import hf_hub_download
 
 
6
 
7
  app = FastAPI()
8
 
9
- MODEL_REPO = "bartowski/Phi-3-mini-4B-instruct-GGUF"
10
- MODEL_FILE = "Phi-3-mini-4B-instruct.Q4_K_M.gguf"
11
-
12
- MODEL_PATH = f"/dev/shm/{MODEL_FILE}"
13
-
14
- # ---------------------------------------------------------
15
- # 1. Descargar modelo directamente a RAM (/dev/shm)
16
- # ---------------------------------------------------------
17
- if not os.path.exists(MODEL_PATH):
18
- print("Descargando modelo a RAM...")
19
- hf_hub_download(
20
- repo_id=MODEL_REPO,
21
- filename=MODEL_FILE,
22
- local_dir="/dev/shm",
23
- local_dir_use_symlinks=False
24
- )
25
-
26
- # ---------------------------------------------------------
27
- # 2. Cargar modelo con llama.cpp
28
- # ---------------------------------------------------------
29
- print("Cargando modelo Phi-3 Mini en RAM…")
30
- llm = Llama(
31
- model_path=MODEL_PATH,
32
- n_ctx=4096,
33
- n_threads=6,
34
- verbose=False,
35
  )
36
 
37
- print("Modelo cargado correctamente.")
 
 
 
 
 
 
38
 
 
 
 
 
 
 
 
39
 
40
- # ---------------------------------------------------------
41
- # 3. Entrada del usuario
42
- # ---------------------------------------------------------
43
- class ChatRequest(BaseModel):
44
- prompt: str
 
45
 
46
 
47
- # ---------------------------------------------------------
48
- # 4. Endpoint principal tipo ChatGPT
49
- # ---------------------------------------------------------
50
- @app.post("/chat")
51
- def chat(req: ChatRequest):
52
- prompt = f"""Eres un asistente para una app de himnos y Biblia.
53
- Responde de forma clara, breve y espiritual.
54
 
55
- Usuario: {req.prompt}
56
- Asistente:"""
 
57
 
 
58
  output = llm(
59
- prompt,
60
- max_tokens=256,
61
- temperature=0.6,
62
- top_p=0.95,
63
- stop=["Usuario:", "Asistente:"]
64
  )
65
 
66
- text = output["choices"][0]["text"].strip()
67
- return {"respuesta": text}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ifrom fastapi import FastAPI
2
+ from fastapi.middleware.cors import CORSMiddleware
 
 
3
  from huggingface_hub import hf_hub_download
4
+ from llama_cpp import Llama
5
+ import json
6
 
7
  app = FastAPI()
8
 
9
+ app.add_middleware(
10
+ CORSMiddleware,
11
+ allow_origins=["*"],
12
+ allow_methods=["*"],
13
+ allow_headers=["*"],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  )
15
 
16
+ # --------- Cargar modelo GGUF en RAM ---------
17
+
18
+ print("Descargando modelo a RAM...")
19
+ model_path = hf_hub_download(
20
+ repo_id="second-state/Gemma-2B-Instruct-GGUF",
21
+ filename="Gemma-2B-Instruct-Q4_K_M.gguf"
22
+ )
23
 
24
+ print("Cargando modelo...")
25
+ llm = Llama(
26
+ model_path=model_path,
27
+ n_ctx=2000,
28
+ n_threads=4,
29
+ use_mlock=True
30
+ )
31
 
32
+ # --------- Cargar himnos.jsonl ---------
33
+ print("Cargando himnos.jsonl...")
34
+ HIMNOS = []
35
+ with open("himnos.jsonl", "r", encoding="utf-8") as f:
36
+ for line in f:
37
+ HIMNOS.append(json.loads(line))
38
 
39
 
40
+ # ============ ENDPOINT PRINCIPAL =============
 
 
 
 
 
 
41
 
42
+ @app.post("/predict")
43
+ def generar_respuesta(request: dict):
44
+ prompt_usuario = request.get("prompt", "")
45
 
46
+ # Pasar al modelo
47
  output = llm(
48
+ f"Responde de forma breve y clara al usuario: {prompt_usuario}",
49
+ max_tokens=200
 
 
 
50
  )
51
 
52
+ texto = output["choices"][0]["text"]
53
+
54
+ # Calcular relevancia simple (sin embeddings)
55
+ resultados = []
56
+ for h in HIMNOS:
57
+ titulo = h["titulo"].lower()
58
+ texto_prompt = prompt_usuario.lower()
59
+
60
+ # coincidencia básica
61
+ puntos = 0
62
+ for palabra in texto_prompt.split():
63
+ if palabra in titulo:
64
+ puntos += 1
65
+
66
+ resultados.append({
67
+ "id": h["id"],
68
+ "titulo": h["titulo"],
69
+ "relacion": puntos
70
+ })
71
+
72
+ # ordenar por relación
73
+ resultados = sorted(resultados, key=lambda x: -x["relacion"])[:7]
74
+
75
+ return {
76
+ "respuesta": texto,
77
+ "recomendados": resultados
78
+ }