Зачем это все?
Облачные AI-ассистенты для кода умеют все. До тех пор, пока вы не попробуете заставить их проанализировать три ваших репозитория одновременно, записать изменения и запустить тесты. Это сценарий агентской работы. Контекст упрется в лимит, запросы будут долгими, а счет - космическим.
Локальные модели на Mac - очевидный выход. Но большинство из них, как показано в разборе GLM-4.7, не справляются с многошаговыми задачами. GLM-5, новая модель от Zhipu AI на февраль 2026, обещает все исправить. А MLX, фреймворк Apple, должен выжать из вашего железа максимум. Получится? Сейчас проверим.
Что имеем и что надо иметь
Забудьте про M1 с 8 ГБ. Агентское кодирование - это не чат. Вам нужно:
- Mac с Apple Silicon (M3/M4/M5). Чем новее, тем лучше Unified Memory.
- Минимум 32 ГБ ОЗУ. Идеально - 64 или 96 ГБ, как у M4 Pro. Модель в 4-битном квантовании съест ~20 ГБ.
- Python 3.10+ и понимание, что такое виртуальное окружение.
- Патентное терпение для первой настройки.
Скачивание модели GLM-5 4-bit (около 20 ГБ) займет время. Убедитесь в стабильном интернет-соединении и свободном месте на SSD. Если планируете экспериментировать с несколькими моделями, посмотрите oMLX для кеширования на диск.
Шаг за шагом: от нуля до первого кода
1 Готовим среду: MLX и компания
MLX от Apple оптимизирован для их железа. Он использует Unified Memory, избегая дорогостоящих копий между CPU и GPU. Ставим.
# Клонируем репозиторий MLX и примеры
git clone https://github.com/ml-explore/mlx-examples.git
cd mlx-examples
# Создаем и активируем виртуальное окружение (рекомендуется)
python -m venv venv
source venv/bin/activate # для Windows: venv\Scripts\activate
# Устанавливаем зависимости
pip install -r requirements.txt
pip install mlx-lm # Пакет для работы с языковыми моделями
Если pip начнет ругаться на версии, понизьте Python до 3.10. С MLX бывают такие танцы.
2 Качаем и загружаем GLM-5
На февраль 2026 доступна версия GLM-5-14B-Chat в 4-битном квантовании (GLM-5-14B-Chat-4bit). Это оптимальный выбор для баланса между качеством и потреблением памяти. Используем mlx-lm для загрузки.
# Команда загрузит модель с Hugging Face Hub в папку ~/.cache/huggingface
python -m mlx_lm.generate --model "ZhipuAI/GLM-5-14B-Chat-4bit" --prompt "Hello" --max-tokens 10
Первый запуск займет время. Файлы модели упадут в кеш. Убедитесь, что на системном диске достаточно места.
3 Пишем скрипт-агента для реальной задачи
Генерация одного ответа - скучно. Наш агент должен уметь: получить задачу, прочитать файлы из проекта, предложить изменения, сгенерировать код. Вот каркас.
import mlx.core as mx
from mlx_lm import load, generate
import os
# Загрузка модели и токенизатора
model, tokenizer = load("ZhipuAI/GLM-5-14B-Chat-4bit")
class CodingAgent:
def __init__(self, model, tokenizer):
self.model = model
self.tokenizer = tokenizer
self.context_window = []
self.max_context_tokens = 32000 # Теоретический лимит GLM-5
def add_to_context(self, text: str):
"""Добавляет текст в контекстное окно, следя за лимитом."""
new_tokens = self.tokenizer.encode(text)
self.context_window.extend(new_tokens)
# Обрезаем начало, если вышли за лимит
if len(self.context_window) > self.max_context_tokens:
self.context_window = self.context_window[-self.max_context_tokens:]
def generate_code(self, prompt: str, temperature=0.2, max_tokens=512):
"""Генерирует код на основе текущего контекста и промпта."""
full_prompt = self.tokenizer.decode(self.context_window) + "\n" + prompt
inputs = mx.array([self.tokenizer.encode(full_prompt)])
# Генерация с использованием MLX
tokens = generate(
model=self.model,
prompt=inputs,
temp=temperature,
max_tokens=max_tokens,
verbose=False
)
output = self.tokenizer.decode(tokens[0].tolist())
self.add_to_context(prompt + "\n" + output) # Обновляем контекст
return output
# Пример использования
agent = CodingAgent(model, tokenizer)
# Агент читает файл
with open("my_script.py", "r") as f:
file_content = f.read()
agent.add_to_context(f"Файл my_script.py:\n{file_content}")
# Задаем задачу по рефакторингу
task = "Найди в коде функции длиннее 20 строк и предложи, как их разбить."
result = agent.generate_code(task)
print(result)
Это упрощенный пример. В реальном агенте нужно управлять контекстом умнее: удалять нерелевантные части, суммировать.
Цифры, которые всех ждали: производительность
Тесты на MacBook Pro M4 Max 64GB Unified Memory, macOS Sequoia 15.4.
| Модель / Настройка | Скорость (токен/с) | Память (актив. ОЗУ) | Контекст (рабочий) |
|---|---|---|---|
| GLM-5-14B-Chat-4bit (MLX) | 48-52 | ~22 ГБ | до 24K токенов |
| Claude Code (через API) | ограничено сетью | не применимо | 200K (но дорого) |
| vLLM-MLX с Llama 3.1 8B | свыше 100 | ~10 ГБ | до 8K |
52 токена в секунду - это много или мало? Для интерактивного чата - нормально. Для пакетной обработки тысячи строк кода - медленно. Вспомните про жадные до токенов модели. GLM-5 не самый прожорливый, но контекст в 24K токенов он обрабатывает минуту-две.
Главный вывод: GLM-5 на MLX - инструмент для точечных, сложных задач, а не для массовой переработки кода. Нужна скорость? Берите меньшую модель. Нужна глубина понимания - GLM-5 справится, но дайте ему время.
Слон в комнате: ограничения контекста на практике
В документации GLM-5 заявлен контекст до 128K токенов. На бумаге. В 4-битной версии на MLX, с 64 ГБ ОЗУ, я стабильно получал Out Of Memory после ~24-28 тысяч токенов. Почему?
- Квантование 4-bit снижает объем памяти для весов, но не для KV-кеша. Кеш ключей-значений для внимания растет линейно с длиной контекста и съедает память.
- MLX и Unified Memory. Хотя архитектура эффективна, физический объем RAM - жесткий предел. Нет подкачки на SSD (без тормозов).
- Токенизатор. GLM-5 использует собственный токенизатор. Для кода он может быть не самым эффективным, "раздувая" количество токенов.
Что делать, если ваш проект больше 24K токенов (примерно 18K слов кода)?
- Резюмируйте. Заставьте модель сначала проанализировать файл и выдать краткое описание. Работайте с описаниями.
- Разделяйте. Агент должен уметь дробить задачу. "Проанализируй сначала модуль A, затем модуль B".
- Чистите контекст. Удаляйте из контекстного окна уже решенные подзадачи, оставляя только ключевые решения.
Если задача требует обработки гигантского контекста (полный репозиторий), рассмотрите архитектуру RAG (Retrieval-Augmented Generation) локально. Загружайте в контекст только релевантные фрагменты кода, найденные поиском по семантическому сходству.
Типичные грабли, на которые вы наступите
Ошибка: "Killed: 9" или внезапный выход.
Система убила процесс из-за нехватки памяти. Даже если в момент запуска свободно 30 ГБ, MLX может запросить большой непрерывный блок. Закройте все лишнее: браузер, IDE. Если не помогает - уменьшайте параметр max_tokens в generate и длину контекста.
Ошибка: Медленная генерация после первых десятков токенов.
Скорее всего, уперлись в лимит контекста, и модель тратит все больше времени на механизм внимания над растущим кешом. Проверьте, не накапливаете ли вы контекст без очистки. Используйте более агрессивную стратегию "скользящего окна".
Ошибка: Модель генерирует ерунду или повторяется.
Температура (temp) по умолчанию в примерах часто 0.0. Для творческих задач кодирования (рефакторинг, генерация) повысьте до 0.2-0.3. Но не переборщите, иначе код не скомпилируется.
И что в итоге?
GLM-5 на MLX - мощный, но требовательный инструмент. Он не заменит облачные сервисы в один клик. Это скорее лаборатория для экспериментов с автономным кодинг-агентом.
Будет ли он сам писать и тестировать фичи? Нет. Может ли он быть "вторым пилотом" для анализа сложного легаси-кода, когда нельзя загружать его в облако? Безусловно. Просто помните о лимитах. И если ваш проект перерос возможности одного Mac, есть безумные идеи вроде связки iPhone и Mac.
Следующий шаг - научить вашего агента не только читать код, но и запускать тесты, фиксить ошибки и коммитить изменения. Но это уже тема для отдельного эксперимента, где производительность MLX и интеллект GLM-5 столкнутся с реальностью автоматизации Git.