Главная / Статьи

Запуск той же циклов чата OpenAI локально с помощью Ollama

Запустите ту же самую циклическую чат-систему OpenAI локально с помощью Ollama: настройте Python SDK OpenAI на localhost и сохраните свой код. Никаких API-ключей, никаких счетов за токены, никакой передачи данных.

Издатель: REACTAPP.TOP4 мин чтения1024 слов

Источники: Part 5 — Run the Same Loop on Ollama (no API key, OpenAI dialect)

Чат с хостинговыми провайдерами стоит денег, и каждый запрос отправляется в чужой центр обработки данных. Запуск открытой модели на собственном компьютере с помощью Ollama устраняет оба этих проблема. Самое лучшее в этом то, что существующий код чата на основе OpenAI продолжает работать, поскольку меняется только адрес.

Тот же диалект, другой компьютер

Ollama — это локальный сервер моделей. После установки вы загружаете модель один раз, и веса скачиваются так же, как и изображения Docker. Затем сервер принимает HTTP-запросы по адресу localhost:11434. Удобство заключается в том, что Ollama намеренно имитирует API Chat Completions от OpenAI: тот же путь /v1/chat/completions, тот же список сообщений с метками ролей, та же структура ответа с элементом choices[0].message.content и те же счетчики использования.

Перенос чат-цикла OpenAI, таким образом, не является переписыванием кода — это лишь смена адреса. Преимущества очевидны: нет API-ключа, нет оплаты за каждый токен, данные не покидают устройство, а взамен вы получаете скорость собственного оборудования и качество открытой модели вместо премиум-модели. Для изучения работы агентов, где сотни итераций считаются нормой, это очень хорошее предложение.

Настройка и один ход

Скачайте Ollama с официального сайта ollama.com. Он устанавливается за один шаг и запускает сервер в фоновом режиме. Затем скачайте небольшую модель — llama3.2 объемом около 2 ГБ подходит в качестве стандартного варианта. На стороне Python ничего нового не требуется, поскольку стандартный пакет openai просто указывает на другой адрес:

from openai import OpenAI

# Part 2's SDK, different address
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # required, unused
)

resp = client.chat.completions.create(
    model="llama3.2",
    messages=[
        {
            "role": "system",
            "content": "You are a concise "
                       "assistant.",
        },
        {
            "role": "user",
            "content": "Where are you running "
                       "right now?",
        },
    ],
    temperature=0,
)
print(resp.choices[0].message.content)

Два параметра заслуживают особого внимания. Указание base_url на localhost перенаправляет весь трафик вне OpenAI. Строка api_key="ollama" кажется бесполезной, но на самом деле она необходима: SDK отказывается создавать клиент без ключа, в то время как сам Ollama игнорирует любой отправленный текст, поэтому подойдёт любой ненулевой текст. Наконец, model должен соответствовать имени модели, которое вы уже загрузили. Выбирать уровень ценообразования не нужно — важен только тот файл, который находится на вашем диске, информация о котором будет отображена командой ollama list.

Цикл обработки истории остаётся прежним

Хорошим тестом на «одинаковый диалект» является проверка того, будет ли ранее использованная функция ask() работать с Ollama без каких-либо изменений. Это действительно так — меняется только код, создающий клиент.

Это подтверждается кратким диалогом, начинающимся с сообщения от системы и развивающимся далее:

msgs = [{
    "role": "system",
    "content": "You are a concise assistant.",
}]

def ask(text: str) -> str:
    msgs.append(
        {"role": "user", "content": text}
    )
    resp = client.chat.completions.create(
        model="llama3.2",
        messages=msgs,  # full history
        temperature=0,
    )
    reply = resp.choices[0].message.content
    msgs.append({
        "role": "assistant",
        "content": reply,
    })
    return reply

print(ask("Define a context window."))
print(ask("Now for a five-year-old."))
print(ask("Which answer was shorter?"))

Третий вопрос по-прежнему демонстрирует механизм истории, и всё, что было усвоено из версии с хостингом, сохраняется. Сервер ничего не запоминает между вызовами. Рост списка msgs является причиной того, что последующие ответы генерируются дольше. Здесь вас не начисляют плату, но вы тратите время, и наблюдение за замедлением работы локальной модели по мере накопления истории позволяет ощутить реальную стоимость обработки контекста так, как это невозможно с помощью счета-фактуры.

Сформируйте соответствующие ожидания. Модель с примерно 3 миллиардами параметров значительно менее точна, чем GPT-4o или Claude. Она может отклоняться от системного промпта или путаться при сравнении, например, при определении того, что из двух вариантов короче. Это не ошибка в алгоритме — это результат использования всего 3 миллиардов параметров, и непосредственное наблюдение за этим разрывом учит больше, чем простое чтение тестовых результатов.

Запуск примера

Для этого достаточно трёх команд. Первая устанавливает модель, вторая — зависимости Python, а третья запускает скрипт:

# one-time: install from ollama.com, then
ollama pull llama3.2

pip install -r requirements.txt
python examples/part05_ollama.py

Прежде всего скрипт проверяет, отвечает ли сервер Ollama по адресу localhost:11434. Если нет, скрипт завершается с инструкциями по установке и загрузке модели. Это аналог механизма быстрой остановки при отсутствии API-ключа, но в локальной среде. Затем выполняются тестовый диалог одного обмена сообщениями и диалог из трех обменов, при этом фиксируется использование токенов, поскольку Ollama отчитывается об этом в тех же полях. Ключи не требуются, и расходов нет. Кроме того, этот способ не используется в CI по причине, отличной от примеров с хостингом: машины CI не запускают сервер моделей.

Когда что-то идет не так

  • Ошибка «модель не найдена» означает, что соответствующая модель ещё не загружена, поэтому необходимо выполнить команду ollama pull llama3.2.
  • Ошибка подключения означает, что сервер не запущен. Запустите его с помощью команды ollama serve; при установке на рабочий стол он запускается автоматически.
  • Пауза в несколько секунд перед первым токеном при первом использовании возникает из-за загрузки модели в память. Ничего не застревает.
  • Почему локальный эндпоинт выгоден

    Эксперименты с агентами повторяются бесконечно. Пайплайны по извлечению информации перестраиваются заново, циклы рассуждений выполняют несколько вызовов модели для одного вопроса, а графовые рабочие процессы перезапускаются после каждой небольшой настройки при отладке. Оплата за каждый токен во всех этих случаях суммируется, тогда как бесплатный локальный эндпоинт позволяет экспериментировать без учета расходов. Поскольку Ollama использует диалект OpenAI, любой пример можно запустить обоими способами, просто заменив базовый URL и имя модели, больше ничего не требуется. В результате получается среда с неограниченным количеством токенов.

    Очевидной следующей темой является RAG. Модель не может знать ваши документы, поэтому настоящий вопрос заключается в том, какие токены получат место в окне контекста.

    Связанные материалы

  • Как стать инженером в области ИИ в 2026 году без диплома по информатике — План от нуля до трудоустройства для тех, кто хочет стать инженером в области ИИ в 2026 году без диплома по информатике: семь областей навыков, небольшие проекты, практический опыт и эффективное налаживание контактов.