Strona główna / Artykuły

Uruchamianie tego samego pętla rozmów OpenAI lokalnie za pomocą Ollamy

Uruchom lokalnie tę samą pętlę czatu OpenAI za pomocą Ollamy: skieruj Python SDK OpenAI na localhost i zachowaj swój kod. Żadnego klucza API, żadnych opłat za tokeny, żadnych danych, które by wychodziły.

Wydawca: REACTAPP.TOP4 min czytania1024 słów

Źródła: Part 5 — Run the Same Loop on Ollama (no API key, OpenAI dialect)

Chat z usługodawcami hostującymi modele kosztuje pieniądze, a każde zapytanie jest przesyłane do centrum danych kogoś innego. Uruchomienie modelu otwartego na własnym komputerze za pomocą Ollamy eliminuje oba te problemy. Najlepsze jest to, że istniejący kod do czatu oparty na OpenAI nadal funkcjonuje, ponieważ zmienia się tylko adres.

Ten sam dialekt, inny komputer

Ollama to lokalny serwer modeli. Po jego zainstalowaniu pobierasz model raz, a jego wagi są ściągane w taki sam sposób jak obrazy Dockera. Serwer następnie oczekuje na żądania HTTP pod adresem localhost:11434. Ułatwia to fakt, że Ollama celowo naśladuje API Chat Completions firmy OpenAI: ta sama ścieżka /v1/chat/completions, ta sama lista wiadomości z tagami ról, ta sama struktura odpowiedzi z elementem choices[0].message.content oraz te same liczniki użycia.

Przeniesienie pętli rozmowy OpenAI nie polega zatem na przepisaniu kodu – to zmiana adresu. Korzyści są oczywiste: nie ma klucza API, nie ma opłat za każdy token, a dane nie opuszczają maszyny. W zamian otrzymuje się szybkość własnego sprzętu oraz jakość modelu otwartego zamiast modelu najnowszej generacji. Dla nauki, jak działają agenci, gdzie setki iteracji są normą, to bardzo dobra oferta.

Ustawienie i jedna tura

Pobierz Ollama z ollama.com. Instaluje się go w jednym kroku, a serwer działa w tle. Następnie pobierz mały model – llama3.2 o rozmiarze około 2 GB to rozsądny standard. Po stronie Pythona nie potrzeba nic nowego, ponieważ standardowy pakiet openai po prostu wskazuje na inne miejsce:

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)

Dwie ustawienia wymagają uwagi. Ustawienie base_url na localhost przekierowuje cały ruch z dala od OpenAI. Ciąg api_key="ollama" wydaje się bezsensowny, ale tak nie jest: SDK odmawia utworzenia klienta bez żadnego klucza, podczas gdy sam Ollama ignoruje wszystko, co wysyłasz, więc wystarczy dowolny niepusty tekst. Wreszcie model musi być nazwą, którą już pobrałeś. Nie ma opcji wyboru poziomu cenowego – decyduje tylko to, co znajduje się na twoim dysku, co zostanie wyświetlone przez polecenie ollama list.

Pętla historii pozostaje taka sama

Dobrym testem „tego samego dialektu” jest to, czy wcześniejsza funkcja ask() działa z Ollamą bez żadnych zmian. Tak jest – różni się tylko kod tworzący klienta.

Dowodzi tego krótka rozmowa, zaczynająca się od wiadomości systemowej i rozwijająca się dalej:

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?"))

Trzecie pytanie nadal ilustruje mechanizm historii, a wszystko, czego nauczyliśmy się z wersji hostowanej, zostaje przeniesione. Serwer nic nie pamięta między połączeniami. Rosnąca lista msgs jest powodem, dla którego późniejsze odpowiedzi zajmują więcej czasu. Tutaj nie pobierana jest opłata, ale płacimy za sekundy, a obserwowanie spowolniania się lokalnego modelu w miarę gromadzenia się historii sprawia, że koszt kontekstu staje się namacalny w sposób, w jaki faktura nigdy nie mogłaby tego osiągnąć.

Ustal odpowiednie oczekiwania. Model z około 3 miliardami parametrów jest wyraźnie mniej precyzyjny niż GPT-4o czy Claude. Może rozwodzić się nad systemowym promptem lub popełniać błędy przy porównaniach, np. określaniu, które z dwóch elementów jest krótsze. To nie jest błąd w algorytmie – to po prostu efekt posiadania 3 miliardów parametrów, a bezpośrednia obserwacja tej różnicy uczy więcej niż czytanie wyników testów.

Uruchamianie przykładu

Trzy polecenia to rozwiązują. Pierwsze instaluje model, drugie instaluje zależności Pythona, a trzecie uruchamia skrypt:

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

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

Najpierw skrypt sprawdza, czy serwer Ollama odpowiada pod adresem localhost:11434. Jeśli tak nie jest, skrypt kończy działanie, podając instrukcje dotyczące instalacji i pobierania modelu. To lokalna odpowiedź na błąd związaný z brakiem klucza API. Następnie uruchamia rozmowę jednoetapową oraz trzyetapową i rejestruje zużycie tokenów, ponieważ Ollama raportuje zużycie w tych samych polach. Nie ma żadnego klucza ani kosztów. Skrypt unika również wykorzystania w środowiskach CI z innego powodu niż w przykładach hostowanych – maszyny CI nie uruchamiają serwera modeli.

Gdy coś idzie nie tak

  • Błąd „model not found” oznacza, że dany model nie został jeszcze pobraany, więc należy wykonać polecenie ollama pull llama3.2.
  • Błąd połączenia oznacza, że serwer nie jest uruchomiony. Należy go uruchomić za pomocą polecenia ollama serve, chociaż wersje do komputera osobistego uruchamiają go automatycznie.
  • Przerwa kilku sekund przed pierwszym tokenem przy pierwszym użyciu wynika z ładowania modelu do pamięci. Nic się nie zacięło.

Dlaczego lokalny endpoint jest korzystny

Eksperymenty z agentami powtarzają się bez końca. Procesy pobierania danych są odbudowywane, pętle rozumowania wykonywają kilka wywołań modelu na jedno pytanie, a procesy grafowe są uruchamiane ponownie po każdej drobnej korekcie w celu debugowania. Płacenie za każdy token w takich przypadkach jest kosztowne, natomiast darmowy lokalny endpoint umożliwia eksperymentowanie bez obserwowania licznika. Ponieważ Ollama używa dialektu OpenAI, każdy przykład może działać w obu wariantach poprzez zamianę adresu bazowego i nazwy modelu – nic więcej. W rezultacie otrzymujemy środowisko testowe z nieograniczoną liczbą tokenów.

Oczywistym następnym tematem jest RAG. Model nie może znać twoich dokumentów, więc prawdziwym pytaniem staje się to, które tokeny znajdą miejsce w oknie kontekstowym.

Pozycje pokrewne

  • Jak zostać inżynierem AI w 2026 roku bez dyplomu z informatyki — Plan od zera do zatrudnienia, aby zostać inżynierem AI w 2026 roku bez wykształcenia z informatyki: siedem obszarów umiejętności, małe projekty, doświadczenie w praktyce oraz mądre nawiązywanie kontaktów.