Почему ChatGPT не понимает тайваньский сленг?
Представь: ты спрашиваешь у ChatGPT, где в Тайбэе найти лучший баобао (это не китайская булочка, а местный сэндвич). В ответ получаешь рецепт паровых булочек. Или спрашиваешь про лакка (зеленый сок из горькой дыни) — модель рекомендует латте. Глобальные LLM обучены на стандартном мандаринском, но тайваньский вариант китайского — это отдельный мир с собственными идиомами, заимствованиями из тайваньского языка, японскими следами и уникальным культурным кодом.
Не путай: традиционный китайский (Тайвань) и упрощенный (материковый Китай) — это не только разные иероглифы, но и разные референсы, юмор, мемы, даже политические эвфемизмы.
Twinkle AI родилась из этой боли. Стартап из Тайбэя решил создать ИИ-ассистента, который говорит на языке тайваньцев, понимает местные законы (например, про аренду жилья или налоги для фрилансеров), и знает, что "пойти выпить пузырькового чая" — это не про чай, а про социальный ритуал.
Выбор основы: почему Gemma 3, а не Llama 3.1?
Когда мы начинали проект, у нас был выбор: взять открытую модель от Meta или Google. Llama 3.1 мощная, но Gemma 3 4B оказалась идеальной для нашего случая. Причины:
- Размер: 4 миллиарда параметров — достаточно для понимания контекста, но достаточно мало, чтобы дообучить на одном GPU за разумное время.
- Лицензия: Gemma 3 разрешает коммерческое использование без ограничений, в отличие от Llama, которая требует отчетности при большом числе пользователей.
- Качество: В бенчмарках для китайского языка Gemma 3 показывает результаты близкие к большим моделям, особенно после тонкой настройки.
Кстати, если тебе интересно, как заставить маленькую модель думать как большая, посмотри статью про Тёмную цепочку мыслей для Gemma 3. Там как раз трюки для улучшения рассуждений.
1 Сбор данных: что такое "тайваньскость" в текстах?
Самый сложный этап. Нам нужно было собрать датасет, который отражает именно тайваньский языковой и культурный контекст. Мы использовали:
- Форумы: PTT (местный аналог Reddit), Dcard (популярный среди молодежи).
- Новости: Тайваньские СМИ, но только те, что пишут на традиционном китайском.
- Соцсети: Facebook, Instagram (тайваньские блогеры, мемы).
- Государственные документы: Законы, формы, инструкции — чтобы модель знала бюрократический язык.
Всего собрали 2 миллиона текстовых документов, около 10GB чистого текста. Очистка данных заняла больше времени, чем сбор. Пришлось удалять спам, рекламу, и самое главное — контент с упрощенными иероглифами (материковый Китай).
Важно: тайваньский интернет полон контента с материка. Мы использовали детектор иероглифов (традиционные vs. упрощенные) и фильтровали по IP (если возможно). Но лучше всего — ручная проверка выборки.
2 Подготовка данных: токенизация и форматирование
Gemma 3 использует токенизатор на базе SentencePiece. Но для традиционного китайского есть нюансы: некоторые иероглифы разбиваются на суб-токены неоптимально. Мы добавили частые тайваньские иероглифы и слова в словарь токенизатора.
Формат данных для обучения — инструкции. Каждый пример выглядит так:
{
"instruction": "Как получить разрешение на строительство дома в Тайване?",
"input": "",
"output": "Для получения разрешения на строительство в Тайване необходимо подать заявление в местный отдел градостроительства. Требуются следующие документы: 1) план участка, 2) архитектурный проект, 3) подтверждение права собственности. Срок рассмотрения — 30 рабочих дней."
}
Мы создали 50 тысяч таких инструкций, покрывающих бытовые, юридические, медицинские и культурные темы. Часть сгенерировали с помощью GPT-4 (предварительно настроенного на тайваньский контекст), часть написали вручную.
3 Тонкая настройка: LoRA или полное обучение?
Полное обучение 4B-модели требует нескольких GPU и недели времени. Мы выбрали LoRA (Low-Rank Adaptation) — это эффективный метод, который обучает только маленькие адаптеры, встроенные в модель. Результат почти такой же, как при полном обучении, но в 10 раз быстрее и дешевле.
Использовали библиотеку Unsloth (ускоряет обучение LoRA в 2 раза) и Hugging Face Transformers. Код обучения:
from unsloth import FastLanguageModel
import torch
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="google/gemma-3-4b",
max_seq_length=2048,
dtype=torch.float16,
load_in_4bit=True, # Используем QLoRA
)
model = FastLanguageModel.get_peft_model(
model,
r=16, # Rank параметров LoRA
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_alpha=16,
lora_dropout=0,
bias="none",
use_gradient_checkpointing=True,
random_state=42,
)
# Тренировочные параметры
trainer = Trainer(
model=model,
train_dataset=train_dataset,
args=TrainingArguments(
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_steps=100,
num_train_epochs=3,
learning_rate=2e-4,
fp16=True,
logging_steps=10,
output_dir="outputs",
),
)
trainer.train()
Обучение заняло 12 часов на RTX 4090. Если у тебя карта с меньшей VRAM, посмотри статью про RTX 5070 Ti и переполнение VRAM, чтобы избежать проблем с памятью.
Для более детального разбора LoRA рекомендую практическое руководство по тренировке LoRA для VibeVoice. Там много применимых концепций, хотя речь о голосовой модели.
4 Function Calling: как модель взаимодействует с внешним миром
Twinkle AI не просто чат-бот. Она умеет вызывать функции: проверять погоду, искать рейсы, рассчитывать налоги. Для этого мы использовали встроенный в Gemma 3 механизм function calling (аналогично OpenAI).
Определяем функции в JSON-формате и передаем их модели. Модель решает, когда какую функцию вызвать. Например:
functions = [
{
"name": "get_weather",
"description": "Получить погоду в городе Тайваня",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Название города, например, Тайбэй"},
},
"required": ["city"]
}
}
]
Обучение модели на вызов функций — отдельная задача. Мы использовали синтетические диалоги, где модель должна была решить, вызывать функцию или ответить самостоятельно. Важно: модель иногда генерирует вызов функции, когда это не нужно. Пришлось дорабатывать пост-обработку.
5 Развертывание: vLLM или llama.cpp?
После обучения модель нужно обслуживать. Выбор бэкенда критичен для производительности. Мы тестировали vLLM и llama.cpp. vLLM отлично подходит для GPU-серверов, поддерживает динамическую батчизацию и эффективно использует память. llama.cpp лучше для CPU или edge-устройств.
Поскольку мы развертывали на облачном GPU (NVIDIA A10G), выбрали vLLM. Скрипт запуска:
python -m vllm.entrypoints.openai.api_server \
--model ./twinkle-ai-gemma-3-4b-lora \
--served-model-name twinkle-ai \
--max-model-len 2048 \
--gpu-memory-utilization 0.9
Для детального сравнения бэкендов смотри статью про vLLM против llama.cpp.
Ошибки, которые мы совершили (чтобы ты их не повторил)
- Слишком много данных с материка: Первая версия модели использовала упрощенные иероглифы и материковые референсы. Пришлось пересобирать датасет.
- Недооценка токенизации: Изначально не адаптировали токенизатор, из-за чего модель плохо понимала редкие тайваньские слова.
- Функции без валидации: Модель иногда вызывала функции с неверными параметрами. Добавили строгую валидацию на стороне сервера.
- Игнорирование контекстного окна: Gemma 3 4B имеет контекст 8192 токена, но мы изначально ограничились 2048. Увеличив контекст, улучшили качество в длинных диалогах. Кстати, о контексте: если тебе нужно, чтобы модель помнила длинные истории, посмотри статью о памяти для длинных историй.
FAQ: ответы на частые вопросы
| Вопрос | Ответ |
|---|---|
| Сколько стоит создать такую модель? | Обучение: ~$100 на облачном GPU (если использовать LoRA). Сбор данных: от $500 до $5000 в зависимости от объема и чистоты. |
| Можно ли адаптировать под другой регион? | Да, процесс аналогичен. Нужно собрать локализованные данные и дообучить модель. Например, для Гонконга или Макао. |
| Как оценить качество? | Мы использовали человеческую оценку (тайваньские носители) и бенчмарки для китайского языка, например, C-Eval и TMMLU. |
| Модель понимает тайваньский язык (хоккиен)? | Частично. Мы добавили данные на тайваньском, но основное внимание — традиционный китайский с местными особенностями. |
Что дальше? Гиперлокальные модели как тренд
Twinkle AI — только начало. Мы видим, как нишевые модели для конкретных городов, диалектов, профессиональных сообществ становятся востребованными. Зачем платить за огромную универсальную модель, если можно иметь маленькую, но идеально заточенную под свои нужды?
Если тебе интересны нишевые ИИ-инструменты, посмотри подборку из 4 нишевых ИИ-инструментов. Там есть примеры для вдохновения.
А еще, если хочешь заглянуть в будущее, где LLM могут устареть, почитай про World Models — следующий прорыв в ИИ.
Создание гиперлокальной модели — это не магия, а инженерная работа. Но когда видишь, как тайваньский студент спрашивает у твоего ИИ про аренду квартиры и получает точный ответ с ссылками на местные законы — понимаешь, что оно того стоит.