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

# Inicialização do cliente de inferência
client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")

# Função para formatar o prompt de entrada com o histórico de diálogo
def formatar_prompt(mensagem, historico):
    prompt = "<s>"
    for prompt_usuario, resposta_bot in historico:
        prompt += f"[INST] {prompt_usuario} [/INST]"
        prompt += f" {resposta_bot}</s> "
    prompt += f"[INST] {mensagem} [/INST]"
    return prompt

# Função para gerar resposta do modelo
def gerar(prompt, historico, prompt_sistema, temperatura=0.9, max_tokens_novos=256, top_p=0.95, penalidade_repeticao=1.0):
    temperatura = max(0.01, float(temperatura))  # Garante que a temperatura seja pelo menos 0.01
    top_p = float(top_p)

    kwargs_geracao = dict(
        temperature=temperatura,
        max_new_tokens=max_tokens_novos,
        top_p=top_p,
        repetition_penalty=penalidade_repeticao,
        do_sample=True,
        seed=42,
    )

    # Formata o prompt
    prompt_formatada = formatar_prompt(f"{prompt_sistema}, {prompt}", historico)
    
    # Geração de texto com stream
    stream = client.text_generation(prompt_formatada, **kwargs_geracao, stream=True, details=True, return_full_text=False)
    output = ""

    for resposta in stream:
        output += resposta.token.text
        yield output
    return output

# Criação dos widgets de entrada adicionais
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"),
]

# 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 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.", 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)