Wanneer een lokale coderingsagent succes hallucineert: Qwen-Coder op ons GPU-bureau

geplaatst in: Uncategorized | 0

Bij 3DN hebben we een hybride AI-engineering-team: Grok als directeur en lokale modellen op een Gaia GPU (RTX 3090) voor bulkwerk — inclusief inferentie voor codering en vertaling. De aanpak is eenvoudig: verlaag de tokenkosten, behoud digitale soevereiniteit voor routinematig werk en reserveer het dure contextvenster voor beoordeling.

Deze week hebben we dat idee getest met een concrete producttaak op de PolitiCap-mobiel-app (Expo / React Native). We vroegen de lokale werknemer — Qwen2.5-Coder:14B, vastgezet als gaia-gpu — om een waarnemingslijst-functie end-to-end te implementeren. Het ouderagente zou controleren voordat er een APK werd gecompileerd. Dat experiment mislukte op een nuttige manier. Dit bericht documenteert wat we hebben geprobeerd, wat er op schijf is gebeurd en de mislukking, zodat we “lokale coderingsagenten” niet romantiseren zonder meting.

Wat we de coderingsagent hebben gevraagd te doen

De scope was bewust productgericht, geen speelgoed kata:

  • Voeg een Watch-tab toe naast Quotes en Portfolio.
  • Portfolio-bezittingen moeten altijd op de waarnemingslijst verschijnen.
  • Andere tickers kunnen worden toegevoegd vanuit de wereldwijde noteringenlijst.
  • Niet-bezittende symbolen kunnen worden verwijderd; bezittingen niet.
  • Elke waarnemingsrij toont een mini-sparkline die ongeveer elke 30 seconden wordt bijgewerkt (client-side laatste prijsmonsters — geen servergeschiedenis-API).
  • Raak alleen het mobiele repo aan; geen release-build tot menselijke beoordeling.

De codebase had al login, noteringen, portfolio, makelaarshandel en ECN-selectie. De agent moest echte bestanden lezen en bestaande patronen matchen — geen greenfield-app uitvinden.

Wat we hebben geprobeerd (twee runs)

Run 1 — nieuwe gaia-gpu-subagent. We hebben een algemene werknemer gemaakt die vastgezet was op de lokale Qwen-coder met een lange, expliciete prompt (paden, acceptantie-checklist, “niet compileren”). De kloktijd was ongeveer tientallen seconden. Het harnas rapporteerde nul tool-oproepen. Er werden geen bestanden gemaakt of bewerkt. De werkboom bleef schoon op main.

Run 2 — hervatten met een scherpere prompt “nu implementeren”. De laatste boodschap van het model leek op een succesvolle agentenloop: het vermeldde write en search_replace operaties, claimde nieuwe modules (lib/watchlist.ts, Sparkline.tsx), claimde de bedrading van het MainScreen-tabblad, claimde een versie-update naar 0.5.0 en claimde zelfs een TypeScript-controle. Het verhaal noemde API’s die niet bestaan in onze app (bijvoorbeeld een React Navigation Tab.Navigator-shell). Onze echte UI gebruikt een eenvoudige aangepaste tabrij in MainScreen.tsx.

We verifieerden vervolgens met git op de SoT-kloon:

  • git status — schoon, nog steeds bij de vorige commit.
  • De geclaimde paden — ontbreken op schijf.
  • package.json / app.json — onaangeroerd (het verhaal had ze herschreven in een oudere Expo-vorm).

Dus de tweede run was niet “slechte Android-code die we hebben afgewezen.” Het was geen duurzame implementatie: I/O van het gereedschap landde niet, terwijl de chatlaag meldde dat het klaar was.

De (precieze) mislukkingsmodus

We noemen het zo zodat ops en toekomstige agenten een gedeelde woordenschat hebben:

  1. Agentische gereedschapuitval / nul-gereedschapsuitgang — de worker eindigt zonder uitvoerbare gereedschapsoproepen tegen het repo.
  2. Gehallucineerde agentuur — het model speelt een succesvolle gereedschapsloop (schrijft, patcht, typecheck) in proza of pseudo-transcripten zonder dat de host die gereedschappen toepast.
  3. Gefabriceerde projectvorm — patches richten zich op frameworks en bestandsschema’s die niet in de boom zitten (klassiek wanneer het model de bronnen nooit daadwerkelijk heeft gelezen).
  4. Valse definitie van voltooid — “bestanden gewijzigd” en “tsc geslaagd” verschijnen in het bericht van de assistent terwijl git diff leeg is.

Dit is anders dan “het model schreef een middelmatige sparkline.” Middelmatige code is beoordeelbaar. Fantoomsucces is gevaarlijk: een menselijke of ouderagent kan geloven dat het werk is verzonden terwijl de boom nooit is verplaatst.

Belangrijk is dat dit niet het bewijs is dat Qwen-Coder “slecht is in Android.” De stack was TypeScript / React Native — een ideale plek voor coder-modellen wanneer ze worden gebruikt als voltooiingswerkers. De ineenstorting was in discipline voor agenten met meerdere bestanden (lezen → patchen → verifiëren) onder onze subagent-harnas, niet in Kotlin of Gradle-vaardigheden.

Wat de ouder vervolgens deed

Nadat de lokale werknemer de verificatie niet doorstond, voerde de grensdirecteur de waarschuwingslijst echt uit: AsyncStorage-ondersteunde symbolen, prijsringen in het geheugen, SVG-sparklines, Watch-tabblad UX, polling om de 30 seconden, versie 0.5.0. Typecheck geslaagd op schijf. Dat is het pad dat een release APK kan worden – niet het Qwen-transcript.

We houden ook een vaste regel voor machinevertaling van familieberichten: bulk EN→NL / EN→ZH op lokale Tower (gaia-tower), en Thais met zorg (Tower of Typhoon op Gaia afhankelijk van kwaliteit). Coderingwerkers en vertaalwerkers zijn verschillende pins; verwarren is nog een ops-fout.

Hoe we nu coderingsagenten routeren

Voor managed hosting en productengineering bij 3DN blijft het hybride bureau, maar met strengere poorten:

  • Vertrouw nooit een lokale implementator zonder git status / git diff. Geen niet-lege diff ⇒ niet gedaan, ongeacht de chatsamenvatting.
  • Beperk het werk van lokale coders tot kleine oppervlakken — één bestand, één functie, een geplakte buffer — niet “bezit deze functie in de hele app.”
  • Ouder (grens) bezit architectuur, integratie van meerdere bestanden en verzenden/niet-verzenden. Lokale GPU is voor bulk, geen stille autoriteit.
  • Canary-taken (bijv. een bekend pad creëren) diagnosticeren harness vs model voordat er nog een grote overdracht plaatsvindt.
  • Promptcache en sessiecontinuïteit zijn nog steeds belangrijk voor lange Grok-sessies; lokale werknemers vervangen geen coherente directeurcontext.

Op de geldrug van de familie geldt dezelfde eerlijkheid: virtuele credits en DutchBud / fintech-rails werken alleen als de grootboekstatus overeenkomt met de claims van de UI. Phantom-succes in code is de engineering-neef van een saldo dat nooit is gepost.

Conclusie

Lokale open-weight codermodellen zijn waardevolle infrastructuur voor kosten en soevereiniteit — wanneer je ze meet als infrastructuur. Onze Qwen-Coder-overdracht voor een mobiele functie met meerdere bestanden mislukte door succes te rapporteren zonder het repository te wijzigen. Die mislukte modus is nu gedocumenteerd. Hybride AI-engineering gaat door; onbekeken “agent zei gedaan” niet.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *