Маленький LLM-чат на Python с Ollama и LiteLLM. Часть 1: ставим окружение и пишем первый запрос

Маленький LLM-чат на Python с Ollama и LiteLLM. Часть 1: ставим окружение и пишем первый запрос

Во многих туториалах по 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

На старте эти инструменты легко перепутать, поэтому сразу разделим роли.

Ollama— это инструмент, который запускает локальные модели и даёт к ним удобный доступ.

LiteLLM— это Python-библиотека, которая позволяет вызывать модель через единый интерфейс. Сегодня мы идём в локальную модель через Ollama, а позже ту же общую логику можно будет перенести и на облачные провайдеры с минимальными изменениями.

То есть роли такие:

  • Ollamaподнимает локальную модель;
  • LiteLLMпомогает обратиться к ней из Python;
  • наш кодсобирает вокруг этого приложение.

Шаг 1. Устанавливаем Ollama

Перейдите на сайт Ollama и скачайте установщик под свою систему.

  • Windows— установщик.exe
  • macOS—.dmg
  • Linux— команда установки с сайта

После установки проверьте, что всё прошло нормально:

Если в ответ вы видите номер версии, значит Ollama установлена.

На Windows после запуска Ollama обычно появляется значок 🦙 в системном трее. Это хороший признак: программа работает в фоне и готова принимать запросы.

Шаг 2. Скачиваем первую модель

Сама Ollama — это ещё не модель, а оболочка для работы с моделями. Теперь нужно скачать конкретную LLM.

Для этой серии возьмём:

Почему именноqwen2.5:3b:

  • это сравнительно компактная модель;
  • она обычно неплохо работает на обычных ноутбуках;
  • у неё хороший компромисс между качеством, размером и удобством старта;
  • она нормально справляется с русским языком.

При первом запуске начнётся загрузка модели. Это разовая операция: модель скачается на диск и потом будет запускаться локально.

Когда загрузка завершится, у вас откроется простой интерфейс прямо в терминале. Напишите что-нибудь по-русски, например:

Если модель отвечает — отлично. Значит, самый важный технический барьер уже пройден:локальная LLM у вас работает.

Чтобы выйти из режима чата Ollama, используйте:

Если компьютер слабый

Если у вас немного оперативной памяти или модель работает слишком тяжело, попробуйте более лёгкий вариант:

Логика Python-кода дальше останется такой же. Поменяется только имя модели.

Шаг 3. Готовим Python-окружение

Теперь подключим Python к уже работающей локальной модели.

Создайте папку проекта и перейдите в неё:

Создайте виртуальное окружение:

Активируйте его.

macOS / Linux:

Если всё прошло нормально, в начале строки терминала появится префикс(venv).

Теперь установим LiteLLM:

На этом этапе у нас уже есть всё необходимое:

  • локальная модель через Ollama;
  • Python-проект;
  • отдельное окружение;
  • библиотека для вызова модели из кода.

Шаг 4. Пишем первый main.py

Создайте файлmain.pyи вставьте в него код:

Теперь запустите:

Если в консоли появился осмысленный ответ на русском языке — всё работает как надо.

И это уже важный момент: теперь модель живёт не отдельно в терминале Ollama, австроена в ваш Python-код.

Разберём код

Здесь нет ничего лишнего — только минимальное ядро будущего приложения.

from litellm import completion

Импортируем функцию, которая делает вызов модели.

MODEL = "ollama_chat/qwen2.5:3b"

Здесь мы указываем, какую модель хотим использовать.Префиксollama_chat/подсказывает LiteLLM, что запрос нужно отправить именно в Ollama.

Если вы скачали другую модель, строка может выглядеть, например, так:

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 проверьте значок 🦙 в трее. Также можно выполнить:

Если команда отвечает, значит сервис доступен.

Проблема 2.Model not found

Почему возникает: модель не скачана или её имя в коде не совпадает с установленной.

Что сделать: посмотрите список моделей:

И затем убедитесь, что в коде указано точное имя модели.

Проблема 3. Ответ генерируется слишком долго

Почему возникает: первый запуск часто самый медленный, потому что модель загружается в память. Либо модель тяжеловата для вашего компьютера.

Что сделать: сначала просто подождите дольше, закройте тяжёлые программы, попробуйте модель полегче — напримерqwen2.5:1.5b.

Проблема 4.ModuleNotFoundError: No module named 'litellm'

Почему возникает: вы запускаете скрипт не из того окружения, где установлен пакет.

Что проверить: перед запуском убедитесь, что окружение активировано и в терминале есть(venv).

Проблема 5. В PowerShell отображаются "кракозябры"

Иногда это связано с кодировкой терминала. Попробуйте выполнить:

А затем снова запустить скрипт.

В этой части мы сделали самый важный первый шаг:связали локальную модель и Python-код.

Пока это ещё не чат. Наш скрипт просто отправляет один вопрос и получает один ответ. Но это уже не игрушка и не теория: у нас есть рабочее ядро будущего приложения.

Именно с этого момента LLM перестаёт быть "чем-то из чужих демо" и становится частью вашей программы.

Что дальше

Сейчас у нас есть один запрос и один ответ. Это хороший старт, но полноценного общения ещё нет.

В следующей части превратим этот минимальный пример вмаленький консольный чат:

  • добавим цикл общения;
  • будем принимать вопросы от пользователя в реальном времени;
  • введём команду выхода;
  • подготовим основу для дальнейшего добавления памяти и контекста.

Продолжение

Это первая часть практического цикла по созданию небольшого LLM-приложения на Python.Дальше - >

Читать оригинал