Во многих туториалах по LLM всё начинается с API-ключей, платных токенов и облачных сервисов. Это рабочий путь, но для первого знакомства он не самый удобный: нужно регистрироваться, разбираться с биллингом и постоянно помнить, что каждый эксперимент что-то стоит.
Здесь пойдём проще. В этой серии мы соберём маленький LLM-чат на Python, который сначала будет работать локально: модель запускается через Ollama, а Python-код общается с ней через LiteLLM.
Это хороший стартовый маршрут по трём причинам:
не нужны API-ключи;
не нужен интернет для каждого запроса;
вы сразу видите, как LLM становится частью обычной Python-программы.
В первой части мы не будем строить полноценный чат. Наша задача скромнее и важнее: поднять локальную модель, подключить её к Python и получить первый осмысленный ответ из своего кода.
Часть 1. Ставим окружение и пишем первый запрос ← вы здесь
Часть 2. Делаем маленький консольный чат
Часть 3. Добавляем историю сообщений и контекст
Часть 4. Разбираем структуру ответа и метаданные
Часть 5. Ошибки и таймауты: делаем код устойчивее
Часть 6. Что дальше: локальные и облачные модели, развитие проекта
В этой статье мы:
установим Ollama;
скачаем локальную модель;
проверим, что она отвечает прямо в терминале;
создадим чистое Python-окружение;
установим LiteLLM;
напишем первый main.py, который отправляет запрос локальной модели.
Когда модель работает у вас на компьютере, путь данных становится очень прозрачным:
ваш Python-код → LiteLLM → Ollama → локальная модель → ответ
Это не "магия AI", а обычный программный поток.
Ваш скрипт формирует запрос, LiteLLM отправляет его в Ollama, Ollama передаёт его модели, а потом ответ возвращается обратно в код.
Для обучения это почти идеальный вариант. Вы не отвлекаетесь на инфраструктуру и сразу видите базовую механику интеграции.
На старте эти инструменты легко перепутать, поэтому сразу разделим роли.
Ollama — это инструмент, который запускает локальные модели и даёт к ним удобный доступ.
LiteLLM — это Python-библиотека, которая позволяет вызывать модель через единый интерфейс. Сегодня мы идём в локальную модель через Ollama, а позже ту же общую логику можно будет перенести и на облачные провайдеры с минимальными изменениями.
То есть роли такие:
Ollama поднимает локальную модель;
LiteLLM помогает обратиться к ней из Python;
наш код собирает вокруг этого приложение.
Перейдите на сайт Ollama и скачайте установщик под свою систему.
Windows — установщик .exe
macOS — .dmg
Linux — команда установки с сайта
После установки проверьте, что всё прошло нормально:
ollama --version
Если в ответ вы видите номер версии, значит Ollama установлена.
На Windows после запуска Ollama обычно появляется значок 🦙 в системном трее. Это хороший признак: программа работает в фоне и готова принимать запросы.
Сама Ollama — это ещё не модель, а оболочка для работы с моделями. Теперь нужно скачать конкретную LLM.
Для этой серии возьмём:
ollama run qwen2.5:3b
Почему именно qwen2.5:3b:
это сравнительно компактная модель;
она обычно неплохо работает на обычных ноутбуках;
у неё хороший компромисс между качеством, размером и удобством старта;
она нормально справляется с русским языком.
При первом запуске начнётся загрузка модели. Это разовая операция: модель скачается на диск и потом будет запускаться локально.
Когда загрузка завершится, у вас откроется простой интерфейс прямо в терминале. Напишите что-нибудь по-русски, например:
Привет! Расскажи в двух предложениях, что такое Python.
Если модель отвечает — отлично. Значит, самый важный технический барьер уже пройден: локальная LLM у вас работает.
Чтобы выйти из режима чата Ollama, используйте:
/bye
Если у вас немного оперативной памяти или модель работает слишком тяжело, попробуйте более лёгкий вариант:
ollama run qwen2.5:1.5b
Логика Python-кода дальше останется такой же. Поменяется только имя модели.
Теперь подключим Python к уже работающей локальной модели.
Создайте папку проекта и перейдите в неё:
mkdir llm-chat cd llm-chat
Создайте виртуальное окружение:
python -m venv venv
Активируйте его.
Windows:
venv\Scripts\activate
macOS / Linux:
source venv/bin/activate
Если всё прошло нормально, в начале строки терминала появится префикс (venv).
Теперь установим LiteLLM:
pip install litellm
На этом этапе у нас уже есть всё необходимое:
локальная модель через Ollama;
Python-проект;
отдельное окружение;
библиотека для вызова модели из кода.
Создайте файл main.py и вставьте в него код:
from litellm import completion MODEL = "ollama_chat/qwen2.5:3b" API_BASE = "http://localhost:11434" def ask(question: str) -> str: response = completion( model=MODEL, messages=[ {"role": "user", "content": question} ], api_base=API_BASE, request_timeout=120, ) return response.choices[0].message.content answer = ask("Привет! Напиши одно короткое предложение о Python.") print(answer)
Теперь запустите:
python main.py
Если в консоли появился осмысленный ответ на русском языке — всё работает как надо.
И это уже важный момент: теперь модель живёт не отдельно в терминале Ollama, а встроена в ваш Python-код.
Здесь нет ничего лишнего — только минимальное ядро будущего приложения.
from litellm import completion
Импортируем функцию, которая делает вызов модели.
MODEL = "ollama_chat/qwen2.5:3b"
Здесь мы указываем, какую модель хотим использовать.
Префикс ollama_chat/ подсказывает LiteLLM, что запрос нужно отправить именно в Ollama.
Если вы скачали другую модель, строка может выглядеть, например, так:
MODEL = "ollama_chat/qwen2.5:1.5b"
API_BASE = "http://localhost:11434"
Это локальный адрес, по которому Ollama принимает запросы.
По умолчанию Ollama работает именно на этом порту.
messages=[{"role": "user", "content": question}]
Это уже очень важная часть.
Большинство современных LLM API работают не с одной строкой текста, а со списком сообщений. Даже если у нас пока только один вопрос, он всё равно передаётся в виде структуры с ролями.
Сейчас в этом списке всего одно сообщение:
role="user" — это вопрос пользователя;
content=question — сам текст вопроса.
Позже именно этот список превратится в историю диалога.
То есть уже в первой статье мы закладываем фундамент будущего чата.
response.choices[0].message.content
Из полного объекта ответа мы достаём только текст, который сгенерировала модель.
Пока нам этого достаточно. В следующих частях мы разберём, что ещё приходит в ответе, кроме самого текста.
На этом этапе у нас уже есть:
установленная Ollama;
скачанная локальная модель;
рабочее Python-окружение;
установленный LiteLLM;
первый скрипт, который отправляет запрос локальной модели и получает ответ.
То есть теперь локальная LLM — это не абстрактная технология "где-то там", а компонент вашей программы, к которому можно обращаться из Python.
Это и есть главное достижение первой части.
Проблема 1. Connection refused или Failed to connect
Почему возникает: Ollama не запущена.
Что проверить: убедитесь, что Ollama действительно работает. На Windows проверьте значок 🦙 в трее. Также можно выполнить:
ollama list
Если команда отвечает, значит сервис доступен.
Проблема 2. Model not found
Почему возникает: модель не скачана или её имя в коде не совпадает с установленной.
Что сделать: посмотрите список моделей:
ollama list
И затем убедитесь, что в коде указано точное имя модели.
Проблема 3. Ответ генерируется слишком долго
Почему возникает: первый запуск часто самый медленный, потому что модель загружается в память. Либо модель тяжеловата для вашего компьютера.
Что сделать: сначала просто подождите дольше, закройте тяжёлые программы, попробуйте модель полегче — например qwen2.5:1.5b.
Проблема 4. ModuleNotFoundError: No module named 'litellm'
Почему возникает: вы запускаете скрипт не из того окружения, где установлен пакет.
Что проверить: перед запуском убедитесь, что окружение активировано и в терминале есть (venv).
Проблема 5. В PowerShell отображаются "кракозябры"
Иногда это связано с кодировкой терминала. Попробуйте выполнить:
$OutputEncoding = [System.Text.Encoding]::UTF8
А затем снова запустить скрипт.
В этой части мы сделали самый важный первый шаг: связали локальную модель и Python-код.
Пока это ещё не чат. Наш скрипт просто отправляет один вопрос и получает один ответ. Но это уже не игрушка и не теория: у нас есть рабочее ядро будущего приложения.
Именно с этого момента LLM перестаёт быть "чем-то из чужих демо" и становится частью вашей программы.
Сейчас у нас есть один запрос и один ответ. Это хороший старт, но полноценного общения ещё нет.
В следующей части превратим этот минимальный пример в маленький консольный чат:
добавим цикл общения;
будем принимать вопросы от пользователя в реальном времени;
введём команду выхода;
подготовим основу для дальнейшего добавления памяти и контекста.
Это первая часть практического цикла по созданию небольшого LLM-приложения на Python.
Ждем часть 2
Источник


