Hopp til innhold
cd /blog

Hvorfor den AI-kodende agenten din hallusinerer filstier

[AI Agents] [Hallucination] [Retrieval] [MCP]

> AI-kodende agenter finner opp filstier når de ikke har et ekte kart over repoet. Her er hvorfor det skjer, og hvordan forankring fører til færre hallusinerte endringer.

Tegnet er ikke en feil funksjonskropp. Det er en selvsikker endring i en fil som ikke finnes, eller i en fil som finnes, men som ikke er den som implementerer oppførselen.

Du ba om en fiks for øktutløp. Agenten åpnet src/auth/session.ts. Den stien er plausibel. Den er også feil. Den ekte handleren lever i apps/api/src/middleware/expiry.ts, omdøpt to refaktoreringer tilbake. Agenten løy ikke for deg. Den fullførte en sti-formet streng fra treningspriorer pluss det som allerede var i kontekstvinduet.

Dette er det vanlige feilmønsteret på et ekte repo. Modellen kan skrive kode. Feilen ligger i å velge feil sted å skrive den.

Hvorfor agenter finner opp stier

En kodende agent er en neste-token-modell med verktøy. Når du sier «fiks øktutløp», må den navngi en fil før den kan lese eller patche noe. Hvis den ikke allerede har et forankret kart, konstruerer den en sti fra:

  1. Navnekonvensjoner den har sett i andre repoer. src/auth/session.ts er en vanlig form.
  2. Filer allerede i samtalen, som kanskje er de du limte inn forrige uke, ikke de som betyr noe nå.
  3. Katalogoppføringer den tilfeldigvis kjørte, ufullstendige på et stort tre.
  4. Instruksjonsfiler. CLAUDE.md og AGENTS.md forteller agenten hvordan den skal oppføre seg. De er ikke en levende indeks over symboler, kallere, eller gjeldende stier.

Ingen av disse kildene er et kart over dette repoet, i dag. Modellen fyller hullet på samme måte som den fyller ethvert hull: med en fortsettelse med høy sannsynlighet. Den fortsettelsen ser ofte ut som en ekte sti. Noen ganger finnes filen og ligger ved siden av den riktige. Noen ganger fantes den på en gren som ble slått sammen forrige måned. Noen ganger fantes den aldri.

Grep redder deg ikke her hvis agenten aldri søker etter riktig streng. Agenten gjettet en sti, leste deretter hva den stien returnerte, og redigerte den. Det første feilsteget var stien, ikke patchen.

Å lese filer er heller ikke det samme som å finne de riktige. Claude Code, Cursor, Codex, og lignende verktøy kan åpne hva som helst du peker dem mot. Spørsmålet er om de pålitelig finner de riktige filene, de viktige symbolene, avhengighetene, testene, og påvirkningsradiusen før de redigerer. Filtilgang uten et kart begynner fortsatt med en gjetning.

Redigering av feil fil er et hentingsproblem

Behandle den oppdiktede stien som en henting som bommet, ikke som en personlighetsfeil.

Hvis agenten måtte returnere path/file.ext:line før den fikk lov til å redigere, ville to ting skje. Først kunne du åpne sitatet og avvise arbeidet på ti sekunder. Deretter måtte agenten spørre noe som faktisk kjenner treet.

Det er jobben til et kodebase-kontekstlag. Semantisk søk alene er ikke nok. Et utdrag som «høres ut som øktutløp» kan fortsatt lande i en avviklet pakke. Du trenger også eksakt tekst når du kjenner strengen, symbolsøk når du kjenner navnet, strukturelt søk når du kjenner formen, og en avhengighetsgraf når du trenger kallere og påvirkningsradius.

Maguyva er det laget for MCP-kompatible kodende agenter. Det er ikke en editor. Claude Code, Cursor, Codex CLI, VS Code, Windsurf, og andre MCP-klienter blir der de er. Agenten spør et rangert kart før den rører en linje.

Påstanden er bevisst beskjeden: færre hallusinerte endringer. Maguyva fjerner ikke modellens evne til å gjette. Den endrer standard første steg fra «finn opp en plausibel sti» til «be om rangerte, siterte steder».

