Автор Гілка: lapa — велика мовна модель для української мови  (Прочитано 1346 раз)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
lapa — це модифікована версія Gemma3, у якій замінено близько 80 тисяч токенів на українські, що дозволяє моделі працювати з українською мовою в 1,5 рази ефективніше ніж Gemma3. Модель демонструє добре знання особливостей української мови.

Спробувати: https://huggingface.co/spaces/lapa-llm/lapa
Проєкт: https://github.com/lapa-llm/lapa-llm
Модель: https://huggingface.co/lapa-llm
[Fedora Linux]

Відсутній ps

  • Дописувач
  • **
  • дописів: 86
  • Карма: +0/-0
Дякую за посилання! Я тільки недавно спробував локальний сервер підняти, щоправда мій комп'ютер тягне моделі до 5 Гб.

А наскільки безпечні моделі від третіх розробників?
Там просто нейронна сітка чи ще якісь заголовки, або вбудована телеметрія? Ну тобто чи безпечно ставити все підряд з робочої машини...

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
А наскільки безпечні моделі від третіх розробників?
Там просто нейронна сітка чи ще якісь заголовки, або вбудована телеметрія? Ну тобто чи безпечно ставити все підряд з робочої машини...

Модель — це просто дані, але якщо модель підтримує роботу з інструментами і їй дати в руки якісь потужні інструменти, то вона може нашкодити або передати дані про запит.

Цитата
Я тільки недавно спробував локальний сервер підняти, щоправда мій комп'ютер тягне моделі до 5 Гб.

На 5Гб можна запустити якусь модель на 5-8 мільярдів параметрів з квантуванням 4 і маленьким контекстом на пару тисяч токенів. Lapa 1.2 12b з квантуванням 4 і контекстом 4096 займає 9Гб в памʼяті, тоді як розмір файлу — всього 7Гб. (Запускав під ollama 0.13)

NAME                                  ID              SIZE      PROCESSOR    CONTEXT    UNTIL             
lapa-v0.1.2-instruct-Q4_K_M:latest    4b0fa1a13cdb    9.1 GB    100% GPU     4096       4 minutes from now   

Модель працює швидко і дуже добре розуміє українську мову, але досить часто зациклюється, на жаль. Не знаю як це виправити. З mamay (україномовна модель на основі Gemma2) така сама ситуація. :-/
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
Я би долучився до такого проєкту, бо я сам над думав щось таке зробити.

Я зараз використовую ШІ для перекладу файлів Gettext PO. Я написав програмку, яка розбиває файл на окремі повідомлення перекладає їх по одному. Я використовую ollama + консольний aichat. Найбільші проблеми, з якоми я зіткнувся, це нестабільність роботи ШІ: він часто помиляється, а також відсутність памʼяті — одні й ті ж виправлення доводиться робити кожного разу. Це вимагає багато ручної роботи. Я думаю або робити додаткове тренування для моделі (але ще не навчився як це робити), або використовувати базу даних з RAG (знову ж таки, ще тільки вчуся), щоб уникати повторів помилок — тоді це зменшить навантаження на оператора з часом.

Lapa/Mamay погано підходять для автоматичних перекладів бо вони зациклюються. Я у себе поставив великі пенальті за повтори, але вони все одно зациклюються час від часу, і зʼїдають процесор.

[Fedora Linux]

Відсутній BeSiDa

  • Кореспондент
  • ***
  • дописів: 186
  • Карма: +1/-0
Можете ловити цикли та зупиняти для особистого розбору ситуації.

А ви додаєте контекст з описом або маном тієї команди та інших перекладених вже повідомлень?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
Можете ловити цикли та зупиняти для особистого розбору ситуації.
Можу, але це потрібно переписувати програму.

А ви додаєте контекст з описом або маном тієї команди та інших перекладених вже повідомлень?

