Meno Tiny 0.1
模型简介
模型特点
模型能力
使用案例
🚀 Meno-Tiny-0.1
Meno-Tiny-0.1 是基于 Qwen2.5-1.5B-Instruct 模型的派生模型,它在一个特殊的俄语指令数据集上进行了微调。这是一个具有 15 亿参数的解码器语言模型,基于带有 SwiGLU 激活函数、注意力 QKV 偏置、分组查询注意力等的 Transformer 架构。“Meno” 这个名字与该模型在 RAG 管道中回答文本问题的适配性有关(以苏格拉底对话《美诺篇》中知识即回忆的理论命名)。
🚀 快速开始
Meno-Tiny-0.1 的代码已集成在最新的 Hugging face transformers
库中,我们建议你使用最新版本的 transformers
。
如果你使用 transformers<4.37.0
,将会遇到以下错误:
KeyError: 'qwen2'
下面为你提供一段使用 apply_chat_template
的代码片段,展示如何加载分词器和模型,以及如何生成内容。
Meno-Tiny-0.1 在微调阶段专门进行了“俄语化”处理,但它仍然保留了用英语回答问题的能力。以下是与 Meno-Tiny-0.1 分别用英语和俄语进行交流的两个示例。
💻 使用示例
基础用法
# 英文交流示例
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)
# 俄语交流示例
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)
高级用法
使用不同的系统和用户提示与 Meno-Tiny-0.1 交互,可以发现它的各种能力。Meno-Tiny-0.1 能够解决的主要任务,包括少样本提示模式下的任务,有:
- 回答关于文本的问题;
- 文本摘要;
- 确定文本毒性并对文本进行解毒;
- 指代消解;
- 纠正语音识别错误;
- 等等。
以下是一些用俄语与 Meno-Tiny-0.1 交流以解决各种专业任务的示例。
# 回答关于文档的问题示例
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)
# 文本摘要示例
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)
# 对话中指代消解示例(少样本提示)
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)
# 语音识别输出纠正示例(少样本提示)
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)
📚 详细文档
基准测试
我在 MERA 上报告了 Meno-Tiny-0.1 的完成格式结果,MERA 是一个知名的开源独立基准测试,用于评估俄语的最先进模型。
MERA 基准测试展示了 59 个大语言模型解决 20 多个问答、信息检索、逻辑、常识推理等任务的结果。以下是部分精选结果,完整的排行榜可在 https://mera.a-ai.ru/en/leaderboard 查看。
排名 | 模型 | 规模 | 总体得分 |
---|---|---|---|
1 | GPT4o | - | 0.642 |
2 | RuadaptQwen-32B-instruct | 320 亿 | 0.615 |
3 | Qwen2.5-32B-Instruct | 320 亿 | 0.603 |
... | ... | ... | ... |
6 | GigaChat Max | - | 0.588 |
7 | Mistral-Large-Instruct-2407 | 1230 亿 | 0.574 |
8 | GPT4o-mini | - | 0.570 |
... | ... | ... | ... |
12 | GigaChat Pro | - | 0.512 |
13 | GigaChat | - | 0.500 |
... | ... | ... | ... |
19 | Phi-3-medium-4k-instruct | 140 亿 | 0.465 |
... | ... | ... | ... |
34 | Yi-1.5-9B-Chat-16K | 140 亿 | 0.373 |
35 | Meno-Tiny-0.1 | 15 亿 | 0.365 |
36 | Qwen2.5 1.5B Instruct | 15 亿 | 0.358 |
... | ... | ... | ... |
44 | Mistral-7B-Instruct-v0.2 | 72 亿 | 0.318 |
45 | Mistral-7B-Instruct-v0.3 | 72 亿 | 0.311 |
46 | Yi-Coder-9B-Chat | 90 亿 | 0.308 |
... | ... | ... | ... |
59 | Qwen2.5-Math-1.5B-Instruct | 15 亿 | 0.207 |
MultiQ 任务
MultiQ 是一个俄语的多跳问答(QA)数据集,适用于一般的开放域问答、信息检索和阅读理解任务。MultiQ 任务的结果对于评估大语言模型(LLM)在检索增强生成(RAG)管道中的应用效果至关重要。
排名 | 模型 | 规模 | MultiQ 得分 |
---|---|---|---|
1 | Mistral-Large-Instruct-2407 | 1230 亿 | 0.630 / 0.471 |
2 | Meta-Llama-3.1-405B-Instruct | 4050 亿 | 0.623 / 0.453 |
3 | Meta-Llama-3.1-70B-Instruct | 706 亿 | 0.607 / 0.443 |
... | ... | ... | ... |
7 | GPT4o | - | 0.572 / 0.431 |
... | ... | ... | ... |
10 | GPT4o-mini | - | 0.509 / 0.379 |
11 | Mixtral-8x22B-Instruct-v0.1 | 1406 亿 | 0.521 / 0.366 |
12 | Qwen2-57B-A14B-Instruct | 574 亿 | 0.480 / 0.348 |
13 | ruadapt llama3-8B-instruct lep ft | 84 亿 | 0.483 / 0.334 |
14 | GigaChat Max | - | 0.486 / 0.322 |
... | ... | ... | ... |
21 | Qwen2.5-Coder-7B-Instruct | 70 亿 | 0.399 / 0.302 |
22 | Meno-Tiny-0.1 | 15 亿 | 0.399 / 0.29 |
23 | Yi-1.5-34B-Chat | 344 亿 | 0.416 / 0.266 |
... | ... | ... | ... |
25 | Qwen2.5-3B-Instruct | 30 亿 | 0.391 / 0.263 |
26 | GigaChat | - | 0.367 / 0.250 |
... | ... | ... | ... |
59 | Qwen2.5-Math-7B-Instruct | 70 亿 | 0.003 / 0.000 |
预期用途
主要用例
Meno-Tiny-0.1 旨在用于俄语的商业和研究用途。它为通用人工智能系统和应用程序提供支持,适用于以下场景:
- 内存/计算资源受限的环境;
- 对延迟有要求的场景。
Meno-Tiny-0.1 旨在加速语言模型的研究,可作为检索增强生成(RAG)管道的构建块。
使用场景考虑
该模型并非专门为所有下游用途设计或评估。开发者在选择使用场景时应考虑语言模型的常见局限性,并在特定下游用例中使用之前,评估和缓解准确性、安全性和公平性问题,特别是在高风险场景中。开发者应了解并遵守与其使用场景相关的适用法律或法规(包括隐私、贸易合规法律等)。
本模型卡片中的任何内容都不应被解释为或视为对模型发布许可证的限制或修改。
负责任的人工智能考虑
与其他语言模型一样,Meno-Tiny-0.1 可能会表现出不公平、不可靠或冒犯性的行为。需要注意的一些限制行为包括:
- 服务质量:Meno-Tiny-0.1 主要在俄语文本上进行微调。非俄语语言的性能会较差,并且不同非俄语语言之间的性能也会存在差异。
- 安全漏洞:我认为让俄语用户更广泛地使用语言模型很重要,但由于 Meno-Tiny-0.1 基于多语言的 Qwen2.5-1.5B-Instruct 模型,它仍然存在多语言版本中常见的挑战。与任何大语言模型的部署一样,开发者应更好地针对其语言和文化背景测试性能或安全漏洞,并通过额外的微调和适当的保障措施对 Meno-Tiny-0.1 进行定制。
- 伤害表征与刻板印象延续:Meno-Tiny-0.1 可能会过度或不足地代表某些人群,抹去某些群体的代表性,或强化贬低性或负面的刻板印象。尽管进行了安全后训练,但由于不同群体的代表性水平不同、文化背景差异或训练数据中反映现实世界模式和社会偏见的负面刻板印象示例的普遍存在,这些局限性可能仍然存在。
- 不适当或冒犯性内容:Meno-Tiny-0.1 可能会产生其他类型的不适当或冒犯性内容,在没有针对具体情况采取额外缓解措施的情况下,可能不适合在敏感环境中部署。
- 信息可靠性:语言模型可能会生成无意义的内容或编造听起来合理但不准确或过时的内容。
- 长对话:与其他模型一样,Meno-Tiny-0.1 在俄语和非俄语的长对话中,有时可能会生成重复、无用或不一致的回复。建议开发者采取适当的缓解措施,例如限制对话轮数以应对可能的对话漂移。
开发者应应用负责任的人工智能最佳实践,包括映射、衡量和缓解与其特定用例以及文化、语言背景相关的风险。Meno-Tiny-0.1 是一个通用模型。当开发者计划将该模型用于特定用例时,建议针对其用例对模型进行微调,并将该模型作为具有特定语言保障措施的更广泛人工智能系统的一部分。需要考虑的重要方面包括:
- 资源分配:在没有进一步评估和额外去偏技术的情况下,Meno-Tiny-0.1 可能不适用于可能对法律地位、资源分配或生活机会(例如住房、就业、信贷等)产生重大影响的场景。
- 高风险场景:开发者应评估在高风险场景中使用 Meno-Tiny-0.1 的适用性,在这些场景中,不公平、不可靠或冒犯性的输出可能代价极高或导致伤害。这包括在准确性和可靠性至关重要的敏感或专业领域提供建议(例如法律或健康建议)。应根据部署环境在应用层面实施额外的保障措施。
- 错误信息:Meno-Tiny-0.1 可能会产生不准确的信息。开发者应遵循透明度最佳实践,并告知最终用户他们正在与人工智能系统进行交互。在应用层面,开发者可以构建反馈机制和管道,将回复与特定用例的上下文信息相结合,这种技术称为检索增强生成(RAG)。
- 有害内容生成:开发者应根据上下文评估输出,并使用适用于其用例的可用安全分类器或自定义解决方案。
- 滥用:可能存在欺诈、垃圾邮件或恶意软件生产等其他形式的滥用,开发者应确保其应用程序不违反适用的法律法规。
📄 许可证
本模型采用 Apache-2.0 许可证。
📖 引用
如果你想引用此模型,可以使用以下 BibTeX 格式:
@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}
}