Hvordan et underbygd svar ser ut

Et nyttig svar på «hvor håndteres øktutløp» er ikke et avsnitt. Det er en kort liste over steder:

  • apps/api/src/middleware/expiry.ts:48 - handleren
  • apps/web/src/lib/auth-client.ts:112 - kalleren
  • apps/api/tests/expiry.test.ts:20 - testen som vil feile hvis endringen er feil

Du kan åpne disse linjene. Hvis de er feil, stopper du. Hvis de er riktige, kan agenten redigere. Verifiseringen er poenget, ikke et slagord.

Maguyva eksponerer 11 kundevendte MCP-verktøy på tvers av søk, symboler, avhengighetsanalyse, filhenting, repo-kontekst og deterministiske hjelpeverktøy-arbeidsflyter. Fire hentemodi (semantisk, strukturell, graf/avhengighet, og tekst) smeltes sammen til rangerte resultater; symbolsøk er et eget MCP-verktøy (find_symbol). Underbygde svar kommer tilbake med filstier og linjenumre, slik at du kan vurdere dem mot treet foran deg.

Dokumentasjonen beskriver den korteste veien: start gratis, indekser et repo du allerede kjenner, koble til klienten, still deretter ett spørsmål du kan verifisere.

En løkke som endrer den første endringen

Du trenger ikke en ny arbeidsflytreligion. Du trenger ett ekstra steg før den første skrivingen.

  1. Still et spørsmål du allerede kan vurdere. «Hvilken kode håndterer innlogging og øktutløp?» er bedre enn «fiks auth».
  2. Krev sitater. Filsti og linjenummer, ikke et sammendrag av «auth-modulen».
  3. Åpne de siterte filene. Følg symbolet. Bekreft avhengigheten du er i ferd med å røre.
  4. Først da lar du agenten patche.

Hvis steg 2 ikke returnerer noe nyttig, har ikke agenten lov til å improvisere en sti. Den søker igjen, eller du peker den. Nettopp denne ene porten er det som gir færre hallusinerte endringer. Modellen er den samme modellen. Kartet er det som har endret seg.

Instruksjonsfiler betyr fortsatt noe. Behold dem. Bruk dem til konvensjoner, gjennomgangsregler, og hva som ikke skal røres. Ikke be dem være indeksen. En CLAUDE.md som lister tre viktige kataloger, vil være utdatert uken etter en pakke-splitting. Et søkbart kart oppdateres når repoet oppdateres.

En beslektet svikt er nesten-riktig-filen: agenten åpner auth.ts når oppførselen lever i auth-client.ts, eller patcher en generert fil i stedet for kilden, eller redigerer kopien i packages/legacy fordi navnet stemte. Sitater gjør ikke disse feilene umulige. De gjør dem synlige før diffet lander.

Hva et kart ikke vil fikse for deg

Vær nøktern om hva du får. Et underbygd kart vil ikke gjøre hver endring riktig — agenten din kan fortsatt skrive en dårlig patch i akkurat riktig fil. Hvis kodebasen din lener seg på dynamisk dispatch, refleksjon, eller monkey-patching, vil noen symbolsøk komme tilbake tynnere enn du skulle ønske, fordi det er det kjøretidsindireksjon gjør med enhver statisk indeks. Og hvis du håper på en prosentandel — «hallusinerte stier ned X%» — finner du den ikke her, fordi ingen ærlig kan måle det tallet for repoet ditt bortsett fra deg selv.

Det du kan forvente er smalere og mer nyttig: agenten slutter å åpne endringene sine med en gjettet sti. Det første steget blir forankret i et ekte kart, og det er derfra færre hallusinerte endringer kommer. Alt etter sitatet — å lese diffet, vurdere patchen — er fortsatt jobben din, akkurat som det alltid har vært.

Testen koster deg nesten ingenting: indekser et repo du allerede kjenner og still ett spørsmål du kan verifisere. Start med en sti du har blitt brent av. Hvis sitatene er feil, ser du det umiddelbart. Hvis de er riktige, har agentens neste endring et bedre sted å lande.

// it doesn't know the file. it knows how to find it.

Relatert lesning

Mer fra Maguyva-byggeloggen