Я контекст додаю в підказці перекладу. Я не міг весь довідник запихнути в контекст, бо я використовував маленький контекст (у мене було тоді 16ГіБ памʼяті). Зараз я збільшив памʼять до 64ГіБ, але коли я використовую великий контекст, то Ollama навіть не пробує задіяти відеокарту (там всього 16ГіБ памʼяті), а всі обрахунки робить на процесорі, тобто ще повільніше.

У таких випадках, для контексту радять використати RAG (Retrieval-Agumented Generation —  Генерація з підтримкою отримання інформації), тобто контекст ріжеться на шматки, перетворюється у вектори, зберігається в базу даних, а потім запит так само перетворюється на вектор і робиться пошук по базі щодо близьких по косинусу векторів, і тоді перші кілька найкращих збігів додаються до контексту.

Я, на жаль, ще не мав часу розібратися детально з цією технологією, тому мені доводиться робити багато ручної роботи після перекладу.
[Fedora Linux]

Відсутній ps

  • Дописувач
  • **
  • дописів: 86
  • Карма: +0/-0
Цитата
Я би долучився до такого проєкту, бо я сам над думав щось таке зробити.
це ви мабуть написали відповідь до посту, який я дропнув.

якщо мова про локалізацію новин, то я ось в прогресі насправді: вже зробив мінімальний програмний комплекс:

* rssto-crawler - демон що моніторить і кравлить контент з фідів RSS, контент забирається не тільки з фіду, але й з його цільового URL по селектору (тобто скрапер)
* rssto-http - поки простий веб-сервер на базі фреймворку Rocket, там багато роботи але список з бази він тягне, є пагінація, згодом додам пошук (але тут може є сенс мантікору задіяти)
* rssto-llm - демон для моніторингу обнов БД з подальшим пост-процесингом з перекладів на потрібну модель (мною тестується на llama.cpp на базі рекомендованого Мамай)
* rssto-mysql - окрема шейред бібліотека для усіх 3-х крейтів вище

репозиторій тут:
https://github.com/YGGverse/rssto/tree/mysql

доками поки не покрив, бо завалило роботою, повернусь згодом, але напишу що прогрес в цьому напрямку є, якщо комусь потрібно.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
Ну я використовую для перекладу ollama + aichat + свою власну утиліту: https://github.com/vlisivka/po-tools-rust , яка написана чисто для свої потреб.

Я спочатку завантажив lapa-v0.1.2-instruct-Q4_K_M.gguf з HuggingFace і створив Modelfile для Lapa:
Код: Text
  1. FROM lapa-v0.1.2-instruct-Q4_K_M.gguf
  2. TEMPLATE """
  3. {{- range $i, $_ := .Messages }}
  4. {{- $last := eq (len (slice $.Messages $i)) 1 }}
  5. {{- if or (eq .Role "user") (eq .Role "system") }}<start_of_turn>user
  6. {{ .Content }}<end_of_turn>
  7. {{ if $last }}<start_of_turn>model
  8. {{ end }}
  9. {{- else if eq .Role "assistant" }}<start_of_turn>model
  10. {{ .Content }}{{ if not $last }}<end_of_turn>
  11. {{ end }}
  12. {{- end }}
  13. {{- end }}
  14. """
  15.  
  16. PARAMETER temperature 0.1
  17. PARAMETER top_p 0.95
  18. PARAMETER top_k 64
  19. PARAMETER num_ctx 4096
  20. PARAMETER stop ["<eos>","<start_of_turn>","<end_of_turn>","</message>"]
  21. PARAMETER repeat_penalty 1.5
  22. PARAMETER presence_penalty 0.1
  23. PARAMETER frequency_penalty 0.1
  24.  
  25. SYSTEM """Ти професійний висококваліфікований технічний перекладач з англійської мови на українську мову.
  26. Ти знаєш всі ньюанси перекладу повідомлень у форматі Gettext .po.
  27. Ти зберігаєш технічні терміни та спецсимволи недоторканими, але, водночас, застосовуєш всю потужність української мови для перекладу людського тексту."""
  28.  

Потім створив модель у Ollama:
ollama create lapa-v0.1.2-instruct-Q4_K_M -f Modelfile-lapa

