File size: 3,404 Bytes
c3dfc09
 
 
b87d619
c3dfc09
 
 
 
 
 
 
 
 
 
b87d619
c3dfc09
 
b87d619
c3dfc09
 
 
 
 
 
b87d619
c3dfc09
 
b87d619
c3dfc09
51e6337
 
 
 
 
 
 
 
 
 
c3dfc09
42a2d58
89224bc
42a2d58
 
89224bc
 
 
 
 
 
 
42a2d58
 
 
 
 
 
 
b87d619
89224bc
 
834e3d1
b87d619
c3dfc09
 
 
89224bc
42a2d58
89224bc
 
42a2d58
89224bc
c3dfc09
 
 
 
 
89224bc
c3dfc09
 
 
 
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient

# Инициализация клиента с моделью от Hugging Face
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")

def respond(
    message,
    history: list[tuple[str, str]],
    system_message,
    max_tokens,
    temperature,
    top_p,
):
    # Формирование списка сообщений для отправки модели
    messages = [{"role": "system", "content": system_message}]

    # Добавление истории разговора в список сообщений
    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    # Добавление текущего сообщения пользователя
    messages.append({"role": "user", "content": message})

    # Получение ответа от модели
    response = ""
    for message in client.chat_completion(
        messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = message.choices[0].delta.content
        response += token
        yield response

    # Выделение диагноза и операции жирным шрифтом
    diagnosis_start = response.find("Предварительный диагноз:")
    operation_start = response.find("Рекомендуемая операция:")

    if diagnosis_start != -1:
        diagnosis_end = response.find("\n", diagnosis_start)
        if diagnosis_end == -1:
            diagnosis_end = len(response)
        diagnosis = response[diagnosis_start:diagnosis_end]
        response = response[:diagnosis_start] + f"<b>{diagnosis}</b>" + response[diagnosis_end:]

    if operation_start != -1:
        operation_end = response.find("\n", operation_start)
        if operation_end == -1:
            operation_end = len(response)
        operation = response[operation_start:operation_end]
        response = response[:operation_start] + f"<b>{operation}</b>" + response[operation_end:]

    # Добавление идентификационного сообщения к ответу
    final_response = f"{response}\n\nСоздано больницей EMS штата Alta"
    yield final_response

# Создание интерфейса Gradio
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(
            value="Привет! Я помощник врача в больнице EMS штата Alta! Опиши свои симптомы кратко, и я поставлю предварительный диагноз и предложу операцию, если это необходимо.",
            label="Системное сообщение"
        ),
        gr.Slider(minimum=1, maximum=4096, value=512, step=1, label="Максимальное количество новых токенов"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Температура"),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (ядерное семплирование)",
        ),
    ],
)

if __name__ == "__main__":
    demo.launch()