Meno Tiny 0.1
Model Overview
Model Features
Model Capabilities
Use Cases
🚀 Meno-Tiny-0.1
Meno-Tiny-0.1 is a derivative of the Qwen2.5-1.5B-Instruct model, fine-tuned on a specialized Russian instruct dataset. It's a 1.5B parameter language model with a decoder, based on the Transformer architecture featuring SwiGLU activation, attention QKV bias, and group query attention. The name "Meno" is linked to adapting this model for answering text-based questions in the RAG pipeline, inspired by the Socratic dialogue "Meno" theory of knowledge as recollection.
✨ Features
- Multilingual Capability: Although fine - tuned to be "Russified", it can still answer questions in English.
- Diverse Task Solving: Can handle various NLP tasks such as answering text - related questions, summarization, toxicity detection and detoxification, anaphora resolution, and speech recognition error correction.
📦 Installation
The code of Meno - Tiny - 0.1 is integrated into the latest Hugging Face transformers
. It is recommended to use the latest version of transformers
.
⚠️ Important Note
With
transformers<4.37.0
, you will encounter the following error:
KeyError: 'qwen2'
💻 Usage Examples
Basic Usage
Here are some examples to show how to interact with Meno - Tiny - 0.1 in different languages and scenarios.
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)
Advanced Usage
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": "в пораде победы на красной площади в москве премут участие свысше четырнадцать ты своим наслу"},
# The original text seems incomplete here, but we keep it as it is.
]
messages = [
{"role": "system", "content": "Correct the speech recognition output."},
{"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)
📄 License
This project is licensed under the Apache - 2.0 license.

