Eszközök

Mesterséges intelligenciával generált szöveg

Offline kódolás helyi AI-ügynökkel a Himalája lábánál

A főszereplő a Thomson Reuters-nél dolgozó Principal Engineer, aki egy évvel ezelőtt a Himalája lábához költözött, és helyi körülmények között vizsgálta meg, mennyit tud elvégezni egy offline futó kódoló AI-ügynökkel.

Offline kódolás helyi AI-ügynökkel a Himalája lábánál

Egy éve költöztem a Himalája lábaihoz, és bár élvezem a nyugalmat, a helyi életmódhoz gyakran hozzátartoznak a hálózati és áramkimaradások. Mint Thomson Reutersnél dolgozó Principal Engineer, a mindennapi munkám nagy részét kódolás és kollégák kódjának átnézése teszi ki. Már korábban is használtam kódoló ügynököket a munkafolyamataimban, ezért kíváncsi voltam, milyen mértékben tarthatók meg ezek az eszközök internetkapcsolat nélkül.

Ez a cikk bemutatja, hogyan futtattam egy kódoló ügynököt teljes egészében a saját laptopomon, offline környezetben: mit lehet elvégezni, milyen eszközökre van szükség, és milyen korlátokra kell figyelni.

Mit lehet offline elvégezni?

A helyi gépen már meglévő projekt sok támpontot ad: egy ügynök képes lehet elmagyarázni egy ismeretlen függvényt, nyomozni egy sikertelen teszt után, refaktorálni kisebb kódrészt vagy segíteni egy funkció befejezésében — feltéve, hogy a modellt, a projekt függőségeit és a teszt eszközöket előre letöltöttük. Új csomag beszerzése vagy valami webes információ lekérése továbbra is internetet igényel.

Milyen eszközöket használtam?

  • OpenCode: egy nyílt forráskódú kódoló ügynök, amely projektfájlok olvasására, módosításra és parancsok futtatására képes (például tesztek). A beállításban engedélyezési promptokkal hagyja jóvá a parancsokat és szerkesztéseket.
  • Ollama: a helyi modellszolgáltató, amely a modellt futtatja a gépen. OpenCode a modellkéréseket Ollama helyi API-jára küldi.
  • Qwen3.5 9B: egy nyílt súlyú (open-weight) nyelvi modell, amely le tud töltődni és helyben futtatható. Ebben a próbában ezt a modellt használtam.

A választás azért esett Qwen3.5 9B-re, mert a Qwen modellek több méretben elérhetők, és a 9B verzió publikus teljesítménymutatói jobb eredményeket mutattak, mint a kisebb 4B verzió a beépített kódgenerálási és eszközhívási teszteken.

Publikált eredmények és modellek méretei

A Qwen modellkártyája szerint LiveCodeBench v6 és BFCL‑V4 metrikák (maguk a számok a forrásmodellek model cardjáról származnak):

  • Qwen3.5 4B: LiveCodeBench v6 = 55.8, BFCL‑V4 = 50.3
  • Qwen3.5 9B (használt): LiveCodeBench v6 = 65.6, BFCL‑V4 = 66.1
  • gpt-oss-20b: LiveCodeBench v6 = 74.6 (BFCL‑V4 nem szerepelt)

A modellek letöltési méretei (megközelítő értékek):

  • Qwen3.5 4B: ~3.3–4.0 GB
  • Qwen3.5 9B: ~6.6–7.6 GB
  • Qwen3.5 27B: ~17–20 GB

A letöltési méret nem egyenlő a RAM‑követelménnyel; a Voltti költségvetés például 12–16 GB memóriát javasol egy 6.6 GB‑os Qwen3.5 9B buildhez. Nálam az OpenCode 64k‑tokenes konfigurációja miatt további memóriaterületre lehet szükség.

OpenCode benchmarkok és további megfontolások

A "The Scaffold Effect in Coding Agents" című preprint összehasonlította az OpenCode‑ot, Goose‑t és OpenHands‑SDK‑t 50 Terminal‑Bench Pro feladaton két felhőmodellen. Az OpenCode pass rate értékei például 50% [36–64%] és 46% [32–60%] két különböző cloud modell esetén (a zárójelek 95% konfidencia intervallumok). A szerzők felhívják a figyelmet, hogy a különbségek többsége statisztikailag nem egyértelmű.

A tanulmány azt is megjegyezte, hogy az OpenCode jóval több token‑felhasználást produkált (körülbelül 40× Goose tokenjeihez képest) a felhőalapú kísérletekben. Ezek a megfigyelések viszont a mi helyi Qwen3.5 9B futtatásunkról nem feltétlenül jóslanak pontos eredményt.

Kezdeti beállítás — amit online kell megtenni

Mielőtt offline módba váltanánk, a projektet és az eszközöket teljesen be kell állítani az internetkapcsolat mellett. Követtem a GitHub README utasításait: telepítettem a szükséges eszközöket, letöltöttem a projektet és telepítettem az OpenCode 1.19.4‑et. A projekt tartalmaz példákat, teszteket és konfigurációt a helyi Qwen használathoz.

