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)