Gå til innholdet

Minne og kunnskap

Uten minne starter hver agent samtale fra null: den samme konvensjonen må forklares på nytt, den samme beslutningen må diskuteres igjen, og den samme blindveien må utforskes på nytt. Minnet er lageret som er knyttet til arbeidsområdet, som overlever kjøringer, og det finnes for at kunnskap som én agent har produsert, skal kunne finnes av en annen senere.

Det har tre lag, og de svarer på forskjellige spørsmål:

  1. Fakta – hva som er sant (en konvensjon, et utfall, en beslutning).
  2. Policyer – hva agenter må gjøre med det (en normativ regel).
  3. Arbeidsminne – hva én agent var midt oppi.

Forskjellen betyr noe, fordi de når agenten via ulike veier. Fakta søkes opp. Policyer dyttes inn. Arbeidsminne er privat.

Et MemoryFact er en kunnskapsenhet knyttet til et arbeidsområde og et domene.

Attributt Hva det er
domain Kunnskapsdomenet (“conventions”, “decisions”, “codebase”)
topic En kort emneetikett
content Selve kunnskapsteksten
confidence 0,0–1,0, sådd fra opphav og hevet ved ny omtale
memoryType Faktumets type – styrer forfallskurven over tid
veracity Hvordan det ble kjent – danner grunnlag for konfidensen og bestemmer størrelsen på hvert løft ved ny omtale
sourceObservationIds Hvilke observasjoner som førte til det
supersededBy Det nyere faktumet som erstattet det, hvis noe
validUntil, recallCount, mentionCount Utløp og brukssignaler som brukes ved gjenkalling

De to siste radene er dem folk overser, og de er det som avgjør hvilket faktum som kommer til overflaten. memoryType bærer Weibull-forfallsparametere per type, så en tidsavgrenset forpliktelse falmer raskt, mens et stabilt profilfaktum ikke gjør det. veracity registrerer opphav – oppgitt av et menneske (vekt 1,0), utledet av en agent (0,7), produsert av et verktøy (0,5), importert (0,6) – og den vekten danner grunnlaget for faktumets startkonfidens.

Fakta redigeres aldri på stedet når de motsies. Å skrive et faktum kjører konfliktdeteksjon mot fakta i samme domene og med samme emne, og erstatter taperen samtidig som det registreres en konfliktrad. Revisjonssporet er hele poenget: du kan alltid se hva som ble trodd før, og hva som erstattet det.

En MemoryPolicy er en normativ regel utledet fra fakta, knyttet til et arbeidsområde og et domene, med et aktiv-flagg og en valgfri requiredRole.

Hver aktive policy i arbeidsområdet injiseres i hver utsending, ufiltrert – ingen filtrering etter domene, rolle, oppgave eller område. Dette er verdt å vite før du skriver din tjuende policy, fordi policyer konkurrerer om det samme kontekstvinduet som oppgaven. Det er også derfor requiredRole på en policy er veiledende: det beskriver hvem regelen er rettet mot, men det er ikke til hinder for at regelen også når alle andre.

Et MemoryDomain grupperer fakta og policyer innenfor et arbeidsområde. Domener gir kunnskap organisatorisk struktur, og de er enheten tilgangstildelinger skrives mot – men se advarselen nedenfor før du behandler et domene som en konfidensialitetsgrense.

Et domene er enten arbeidsområdeomfattende (architecture) eller avgrenset til ett repo (repo:<slug>/architecture). Det samme navnet i begge omfang er to uavhengige lagre: et faktum som gjelder én kodebase, overskriver ikke det arbeidsområdeomfattende. search_memory og utsendingspreambelen rangerer repoomfattet minne først når agenten jobber i det repoet; de filtrerer ikke bort resten. Send repo til propose_fact / propose_policy / search_memory for å skrive til eller løfte fram det omfanget.

MemoryAccessGrant kobler en agentrolle og et domene til ett av tre tillatelsesnivåer:

Tillatelse Betydning
none Ingen tilgang
read Kan søke i og hente fram fakta
write Kreves av propose_policy. Skriving av fakta (propose_fact, supersede_fact) styres ikke av tilgangstildelinger

Asymmetrien – myk på lesing, hard på skriving av policyer – er et bevisst bytte. Minne er mest nyttig når det sirkulerer, og et avslag på lesing gir en agent som i stillhet vet mindre, i stedet for en som melder fra om et problem. Et avslag på å skrive policyer er derimot høylytt og kan rettes opp, så det er der håndhevingen ligger. Et nyopprettet domene initialiserer write for hver rolle; å stramme det inn i etterkant er en endring som bare kan gjøres over RPC, fordi det ikke finnes noe UI for tilgangstildelinger.

