Запуск того самого циклу чату OpenAI локально за допомогою Ollama
Запустіть ту саму циклічну розмову з OpenAI локально за допомогою Ollama: налаштуйте Python SDK від OpenAI на localhost та залиште свій код. Жодних API-ключів, жодних оплат за токени, жодних даних, що виходять назовні.
Джерела: 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. Модель не може знати ваші документи, тому справжнім питанням стає те, які токени отримають місце у вікні контексту.
Пов’язана література
- Безстановий цикл чату: виклик API OpenAI вручну на Python — Створіть багатокроковий чат за допомогою Python SDK від OpenAI, самостійно керуючи історією повідомлень, та дізнайтеся, чому саме цей цикл лежить в основі функцій пам’яті та агентів у LangChain.
- Локальний ШІ після Ollama: вибір середовищ виконання у 2026 році — Чому Ollama є чудовим початковим інструментом, але слабким засобом для довгострокового керування — та які інструменти на кшталт llama.cpp, LM Studio, vLLM та інші підходять для кожної стадії.