Spaces:
Sleeping
Sleeping
Commit ·
0a227d1
0
Parent(s):
HF - PARTE 0
Browse files- app.py +29 -0
- documents.json +7 -0
- rag_engine.py +53 -0
- requirements.txt +14 -0
- test/test-api-space.py +13 -0
- test/test_api.py +0 -0
app.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ENUNCIADO
|
| 2 |
+
# app.py
|
| 3 |
+
#
|
| 4 |
+
# Este archivo construirá la interfaz web con Gradio.
|
| 5 |
+
# Función principal ask:
|
| 6 |
+
# Se debe definir una función ask(query, top_k, umbral) que:
|
| 7 |
+
# • Reciba:
|
| 8 |
+
# o query (str): la pregunta del usuario.
|
| 9 |
+
# o top_k (int): número de documentos a recuperar.
|
| 10 |
+
# o umbral (float): umbral de similitud.
|
| 11 |
+
# • Utilice las funciones del módulo rag_engine para obtener los documentos
|
| 12 |
+
# relevantes y la respuesta generada.
|
| 13 |
+
# • Formatee los documentos recuperados para mostrarlos de forma legible (por
|
| 14 |
+
# ejemplo, uniendo los textos con separadores como \n\n---\n\n).
|
| 15 |
+
# • Retorne (respuesta, docs_formateados).
|
| 16 |
+
#
|
| 17 |
+
# Interfaz Gradio
|
| 18 |
+
# • Utilizar gr.Blocks con un título y descripción.
|
| 19 |
+
# • Tiene:
|
| 20 |
+
# o Un gr.Textbox para la pregunta (con placeholder).
|
| 21 |
+
# o Un gr.Slider para top_k (valores de 1 a 5, valor por defecto 5, paso 1).
|
| 22 |
+
# o Un gr.Slider para umbral (valores de 0.0 a 1.0, valor por defecto 0.55,
|
| 23 |
+
# paso 0.05).
|
| 24 |
+
# o Un gr.Textbox para mostrar la respuesta (de 3 líneas).
|
| 25 |
+
# o Un gr.Textbox para mostrar los documentos recuperados (de 6 líneas,
|
| 26 |
+
# máximo 15).
|
| 27 |
+
# o Un botón Enviar que al hacer clic ejecute la función ask con los valores
|
| 28 |
+
# de entrada y actualice las salidas.
|
| 29 |
+
# • Por último, lanzar la interfaz con .launch().
|
documents.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"doc1": "Hospital contact details: You can contact the hospital at email testing@gmail.com, phone +911234567890, or visit us at xyz, abc, 1234, Nepal.",
|
| 3 |
+
"doc2": "Hospital's working hours: The hospital's working hours are 7:00 AM - 8:00 PM daily.",
|
| 4 |
+
"doc3": "Official email address: The official email address to contact the hospital is testing@gmail.com.",
|
| 5 |
+
"doc4": "Main services: We provide comprehensive healthcare services including emergency care, diagnostic testing, surgical procedures, maternity services, and specialized treatments.",
|
| 6 |
+
"doc5": "Hospital location: The hospital is located at xyz, abc, 1234, Nepal."
|
| 7 |
+
}
|
rag_engine.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ENUNCIADO
|
| 2 |
+
# rag_engine.py
|
| 3 |
+
#
|
| 4 |
+
# Este archivo contendrá toda la lógica del motor RAG. Se deben
|
| 5 |
+
# implementar obligatoriamente las siguientes funciones (con los nombres y parámetros
|
| 6 |
+
# exactos que se indican).
|
| 7 |
+
# Al inicio del script se deben cargar:
|
| 8 |
+
# • El modelo de embeddings: SentenceTransformer("MongoDB/mdbr-leaf-ir")
|
| 9 |
+
# • El modelo de lenguaje: PleIAs/Pleias-RAG350M (usando AutoTokenizer y AutoModelForCausalLM de transformers).
|
| 10 |
+
# • Los documentos desde documents.json.
|
| 11 |
+
# Función recuperar_documentos(consulta, top_k=2, umbral=0.4)
|
| 12 |
+
# Dada una consulta en inglés, recupera los documentos más relevantes de la base de conocimiento.
|
| 13 |
+
# • Parámetros:
|
| 14 |
+
# o consulta (str): pregunta del usuario.
|
| 15 |
+
# o top_k (int): número máximo de documentos a retornar.
|
| 16 |
+
# o umbral (float): valor mínimo de similitud (coseno) para considerar un
|
| 17 |
+
# documento relevante. Los documentos con similitud inferior a este
|
| 18 |
+
# umbral se descartan.
|
| 19 |
+
# • Proceso:
|
| 20 |
+
# 1. Calcular el embedding de la consulta y de todos los documentos
|
| 21 |
+
# (preferiblemente una sola vez al cargar el script y almacenarlos para
|
| 22 |
+
# evitar recalcular).
|
| 23 |
+
# 2. Calcular la similitud del coseno entre el embedding de la consulta y los
|
| 24 |
+
# embeddings de los documentos.
|
| 25 |
+
# 3. Ordenar los documentos de mayor a menor similitud.
|
| 26 |
+
# 4. Recorrer en ese orden y seleccionar aquellos cuya similitud sea mayor o
|
| 27 |
+
# igual al umbral, hasta un máximo de top_k documentos.
|
| 28 |
+
# • Retorno: Lista con los textos de los documentos seleccionados.
|
| 29 |
+
# Función generar_respuesta(consulta, documentos_recuperados)
|
| 30 |
+
# Genera una respuesta usando el modelo de lenguaje, inyectando los documentos
|
| 31 |
+
# recuperados como contexto.
|
| 32 |
+
# Parámetros:
|
| 33 |
+
# o consulta (str): pregunta original del usuario.
|
| 34 |
+
# o documentos_recuperados (list): lista de textos con los documentos
|
| 35 |
+
# relevantes.
|
| 36 |
+
# Proceso:
|
| 37 |
+
# 1. Se concatenan todos los documentos en un solo string (por ejemplo,
|
| 38 |
+
# separados por espacios).
|
| 39 |
+
# 2. Se construye un prompt con el siguiente formato:
|
| 40 |
+
# “””
|
| 41 |
+
# Answer the question based only on the context provided
|
| 42 |
+
# Context: <" ".join(documentos_recuperados)>
|
| 43 |
+
# Question: <consulta>
|
| 44 |
+
# Answer:
|
| 45 |
+
# “””
|
| 46 |
+
# 3. Se genera la respuesta con el modelo
|
| 47 |
+
# Retorno: Cadena con la respuesta generada.
|
| 48 |
+
# Función preguntar(consulta, top_k=2, umbral=0.4)
|
| 49 |
+
# • Descripción:
|
| 50 |
+
# o Función de alto nivel que une la lógica de recuperar_documentos y
|
| 51 |
+
# generar_respuestas
|
| 52 |
+
# • Parámetros: los mismos que recuperar_documentos.
|
| 53 |
+
# • Retorno: La respuesta generada (cadena).
|
requirements.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ENUNCIADO
|
| 2 |
+
# documents.json y requirements.txt (ya vienen dados)
|
| 3 |
+
#
|
| 4 |
+
# documents.json contendrá un conjunto de documentos en inglés que servirán como base
|
| 5 |
+
# de conocimiento para el chatbot.
|
| 6 |
+
|
| 7 |
+
torch
|
| 8 |
+
transformers
|
| 9 |
+
sentence-transformers
|
| 10 |
+
scikit-learn
|
| 11 |
+
fastapi
|
| 12 |
+
uvicorn
|
| 13 |
+
gradio
|
| 14 |
+
pydantic
|
test/test-api-space.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Una vez hemos hecho el deploy en Hugging Face, podemos probar la API de Gradio
|
| 2 |
+
# usando el cliente de Gradio (https://github.com/gradio-app/gradio-client)
|
| 3 |
+
|
| 4 |
+
from gradio_client import Client
|
| 5 |
+
|
| 6 |
+
client = Client("manuell01/practica-chat")
|
| 7 |
+
result = client.predict(
|
| 8 |
+
query="Where is the hospital located!!",
|
| 9 |
+
top_k=5,
|
| 10 |
+
umbral=0.55,
|
| 11 |
+
api_name="/ask"
|
| 12 |
+
)
|
| 13 |
+
print(result[0])
|
test/test_api.py
ADDED
|
File without changes
|