Adrian Palma commited on
Commit
b7345ba
·
0 Parent(s):

initial commit

Browse files
Files changed (7) hide show
  1. .gitignore +3 -0
  2. README.md +0 -0
  3. app.py +37 -0
  4. documents.json +7 -0
  5. rag_engine.py +81 -0
  6. requirements.txt +8 -0
  7. tests/test_api.py +0 -0
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ .venv
2
+ __pycache__
3
+ *.pyc
README.md ADDED
File without changes
app.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import rag_engine
3
+
4
+ def ask(query, top_k, umbral):
5
+
6
+ docs = rag_engine.recuperar_documentos(query, top_k=top_k, umbral=umbral)
7
+ respuesta = rag_engine.generar_respuesta(query, docs)
8
+
9
+ docs_formateados = "\n\n---\n\n".join(docs)
10
+
11
+ return respuesta, docs_formateados
12
+
13
+
14
+ with gr.Blocks() as demo:
15
+
16
+ gr.Markdown("# Sistema de preguntas con RAG")
17
+ gr.Markdown("Haz una pregunta sobre la base de conocimiento.")
18
+
19
+ query = gr.Textbox(label="Tu pregunta (en inglés)", placeholder="Where is the hospital?")
20
+
21
+ top_k = gr.Slider(1, 5, value=2, step=1, label="Top-k documentos")
22
+
23
+ umbral = gr.Slider(0.0, 1.0, value=0.55, step=0.05, label="Umbral de similitud")
24
+
25
+ respuesta = gr.Textbox(label="Respuesta", lines=3)
26
+
27
+ docs = gr.Textbox(label="Documentos recuperados", lines=6)
28
+
29
+ boton = gr.Button("Enviar")
30
+
31
+ boton.click(
32
+ ask,
33
+ inputs=[query, top_k, umbral],
34
+ outputs=[respuesta, docs]
35
+ )
36
+
37
+ demo.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,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import torch
3
+ from sentence_transformers import SentenceTransformer
4
+ from sklearn.metrics.pairwise import cosine_similarity
5
+ from transformers import AutoTokenizer, AutoModelForCausalLM
6
+
7
+ with open("documents.json", "r", encoding="utf-8") as f:
8
+ documents = json.load(f)
9
+
10
+ docs_list = list(documents.values())
11
+
12
+ embedding_model = SentenceTransformer("MongoDB/mdbr-leaf-ir")
13
+ doc_embeddings = embedding_model.encode(docs_list)
14
+
15
+ tokenizer = AutoTokenizer.from_pretrained("PleIAs/Pleias-RAG-350M")
16
+ language_model = AutoModelForCausalLM.from_pretrained("PleIAs/Pleias-RAG-350M")
17
+
18
+
19
+ def recuperar_documentos(consulta, top_k=2, umbral=0.4):
20
+ consulta_embedding = embedding_model.encode([consulta])
21
+ similitudes = cosine_similarity(consulta_embedding, doc_embeddings)[0]
22
+
23
+ resultados = []
24
+
25
+ for i, score in enumerate(similitudes):
26
+ if score >= umbral:
27
+ resultados.append((score, docs_list[i]))
28
+
29
+ resultados.sort(key=lambda x: x[0], reverse=True)
30
+
31
+ documentos_recuperados = [doc for _, doc in resultados[:top_k]]
32
+
33
+ return documentos_recuperados
34
+
35
+
36
+ def generar_respuesta(consulta, documentos_recuperados):
37
+ contexto = " ".join(documentos_recuperados)
38
+
39
+ prompt = f"""Answer the question based only on the context provided
40
+ Context: {contexto}
41
+ Question: {consulta}
42
+ Answer:"""
43
+
44
+ inputs = tokenizer(prompt, return_tensors="pt", truncation=True)
45
+
46
+ with torch.no_grad():
47
+ output = language_model.generate(
48
+ **inputs,
49
+ max_new_tokens=60,
50
+ do_sample=False,
51
+ repetition_penalty=1.2,
52
+ pad_token_id=tokenizer.eos_token_id,
53
+ )
54
+
55
+ respuesta_completa = tokenizer.decode(output[0], skip_special_tokens=True)
56
+
57
+ if "Answer:" in respuesta_completa:
58
+ respuesta = respuesta_completa.split("Answer:")[-1].strip()
59
+ else:
60
+ respuesta = respuesta_completa.strip()
61
+
62
+ return respuesta
63
+
64
+
65
+ def preguntar(consulta, top_k=2, umbral=0.4):
66
+ documentos_recuperados = recuperar_documentos(consulta, top_k=top_k, umbral=umbral)
67
+ respuesta = generar_respuesta(consulta, documentos_recuperados)
68
+ return respuesta
69
+
70
+
71
+ if __name__ == "__main__":
72
+ pregunta = "Where is the hospital?"
73
+ docs = recuperar_documentos(pregunta)
74
+ respuesta = generar_respuesta(pregunta, docs)
75
+
76
+ print("Documentos encontrados:")
77
+ for i, doc in enumerate(docs, start=1):
78
+ print(f"{i}. {doc}")
79
+
80
+ print("\nRespuesta generada:")
81
+ print(respuesta)
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ torch
2
+ transformers
3
+ sentence-transformers
4
+ scikit-learn
5
+ fastapi
6
+ uvicorn
7
+ gradio
8
+ pydantic
tests/test_api.py ADDED
File without changes