Az opencode.json fájl a projekt konfigurációja: nálam mind a model, mind a small_model Qwen3.5 9B‑re mutatott, és a baseURL Ollama helyi címére (http://127.0.0.1:11434/v1). A konfiguráció letiltotta a webes eszközöket és rákérdezést kért szerkesztések és shellparancsok előtt.

Futtatási elrendezés:

  • Terminal A: OpenCode és a tesztek futtatása a projekt mappájából.
  • Terminal B: Ollama indítása úgy, hogy a szolgáltatás a localhoston maradjon és a felhő funkciók le legyenek tiltva:

OLLAMA_HOST=127.0.0.1:11434 OLLAMA_NO_CLOUD=1 OLLAMA_CONTEXT_LENGTH=65536 ollama serve

Majd a modell letöltése: ollama pull qwen3.5:9b

Ezek után ellenőriztem, hogy az ügynök válaszol, mielőtt leválasztottam volna az internetet.

Példa: hibajavítás egy költség‑összesítő programban

A mellékelt példa öt tételt ad hozzá (egy visszatérítéssel), a helyes összeg 25.50. A kezdő program azonban 8.00‑t nyomtatott; a függvény minden iterációnál felülírta az összesítést.

A projekt beépített tesztjeit futtatva három teszt bukott: decimális műveletek, visszatérítések és a példa tételek. Ezek a tesztek konkrét célt adtak az ügynöknek, illetve független ellenőrzést nyújtottak.

Mielőtt leválasztottam az internetet, OpenCode‑ot elindítva diagnosztikai parancsra megkértem, hogy olvassa el az expense_total.py‑t, futtassa a teszteket és magyarázza el a hibát. Az ügynök megtalálta a teszteket és tesztparancs futtatását kérte — az engedélykérés lehetőséget adott a parancs ellenőrzésére. Az ügynök kezdetben a pytest‑et javasolta, bár a projekt a beépített unittest‑et használta; emiatt célszerű pontosan megadni a tesztparancsot (python3 -m unittest -v).

Internet kikapcsolása és ellenőrzés

Wi‑Fi kikapcsolva, minden külső kapcsolat megszakítva, localhoston az Ollama továbbra is válaszolt:

curl --noproxy '*' --fail http://127.0.0.1:11434/api/tags

A külső címekre irányuló kérések viszont megbuktak (Could not resolve host), ami igazolta, hogy a futtatás tényleg offline történt.

A hibajavítás offline

OpenCode újraindítása után megkértem az ügynököt: „Fix the bug in expense_total.py so the existing tests pass. Don't change the tests or install anything. Run the tests and explain your fix.” A modell egy egyszerű, egy soros javaslattal tért vissza:

  • Eredeti sor: total = Decimal(amount)
  • Javasolt sor: total += Decimal(amount)

Az ügynök engedélyt kért a szerkesztésre, lefuttatta a teszteket és öt sikeres tesztet jelentett. A saját terminálomban is lefuttattam a python3 -m unittest -v parancsot, és az összes teszt átment. A mintaprogram most 25.50‑et ad vissza.

További gyakorlatok a projektben

A kísérő projektben két további feladat is található: egy CSV riport és egy napló‑elemző. Ezeket még nem futtottam végig offline az ügynökkel, ezért a fenti eredmények az expense példa futtatásából származnak.

  • CSV riport: a feladat sorok csoportosítása termék szerint, mennyiségek és bevételek számolása; 7 teszt lefedi a csoportosítást, decimális műveleteket, rendezést és üres bemenetet.
  • Log analyzer: hibák számlálása és a leglassabb kérés kiválasztása; 7 teszt foglalkozik hibás sorokkal és üres inputtal.

Mindkét gyakorlat README‑je tartalmazza a pontos tesztparancsokat és a várt eredményeket.

Mi segít, ha nincs internet?

  • Előre készítsd elő a projektet és töltsd le a függőségeket, dokumentációt és a modellt.
  • Indítsd el ugyanazt a helyi konfigurációt egyszer online, hogy mindent ellenőrizhess.
  • Add meg az ügynöknek a pontos tesztparancsot (például python3 -m unittest -v), hogy ne térjen el feleslegesen.
  • Tartsd a feladatot kicsiben és önállóan: egy kis, jól körülhatárolt hibajavítás vagy funkció jobb kiindulópont.
  • Figyeld a memóriahasználatot: a modell letöltése csak a kezdete a memóriaszükségletnek; a nagy kontextus és más nyitott alkalmazások is teremtenek terhelést.
  • Rögzítsd a próbálkozásokat: engedélykérések, újrapróbálkozások, és kudarcok is hasznosak később.

Mit tanultam?

A legfontosabb megállapítás: igen, egy kódoló ügynök képes helyi fájlokat olvasni, szerkeszteni és teszteket futtatni internetkapcsolat nélkül, feltéve hogy a modell és a projekt erőforrásai előre helyben vannak. Mindig átnézem a javasolt diffet és saját tesztekkel is ellenőrzöm az eredményt.

Praktikus megközelítés: kezdd kis, önálló feladatokkal egy gépen, amelyen a projekt és a modell minden szükséges összetevője rendelkezésre áll, majd haladj összetettebb példák felé (például a CSV riport), hogy kiderüljön, hogyan boldogul az ügynök bővebb munkával és ismeretlen kódbázissal.