File size: 6,012 Bytes
8a4de8f
 
 
ae390c9
8a4de8f
 
a18d40f
8a4de8f
ae390c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a4de8f
0e4a05e
1fbda48
8a4de8f
 
 
 
 
 
 
a18d40f
 
 
 
 
 
 
 
 
 
9eb51ec
7fa0e76
 
 
 
 
 
 
8a4de8f
0e4a05e
7fa0e76
739d38d
 
 
a18d40f
739d38d
 
7fa0e76
8a4de8f
13273ea
8a4de8f
 
7ebea95
80797a0
 
8a4de8f
 
3e49491
86794d4
 
 
 
3e49491
 
 
7fa0e76
13273ea
 
 
 
 
ae390c9
13273ea
 
 
 
ae390c9
13273ea
8a4de8f
 
13273ea
7fa0e76
739d38d
8a4de8f
739d38d
8a4de8f
 
 
99ed14f
7fa0e76
 
2949d74
8a4de8f
 
 
 
739d38d
8a4de8f
 
 
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
134
135
136
137
import gradio as gr
from ctransformers import AutoModelForCausalLM
from transformers import AutoTokenizer, pipeline
import datasets
import torch
import re
import random




from pathlib import Path
from huggingface_hub import CommitScheduler

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="Detsutut/feedbacks_test",
    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")




# Initialize the model
model = AutoModelForCausalLM.from_pretrained("Detsutut/Igea-1B-instruct-v0.3-test4epochs-GGUF", model_file="unsloth.Q4_K_M.gguf", model_type="mistral", hf=True)
tokenizer = AutoTokenizer.from_pretrained( "Detsutut/Igea-1B-instruct-v0.3-test4epochs")

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):
    print("positive")
    print(last_generated_text)
    save_json(last_generated_text,"positive")

def negative_feedback(last_generated_text):
    print("negative")
    print(last_generated_text)
    save_json(last_generated_text,"negative")
    

# 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])

    btn_p = gr.Button("👍")
    btn_p.click(positive_feedback, inputs=[last_generated_text], outputs=None)
    btn_n = gr.Button("👎")
    btn_n.click(negative_feedback, inputs=[last_generated_text], outputs=None)

# Launch the interface
if __name__ == "__main__":
    iface.launch(inline=True)