File size: 7,383 Bytes
095f268
 
 
 
 
 
 
 
 
 
 
 
 
 
8dfcef0
095f268
 
 
60b9593
 
 
095f268
 
 
 
b72f1c3
095f268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b72f1c3
095f268
 
 
 
b72f1c3
 
 
 
 
 
 
 
095f268
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
---
datasets:
- IlyaGusev/ru_turbo_alpaca
- IlyaGusev/ru_turbo_saiga
- IlyaGusev/ru_sharegpt_cleaned
- IlyaGusev/oasst1_ru_main_branch
- IlyaGusev/ru_turbo_alpaca_evol_instruct
- lksy/ru_instruct_gpt4
language:
- ru
pipeline_tag: conversational
license: cc-by-4.0
---

# GigaSaiga, Russian ruGPT-3.5-13B-based chatbot

Based on [ruGPT-3.5-13B](https://huggingface.co/ai-forever/ruGPT-3.5-13B).

This is an adapter-only version.

Colab: [link](https://colab.research.google.com/drive/1s_ymKs_g5-Hq-xeWYNW-19QC0VzozMtf?usp=sharing)

Training code: [link](https://github.com/IlyaGusev/rulm/tree/master/self_instruct)

```python
import torch
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

MODEL_NAME = "IlyaGusev/gigasaiga_lora"
DEFAULT_MESSAGE_TEMPLATE = "<s> {role}\n{content}</s>\n"
DEFAULT_SYSTEM_PROMPT = "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."

class Conversation:
    def __init__(
        self,
        message_template=DEFAULT_MESSAGE_TEMPLATE,
        system_prompt=DEFAULT_SYSTEM_PROMPT,
        start_token_id=2,
        bot_token_id=46787
    ):
        self.message_template = message_template
        self.start_token_id = start_token_id
        self.bot_token_id = bot_token_id
        self.messages = [{
            "role": "system",
            "content": system_prompt
        }]

    def get_start_token_id(self):
        return self.start_token_id

    def get_bot_token_id(self):
        return self.bot_token_id

    def add_user_message(self, message):
        self.messages.append({
            "role": "user",
            "content": message
        })

    def add_bot_message(self, message):
        self.messages.append({
            "role": "bot",
            "content": message
        })

    def get_prompt(self, tokenizer):
        final_text = ""
        for message in self.messages:
            message_text = self.message_template.format(**message)
            final_text += message_text
        final_text += tokenizer.decode([self.start_token_id, self.bot_token_id])
        return final_text.strip()


def generate(model, tokenizer, prompt, generation_config):
    data = tokenizer(prompt, return_tensors="pt")
    data = {k: v.to(model.device) for k, v in data.items()}
    output_ids = model.generate(
        **data,
        generation_config=generation_config
    )[0]
    output_ids = output_ids[len(data["input_ids"][0]):]
    output = tokenizer.decode(output_ids, skip_special_tokens=True)
    return output.strip()

config = PeftConfig.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
    config.base_model_name_or_path,
    load_in_8bit=True,
    torch_dtype=torch.float16,
    device_map="auto"
)
model = PeftModel.from_pretrained(
    model,
    MODEL_NAME,
    torch_dtype=torch.float16
)
model.eval()

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=False)
generation_config = GenerationConfig.from_pretrained(MODEL_NAME)
print(generation_config)

inputs = ["Почему трава зеленая?", "Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч"]
for inp in inputs:
    conversation = Conversation()
    conversation.add_user_message(inp)
    prompt = conversation.get_prompt(tokenizer)

    output = generate(model, tokenizer, prompt, generation_config)
    print(inp)
    print(output)
    print()
    print("==============================")
    print()
```

Examples:
```
User: Почему трава зеленая? 
Saiga: Трава имеет зеленый цвет благодаря хлорофиллу - пигменту растений, который поглощает световую энергию и преобразует ее в химическую энергию для роста растения. Хлорофилл также придает траве зеленоватый оттенок при солнечном свете.
```

```
User: Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч
Saiga: Таня сидела на скамейке в парке и играла со своим любимым мячиком. Она была увлечена игрой настолько, что не замечала ничего вокруг себя. Вдруг она услышала звук приближающихся шагов. Обернувшись, она увидела молодого человека, который шел к ней по дорожке парка. Он был одет в джинсы и футболку, а его волосы были собраны в хвост.
- Привет! - сказал он Тане.
Она улыбнулась ему и кивнула головой. Молодой человек подошел ближе и сел рядом с Таней на скамейку. Они начали разговаривать о разных вещах, таких как погода, игры и фильмы. В какой-то момент молодой человек спросил у Тани, играет ли она еще в игру под названием "мяч".
- Конечно, я играю каждый день, - ответила Таня.
Молодой человек улыбнулся ей и достал из кармана свой любимый красный мяч. Он протянул его Тане и попросил ее поиграть вместе с ним. Таня взяла мяч и начала играть с молодым человеком. Это было так весело, что они забыли обо всем на свете. Мячик летал между ними, ударяясь об землю и отскакивая обратно. Они смеялись и радовались игре.
Когда игра закончилась, Таня поблагодарила своего нового друга за то, что он показал ей такую интересную игру. Молодой человек ответил, что это было для него удовольствием провести время с такой милой девушкой. Затем они попрощались и разошлись в разные стороны.
С тех пор Таня часто вспоминала эту встречу и думала о том, насколько же приятно проводить время с новыми друзьями.

```

v1:
- dataset code revision 7712a061d993f61c49b1e2d992e893c48acb3a87
- wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/lwgw4a1w)
- 7 datasets: ru_turbo_alpaca, ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch, gpt_roleplay_realm, ru_turbo_alpaca_evol_instruct (iteration 1/2), ru_instruct_gpt4
- Datasets merging script: [create_chat_set.py](https://github.com/IlyaGusev/rulm/blob/e4238fd9a196405b566a2d5838ab44b7a0f4dc31/self_instruct/src/data_processing/create_chat_set.py)
- saiga13b_v2 vs gigasaiga: 112-11-53