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 velduser, 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: everyonedragen. 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 metthreads: 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
departmentvast voormemory_recordmetattribute: true, enaudiencevoormemory_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¶
- Geheugen via de API: records schrijven en lezen, de tools, automatisch toevoegen en geheugen uit gesprekken halen.
- Geheugen in de console: records, opslagen en toezeggingen bekijken.
- Bouwen voor personen: subjects, attributen, labels en regels.
- Gesprekken: wat er in een gesprek bewaard wordt, en hoe het wordt samengevat.
- Skills via de API: vaste werkwijzen voor een agent.