← Мои проекты

Локальная лаборатория 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 или свой код:

  1. Отсутствие памяти. Первый запрос: представьтесь модели. Второй, без истории: спросите, как вас зовут. Третий: тот же вопрос, но с полной историей в messages.
  2. Temperature. Один творческий промпт, по три прогона при temperature=0.0 и temperature=1.5.
  3. Галлюцинация. Добейтесь от маленькой модели (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. Добавьте ссылку в поле «Ваш результат» и нажмите «Отправить на проверку».

И принесите на следующее занятие одно наблюдение, которое вас удивило, — обсудим в начале.

Начните работу над проектом

Войдите, чтобы начать работу над этим проектом

Войти