meno-tiny-0.1 / README.md
bond005's picture
Update README.md
e45b560 verified
metadata
license: apache-2.0
language:
  - ru
  - en
pipeline_tag: text-generation
tags:
  - nlp
  - chat
base_model:
  - Qwen/Qwen2.5-1.5B-Instruct
library_name: transformers

Meno-Tiny-0.1

Meno-Tiny-0.1 is a descendant of the Qwen2.5-1.5B-Instruct model, which was fine-tuned on a special Russian instruct dataset. It is a 1.5B parameter language model with a decoder. It is based on the Transformer architecture with SwiGLU activation, attention QKV bias, group query attention, etc. The name "Meno" is associated with the adaptation of this model for answering questions from text in the RAG pipeline (in honor of the theory of knowledge as recollection from the Socratic dialogue "Meno").

Requirements

The code of Meno-Tiny-0.1 has been in the latest Hugging face transformers and we advise you to use the latest version of transformers.

With transformers<4.37.0, you will encounter the following error:

KeyError: 'qwen2'

Quickstart

Here, we provide a code snippet with apply_chat_template to show you how to load the tokenizer and model and how to generate content.

Meno-Tiny-0.1 was specifically "Russified" during the fine-tuning stage, but it retained the ability to answer in English. The following are two examples of communication with Meno-Tiny-0.1 in English and Russian.

1. Example of communication in English

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

