Двунаправленный переводчик
якутский (саха, sah) ↔ русский (ru) на базе
TranslateGemma-12B-IT.
Якутский — тюркский язык Сибири, не покрытый ни базовой TranslateGemma
(55 языков), ни NLLB-200, ни FLORES-200. Эта модель добавляет якутский к
Gemma 3 через дообучение на 121 376 реальных пар + self-back-translation
Out-of-domain (
OPUS Tatoeba sah-ru, 994
пары, разговорный домен):
1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3
4model_id = "lab-ii/translategemma-12b-it-sah"
5tok = AutoTokenizer.from_pretrained(model_id)
6model = AutoModelForCausalLM.from_pretrained(
7 model_id, dtype=torch.bfloat16, device_map="auto")
8
9INSTR = {
10 ("ru", "sah"): "Translate the following text from Russian to Yakut (Sakha).",
11 ("sah", "ru"): "Translate the following text from Yakut (Sakha) to Russian.",
12}
13
14def translate(text, src="ru", tgt="sah"):
15 prompt = (f"<start_of_turn>user\n{INSTR[(src, tgt)]}\n\n{text}"
16 f"<end_of_turn>\n<start_of_turn>model\n")
17 inp = tok(prompt, return_tensors="pt", add_special_tokens=True).to(model.device)
18 out = model.generate(**inp, max_new_tokens=256, do_sample=False,
19 pad_token_id=tok.pad_token_id)
20 return tok.decode(out[0][inp.input_ids.shape[1]:],
21 skip_special_tokens=True).strip()
22
23print(translate("Привет, как дела?", "ru", "sah"))
24print(translate("Дорообо!", "sah", "ru"))
После v3 LoRA сливалась в базу для финального чекпойнта.
Out-of-domain Tatoeba собран из
OPUS Tatoeba sah-ru
(v2023-04-12, 994 пары после чистки), дедуплен против train. FLORES-200 якутский не
содержит — стандартного бенчмарка нет.