Локальная лаборатория LLM
Запустите LLM на своей машине, загляните ей внутрь, измерьте скорость, поймайте галлюцинацию и соберите свой клиент с переключением провайдеров.
Цель проекта
Превратить локальную модель в рабочий инструмент: запустить её осознанно, понять её устройство и ограничения и собрать поверх неё свой первый клиент.
Задача
Пройдите пять шагов. По ходу ведите файл NOTES.md — в каждом шаге указано, что в него записать. Это не формальность: заметки превращают «я что-то запускал» в результат, который можно показать и обсудить.
Все команды и примеры из шагов есть в материалах урока — но сначала попробуйте без них: так усвоится лучше. Если совсем застряли, то задайте вопрос в чат потока.
Шаг 1. Запустите модель (~20 минут)
Поставьте Ollama или LM Studio — а лучше оба, они пригодятся на разных шагах. Выберите модель под свою память: посмотрите, сколько у вас RAM, и прикиньте, какой размер модели и какая квантизация в неё поместятся. Поговорите с моделью, убедитесь, что она отвечает.
В NOTES.md: сколько у вас памяти, какую модель и квантизацию выбрали и почему.
Шаг 2. Загляните внутрь (~20 минут)
Найдите свою модель (или её исходный вариант) на Hugging Face и откройте «Files and versions»:
- В
config.jsonнайдите количество слоёв и размерность — те самые гиперпараметры из лекции по архитектуре - Сложите размеры шардов весов — столько модель заняла бы в памяти в FP16
- Найдите GGUF-вариант модели и сравните размер вашей квантизации с полным
В NOTES.md: num_hidden_layers, hidden_size, размер весов в FP16 и в вашей квантизации.
Шаг 3. Измерьте скорость (~20 минут)
Ollama возвращает метрики генерации в /api/generate: eval_count — сколько токенов сгенерировано, eval_duration — за сколько наносекунд. Скорость = eval_count / (eval_duration / 1e9) токенов в секунду.
Сравните две модели разного размера или одну модель в двух квантизациях (команда замера есть в материалах урока, раздел «Размер моделей и квантизация»).
В NOTES.md: табличка «модель → токенов в секунду» и вывод в одно предложение.
Шаг 4. Поэкспериментируйте с поведением (~40 минут)
Три эксперимента из лекции — повторите их сами через API или свой код:
- Отсутствие памяти. Первый запрос: представьтесь модели. Второй, без истории: спросите, как вас зовут. Третий: тот же вопрос, но с полной историей в
messages. - Temperature. Один творческий промпт, по три прогона при
temperature=0.0иtemperature=1.5. - Галлюцинация. Добейтесь от маленькой модели (1B) уверенного выдуманного факта — спросите о малоизвестном человеке или событии. Задайте тот же вопрос модели побольше и сравните.
В NOTES.md: по паре строк на эксперимент — что увидели.
Шаг 5. Соберите свой клиент (~60 минут)
Финал — собственный мини-клиент: программа, которая в цикле читает ваш вопрос из терминала, отправляет его модели и печатает ответ. По сути «ChatGPT без браузера» — только без памяти: каждый вопрос для модели первый (вы видели это в шаге 4).
Понадобится пакет openai (pip install openai). Создайте файл chat.py:
from openai import OpenAI
PROVIDERS = {
"ollama": {"base_url": "http://localhost:11434/v1",
"api_key": "ollama",
"model": "llama3.1:8b"},
"lmstudio": {"base_url": "http://localhost:1234/v1",
"api_key": "lm-studio",
"model": "имя-модели-из-LM-Studio"},
}
def ask(question, provider="ollama"):
cfg = PROVIDERS[provider]
client = OpenAI(base_url=cfg["base_url"], api_key=cfg["api_key"])
response = client.chat.completions.create(
model=cfg["model"],
messages=[{"role": "user", "content": question}],
)
return response.choices[0].message.content
while True:
print(ask(input("Вы: ")), "\n")
Как это работает:
PROVIDERS— настройки подключений. Библиотекаopenaiумеет говорить с любым сервером, понимающим формат Chat Completions: меняются только адрес, ключ и имя модели. Для Ollama подставьте модель, которую скачали в шаге 1 (ollama listнапомнит имя); ключ Ollama не проверяет, годится любая строка.ask()отправляет один вопрос и возвращает текст ответа — без истории.- Цикл внизу бесконечно спрашивает и отвечает. Выход —
Ctrl+C.
Запустите python3 chat.py и поговорите с моделью. Затем включите сервер в LM Studio (вкладка Developer, по умолчанию порт 1234), впишите имя загруженной там модели в PROVIDERS и поменяйте провайдера: ask(..., provider="lmstudio"). Тот же код — другой провайдер; в этом главный смысл шага. Вместо LM Studio можно подключить OpenRouter или OpenAI — добавьте запись в PROVIDERS с их адресом и настоящим ключом.
Когда базовый вариант заработал, добавьте хотя бы одно своё улучшение, например:
- Выбор провайдера и модели аргументами командной строки
- Вывод скорости (токенов в секунду) после каждого ответа
- Потоковый вывод ответа по мере генерации
- Цветной вывод, команда выхода — на ваш вкус
- Придумайте что-то своё
Со звёздочкой (по желанию)
Одно из:
- Vision: мультимодальная модель (Gemma 3, Qwen-VL) + скриншот → структурированные данные в JSON
- Reasoning: запустите DeepSeek-R1 и посмотрите на блок рассуждений перед ответом
- Base vs instruct: скачайте вариант с тегом
-textи сравните его поведение с обычным
Результат
Репозиторий с кодом клиента и NOTES.md. Добавьте ссылку в поле «Ваш результат» и нажмите «Отправить на проверку».
И принесите на следующее занятие одно наблюдение, которое вас удивило, — обсудим в начале.