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"{diagnosis}" + 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"{operation}" + 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()