Ga naar inhoud

Geheugen

Geheugen is wat een agent onthoudt van het ene gesprek naar het volgende: een feit over een klant, een voorkeur, een belofte, de manier waarop een taak gedaan wordt. Core heeft daar geen aparte dienst voor. Elke soort geheugen staat in een onderdeel dat je al kent, en voor elk onderdeel geldt dezelfde vraag: is dit van één persoon, of van de hele organisatie?

Wat Core onthoudt, en waar

Wat je wilt onthouden Waar het staat Wie het schrijft
Feiten en voorkeuren, zoals "heeft liever e-mail dan telefoon" geheugenrecords in een geheugenopslag, met een type dat je zelf kiest je applicatie met POST /memory, het model met de schrijftool, of Core zelf uit je gesprekken
Regels voor hoe de assistent voor één persoon moet handelen, zoals "antwoord in het Nederlands" geheugenrecords van het type behaviour, alleen van haar, meegegeven aan elke beurt voor haar dezelfde drie
Toezeggingen, zoals "belt de bank donderdag terug" geheugenrecords van het type commitment, met een status, een uiterste datum en aan wie het beloofd is dezelfde drie
Hoe een taak gedaan wordt skills, de instructies van een agent en prompts jij of een beheerder, in de bibliotheek van de organisatie
Wat er in een gesprek gebeurde het gesprek zelf, met een samenvatting zodra het lang wordt Core, bij elke beurt
Wat er in eerdere sessies gebeurde geheugenrecords van het type episode, één per sessie die tot rust kwam, terug te vinden op waar een nieuwe beurt over gaat Core zelf, uit je gesprekken, als de extractie van de opslag erom vraagt (Elke sessie vastleggen)
Wat de eigen sessies van een persoon haar leerden geheugenrecords van het type lesson, alleen van haar Core zelf, uit haar eigen gelijkende sessies, als de opslag erom vraagt (De sessies van een persoon haar assistent laten leren)
De taak waar het om gaat: het doel, de genomen besluiten, de volgende stap het werkgeheugen van het gesprek, één klein JSON-object dat aan het begin van elke beurt meegaat, zie Een werkgeheugen bijhouden het model met builtin__update_working_state, of je applicatie

Elke schrijfactie, ook die van het model en van het halen uit gesprekken, heeft een regel in de policy van de sleutel nodig die memory_write toestaat; de standaardregels hebben die niet (Je eerste regel schrijven).

Een beurt krijgt geheugen op twee manieren. Het model kan zoeken met de zoektool van een geheugenopslag. Of Core voegt passende records automatisch toe aan de context voordat het model begint, als je dat op de sleutel aanzet. Een toegevoegd record is voor het model altijd gegevens, nooit een instructie. Hoe je beide instelt staat in Geheugen via de API.

Van wie een record is: een persoon of de organisatie

Een geheugenopslag bevat twee soorten records naast elkaar:

  • Persoonlijke records. Noemt een verzoek een persoon, met X-Core-Subject, een subject-token of het veld user, dan is elk record dat het schrijft van die persoon. "Jan houdt van ochtenden" is van Jan.
  • Gedeelde records. Een verzoek dat niemand noemt, schrijft een record van de organisatie. "Declaraties gaan voor de 25e naar financiën" is van iedereen.

Wat Core uit gesprekken haalt, volgt het gesprek: uit een gesprek van Jan komen records van Jan. Standaard leest het halen alleen gesprekken die een persoon noemen (threads is with_person), dus uit een gesprek dat niemand noemt komen helemaal geen records.

Onder de standaardregels van een sleutel ziet een persoon haar eigen records en de gedeelde. Piet ziet de records van Jan nooit: niet in een lijst, niet in een zoekresultaat en niet in wat Core automatisch toevoegt, en een opvraging op id geeft 404. Een verzoek dat niemand noemt, zoals een achtergrondtaak van je applicatie, bereikt alle records. Wat Core automatisch toevoegt is smaller: een beurt voor Jan krijgt zijn eigen records en de gedeelde, en een beurt die niemand noemt alleen de gedeelde, en als de opslag erom vraagt ook zijn eigen eerdere sessies onder [past_sessions]. Ze staan in aparte secties van één blok, zodat veel gedeelde records zijn eigen records nooit verdringen. Elk record toont zijn zekerheid als percentage, en het blok blijft binnen een tokenbudget: memory.injection.budget_tokens van de sleutel (standaard 1.500), dat de optionele injection.budget_tokens van een opslag en je operator alleen kunnen verlagen. Een agent kan een eigen blok meebrengen, met een eigen opslag en budget, dat dan voor zijn beurten dat van de sleutel vervangt.

