Update rag_api.py
Browse files- rag_api.py +19 -23
rag_api.py
CHANGED
|
@@ -21,8 +21,8 @@ os.makedirs(TEMP_CACHE_DIR, exist_ok=True)
|
|
| 21 |
# --------------------------------------------------------
|
| 22 |
# 1. CONFIGURACIÓN
|
| 23 |
# --------------------------------------------------------
|
| 24 |
-
URL_FAISS = "https://drive.google.com/
|
| 25 |
-
URL_PKL = "https://drive.google.com/
|
| 26 |
DOWNLOAD_DIR = "/tmp/db_faiss"
|
| 27 |
DB_FAISS_PATH = DOWNLOAD_DIR
|
| 28 |
|
|
@@ -30,17 +30,15 @@ DB_FAISS_PATH = DOWNLOAD_DIR
|
|
| 30 |
# 2. CLASIFICADOR DE INTENCIÓN ← NUEVO
|
| 31 |
# --------------------------------------------------------
|
| 32 |
INTENT_PROMPT = PromptTemplate(
|
| 33 |
-
template="""Eres un clasificador de intenciones para un asistente de
|
| 34 |
Analiza el mensaje del usuario y clasifícalo en UNA de estas categorías:
|
| 35 |
- SALUDO: saludos, despedidas, conversación casual ("hola", "gracias", "adiós", "¿cómo estás?")
|
| 36 |
-
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
IMPORTANTE: Ante la duda, clasifica como NUTRICION. Solo usa OTRO cuando estés
|
| 43 |
-
completamente seguro de que no tiene relación con nutrición ni con NutriActive.
|
| 44 |
Responde SOLO con la categoría, sin explicación.
|
| 45 |
Mensaje: {query}
|
| 46 |
Categoría:""",
|
|
@@ -48,19 +46,17 @@ Categoría:""",
|
|
| 48 |
)
|
| 49 |
|
| 50 |
SALUDO_PROMPT = PromptTemplate(
|
| 51 |
-
template="""Eres
|
| 52 |
-
|
| 53 |
-
Si el usuario se despide o agradece, invítalo a preguntar sobre nutrición.
|
| 54 |
Mensaje: {query}
|
| 55 |
Respuesta:""",
|
| 56 |
input_variables=["query"]
|
| 57 |
)
|
| 58 |
|
| 59 |
RAG_PROMPT = PromptTemplate(
|
| 60 |
-
template="""Eres
|
| 61 |
-
Tu tarea es responder basándote en el contexto proporcionado.
|
| 62 |
-
|
| 63 |
-
Sé amigable, claro y conciso.
|
| 64 |
Contexto de la base de datos: {context}
|
| 65 |
Pregunta del usuario: {question}
|
| 66 |
Respuesta:""",
|
|
@@ -131,7 +127,7 @@ def load_and_configure_rag():
|
|
| 131 |
# --------------------------------------------------------
|
| 132 |
# 4. FASTAPI
|
| 133 |
# --------------------------------------------------------
|
| 134 |
-
app = FastAPI(title="
|
| 135 |
|
| 136 |
intent_chain = saludo_chain = qa_chain = retriever = None
|
| 137 |
|
|
@@ -144,7 +140,7 @@ except RuntimeError:
|
|
| 144 |
def home():
|
| 145 |
if qa_chain is None:
|
| 146 |
return {"error": "RAG no inicializado. Revisa los logs."}
|
| 147 |
-
return {"message": "API
|
| 148 |
|
| 149 |
@app.post("/query")
|
| 150 |
async def process_query(request: QueryRequest):
|
|
@@ -170,20 +166,20 @@ async def process_query(request: QueryRequest):
|
|
| 170 |
elif "OTRO" in intent:
|
| 171 |
return {
|
| 172 |
"query": request.query,
|
| 173 |
-
"response": "Soy
|
| 174 |
"intent": "OTRO",
|
| 175 |
"sources": []
|
| 176 |
}
|
| 177 |
|
| 178 |
else:
|
| 179 |
-
#
|
| 180 |
respuesta = qa_chain.invoke(request.query)
|
| 181 |
docs = retriever.invoke(request.query)
|
| 182 |
sources = [doc.metadata.get("source", "N/A") for doc in docs]
|
| 183 |
return {
|
| 184 |
"query": request.query,
|
| 185 |
"response": respuesta.content,
|
| 186 |
-
"intent": "
|
| 187 |
"sources": sources
|
| 188 |
}
|
| 189 |
|
|
|
|
| 21 |
# --------------------------------------------------------
|
| 22 |
# 1. CONFIGURACIÓN
|
| 23 |
# --------------------------------------------------------
|
| 24 |
+
URL_FAISS = "https://drive.google.com/file/d/1hiVycS4DQHO1MBdC-L_z1TXA6sJO_Y-r/view?usp=drive_link"
|
| 25 |
+
URL_PKL = "https://drive.google.com/file/d/1vbG8unx88Kb5jn7puGv1gqSM4S6rIUQC/view?usp=drive_link"
|
| 26 |
DOWNLOAD_DIR = "/tmp/db_faiss"
|
| 27 |
DB_FAISS_PATH = DOWNLOAD_DIR
|
| 28 |
|
|
|
|
| 30 |
# 2. CLASIFICADOR DE INTENCIÓN ← NUEVO
|
| 31 |
# --------------------------------------------------------
|
| 32 |
INTENT_PROMPT = PromptTemplate(
|
| 33 |
+
template="""Eres un clasificador de intenciones para un asistente del portal de la Universidad Poltécnica de Aragua.
|
| 34 |
Analiza el mensaje del usuario y clasifícalo en UNA de estas categorías:
|
| 35 |
- SALUDO: saludos, despedidas, conversación casual ("hola", "gracias", "adiós", "¿cómo estás?")
|
| 36 |
+
- UNIVERSIDAD: preguntas sobre carreras o programas, investigación, cursos, admisiones, notas, proyectos, postgrado,
|
| 37 |
+
PNF, PNFA, diplomados, servivios, Y TAMBIÉN cualquier pregunta relacionada con La Universidad relacionado con: sus autoridades, reglamentos,
|
| 38 |
+
servivios estudiantiles, precios de cursos, programas, etc.
|
| 39 |
+
- OTRO: preguntas claramente NO relacionadas con la Universidad tales como: matemáticas, historia, tecnología general, etc.
|
| 40 |
+
IMPORTANTE: Ante la duda, clasifica como Universidad Politécnica de Aragua o UPT ARagua. Solo usa OTRO cuando estés
|
| 41 |
+
completamente seguro de que no tiene relación con la Universidad.
|
|
|
|
|
|
|
| 42 |
Responde SOLO con la categoría, sin explicación.
|
| 43 |
Mensaje: {query}
|
| 44 |
Categoría:""",
|
|
|
|
| 46 |
)
|
| 47 |
|
| 48 |
SALUDO_PROMPT = PromptTemplate(
|
| 49 |
+
template="""Eres UPTA bot, un Asistente Virtual de la UPT Aragua. Estas aquí para ayudar con información sobre admisiones, programas académicos,
|
| 50 |
+
servicios, becas y mucho más. Si el usuario se despide o agradece, invítalo a preguntar sobre la universidad.
|
|
|
|
| 51 |
Mensaje: {query}
|
| 52 |
Respuesta:""",
|
| 53 |
input_variables=["query"]
|
| 54 |
)
|
| 55 |
|
| 56 |
RAG_PROMPT = PromptTemplate(
|
| 57 |
+
template="""Eres UPTA bot, un Asistente Virtual experto de la UPT Aragua. Estas aquí para ayudar con información sobre
|
| 58 |
+
admisiones, programas académicos, servicios, becas y mucho más. Tu tarea es responder basándote en el contexto proporcionado. Si el contexto
|
| 59 |
+
no tiene suficiente información, usa tu conocimiento general sobre el sistema universitario para dar una respuesta útil. Sé amigable, claro y conciso.
|
|
|
|
| 60 |
Contexto de la base de datos: {context}
|
| 61 |
Pregunta del usuario: {question}
|
| 62 |
Respuesta:""",
|
|
|
|
| 127 |
# --------------------------------------------------------
|
| 128 |
# 4. FASTAPI
|
| 129 |
# --------------------------------------------------------
|
| 130 |
+
app = FastAPI(title="UPT Aragua bot RAG API")
|
| 131 |
|
| 132 |
intent_chain = saludo_chain = qa_chain = retriever = None
|
| 133 |
|
|
|
|
| 140 |
def home():
|
| 141 |
if qa_chain is None:
|
| 142 |
return {"error": "RAG no inicializado. Revisa los logs."}
|
| 143 |
+
return {"message": "API UPT Aragua bot operativa. Usa /query."}
|
| 144 |
|
| 145 |
@app.post("/query")
|
| 146 |
async def process_query(request: QueryRequest):
|
|
|
|
| 166 |
elif "OTRO" in intent:
|
| 167 |
return {
|
| 168 |
"query": request.query,
|
| 169 |
+
"response": "Soy UPTA bot, estoy especializado en la UPT Aragua. ¿Tienes alguna pregunta sobre programas, carreras, inscripciones, fechas...? 🥗",
|
| 170 |
"intent": "OTRO",
|
| 171 |
"sources": []
|
| 172 |
}
|
| 173 |
|
| 174 |
else:
|
| 175 |
+
# UNIVERSIDAD o cualquier categoría no reconocida → RAG
|
| 176 |
respuesta = qa_chain.invoke(request.query)
|
| 177 |
docs = retriever.invoke(request.query)
|
| 178 |
sources = [doc.metadata.get("source", "N/A") for doc in docs]
|
| 179 |
return {
|
| 180 |
"query": request.query,
|
| 181 |
"response": respuesta.content,
|
| 182 |
+
"intent": "UNIVERSIDAD",
|
| 183 |
"sources": sources
|
| 184 |
}
|
| 185 |
|