File size: 4,565 Bytes
9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 4c74d6c e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 e352b4f 9bb76c2 |
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 |
import os
import gradio as gr
from gradio import ChatMessage
from typing import Iterator
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch
# Загрузка модели и токенизатора
model_name = "FractalGPT/RuQwen2.5-3B-Instruct-AWQ"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
# Создание пайплайна для генерации текста
text_generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
def format_chat_history(messages: list) -> str:
"""
Форматирует историю чата в строку, которую модель может понять.
"""
formatted_history = ""
for message in messages:
if message.get("role") == "user":
formatted_history += f"User: {message.get('content', '')}\n"
elif message.get("role") == "assistant":
formatted_history += f"Assistant: {message.get('content', '')}\n"
return formatted_history
def stream_model_response(user_message: str, messages: list) -> Iterator[list]:
"""
Генерирует ответ модели с поддержкой истории чата.
"""
try:
print(f"\n=== New Request ===")
print(f"User message: {user_message}")
# Форматируем историю чата
chat_history = format_chat_history(messages)
# Формируем входной текст для модели
input_text = f"{chat_history}User: {user_message}\nAssistant:"
# Генерируем ответ модели
response = text_generator(input_text, max_length=512, do_sample=True, temperature=0.7, top_p=0.9)
model_response = response[0]['generated_text'].split("Assistant:")[-1].strip()
# Добавляем ответ модели в историю чата
messages.append(
ChatMessage(
role="assistant",
content=model_response
)
)
yield messages
print(f"\n=== Final Response ===\n{model_response}")
except Exception as e:
print(f"\n=== Error ===\n{str(e)}")
messages.append(
ChatMessage(
role="assistant",
content=f"I apologize, but I encountered an error: {str(e)}"
)
)
yield messages
def user_message(msg: str, history: list) -> tuple[str, list]:
"""Добавляет сообщение пользователя в историю чата"""
history.append(ChatMessage(role="user", content=msg))
return "", history
# Создаем интерфейс Gradio
with gr.Blocks(theme=gr.themes.Citrus(), fill_height=True) as demo:
gr.Markdown("# Chat with FractalGPT/RuQwen2.5-3B-Instruct-AWQ 💭")
chatbot = gr.Chatbot(
type="messages",
label="FractalGPT Chatbot",
render_markdown=True,
scale=1,
avatar_images=(None, "https://huggingface.co/FractalGPT/RuQwen2.5-3B-Instruct-AWQ/resolve/main/avatar.png")
)
with gr.Row(equal_height=True):
input_box = gr.Textbox(
lines=1,
label="Chat Message",
placeholder="Type your message here...",
scale=4
)
clear_button = gr.Button("Clear Chat", scale=1)
# Настраиваем обработчики событий
msg_store = gr.State("") # Хранилище для сохранения сообщения пользователя
input_box.submit(
lambda msg: (msg, msg, ""), # Сохраняем сообщение и очищаем поле ввода
inputs=[input_box],
outputs=[msg_store, input_box, input_box],
queue=False
).then(
user_message, # Добавляем сообщение пользователя в чат
inputs=[msg_store, chatbot],
outputs=[input_box, chatbot],
queue=False
).then(
stream_model_response, # Генерируем и передаем ответ модели
inputs=[msg_store, chatbot],
outputs=chatbot
)
clear_button.click(
lambda: ([], "", ""),
outputs=[chatbot, input_box, msg_store],
queue=False
)
# Запускаем интерфейс
if __name__ == "__main__":
demo.launch(debug=True) |