Створив свою роль  ~/.config/aichat/roles/translate-po.md для перекладів у aichat ( https://github.com/sigoden/aichat ):

Код: Text
  1. ---
  2. model: ollama:codestral:22b-v0.1-q5_K_S
  3. temperature: 0
  4. top_p: 0
  5. ---
  6. <instruction>
  7.  
  8. **Будь ласка, переклади наступне повідомлення українською мовою у
  9. форматі Gettext PO (тобо msgid — англійською, а msgstr - українською),
  10. переконавшись, що всі прикметники узгоджуються з іменниками за родом,
  11. числом і відмінком. Якщо ти не впевнений у граматичній коректності,
  12. поясни, чому ти обрав саме таку форму.**
  13.  
  14. * **Accuracy:** Leave technical symbols as is, such as command line options, special characters.
  15.  
  16. Example:
  17.  
  18. msgid  "-frust-edition=[unwind|abort]             Panic strategy to compile crate with"
  19. msgstr "-frust-edition=[unwind|abort]             Стратегія паніки для компіляції крейта з використанням"
  20. </instruction>
  21.  

(Цю роль я постійно підправляю під свої потреби, в залежності від того що і чим я перекладаю, тому що це найшвидше і дає найбільше гнучкості).

І викликаю мою утиліту так (див. po-tools translate --help ):
Код: Bash
  1. #!/bin/bash
  2. #MODEL="codestral:22b-v0.1-q5_K_S
  3. #MODEL="aya-expanse:32b-q3_K_S"
  4. #MODEL="gemma3n:latest"
  5. #MODEL="mistral-small3.2:latest"
  6. MODEL="lapa-v0.1.2-instruct-Q4_K_M:latest"
  7. #MODEL="MamayLM-Gemma-3-12B-IT-v1.0.Q4_K_M:latest"
  8.  
  9. exec po-tools -c 3 translate -m "ollama:$MODEL" un.po | tee tr-uk-"$MODEL".po
  10.  

де un.po — це поточний робочий файл з неперекладеними повідомленнями.

Далі я переглядаю вручну всі переклади і виправляю вручну чи відкидаю все, що не сподобалося. Далі я мерджу перекладений текст в один файл, а неперекладений в інший, і знову пробую перекласти, але іншою моделлю.

Це все писалося для себе (я перекладав gcc), але якістю перекладів я все ще не задоволений і все ще багато ручної роботи.

В po-tools мені багато чого не подобається, багато чого треба додати (словник, RAG, автоматичне переключення на іншу запасну модель, підказку, чи роль у випадку невдачі, покращити інтерфейс), але немає вже здоровʼя та часу на все що хочеться.
« Змінено: 2026-01-09 08:54:27 від Володимир Лісівка »
[Fedora Linux]

Відсутній BeSiDa

  • Кореспондент
  • ***
  • дописів: 186
  • Карма: +1/-0
А чому у вас перший системний промпт з русизмом, а другий без? :)
Цитата
з англійської мови на українську мову
"англомовних текстів українською мовою" мабуть

Відсутній ps

  • Дописувач
  • **
  • дописів: 86
  • Карма: +0/-0
Володимир Лісівка, дякую за детальний приклад з посиланнями. Так бачу, що Message типу "System" - це щось типу "програмування" моделі а "User" - це власне клієнтські повідомлення? Бо я оце думаю куди писати йому префікс "Переклади українською:".

У цілому, так трохи розібрався в темі а так бачу що тут як і з класичними парсерами потрібен кастомний тюнінг, чудес не буває :)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
Володимир Лісівка, дякую за детальний приклад з посиланнями. Так бачу, що Message типу "System" - це щось типу "програмування" моделі а "User" - це власне клієнтські повідомлення? Бо я оце думаю куди писати йому префікс "Переклади українською:".

Все залежить від того, як модель натренована. Багато навчальних текстів для моделей ШІ має три частини на етапі тренування виконання завдань, це system — опис ролі, яку виконує модель (напр. вчитель, чи науковець, чи помічник), user — це питання користувача, та assistant (або model) — це відповідь, яка очікується від ШІ.

