File size: 5,566 Bytes
b70b72a 3afd61a b70b72a f4f9c98 b70b72a 3afd61a b70b72a 3afd61a f4f9c98 3afd61a b70b72a 3afd61a f4f9c98 3afd61a b70b72a 3afd61a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
from pathlib import Path
import gradio as gr
from src.rag import Rag
from src.model_huggingface import HuggingFaceModel
from src.amodel import AModel
AModel.load_env_variables()
STORE_DIR = "./db/rag_app" # Le répertoire de la base
# STORE_DIR = None # Store éphémère
MAX_DOCS = 6 # Le nombre max de documents dans la base
# global State https://www.gradio.app/guides/state-in-blocks
rag:Rag = Rag(
HuggingFaceModel("meta-llama/Meta-Llama-3-8B-Instruct", None, 0),
HuggingFaceModel(None, "sentence-transformers/all-MiniLM-l6-v2", 0),
STORE_DIR
)
rag.reset_store() # Reset de la base à chaque démarrage du serveur
print("rag created, store reseted")
# UI
with gr.Blocks(title="RAGnar",
# theme="Yntec/HaleyCH_Theme_Orange_Green",
fill_height=True,
analytics_enabled=False,
css="footer {visibility: hidden}",
) as demo:
def upload_file(file_path):
name:str = Path(file_path).name
names = rag.emb_store.get_collection_names()
count = len(names)
if name in names:
rag.delete_collection(name)
print("collection", name, "deleted because already exists")
names = rag.emb_store.get_collection_names()
if count >= MAX_DOCS:
print("collection", names[0], "deleted because too many collections")
rag.delete_collection(names[0])
rag.add_pdf_to_store(file_name=file_path, collection_name=name)
return gr.Dropdown(
choices=rag.emb_store.get_collection_names(),
value=rag.emb_store.collections[-1].name,
show_label=False,
container=False,
interactive=True
)
def ask_rag(question:str, col_name:str):
if col_name == "Aucun fichier":
return "Aucun pdf actif, veuillez en uploader un !"
if question.strip() == "":
return "Veuillez poser une question."
names = rag.emb_store.get_collection_names()
if not col_name in names:
return "'{name}' n'est plus sur le serveur, veuillez le recharger".format(name=col_name)
prompt, resp, sources, ids = rag.ask_rag(question, col_name)
return resp
def on_temperature_change(temp):
rag.set_temperature(temp)
def on_refresh():
print("on_refresh")
choices=rag.emb_store.get_collection_names() if len(rag.emb_store.collections) > 0 else ["Aucun fichier"]
value = rag.emb_store.collections[-1].name if len(rag.emb_store.collections) > 0 else "Aucun fichier"
return gr.Dropdown(
choices=choices,
value=value,
show_label=False,
container=False,
interactive=True
)
with gr.Row():
gr.Image("./files/drane.png", show_download_button=False,
show_fullscreen_button=False, show_label=False, show_share_button=False,
interactive=False, container=False)
# https://www.svgrepo.com/svg/483648/viking-face
gr.Image("./files/viking.png", show_download_button=False,
show_fullscreen_button=False, show_label=False, show_share_button=False,
interactive=False, container=False)
with gr.Tab("RAG naïf"):
with gr.Row():
# Le button qui permet d'updater le combo des collections
refresh = gr.Button("Refresh", scale=1)
# Le combo qui affiche toutes les collections du store
choices=rag.emb_store.get_collection_names() if len(rag.emb_store.collections) > 0 else ["Aucun fichier"]
value = rag.emb_store.collections[-1].name if len(rag.emb_store.collections) > 0 else "Aucun fichier"
cols = gr.Dropdown(
choices=choices,
value=value,
show_label=False,
container=False,
interactive=True,
scale=10
)
# Le button qui permet d'uploader un pdf
upload_button = gr.UploadButton(
"Clique pour ajouter un pdf",
file_types=[".pdf"],
file_count="single",
scale=10)
# La zone où on pose une question au RAG
ask_input = gr.Text(placeholder="Pose une question à ton pdf", show_label=False, container=False)
# La réponse du RAG (Markdown pour afficher les formules .tex)
rag_output = gr.Textbox("", show_copy_button=False,
show_label=False,
container=False,
max_lines=15)
with gr.Tab("Réglages"):
gr.Markdown("## Modèles:")
gr.Markdown("- " + rag.get_llm_name())
gr.Markdown("- " + rag.get_feature_name())
temperature_slider = gr.Slider(minimum=0,
maximum=1.0,
value=0.0,
step=0.1,
label="Température")
# Réponses aux évènements
refresh.click(fn=on_refresh, inputs=[], outputs=[cols])
upload_button.upload(fn=upload_file, inputs=upload_button, outputs=[cols], show_progress=True)
ask_input.submit(fn=ask_rag, inputs=[ask_input, cols], outputs=rag_output, show_progress=True)
temperature_slider.change(fn=on_temperature_change, inputs=temperature_slider)
demo.load(fn=on_refresh, inputs=[], outputs=[cols])
if __name__ == "__main__":
demo.queue().launch() |