File size: 4,848 Bytes
3d2becb
b4d7841
 
 
952b9c8
b4d7841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
952b9c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d2becb
 
 
952b9c8
 
 
 
 
 
3d2becb
 
 
952b9c8
3d2becb
3ec5e4c
 
3d2becb
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
import gradio as gr
import os, random
import transformers
import torch

model_id = "yodayo-ai/nephra_v1.0"

pipeline = transformers.pipeline(
  "text-generation",
  model=model_id,
  model_kwargs={"torch_dtype": torch.bfloat16},
  device_map="auto",
)

messages = [
  {"role": "system", "content": "You are to play the role of a Алекс - молодой и амбициозный приключенец, обладающий неутомимой энергией и жаждой новых открытий. Он всегда готов бросить вызов любым трудностям и стремится к познанию неизведанных мест."},
  {"role": "user", "content": "Hi there, how's your day?"},
]

prompt = pipeline.tokenizer.apply_chat_template(
  messages,
  tokenize=False,
  add_generation_prompt=True
)

outputs = pipeline(
  prompt,
  max_new_tokens=512,
  eos_token_id=[
    pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>"),
    pipeline.tokenizer.eos_token_id,
  ],
  do_sample=True,
  temperature=1.12,
  min_p=0.075,
)
print(outputs[0]["generated_text"][len(prompt):])
# Определение персонажей
characters = [
    {"name": "Алекс", 
     "description": "Алекс - молодой и амбициозный приключенец, обладающий неутомимой энергией и жаждой новых открытий. Он всегда готов бросить вызов любым трудностям и стремится к познанию неизведанных мест.", 
     "traits": "смелый, энергичный, оптимистичный, решительный"},
    
    {"name": "Майя", 
     "description": "Майя - мудрая и опытная волшебница, обладающая глубокими знаниями в магии и древних ритуалах. Она известна своим спокойствием, аналитическим умом и способностью находить решения в сложных ситуациях.",
     "traits": "спокойная, вдумчивая, интуитивная, внимательная"},
    
    {"name": "Виктор", 
     "description": "Виктор - бывший воин, который оставил боевые подвиги ради поиска внутреннего мира и гармонии. Его жизненный опыт и стремление к справедливости делают его надежным другом и наставником.", 
     "traits": "серьезный, рассудительный, справедливый, уравновешенный"}
]

# Загрузка модели
model_path = "model-q4_K.gguf"
model = llama.load_model(model_path)

def generate_response(character_name, prompt, max_length=100, temperature=0.7, top_p=0.85, repetition_penalty=1.1):
    # Поиск данных персонажа
    character = next((c for c in characters if c["name"] == character_name), None)
    if not character:
        return "Персонаж не найден."

    # Формирование текста запроса
    prompt_text = (f"Ты - {character_name}, {character['description']}. Черты характера: {character['traits']}. "
                   f"В ответ на вопрос '{prompt}' {random.choice(['вдохновленно', 'с сомнением', 'с радостью', 'вдумчиво', 'с недоверием'])}. Пожалуйста, закончите ответ полностью.")
    
    # Генерация ответа
    response = model.generate(prompt_text, max_length=max_length, temperature=temperature, top_p=top_p, repetition_penalty=repetition_penalty)
    return response

# Создание интерфейса Gradio
iface = gr.Interface(
    fn=generate_response,
    inputs=[
        gr.inputs.Dropdown([c["name"] for c in characters], label="Выберите персонажа"),
        gr.inputs.Textbox(lines=2, placeholder="Введите ваш текст здесь..."),
        gr.inputs.Slider(20, 200, step=1, default=100, label="Максимальная длина"),
        gr.inputs.Slider(0.1, 1.0, step=0.1, default=0.7, label="Температура"),
        gr.inputs.Slider(0.1, 1.0, step=0.05, default=0.85, label="Top-p"),
        gr.inputs.Slider(1.0, 2.0, step=0.1, default=1.1, label="Штраф за повторение")
    ],
    outputs="text",
    title="LLM Model Demo",
    description="Введите текстовый запрос, чтобы сгенерировать ответ с помощью модели, основываясь на выбранном персонаже."
)

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