prompt = "Give me a short introduction to large language model."  # in English
messages = [
    {"role": "system", "content": "You are Meno, created by Ivan Bondarenko. You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

2. Example of communication in Russian

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

prompt = "Напиши краткое введение в большие языковые модели."  # in Russian
messages = [
    {"role": "system", "content": "Ты - Менон, разработанный Иваном Бондаренко. Ты полезный ассистент."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

Abilities of Meno-Tiny-0.1

Using Meno-Tiny-0.1 with different system and user prompts allows you to discover its various abilities. The main tasks that Meno-Tiny-0.1 can solve, including in the few-shot prompting mode, are:

  • Answering questions about the text;
  • Summarization;
  • Determining text toxicity and detoxifying the text;
  • Anaphora resolution;
  • Correcting speech recognition errors;
  • and so on.

Below are some examples of how to communicate with Meno-Tiny-0.1 in Russian in order to solve a variety of specialized tasks.

1. The answer to the question about the document

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

prompt = "Ответь на вопрос по тексту.\n\nВопрос: {question}\n\nТекст: {context}".format(
    question="Где живут пингвины?",
    context="Ныне пингвины наиболее разнообразны на островах Субантарктики; в целом распространение группы связано с холодными океаническими течениями Южного полушария, вдоль которых пингвины проникают далеко на север – в субтропики Южной Америки (гумбольдтов и магелланов пингвины), Африки (очковый пингвин Spheniscus demersus), Австралии (малый пингвин) и даже к экваториальным Островам Галапагос (эндемичный галапагосский пингвин, Spheniscus mendiculus). На Фолклендских островах симпатрично обитают 5 видов. Лишь 3 вида – императорский, антарктический (Pygoscelis antarcticus) пингвины и пингвин Адели (Pygoscelis adeliae) – населяют береговую кромку ледового щита Антарктиды. Северная граница распространения большинства пингвинов определяется изотермой морской воды +15…+16 °С."
)
messages = [
    {"role": "system", "content": "Ты - Менон, разработанный Иваном Бондаренко. Ты полезный ассистент."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

2. Summarization

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

prompt = "Стали известны результаты, полученные открытой системой «Писец» на ежегодной акции «Тотальный диктант», которая состоялась 20 апреля. Напомним, что «Писец» был разработан научным сотрудником Лаборатории прикладных цифровых технологий Международного научно-образовательного математического центра НГУ и сооснователем стартапа «Сибирские нейросети» Иваном Бондаренко. Впервые искусственный интеллект соревновался в грамотности с человеческим в рамках задачи диктанта, и создатель «Писца» предполагал, что положительной оценки тот не получит — скорее всего, система допустит минимум орфографических ошибок, однако с расставлением знаков препинания вряд ли справится. \n\nРазработчикам «Писца» было важно собрать статистику о разнообразии совершаемых им ошибок и неточностей, чтобы в дальнейшем усовершенствовать систему. Результаты оказались неожиданными, но закономерными – «Писец»  вполне удовлетворительно расставил запятые и разбил текст на абзацы. Для этого его специально научили улавливать в речи «кодовые фразы» вроде «пишем с красной строки» или «переходим на новый абзац». В этих целях использовалась отдельная нейросеть, обученная на базе Longformer выделять такие «внесюжетные» вставки наподобие системы NER (Named Entity Recognition - распознавание именованных сущностей). Для обучения использовался синтетический текстовый корпус. Сам же «Писец» использовал в своей работе связку Wav2Vec2-Large-Ru-Golos + Whisper-Podlodka (о Wav2Vec2-Large-Ru-Golos мы ранее писали https://www.nsu.ru/n/media/news/nauka/razrabotannuyu-professorom-ngu-model-raspoznavaniya-rechi-nauchili-razlichat-emotsii, а Whisper-Podlodka является новой моделью). Однако галлюцинаций избежать не удалось.\n\nГаллюцинация — это ответ авторегрессионной нейросетевой модели языка, который корректен грамматически, но неверен семантически (не соответствует входному запросу по смыслу)."
messages = [
    {"role": "system", "content": "Перескажи кратко текст."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

3. Anaphora resolution in dialogue (with few-shot prompting)

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

user_prompt = "User: Кто сейчас ректор Новосибирского государственного университета?\nAssistant: Ректором Новосибирского государственного университета является Михаил Петрович Федорук, академик Российской академии наук, доктор физико-математических наук, профессор.\nUser: Какие у него научные интересы?"
few_shots_for_anaphora = [
    {"role": "user", "content": "User: Что такое механико-математический факультет?\nAssistant: Механико-математический факультет НГУ — это факультет, выпускники которого осуществляют научные исследования и разработки для лучших компаний мира. Студент Механико-математического факультета учится преобразовывать свои разрозненные мысли в четко структурированные рассуждения, обладающие логической стройностью.\nUser: А там есть магистратура?"},
    {"role": "assistant", "content": "А на механико-математическом факультете есть магистратура?"},
    {"role": "user", "content": "User: Когда начинается приём документов в НГУ?\nAssistant: Приём документов в НГУ начинается 1 марта – для иностранных граждан и лиц без гражданства и 20 июня – для граждан Российской Федерации.\nUser: А когда он заканчивается?"},
    {"role": "assistant", "content": "А когда приём документов в НГУ заканчивается?"},
    {"role": "user", "content": "User: Кто основал Новосибирский Академгородок?\nAssistant: Новосибирский Академгородок основал Михаил Алексеевич Лаврентьев в 1957 году.\nUser: Чем же он занимался до этого?"},
    {"role": "assistant", "content": "Чем же Михаил Алексеевич Лаврентьев занимался до основания Новосибирского Академгородка?"}
]
system_prompt_for_anaphora = [
    {"role": "system", "content": "Перепиши текст последней реплики пользователя в диалоге так, что разрешить все ситуации местоименной анафоры в этом тексте. Замени анафорические местоимения соответствующими им существительными."}
]
messages = system_prompt_for_anaphora + few_shots_for_anaphora + [
    {"role": "user", "content": user_prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

4. Correction of speech recognition output (with few-shot prompting)

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig

model_name = "bond005/meno-tiny-0.1"

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
gen_config = GenerationConfig.from_pretrained(model_name)

user_prompt = "то есть мы в каждый момент времени знаем про звук еще и какое то такое распределение частот и связанное это с тем что наше ухо на самом деле примерно также и воспринимать звук то есть мы не просто понимаем что вот где то там громче где то тише а наше уху еще понимает что вот этот  звук выше этот ниже этот голос боле высокий этот голос низки"
few_shots_for_ASR_correction = [
    {"role": "user", "content": "вы выборском районе города проводится проверка по факту нападению на квартиру"},
    {"role": "assistant", "content": "В Выборгском районе города проводится проверка по факту нападения на квартиру."},
    {"role": "user", "content": "в пораде победы на красной площади в москве премут участие свысше четырнадцать ты своим наслужащих в том числе одинствого музыканта всводного оркестра сообщил интерфакт словнвы четверг представителе правления прес службы и информацию именно борон рф по сухоопутным войскам полковник сергей власов"},
    {"role": "assistant", "content": "В параде Победы на Красной площади в Москве примут участие свыше 14 тыс. военнослужащих, в том числе 1 100 музыкантов сводного оркестра, сообщил «Интерфаксу-АВН» в четверг представитель управления пресс-службы и информации Минобороны РФ по Сухопутным войскам полковник Сергей Власов."},
    {"role": "user", "content": "главные потребители дискофс виндовс ими крософтов фикироссийские сборщики устанавливающие программные обеспечение прана выпускаемые ими компьютеры и серверы отсюда название а инверсия этой яверсия для оригиналгикоепментмано фактуер для сборщика"},
    {"role": "assistant", "content": "Главные потребители дисков с «Windows» и «Microsoft Office» - российские сборщики, устанавливающие программное обеспечение (ПО) на выпускаемые ими компьютеры и серверы (отсюда название OEM-версия, т. е. версия для «Original Equipment Manufacturer», для сборщика)."},
    {"role": "user", "content": "в две тысячи тринадцать год уконкурс гуглеский енки фаир организатором которого выступает компания гугле проводится в этретий раз веконку всемогут участвовать деть в возрасти от тринадцать да восемнадцать лет свои научные проекты участники от правляют на рассмотрения через интернетых изучает жури состоящие из ученых и сотрудников гогль он уже определяет девяносто региональных изатем пятнадцать глобальных феналистов"},
    {"role": "assistant", "content": "В 2013 году конкурс Google Science Fair, организатором которого выступает компания Google, проводится в третий раз. В конкурсе могут участвовать дети в возрасте от 13 до 18 лет. Свои научные проекты участники отправляют на рассмотрение через интернет. Их изучает жюри, состоящее из ученых и сотрудников Google. Оно же определяет 90 региональных, а затем 15 глобальных финалистов."},
]
system_prompt_for_ASR_correction = [
    {"role": "system", "content": "Исправь, пожалуйста, ошибки распознавания речи в следующем тексте, восстанови в нём знаки пунктуации и правильно расставь прописные и строчные буквы. Пиши свой ответ грамотно, с учётом морфологии и синтаксиса русского языка."}
]
messages = system_prompt_for_ASR_correction + few_shots_for_ASR_correction + [
    {"role": "user", "content": user_prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    generation_config=gen_config
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

Benchmarks

I report the results in the completion format for Meno-Tiny-0.1 on MERA, a well-known open-source independent benchmark for evaluating state-of-the-art models for the Russian language.

The MERA benchmark presents the results of solving more than 20 tasks for question answering, information retrieval, logic, commonsense reasoning, etc., for 59 large language models. I present selected results below. The full leaderboard is available at https://mera.a-ai.ru/en/leaderboard.

Rank Model Size Overall score
1 GPT4o - 0.642
2 RuadaptQwen-32B-instruct 32.0B 0.615
3 Qwen2.5-32B-Instruct 32.0B 0.603
... ... ... ...
6 GigaChat Max - 0.588
7 Mistral-Large-Instruct-2407 123.0B 0.574
8 GPT4o-mini - 0.570
... ... ... ...
12 GigaChat Pro - 0.512
13 GigaChat - 0.500
... ... ... ...
19 Phi-3-medium-4k-instruct 14.0B 0.465
... ... ... ...
34 Yi-1.5-9B-Chat-16K 14.0B 0.373
35 Meno-Tiny-0.1 1.5B 0.365
36 Qwen2.5 1.5B Instruct 1.5B 0.358
... ... ... ...
44 Mistral-7B-Instruct-v0.2 7.2B 0.318
45 Mistral-7B-Instruct-v0.3 7.2B 0.311
46 Yi-Coder-9B-Chat 9.0B 0.308
... ... ... ...
59 Qwen2.5-Math-1.5B-Instruct 1.5B 0.207

MultiQ Task

MultiQ is a multi-hop question-answering (QA) dataset for the Russian language, suitable for general open-domain question answering, information retrieval, and reading comprehension tasks. The results on the MultiQ task are crucial for evaluating the effectiveness of large language model (LLM) applications in the Retrieval-Augmented Generation (RAG) pipeline.

Rank Model Size MultiQ score
1 Mistral-Large-Instruct-2407 123.0B 0.630 / 0.471
2 Meta-Llama-3.1-405B-Instruct 405.0B 0.623 / 0.453
3 Meta-Llama-3.1-70B-Instruct 70.6B 0.607 / 0.443
... ... ... ...
7 GPT4o - 0.572 / 0.431
... ... ... ...
10 GPT4o-mini - 0.509 / 0.379
11 Mixtral-8x22B-Instruct-v0.1 140.6B 0.521 / 0.366
12 Qwen2-57B-A14B-Instruct 57.4B 0.480 / 0.348
13 ruadapt llama3-8B-instruct lep ft 8.4B 0.483 / 0.334
14 GigaChat Max - 0.486 / 0.322
... ... ... ...
21 Qwen2.5-Coder-7B-Instruct 7.0B 0.399 / 0.302
22 Meno-Tiny-0.1 1.5B 0.399 / 0.29
23 Yi-1.5-34B-Chat 34.4B 0.416 / 0.266
... ... ... ...
25 Qwen2.5-3B-Instruct 3.0B 0.391 / 0.263
26 GigaChat - 0.367 / 0.250
... ... ... ...
59 Qwen2.5-Math-7B-Instruct 7.0B 0.003 / 0.000

Intended Uses

Primary Use Cases

Meno-Tiny-0.1 is intended for commercial and research use in Russian. Meno-Tiny-0.1 provides uses for general purpose AI systems and applications which require:

  1. Memory/compute constrained environments
  2. Latency bound scenarios

Meno-Tiny-0.1 is designed to accelerate research on language models, for use as a building block for Retrieval Augmented Generation (RAG) pipelines.

Use Case Considerations

This model is not specifically designed or evaluated for all downstream purposes. Developers should consider common limitations of language models as they select use cases, and evaluate and mitigate for accuracy, safety, and fariness before using within a specific downstream use case, particularly for high risk scenarios. Developers should be aware of and adhere to applicable laws or regulations (including privacy, trade compliance laws, etc.) that are relevant to their use case.

Nothing contained in this Model Card should be interpreted as or deemed a restriction or modification to the license the model is released under.

Responsible AI Considerations

Like other language models, Meno-Tiny-0.1 can potentially behave in ways that are unfair, unreliable, or offensive. Some of the limiting behaviors to be aware of include:

  • Quality of Service: Meno-Tiny-0.1 is fine-tuned primarily on Russian text. Languages other than Russian will experience worse performance as well as performance disparities across non-Russian.
  • Safety gaps: I believe it is important to make language models more widely available for Russian, but Meno-Tiny-0.1 still exhibits challenges common across multilingual releases, since Meno-Tiny-0.1 is based on the multilingual Qwen2.5-1.5B-Instruct model. As with any deployment of LLMs, developers will be better positioned to test for performance or safety gaps for their linguistic and cultural context and customize Meno-Tiny-0.1 with additional fine-tuning and appropriate safeguards.
  • Representation of Harms & Perpetuation of Stereotypes: Meno-Tiny-0.1 can over- or under-represent groups of people, erase representation of some groups, or reinforce demeaning or negative stereotypes. Despite safety post-training, these limitations may still be present due to differing levels of representation of different groups, cultural contexts, or prevalence of examples of negative stereotypes in training data that reflect real-world patterns and societal biases.
  • Inappropriate or Offensive Content: Meno-Tiny-0.1 may produce other types of inappropriate or offensive content, which may make it inappropriate to deploy for sensitive contexts without additional mitigations that are specific to the case.
  • Information Reliability: Language models can generate nonsensical content or fabricate content that might sound reasonable but is inaccurate or outdated.
  • Long Conversation: Meno-Tiny-0.1, like other models, can in some cases generate responses that are repetitive, unhelpful, or inconsistent in very long chat sessions in both Russian and non-Russian languages. Developers are encouraged to place appropriate mitigations, like limiting conversation turns to account for the possible conversational drift.

Developers should apply responsible AI best practices, including mapping, measuring, and mitigating risks associated with their specific use case and cultural, linguistic context. Meno-Tiny-0.1 is general purpose model. As developers plan to deploy this model for specific use cases, they are encouraged to fine-tune the model for their use case and leverage the model as part of broader AI systems with language-specific safeguards in place. Important areas for consideration include:

  • Allocation: Meno-Tiny-0.1 may not be suitable for scenarios that could have consequential impact on legal status or the allocation of resources or life opportunities (ex: housing, employment, credit, etc.) without further assessments and additional debiasing techniques.
  • High-Risk Scenarios: Developers should assess the suitability of using Meno-Tiny-0.1 in high-risk scenarios where unfair, unreliable or offensive outputs might be extremely costly or lead to harm. This includes providing advice in sensitive or expert domains where accuracy and reliability are critical (ex: legal or health advice). Additional safeguards should be implemented at the application level according to the deployment context.
  • Misinformation: Meno-Tiny-0.1 may produce inaccurate information. Developers should follow transparency best practices and inform end-users they are interacting with an AI system. At the application level, developers can build feedback mechanisms and pipelines to ground responses in use-case specific, contextual information, a technique known as Retrieval Augmented Generation (RAG).
  • Generation of Harmful Content: Developers should assess outputs for their context and use available safety classifiers or custom solutions appropriate for their use case.
  • Misuse: Other forms of misuse such as fraud, spam, or malware production may be possible, and developers should ensure that their applications do not violate applicable laws and regulations.

Citation

If you want to cite this model you can use this:

@misc{bondarenko2024meno,
  title={Meno-Tiny: A Small Russian Language Model for Question Answering and Other Useful NLP Tasks in Russian},
  author={Bondarenko, Ivan},
  publisher={Hugging Face},
  journal={Hugging Face Hub},
  howpublished={\url{https://huggingface.co/bond005/meno-tiny-0.1}},
  year={2024}
}