--- language: - ru datasets: - IlyaGusev/saiga_scored license: other license_name: llama3 license_link: https://llama.meta.com/llama3/license/ --- # Saiga/Llama3 8B, Russian Llama-3-based chatbot Based on [Llama-3 8B Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct). Llama.cpp version: [link](https://huggingface.co/IlyaGusev/saiga_llama3_8b_gguf) ## Prompt format **ОСТОРОЖНО! WARNING! LET OP!** I've changed the prompt format from ChatML to **the original Llama-3 format in v4**. Don't forget to switch formats! **v4+**: LLama-3 prompt format: ``` <|begin_of_text|><|start_header_id|>system<|end_header_id|> Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им.<|eot_id|><|start_header_id|>user<|end_header_id|> Как дела?<|eot_id|><|start_header_id|>assistant<|end_header_id|> Отлично, а у тебя?<|eot_id|><|start_header_id|>user<|end_header_id|> Шикарно. Как пройти в библиотеку?<|eot_id|><|start_header_id|>assistant<|end_header_id|> ``` **v2, v3**: ChatML prompt format: ``` <|im_start|>system Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им.<|im_end|> <|im_start|>user Как дела?<|im_end|> <|im_start|>assistant Отлично, а у тебя?<|im_end|> <|im_start|>user Шикарно. Как пройти в библиотеку?<|im_end|> <|im_start|>assistant ``` ## Code example ```python # Исключительно ознакомительный пример. # НЕ НАДО ТАК ИНФЕРИТЬ МОДЕЛЬ В ПРОДЕ. # См. https://github.com/vllm-project/vllm или https://github.com/huggingface/text-generation-inference import torch from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig MODEL_NAME = "IlyaGusev/saiga_llama3_8b" DEFAULT_SYSTEM_PROMPT = "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им." model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, load_in_8bit=True, torch_dtype=torch.bfloat16, device_map="auto" ) model.eval() tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) generation_config = GenerationConfig.from_pretrained(MODEL_NAME) print(generation_config) inputs = ["Почему трава зеленая?", "Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч"] for query in inputs: prompt = tokenizer.apply_chat_template([{ "role": "system", "content": DEFAULT_SYSTEM_PROMPT }, { "role": "user", "content": query }] 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).strip() print(inp) print(output) print() print("==============================") print() ``` ## Output examples ``` User: Почему трава зеленая? Saiga: Зеленый цвет травы обусловлен наличием хлорофилла, пигмента, который поглощает свет и передает энергию для фотосинтеза. Хлорофилл содержится в клетках листьев растений и играет ключевую роль в процессе фотосинтеза, когда растения используют солнечный свет для превращения воды и углекислого газа в органические вещества, такие как глюкоза и олигоэфиры. Хлорофилл состоит из двух основных форм: хлорофилла а и хлорофилла б. Хлорофилл а поглощает свет с длиной волны около 430 нанометров (нм), что соответствует синему или голубому свету, а хлорофилл б поглощает свет с длиной волны около 660 нм, что соответствует красному свету. Когда свет поглощается хлорофиллом, он передается в молекулы воды и углекислого газа, которые используются для фотосинтеза. Таким образом, хлорофилл является основным компонентом, ответственным за зеленый цвет листьев растений, так как он поглощает свет и передает его энергию для фотосинтеза. ``` ``` User: Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч Saiga: Однажды в солнечную погоду на поле для игры в футбол приехала группа друзей, чтобы провести время вместе. В числе их был и Таня, которая была страстной футбольной фанаткой и всегда радовал своих друзей своим энтузиазмом и умением забивать мячи. В этот день, как обычно, друзья решили провести соревнование между собой, чтобы определить кто из них является лучшим футболистом. Таня была очень уверена в своих силах и готовилась к этому матчу с особой серьёзностью. Когда все друзья собрались на поле, они увидели, что перед ними стоял огромный мяч, который должен был стать предметом состязания. Мяч был огромным и тяжелым, и его размеры были необычайно большими по сравнению с обычными мячами, которые используются в футболе. Таня была первая, кто решил начать игру. Она подошла к мячу и начала его удерживать, стараясь выдержать его вес и силу. Но мяч оказался настолько тяжелым, что Таня не смогла удержать его и он упал на землю. Друзья посмеялись над ее неудачей, но Таня не отчаивалась и продолжила пытаться удержать мяч. Она стала использовать все свои силы и умения, чтобы выдержать его вес и силу. Наконец, после долгих усилий, она смогла удержать мяч и начала его бросать в сторону. Мяч летел высоко вверх, и друзья смотрели, как он пролетает над полем. Но мяч неожиданно повернул и стал лететь обратно к Тане. Она успела поймать его и продолжила играть, используя все свои навыки и умения. ``` ## Versions v5: - [d947b00c56683cd4b2f7ce707edef89318027be4](https://huggingface.co/IlyaGusev/saiga_llama3_8b/commit/d947b00c56683cd4b2f7ce707edef89318027be4) - KTO-tune over v4, dataset: [lmsys_clean_ru_preferences](https://huggingface.co/datasets/IlyaGusev/lmsys_clean_ru_preferences) - wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/se1mbx7n) v4: - [1cc945d4ca2c7901cf989e7edaac52ab24f1a7dd](https://huggingface.co/IlyaGusev/saiga_llama3_8b/commit/1cc945d4ca2c7901cf989e7edaac52ab24f1a7dd) - dataset: [saiga_scored](https://huggingface.co/datasets/IlyaGusev/saiga_scored), scores >= 8, c66032920556c0f21bbbed05e7e04433ec954c3d - wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/dcbs9ttt) v3: - [c588356cd60bdee54d52c2dd5a2445acca8aa5c3](https://huggingface.co/IlyaGusev/saiga_llama3_8b/commit/c588356cd60bdee54d52c2dd5a2445acca8aa5c3) - dataset: [saiga_scored](https://huggingface.co/datasets/IlyaGusev/saiga_scored), scores >= 8, d51cf8060bdc90023da8cf1c3f113f9193d6569b - wandb [link](https://wandb.ai/ilyagusev/rulm_self_instruct/runs/ltoqdsal) v2: - [ae61b4f9b34fac9856d361ea78c66284a00e4f0b](https://huggingface.co/IlyaGusev/saiga_llama3_8b/commit/ae61b4f9b34fac9856d361ea78c66284a00e4f0b) - dataset code revision d0d123dd221e10bb2a3383bcb1c6e4efe1b4a28a - wandb [link](https://wandb.ai/ilyagusev/huggingface/runs/r6u5juyk) - 5 datasets: ru_turbo_saiga, ru_sharegpt_cleaned, oasst1_ru_main_branch, gpt_roleplay_realm, ru_instruct_gpt4 - Datasets merging script: [create_short_chat_set.py](https://github.com/IlyaGusev/rulm/blob/d0d123dd221e10bb2a3383bcb1c6e4efe1b4a28a/self_instruct/src/data_processing/create_short_chat_set.py) ## Evaluation * Dataset: https://github.com/IlyaGusev/rulm/blob/master/self_instruct/data/tasks.jsonl * Framework: https://github.com/tatsu-lab/alpaca_eval * Evaluator: alpaca_eval_cot_gpt4_turbo_fn | model | length_controlled_winrate | win_rate | standard_error | avg_length | |-----|-----|-----|-----|-----| |chatgpt_4_turbo | 76.04 | 90.00 |1.46 | 1270 | |chatgpt_3_5_turbo | 50.00 | 50.00 | 0.00 | 536 | |sfr-iter-dpo | 49.11 | 74.94 | 2.13 | 1215 | |suzume | 49.05 | 71.57 | 2.20 | 1325 | |saiga_llama3_8b, v5 | 47.13 | 66.18 | 2.31 | 1194 | |saiga_llama3_8b, v4 | 43.64 | 65.90 | 2.31 | 1200 | |saiga_llama3_8b, v3 | 36.97 | 61.08 | 2.38 | 1162 | |saiga_llama3_8b, v2 | 33.07 | 48.19 | 2.45 | 1166 | |saiga_mistral_7b | 23.38 | 35.99 | 2.34 | 949 |