Een persoonlijk record wordt nooit vanzelf gedeeld. Een correctie houdt het feit bij dezelfde eigenaar, en een subject-token van Jan kan een gedeeld record niet wijzigen of verwijderen (403).

Noem altijd de persoon. Een verzoek dat niemand noemt, geldt als een verzoek van de organisatie. Vergeet je applicatie de persoon mee te sturen, dan wordt het gesprek van Jan een gesprek voor niemand. Met threads: with_person, de standaard, haalt Core geen geheugen uit dat gesprek. Een schakelaar waarvan de GET threads: all toont, haalt gesprekken voor niemand nog wel, dan worden zijn persoonlijke feiten gedeelde records die al zijn collega's te zien krijgen; een PUT zonder threads zet with_person. Zet settings.subjects_required op true in de policy van elke sleutel die voor personen werkt, dan wordt een verzoek zonder persoon geweigerd (Wat een verzoek zonder subject bereikt). Je kunt het halen van geheugen uit gesprekken ook beperken met filters.key_ids tot de sleutels die altijd een persoon noemen.

Afdelingen: labels op gedeelde records

Core kent geen afdelingen. Je maakt ze met een label. Een gedeeld record voor de salarisadministratie krijgt "labels": {"department": "payroll"}, en een gedeeld record voor iedereen krijgt "labels": {"audience": "everyone"}. Een gedeeld record dat de verbeterlus voorstelt, begint met de promotion.labels van de opslag in zijn metadata, die deze regels alleen tijdens de overstap naar labels lezen. De persoon draagt zijn afdeling als attribuut mee op het verzoek, bijvoorbeeld department: ["payroll"].

In de policy van de sleutel vervang je dan de standaardregel memory-record-shared door twee regels die alleen gedeelde records toestaan:

{"id": "memory-record-everyone", "effect": "permit", "kind": "memory_record",
 "match": {"labels": {"subject": "", "audience": "everyone"}}},
{"id": "memory-record-department", "effect": "permit", "kind": "memory_record",
 "match": {"labels": {"subject": ""}},
 "when": [{"atom": "label_among", "label": "department", "attribute": "department"}]}

"subject": "" betekent: een record dat niemand in het bijzonder heeft geschreven. De regels memory-record-nobody-named en memory-record-own blijven staan. Anna van de salarisadministratie krijgt dan haar eigen records, de records voor iedereen en die van payroll. Bob van de receptie krijgt zijn eigen records en de records voor iedereen. Dat geldt voor lijsten, zoeken en automatisch toevoegen.

Vier dingen om op te letten:

  • Een regel kan niet zeggen "alles behalve". Een record voor de hele organisatie moet daarom audience: everyone dragen. Een gedeeld record zonder een van beide labels bereikt alleen nog een verzoek dat niemand noemt. Records die Core uit gesprekken haalt, krijgen geen van beide labels: een gedeeld record uit een gesprek voor niemand (alleen mogelijk met threads: all) bereikt dus ook alleen zo'n verzoek.
  • Beide regels gaan alleen over gedeelde records. Een label dat iemand op haar eigen record zet, laat dat record niet aan collega's zien.
  • Een planning draagt nooit attributen. Noemt de planning een persoon, dan krijgt haar beurt de records van die persoon en de records voor iedereen, en geen records van een afdeling. Noemt ze niemand, dan krijgt de beurt elk gedeeld record, ook die van elke afdeling.
  • Heeft je organisatie een vocabulaire vastgelegd, leg dan department vast voor memory_record met attribute: true, en audience voor memory_record.

Skills deel je op dezelfde manier per afdeling in: een skill met het label department: payroll en een regel met label_among over skill wordt alleen aan die afdeling aangeboden. Hoe je een regel schrijft staat in Je eerste regel schrijven.

Een persoon wissen

DELETE /subjects/{id} wist de gesprekken van een persoon en al haar geheugenrecords, van elk type (Een persoon wissen). Gedeelde records blijven staan: ze zijn van de organisatie en noemen niemand.

Verder