File size: 3,843 Bytes
89f2b62
e77d8fb
89f2b62
10f4f78
e77d8fb
 
 
 
 
 
 
 
 
 
 
10f4f78
32bb3d3
 
 
 
10f4f78
 
 
e77d8fb
 
10f4f78
 
32bb3d3
89f2b62
10f4f78
32bb3d3
 
 
 
 
 
e77d8fb
10f4f78
9248299
eaa2ef1
690af6c
2fb1211
 
 
 
 
690af6c
10f4f78
88b6d09
eaa2ef1
 
 
 
0a577eb
eaa2ef1
 
32bb3d3
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
import gradio as gr
from huggingface_hub import InferenceClient

# Função para gerar resposta do modelo
def gerar(prompt, historico, prompt_sistema, modelo, temperatura=0.9, max_tokens_novos=256, top_p=0.95, penalidade_repeticao=1.0):
    # Inicialização do cliente de inferência
    if modelo == "Modelo 1":
        client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.2")
    elif modelo == "Modelo 2":
        client = InferenceClient("microsoft/Phi-3-mini-4k-instruct")
    elif modelo == "Modelo 3":
        client = InferenceClient("google/gemma-1.1-7b-it")
    else:
        return "Modelo não reconhecido."

    kwargs_geracao = dict(
        temperature=float(temperatura),
        max_new_tokens=int(max_tokens_novos),
        top_p=float(top_p),
        repetition_penalty=float(penalidade_repeticao),
        do_sample=True,
        seed=42,
    )
    # Função para formatar o prompt de entrada com o histórico de diálogo
    prompt_formatada = "<s>" + "".join(f"[INST] {prompt_usuario} [/INST] {resposta_bot}" for prompt_usuario, resposta_bot in historico) + f"[INST] {prompt_sistema} [/INST]"
    stream = client.text_generation(prompt_formatada, **kwargs_geracao, stream=True, details=True, return_full_text=False)
    for resposta in stream:
        yield resposta.token.text

# Inputs adicionais para o modelo
inputs_adicionais = [
    gr.Textbox(label="Prompt do Sistema", max_lines=1, interactive=True),
    gr.Slider(label="Temperatura", value=0.9, minimum=0.0, maximum=1.0, step=0.05, interactive=True, info="Valores mais altos produzem saídas mais diversas"),
    gr.Slider(label="Máximo de Novos Tokens", value=256, minimum=0, maximum=1048, step=64, interactive=True, info="O número máximo de novos tokens"),
    gr.Slider(label="Top-p (amostragem de núcleo)", value=0.90, minimum=0.0, maximum=1, step=0.05, interactive=True, info="Valores mais altos amostram mais tokens de baixa probabilidade"),
    gr.Slider(label="Penalidade de Repetição", value=1.2, minimum=1.0, maximum=2.0, step=0.05, interactive=True, info="Penalize tokens repetidos"),
    gr.Dropdown(label="Modelo", choices=["Modelo 1", "Modelo 2", "Modelo 3"], default="Modelo 1", interactive=True)
]

# Exemplos de prompts
exemplos=[
    ["Paciente de 55 anos, história familiar de doença cardíaca. Colesterol total: 260 mg/dL, HDL: 40 mg/dL, LDL: 180 mg/dL, triglicerídeos: 200 mg/dL. Interpretar resultados e sugerir intervenções.", None, None, None, None, None],
    ["Ecocardiograma em paciente de 70 anos, dispneia aos esforços. Fração de ejeção: 40%, espessamento do septo interventricular, dilatação atrial esquerda. Propor tratamento para insuficiência cardíaca.", None, None, None, None, None],
    ["Teste de esforço em esteira, paciente de 45 anos, dor torácica atípica. 10 METs atingidos, depressão do segmento ST de 2 mm no pós-exercício. Recomendar próximos passos diagnósticos e terapêuticos.", None, None, None, None, None],
    ["Holter de 24 horas, paciente de 60 anos, síncope recorrente. Episódios de pausas sinusais de até 5 segundos, arritmia sinusal respiratória. Formular plano de monitoramento e tratamento para bradicardia sintomática.", None, None, None, None, None],
    ["Cateterismo cardíaco em paciente de 65 anos, angina instável. Angiografia revela lesões significativas em duas artérias coronárias principais, FFR: 0,68. Recomendar opções de revascularização e manejo coronariano.", None, None, None, None, None]
]

# Interface do Chat
gr.ChatInterface(
    fn=gerar,
    chatbot=gr.Chatbot(show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel"),
    additional_inputs=inputs_adicionais,
    title="Medchat | Automação Inteligente de Saúde",
    examples=exemplos,
    concurrency_limit=20,
).launch(show_api=False)