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}
}