Хоча зараз також популярне навчання у стилі «виконуй інструкцію», де є інструкція, якийсь вхідний текст, який необхідно опрацювати, і очікуваний результат (наприклад: https://huggingface.co/datasets/lapa-llm/wiki-instruction-dialogs ).

Це розділення потрібне, щоб користувач не міг перепрограмувати модель, випадково чи навмисно, своїми запитаннями.

Тобто в system можна написати «Ти перекладач з англійської на українську мову. Виконуй запити користувача.», а в user: «Переклади це повідомлення з англійської на українську:» чи «Переклади це повідомлення з української на англійську:».

АЛЕ, як виявилося, Лапа тренувалася інакше:

  - path: lapa-llm/antipropaganda-safe
    type: chat_template
    field_messages: conversations
    drop_system_message: true
    message_property_mappings:
      role: from
      content: value
Дані: https://huggingface.co/datasets/lapa-llm/antipropaganda-safe .
Шаблон: https://huggingface.co/lapa-llm/lapa-v0.1.2-instruct/blob/main/chat_template.jinja

Опція drop_system_message: true вказує на те, що system при тренуванні не використовувалося і в даних цих інструкцій теж нема, а в шаблоні для тренування прямо написано що текст має бути діалогом в стилі user/assistant/user/assistant/....

Тому, можливо system і не дуже потрібен Лапі.   :-\
« Змінено: 2026-01-11 09:43:26 від Володимир Лісівка »
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3997
  • Карма: +27/-0
  • Програміст
Gemini покритикував мій Modelfile для Лапи, але з його правками краще не стало, навпаки — стало більше помилок.

Я включив відлагодження в ollama ( Environment="OLLAMA_DEBUG=2" в ollama.service), і нарешті побачив що там реально відсилається на Лапу, після чого вирішив радикально спростити текст, і стало тільки гірше.  :o

Коротше, гра зводиться до того, щоб правильний результат був найбільш імовірним токеном у відповіді моделі, а для цього дуже важливий контекст і те, як модель тренувалася.

Я спробував RAG: класна штука для документації. Я всмоктав документацію по останній версії драйвера, і модель тоді здатна досить точно відповідати про настройки саме цього драйвера українською мовою, тому що ШІ просто читає зі шпаргалки.

Але дуже важлива правильна нарізка даних на шматки, і хороші моделі для генерації векторів сенсу, які розуміють як мову документа (англійську) так і мову запитів (українську), щоб вектори сенсу були приблизно однакові. Розумна модель дуже довго працює (я не дочекався), а не дуже розумна модель швидка, але не дуже розумна.

Також дуже важливо зробити контекст достатньо великого розміру і покласти туди достатньо шматків з оригінального тексту, а у мене не так багато памʼяті на відеоплаті. Можливо я просто перейду на генерацію на процесорі, бо у мене відеокарта всеодно глючить від сучасного ШІ (виробник Gigabyte попереджає у своїй утиліті AITOP що треба оновити BIOS для стабільної роботи, але для мого ноутбука, якому 3 роки всього, оновлення BIOS він так і не випустив, дарма я з китайцем звʼязався).

Я спробував використати RAG для перекладів: з одного боку класно що він накидує контекст автоматично, подібно на fuzzy matching в gettext, так що мені не потрібно заморочуватися зі словником чи прикладами, але з іншого боку, навіть мінімальна модель всеодно вивантажує мою основну модель з памʼяті, бо памʼяті у мене не вистачає, і це завантаження/вивантаження/завантаження/вивантаження/... дуже сповільнює роботу.

У мене три варіанти: генерувати контекст вручну з 1) допомогою ШІ чи 2) fuzzy matching з gettext до початку перекладу, або натренувати якусь модель на існуючих перекладах. Я вирішив піти третім шляхом використовуючи LLaMAFactory. Тренується ніби швидко для малих моделей (4 ГП), які в памʼять влазять. Але з цими відключеннями світла це лотерея.
[Fedora Linux]