Hver agent har en AgentWorkingMemory: et fritekstkladdeark med nøkkel på arbeidsområde og agent. Det varer på tvers av kjøringer, er privat for den agenten og injiseres i prompten ved hver utsending. Det er der «jeg var halvveis i refaktoreringen av auth» bor – tilstanden som er verdt å ta med til neste kjøring, men ikke verdt å forfremme til et varig faktum.

Ved utsending settes minnepreambelen sammen av nøyaktig tre ting:

  • Hver aktive arbeidsområdepolicy, som linjer av typen - [domain] rule.
  • Agentens eget arbeidsminne, ordrett.
  • En nøkkelordbasert kortliste over fakta for denne oppgaven – høyst fem, innenfor et budsjett på ~1200 tegn, og bare når oppgavebeskrivelsen er minst 20 tegn lang. Kortere oppgaver får ingen fakta i det hele tatt.

Kortlisten er kun FTS/nøkkelord, og taket er der med vilje. Å beregne en embedding for et søk er tregt, og utsendingsveien er det ene stedet hvor latenstid er umiddelbart synlig, så den trege semantiske veien holdes bevisst utenfor. Preambelen avsluttes med å be agenten verifisere bærende elementer med search_memory, som er der den fulle gjenkallingsmodellen bor.

Ingen tilgangstildelinger konsulteres på denne veien. Det kortlisten finner, er det agenten ser.

Verktøyet search_memory, som er rettet mot agenter, har tre moduser, og de er reelt sett forskjellige søk:

  • keyword – kun FTS5.
  • semantic – BM25- og vektorresultater slått sammen med gjensidig rangfusjon.
  • hybrid (standard) – polyfonisk gjenkalling: fire rangerte stemmer slås sammen og diversifiseres deretter.

De fire stemmene er leksikalsk (FTS), semantisk (vektor-KNN), temporal (nylige aktive fakta) og graf – en tostegs vandring over episodiske kanter fra de sterkeste leksikalske og semantiske frøene. Grafstemmen er grunnen til at episodiske kanter i det hele tatt finnes: den bringer fram faktumet som er koblet til svaret ditt, uten å matche noen av ordene dine. Stemmene vektes etter en klassifisert søkeintensjon (semantisk veier mest som standard, deretter graf og leksikalsk, og til slutt hvor nylig noe er), hver kandidats poengsum skaleres med Weibull-forfallet, og resultatsettet MMR-diversifiseres, slik at fem omformuleringer av ett faktum ikke fortrenger fire forskjellige.

Minnesøket på skrivebordet og i nettversjonen er en separat, enklere vei: RPC-operasjonen memory_fact.search er kun FTS5, fordi en tynnklient ikke kan sende med en søkeembedding, og hybridveien holder seg internt på verten. Rangeringen du ser i minneutforskeren, er altså ikke den samme som agenten får fra search_memory. Det er forventet, ikke en feil, men det betyr at «jeg søkte og fant det ikke» i brukergrensesnittet ikke er bevis for at agenten ikke vil finne det.

Minneutforskeren ligger under Innstillinger → Arbeidsområde → Minne (/workspaces/<id>/settings/memory), med fanene Fakta, Policyer og Kunnskapsgraf.

Det er en asymmetri der som overrasker folk: du kan redigere og slette minne, men du kan ikke opprette det. Verken fanen Fakta eller fanen Policyer har noe element for å legge til. Forfatterskap skjer på agentsiden, gjennom propose_fact og propose_policy (supersede_fact / supersede_policy for å erstatte dem). remember skriver et element i hot-laget som er avgrenset til økten, og som consolidate_memory senere kan forfremme til et faktum; record_observation og update_my_notes skriver det private kladdearket som injiseres ved utsending. Utforskeren er en flate for gjennomgang og korreksjon, ikke for forfatterskap – så hvis du vil ha et faktum inn i minnet, er måten å få det dit å si det til en agent.

To vedlikeholdsoperasjoner kalles på samme måte av agenter i stedet for etter en plan: consolidate_memory slår sammen og rydder i oppsamlede fakta, og harmonize_memory forener oppfatninger som har sprikt fra hverandre på tvers av agenter. list_memory_conflicts viser hva konfliktdeteksjonen allerede har registrert. Ingenting kjører dem for deg på en tidsplan. Møtebeslutninger høstes inn i domenet decisions når et møte-persistenssteg registrerer dem; det er ikke en tidsstyrt jobb for fullførte agentkjøringer.