Spaces:
Sleeping
Sleeping
File size: 6,046 Bytes
8a4de8f a18d40f 8a4de8f a9a7a15 ae390c9 d14ea6b ae390c9 a9a7a15 ae390c9 a9a7a15 ae390c9 8a4de8f 6d520fd 8a4de8f a18d40f 9eb51ec 7fa0e76 8a4de8f 0e4a05e 7fa0e76 739d38d a18d40f 739d38d 7fa0e76 8a4de8f 13273ea 8a4de8f 7ebea95 80797a0 8a4de8f 3e49491 86794d4 3e49491 7fa0e76 13273ea ae390c9 a9a7a15 13273ea ae390c9 a9a7a15 13273ea 8a4de8f 13273ea 7fa0e76 739d38d 8a4de8f 739d38d 8a4de8f 99ed14f 7fa0e76 2949d74 8a4de8f 739d38d 8a4de8f 13273ea a9a7a15 13273ea 8a4de8f |
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 |
import gradio as gr
from ctransformers import AutoModelForCausalLM
from transformers import AutoTokenizer, pipeline
import torch
import re
import random
### FEEDBACKS UPDATE IN PERSISTENT MEMORY
from pathlib import Path
from huggingface_hub import CommitScheduler
import json
JSON_DATASET_DIR = Path("json_dataset")
JSON_DATASET_DIR.mkdir(parents=True, exist_ok=True)
JSON_DATASET_PATH = JSON_DATASET_DIR / f"feedbacks.json"
scheduler = CommitScheduler(
repo_id="bmi-labmedinfo/feedbacks",
repo_type="dataset",
folder_path=JSON_DATASET_DIR,
path_in_repo="data",
)
def save_json(last_state: dict, pos_or_neg: str) -> None:
last_state["feedback"]=pos_or_neg
with scheduler.lock:
with JSON_DATASET_PATH.open("a") as f:
json.dump(last_state, f)
f.write("\n")
### /FEEDBACKS
# Initialize the model
model = AutoModelForCausalLM.from_pretrained("bmi-labmedinfo/Igea-1B-instruct-GGUF", model_file="unsloth.Q4_K_M.gguf", model_type="mistral", hf=True)
tokenizer = AutoTokenizer.from_pretrained( "bmi-labmedinfo/Igea-1B-instruct")
gen_pipeline = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer
)
system_med_msgs = ["Sei un assistente medico virtuale. Offri supporto per la gestione delle richieste mediche e fornisci informazioni mediche.",
"Sei un assistente medico virtuale. Offri supporto per questioni mediche.",
"Sei un assistente virtuale sanitario. Offri supporto e informazioni su problemi di salute.",
"Sei un assistente virtuale per la salute. Fornisci supporto per richieste riguardanti la salute.",
"Sei un assistente digitale per la salute. Fornisci supporto su questioni mediche e sanitarie.",
"Sei un assistente virtuale per informazioni sanitarie. Fornisci supporto su problemi di salute e benessere.",
"Sei un assistente digitale per la gestione delle questioni sanitarie. Rispondi a richieste mediche e fornisci informazioni sanitarie.",
"Sei un assistente sanitario digitale. Rispondi a richieste di natura medica e fornisci informazioni sanitarie.",
"Sei un assistente sanitario virtuale. Aiuti a rispondere a richieste mediche e fornisci informazioni sanitarie."]
alpaca_instruct_prompt = """{}
### Istruzione:
{}
### Risposta:
{}"""
# Define the function to generate text
def generate_text(input_text, max_new_tokens=512, temperature=1, system_prompt=""):
if len(system_prompt)>0:
system_str = system_prompt
else:
system_str = random.choice(system_med_msgs)
prompt = alpaca_instruct_prompt.format(system_str, input_text,"")
output = gen_pipeline(
prompt,
max_new_tokens=max_new_tokens,
temperature=temperature,
return_full_text = False,
forced_eos_token_id=tokenizer.encode("[...]")[1],
pad_token_id=tokenizer.eos_token_id
)
generated_text = output[0]['generated_text']
generated_text_color = 'blue'
split_tentative = generated_text.split("### Risposta:")
if len(split_tentative) > 1:
generated_text = split_tentative[1]
elif '### Istruzione:' in split_tentative[0]:
generated_text = "Spiacente, non sono in grado di rispondere."
generated_text_color = 'red'
return f"<span>{input_text}</span><b style='color: {generated_text_color};'>{generated_text}</b>", {"input_prompt":prompt, "generated_text_raw":output[0]['generated_text'], "generated_text_displayed":generated_text}
def positive_feedback(last_generated_text):
save_json(last_generated_text,"positive")
gr.Info("Feedback collected. Thanks!")
def negative_feedback(last_generated_text):
save_json(last_generated_text,"negative")
gr.Info("Feedback collected. Thanks!")
# Create the Gradio interface
input_text = gr.Textbox(lines=2, placeholder="Enter your request here...", label="Input Text")
system_prompt = gr.Textbox(lines=2, placeholder="Enter custom system prompt...", label="Custom System Prompt")
max_new_tokens = gr.Slider(minimum=1, maximum=200, value=100, step=1, label="Max New Tokens")
temperature = gr.Slider(minimum=0.1, maximum=2.0, value=1.0, step=0.1, label="Temperature")
with gr.Blocks(css="#outbox { border-radius: 8px !important; border: 1px solid #e5e7eb !important; padding: 8px !important; text-align:center !important;}") as iface:
last_generated_text = gr.State({"input_prompt":"", "generated_text_raw":"", "generated_text_displayed":""})
gr.Markdown("# Igea Instruct Interface ⚕️🩺")
gr.Markdown("🐢💬 To guarantee a reasonable througput (<1 min to answer with default settings), this space employs a **GGUF quantized version of [Igea 1B](https://huggingface.co/bmi-labmedinfo/Igea-1B-v0.0.1)**, optimized for **hardware-limited, CPU-only machines** like the free-tier HuggingFace space. Quantized models may result in significant performance degradation and therefore are not representative of the original model capabilities.")
gr.Markdown("⚠️ Read the **[bias, risks and limitations](https://huggingface.co/bmi-labmedinfo/Igea-1B-v0.0.1#%F0%9F%9A%A8%E2%9A%A0%EF%B8%8F%F0%9F%9A%A8-bias-risks-and-limitations-%F0%9F%9A%A8%E2%9A%A0%EF%B8%8F%F0%9F%9A%A8)** of Igea before use!")
input_text.render()
with gr.Accordion("Advanced Options", open=False):
max_new_tokens.render()
temperature.render()
system_prompt.render()
output = gr.HTML(label="Generated Text",elem_id="outbox")
btn = gr.Button("Generate")
btn.click(generate_text, [input_text, max_new_tokens, temperature, system_prompt], outputs=[output, last_generated_text])
with gr.Row():
btn_p = gr.Button("👍")
btn_n = gr.Button("👎")
btn_p.click(positive_feedback, inputs=[last_generated_text], outputs=None)
btn_n.click(negative_feedback, inputs=[last_generated_text], outputs=None)
# Launch the interface
if __name__ == "__main__":
iface.launch(inline=True)
|