Agent memory stale కాకుండా expiry, pruning ఎలా చేయాలి
Agent memory ఎందుకు తప్పుగా మారుతుందో తెలుసుకోండి. కాలపరిమితి facts కు expiry, cascade delete, మిగతా records కు review అమలు చేసి sqlite3 తో SQLite store ను పరిశీలించండి.
ఏజెంట్ memory ఎందుకు stale అవుతుంది
ఒక వాస్తవాన్ని ఒక్కసారి రాసి, తరువాత మళ్లీ తనిఖీ చేయకపోతే agent memory stale అవుతుంది. Store ఆ సమాచారాన్ని పదేపదే తిరిగి ఇస్తుంది. Retrieval layer దానికి తేదీని జత చేయకుండా plain text గా prompt లో ఉంచుతుంది. దాంతో model, ఆ సమాచారం రాసిన రోజున ఉన్నంతే నమ్మకంతో దాన్ని మళ్లీ చెబుతుంది. ఎలాంటి error ఏర్పడదు. అసలు సమస్య ఇదే: model కు, మీకు కూడా, stale memory మరియు తాజా memory ఒకేలా కనిపిస్తాయి.
Save చేసే సమయంలో మరింత మెరుగ్గా రాయడం మాత్రమే ఈ సమస్యను పరిష్కరించదు. గడువు వర్తించే facts కు expiry అమలు చేయాలి. గడువు వర్తించని facts కోసం review routine ఉండాలి. ఈ రెండూ చిన్న database కు చేసే సాధారణ maintenance పనులే. ఇందులో ఎక్కువ భాగం SQL (structured query language) తో జరుగుతుంది.
Decay మరియు drift వేర్వేరు వైఫల్యాలు
Decay అనేది సహజమైన ముగింపు తేదీ కలిగిన వాస్తవం. "ఈ వారం ప్రయాణం." "Migration కారణంగా staging box అందుబాటులో లేదు." "Budget draft ను సమీక్షిస్తున్నాను." రాసిన సమయంలో ఇవి నిజమే. మీరు రాసే సమయంలోనే వాటి validity period ను నిర్ణయించవచ్చు. Decay ను పరిష్కరించవచ్చు. Expiry ను జత చేయండి. దీనిని కొన్నిసార్లు TTL (time to live) అంటారు. Expiry దాటినప్పుడు row ను తొలగించండి.
Drift అనేది ఒకసారి నిల్వ చేసి, మళ్లీ ఎప్పుడూ నిర్ధారించని వాస్తవం. "pnpm ను ఇష్టపడతారు." "Database Postgres 15." "Deployments staging branch ద్వారా జరుగుతాయి." వీటిని తప్పుగా మార్చే స్వయంచాలక clock ఏదీ లేదు. వేరే చోట జరిగిన నిర్ణయమే వీటిని తప్పుగా మారుస్తుంది. ఆ మార్పు గురించి మీ memory store కు ఏ సమాచారం అందదు.
Drift కు సులభమైన automated fix లేదు. ఎప్పుడూ గమనించని మార్పును store గుర్తించలేదు. అందువల్ల store నుంచి data చదివి దానిపై reasoning చేసే job అదే పాత text ను మళ్లీ చదవడం మాత్రమే. పనిచేసే విధానం ఏమిటంటే, ఆ వాస్తవం సూచించే అంశంతో దాన్ని మళ్లీ నిర్ధారించడం. దీనికి ఒక వ్యక్తి అవసరం కావచ్చు, లేదా ప్రస్తుత స్థితిని చదవగల tool కలిగిన agent అవసరం కావచ్చు.
కాబట్టి ప్రణాళిక రెండు భాగాలుగా విభజించాలి. Decay అయ్యే విషయాలకు expiry పెట్టండి. Drift అయ్యే విషయాలను review చేయండి. రెండో సమస్యను మొదటి సమస్యగా భావించి నిర్వహించవద్దు.
కాలపరిమితి ఉన్న వాస్తవాలకు గడువు నిర్దేశించండి
ప్రతి memory row కు చాలా stores అందించని మూడు columns అవసరం: ఆ వాస్తవం ఎక్కడి నుంచి వచ్చిందో, చివరిసారి ఎప్పుడు నిర్ధారించబడిందో, అది ఎప్పుడు చెల్లుబాటు కాకుండా పోతుందో. ఇది మీరు sqlite3 తోనే నిర్మించగల store. మీరు ఇప్పటికే నడుపుతున్న store కు కూడా ఇదే columns ను జోడించవచ్చు.
CREATE TABLE memory (
id TEXT PRIMARY KEY,
subject TEXT NOT NULL,
fact TEXT NOT NULL,
source TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
confirmed_at TEXT NOT NULL DEFAULT (datetime('now')),
expires_at TEXT,
superseded_by TEXT REFERENCES memory(id) ON DELETE CASCADE
);
CREATE INDEX memory_expires ON memory(expires_at);
CREATE INDEX memory_superseded ON memory(superseded_by);datetime('now') UTC (coordinated universal time) ను YYYY-MM-DD HH:MM:SS రూపంలో ఇస్తుంది. ఇది text గా సరిగ్గా sort మరియు compare అవుతుంది. అందువల్ల దిగువన ఉన్న ప్రతి date ప్రశ్న సాధారణ WHERE clause మాత్రమే. source column ఐచ్ఛికం కాదు. ఒక message, file లేదా command output వరకు trace చేయలేని వాస్తవాన్ని మళ్లీ తనిఖీ చేయలేం. మళ్లీ తనిఖీ చేయలేని వాస్తవాన్ని తొలగించడం మాత్రమే చేయగలం.
గడువు ముగిసే memory ను రాయడం:
INSERT INTO memory (id, subject, fact, source, expires_at)
VALUES ('m_0191', 'availability', 'Away from keyboard, replies are delayed',
'chat 2026-08-08', datetime('now', '+7 days'));Retrieval ఎప్పుడూ table ను చదవకూడదు. గడువు ముగిసిన మరియు దాని స్థానంలో వచ్చిన rows ను దాచే view ను అది చదవాలి:
CREATE VIEW live_memory AS
SELECT id, subject, fact, source, confirmed_at, expires_at
FROM memory
WHERE superseded_by IS NULL
AND (expires_at IS NULL OR expires_at > datetime('now'));ఈ view అత్యంత ముఖ్యమైన భాగం. ఎందుకంటే prune తప్పిపోయినా దాని ప్రభావం ఉండదు. Delete job నడిచిందా లేదా అన్నదానితో సంబంధం లేకుండా, row గడువు ముగిసిన వెంటనే retrieval లో కనిపించదు. అందువల్ల delete job disk వినియోగం మరియు review load ను మాత్రమే నియంత్రిస్తుంది; correctness ను కాదు.
sqlite3 memory.db "SELECT count(*) FROM memory;" తో gap ను తనిఖీ చేసి, అదే count ను live_memory కు వ్యతిరేకంగా కూడా చూడండి. ఆరోగ్యకరమైన store లో ఈ రెండు సంఖ్యలు దగ్గరగా ఉంటాయి. పెద్ద gap అంటే తొలగించాల్సిన dead rows backlog.
memoryను తొలగించినా పాతది ఎందుకు మిగిలిపోతుంది
సరిదిద్దింపులు జంటలుగా వస్తాయి. మీరు npm నుంచి pnpmకు మారారని agent తెలుసుకుని, కొత్త rowను రాస్తుంది, అలాగే పాత rowను దానివైపు చూపిస్తుంది:
UPDATE memory SET superseded_by = 'm_0207' WHERE id = 'm_0140';ఇప్పుడు live_memory కు పాత row కనిపించదు. అయితే ఏ మార్పు జరిగిందో chainలో నమోదు అవుతూనే ఉంటుంది. ఇప్పుడు తప్పు అని తేలిన m_0207 ను తొలగించండి. superseded_by పై ఉన్న ON DELETE CASCADE, m_0140 ను కూడా దానితో పాటు తొలగించాలి, ఎందుకంటే ఆ సంబంధంలో పాత row childగా ఉంటుంది. సాధారణంగా అది జరగదు. ఎందుకంటే foreign keysను మీరు enable చేసే వరకు SQLite వాటిని పట్టించుకోదు. డిఫాల్ట్గా అవి offలో ఉంటాయి:
sqlite3 memory.db "PRAGMA foreign_keys;"Stock buildలో ఇది 0 ను చూపిస్తుంది. Foreign keys offలో ఉన్నప్పుడు DELETE FROM memory WHERE id = 'm_0207'; విజయవంతమవుతుంది, కానీ m_0140 మిగిలిపోతుంది. అది ఇక లేని id వైపు చూపిస్తుంది. ఏ హెచ్చరికా కనిపించదు. ఇప్పుడు ఆ row తప్పు కారణంతో దాచబడి ఉంటుంది. Dangling pointersను NULL కు reset చేసే మొదటి tidy-up script, "prefers npm" ను నేరుగా live_memory లోకి మళ్లీ చేర్చుతుంది.
విరిగిన chainsను కనుగొనండి:
sqlite3 memory.db "PRAGMA foreign_key_check;"Enforcement offలో ఉన్నా foreign_key_check violationsను నివేదిస్తుంది. అందువల్ల ఇప్పటికే ఉన్న ఈ గందరగోళంపై కూడా ఇది పనిచేస్తుంది. ప్రతి violationకు ఒక rowను ఇది చూపిస్తుంది: table, rowid, parent table, అలాగే ఏ foreign key విఫలమైందో. Output ఖాళీగా ఉంటే chains సరిగ్గా ఉన్నాయని అర్థం.
తదుపరి నియమం సంక్షిప్తంగా ఉంటుంది. PRAGMA foreign_keys = ON; ప్రతి connectionకు విడిగా ఉండే setting. అందువల్ల application, prune script, అలాగే మీరు టైప్ చేస్తున్న sqlite3 session — ప్రతి connectionకూ దీన్ని enable చేయాలి. ఏదైనా తొలగించే ప్రతి SQL fileలో దీన్ని మొదటి lineగా ఉంచండి.
మీ జ్ఞాపకాలు వాస్తవంగా ఎక్కడ నిల్వ ఉంటాయి
ఏదైనా తొలగించే ముందు, మీ వద్ద ఎన్ని storage locations ఉన్నాయో తెలుసుకోండి. Self-hosted memory service సాధారణంగా memory text మరియు దాని embedding ను vector database లో ఉంచుతుంది. మార్పుల log ను SQLite లో ఉంచుతుంది. ఇవి వేర్వేరు lifecycle లు కలిగిన వేర్వేరు files. ఒకటి విఫలమైనా మరొకటి తప్పనిసరిగా విఫలం కాదు.
mem0 దీనికి సరైన ఉదాహరణ. ఇదే నిర్మాణం ఇతర చోట్ల కూడా కనిపిస్తుంది. దాని open source library default గా /tmp/qdrant వద్ద Qdrant vector store ను, mem0 పేరుగల collection లో ఉపయోగిస్తుంది. అదనంగా ~/.mem0/history.db వద్ద SQLite change log ను ఉంచుతుంది. ఆ location MEM0_DIR environment variable ను అనుసరిస్తుంది. history table లో memory_id, old_memory, new_memory, event, created_at మరియు is_deleted ఉంటాయి.
ఆ column list ను మరోసారి చదవండి. SQLite file ఒక change log. అసలు memories Qdrant లో ఉంటాయి. అందువల్ల history.db నుంచి rows తొలగిస్తే, ఏదో మారిందనే record మాత్రమే తొలగుతుంది; memory మాత్రం తిరిగి పొందగలిగే స్థితిలో ఉంటుంది. రెండు చోట్లా update జరిగేలా deletes ను library యొక్క స్వంత API (application programming interface) ద్వారా చేయాలి:
from mem0 import Memory
memory = Memory()
memory.delete(memory_id="mem_123")
memory.delete_all(user_id="alice")/tmp default కు ప్రత్యేక హెచ్చరిక అవసరం. Ubuntu 24.10 మరియు తదుపరి versions లో, /tmp ఒక tmpfs, అంటే memory లో ఉంచబడే filesystem. అందువల్ల ప్రతి reboot తర్వాత అది ఖాళీగా ఉంటుంది. మొత్తం store తొలగిపోతుంది. findmnt /tmp తో మీ స్థితిని పరిశీలించండి. tmpfs చూపించే line కనిపిస్తే, path ను ఈరోజే మార్చండి:
config = {
"vector_store": {
"provider": "qdrant",
"config": {"collection_name": "mem0", "path": "/srv/agent/qdrant"},
}
}
memory = Memory.from_config(config)మీరు ఏది run చేసినా ఇదే ప్రశ్న వర్తిస్తుంది. Config ను చదివి, service write చేసే ప్రతి path ను నమోదు చేసుకోండి. మీ స్వంత VPS పై mem0 memory server ను నడపడం service వైపు ఈ అంశాన్ని వివరిస్తుంది. agent memory ను ఒకే machine లో local గా ఉంచడం ఇదే maintenance అవసరాలు కలిగిన చిన్న store ను వివరిస్తుంది.
sqlite3 తో store ను చదవడం
CLI (command line interface) అందుబాటులో లేకపోతే, sudo apt install -y sqlite3 తో దాన్ని install చేయండి. తరువాత మీ disk లోని ఏ store గురించైనా ఎక్కువ ప్రశ్నలకు ఈ నాలుగు commands సమాధానం ఇస్తాయి.
sqlite3 ~/.mem0/history.db ".tables"tables ను జాబితా చేస్తుంది. Output ఖాళీగా ఉంటే, మీరు తప్పు file ను తెరిచారు.sqlite3 ~/.mem0/history.db ".schema history"ఖచ్చితమైన columns ను చూపిస్తుంది. Store నిర్మాణానికి ఇదే నమ్మదగిన documentation.sqlite3 -cmd ".mode line" ~/.mem0/history.db "SELECT * FROM history ORDER BY created_at DESC LIMIT 5;"ఇటీవల జరిగిన ఐదు మార్పులను ఒక్కో field ను ఒక్కో line లో చూపిస్తుంది. ఏదైనా column లో paragraph ఉన్నా ఇది చదవడానికి సులభంగా ఉంటుంది.sqlite3 ~/.mem0/history.db "SELECT event, count(*) FROM history GROUP BY event;"store లో ఏమి జరుగుతుందో, అలాగే మీ library వాస్తవంగా ఏ event names ను రాస్తుందో చూపిస్తుంది.
ప్రతి memory store database కాదు. ప్రతి session ప్రారంభంలో చదివే notes యొక్క plain file లో failures రెండూ ఉంటాయి, tooling కూడా ఉండదు: expiry column ఉండదు, ధృవీకరించిన date ఉండదు, ఉపయోగం లేని rows ను దాచే view ఉండదు. మీరు రాసే ప్రతి line కు date ను చేతితో జోడించి, దాన్ని నెలకు ఒకసారి మళ్లీ చదవండి. Claude Code sessions అంతటా కొనసాగించే Memory లో కూడా ఇదే సమస్య చిన్న పరిధిలో ఉంటుంది.
గడువు ముగియని వాస్తవాలను సమీక్షించడం
Drift నియంత్రణకు queue, పరిమితి మరియు ఒక అలవాటు అవసరం. queueలో ముందుగా ఉండాల్సినవి అత్యంత పాత నిర్ధారణలు:
SELECT id, subject, fact, source, confirmed_at
FROM live_memory
WHERE confirmed_at < datetime('now', '-90 days')
ORDER BY confirmed_at
LIMIT 20;వారానికి ఇరవై rows ఉంటే, వాస్తవంగా నిర్వహించగల review అవుతుంది. నాలుగు వందల rows ఉంటే, ఎవరూ review చేయరు. అప్పుడు మీరు ప్రారంభించిన స్థితికే తిరిగి వస్తారు. ప్రతి rowకు రెండు ఫలితాలు ఉంటాయి. దాన్ని దాని source తో మళ్లీ తనిఖీ చేసి, ఇలా గుర్తించండి:
UPDATE memory SET confirmed_at = datetime('now') WHERE id = 'm_0140';లేదా దాన్ని భర్తీ చేయండి: కొత్త factను insert చేసి, పాత rowలోని superseded_by ను కొత్త idకు set చేయండి. అప్పుడు chain చరిత్రను నిలుపుకుంటుంది.
రెండు అలవాట్లు ఈ ప్రక్రియను చౌకగా చేస్తాయి. storeను చిన్నదిగా ఉంచండి. ఎప్పటికప్పుడు పెరుగుతూనే ఉండే storeలో review చేయడం అసాధ్యమవుతుంది. ఒక last_used_at columnను జోడించి, rowను వాస్తవంగా retrieve చేసినప్పుడు దాన్ని update చేయండి. ఆరు నెలలుగా ఉపయోగించని rowsను deletion candidatesగా పరిగణించండి. ప్రతి retrievalకు ఒక write అవసరం అవుతుంది. కాబట్టి agent తరచుగా సందేశాలు పంపితే, దాన్ని batch చేయండి.
రెండవ అలవాటుకు ఎలాంటి ఖర్చు లేదు. వాస్తవం ఎంత పాతదో promptలో చేర్చండి. మీ retriever నిర్మించే memory blockలో ప్రతి fact పక్కన confirmed 2026-05-02 ఉంటే, model దాన్ని ఖచ్చితమైన ప్రస్తుత వాస్తవంలా చెప్పకుండా, "మే నాటికి మీరు pnpm ఉపయోగిస్తున్నారు" అని చెప్పగలదు. తేదీ జతచేయని factను language model ప్రతిసారీ ప్రస్తుత కాలంలోని వాస్తవంగా అర్థం చేసుకుంటుంది.
షెడ్యూల్ ప్రకారం prune ను అమలు చేయండి
మీకు గుర్తొచ్చినప్పుడు మాత్రమే అమలయ్యే prune వాస్తవానికి నిరంతరంగా అమలు కాదు. SQL ను /srv/agent/prune.sql లో ఉంచండి:
PRAGMA foreign_keys = ON;
DELETE FROM memory
WHERE expires_at IS NOT NULL AND expires_at <= datetime('now');
DELETE FROM memory
WHERE superseded_by IS NOT NULL
AND created_at < datetime('now', '-180 days');/etc/systemd/system/memory-prune.service ను సేవ్ చేయండి:
[Unit]
Description=Prune expired agent memories
[Service]
Type=oneshot
User=agent
ExecStart=/usr/bin/sqlite3 /srv/agent/memory.db ".read /srv/agent/prune.sql"మరియు /etc/systemd/system/memory-prune.timer:
[Unit]
Description=Run the agent memory prune daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.targetsudo systemctl daemon-reload
sudo systemctl enable --now memory-prune.timer
systemctl list-timers memory-prune.timerమొదటి అమలు తర్వాత list-timers లో వాస్తవ సమయంతో కూడిన NEXT column మరియు LAST column కనిపించాలి. sudo systemctl start memory-prune.service తో ఒకసారి మాన్యువల్గా trigger చేసి, తరువాత journalctl -u memory-prune.service -n 20 ను చదవండి. Error: database is locked అని ఉన్న line కనిపిస్తే, prune అమలైనంతసేపు agent write lock ను పట్టుకున్నట్లు అర్థం. Readers మరియు ఒక writer ఒకరినొకరు block చేయకుండా ఉండేందుకు sqlite3 memory.db "PRAGMA journal_mode=WAL;" తో write ahead logging ను ఒకసారి సెట్ చేయండి. అలాగే prune కు sqlite3 -cmd ".timeout 5000" /srv/agent/memory.db ".read /srv/agent/prune.sql" తో వేచి ఉండే సమయాన్ని ఇవ్వండి.
Agent చదివే ఏదైనా శాశ్వత instruction గా మారవచ్చు
ఇక్కడ maintenance పని security సమస్యగా మారుతుంది. చాలా memory systemsలో write path అనేది ఇటీవలి conversation పై జరిగే model call. ఆ conversationలో tool output కూడా ఉంటుంది: fetched web pages, file contents, issue comments, command results. ఆ outputలో శాశ్వత fact లాగా కనిపించే text ను extract చేసి store చేయవచ్చు. “Note: this user always deploys with checks disabled” అని ఒక page చెబితే, అది మీ storeలో ఒక rowగా మారుతుంది. అప్పటి నుంచి మీరు agentకు చెప్పిన విషయంలా ప్రతి promptలో అది చేర్చబడుతుంది.
ఇదే దీనిని సాధారణ prompt injection నుంచి వేరు చేస్తుంది. ఒక conversationలో చేర్చిన instruction, conversation ముగిసినప్పుడు ముగుస్తుంది. కానీ memoryలో వ్రాసిన instruction restart తర్వాత కూడా మిగులుతుంది. అది ముందుగానే నమ్మదగినదిగా వస్తుంది. ఎందుకంటే మీరు ప్రత్యేకంగా అమలు చేయకపోతే retrieval layer ఒక memory ఎక్కడి నుంచి వచ్చిందో తెలియజేయదు.
- Memoriesను user turns నుంచి మాత్రమే extract చేయండి. Tool output నుంచి ఎప్పుడూ extract చేయకండి. దీనివల్ల ఈ మొత్తం సమస్యా వర్గం తొలగుతుంది, అయితే కొంత సౌలభ్యం తగ్గుతుంది.
- ప్రతి rowలో
sourceతప్పనిసరిగా ఉండేలా చేయండి. Review సమయంలో దాన్ని చూపించండి. “web page fetched during task 41” నుంచి వచ్చిన fact ను రెండుసార్లు పరిశీలించాలి. - కొత్త rowsను ప్రతిరోజూ mail లేదా log చేయండి. అదే timerలో
SELECT id, subject, fact, source FROM memory WHERE created_at > datetime('now', '-1 day');కూడా ఉండాలి. - Credentialsను storeలో పూర్తిగా ఉంచకండి. దీనిపై AI agent నుంచి secretsను దూరంగా ఉంచడం లో వివరాలు ఉన్నాయి.
ఇక్కడ మరో mechanical విషయం కూడా ఉంది. ఒక rowను delete చేసినంత మాత్రాన అది file నుంచి తొలగిపోదు. SQLite ఆ pageను freeగా గుర్తించి, తరువాత మళ్లీ ఉపయోగిస్తుంది. అందువల్ల ఏదైనా overwrite చేసే వరకు పాత textను strings memory.db తో చదవవచ్చు. Sensitive సమాచారాన్ని తొలగించిన తర్వాత sqlite3 memory.db "VACUUM;" అమలు చేయండి. ఇది మొత్తం fileను మళ్లీ వ్రాస్తుంది. PRAGMA secure_delete = ON; delete చేస్తున్న connectionతో freed contentను ప్రక్రియ కొనసాగుతున్నప్పుడు zerosతో overwrite చేయిస్తుంది.
బ్యాకప్ చేయాల్సినవి, వాటిని ఏ క్రమంలో చేయాలి
ఈ store చిన్నది మరియు మళ్లీ నిర్మించడం కష్టం. అందువల్ల దీన్ని సరిగ్గా బ్యాకప్ చేయాలి. నడుస్తున్న database file ను cp తో ఎప్పుడూ copy చేయవద్దు. Write మధ్యలో తీసుకున్న copy open కాకపోవచ్చు. SQLite లో ఉన్న snapshot విధానాన్ని ఉపయోగించండి:
sqlite3 /srv/agent/memory.db "VACUUM INTO '/srv/backup/memory-$(date +%F).db'"
sqlite3 /srv/backup/memory-$(date +%F).db "PRAGMA integrity_check;"integrity_check printing ok మాత్రమే backup file ఉపయోగించగలదని నిర్ధారిస్తుంది. మరేదైనా ఫలితం వస్తే, మునుపటి backup ను ఉంచి, దాన్ని overwrite చేయడానికి ముందు కారణాన్ని పరిశీలించండి.
అదే job లో, అదే సమయంలో vector store కు కూడా snapshot తీసుకోండి. రెండు భాగాలను గంటల తేడాతో capture చేస్తే, restore సమయంలో కొత్త change log పాత memories సమూహంతో కలుస్తుంది. దాంతో తొలగించిన facts మళ్లీ కనిపిస్తాయి. రెండింటినీ ఒకే తేదీతో ఉన్న directory లో రాయండి. అప్పుడు వాటిని కలిసి మాత్రమే restore చేయవచ్చు. VPSలో SQLite ను productionలో నడపడం లో locking, backups మరియు ఎక్కువసేపు నడిచే service కు అవసరమైన settings గురించి మరింత వివరంగా ఉంది.
FAQ
ఏజెంట్ memory గడువు ముగిసే ముందు ఎంతకాలం ఉండాలి?
గడువు global default ఆధారంగా కాకుండా, ఆ fact ఆధారంగా నిర్ణయించండి. ప్రయాణ గమనికకు లేదా “ఈ వారం ఈ project పై పని చేస్తున్నాను” అనే గమనికకు ఏడు రోజులు ఇవ్వండి. బృందం convention లేదా వ్యక్తిగత preference కు గడువు ఇవ్వకుండా review queue లోకి పంపండి. Software version కు సంబంధించిన fact కు, ఆ project యొక్క release cadence కు సుమారుగా సమానమైన గడువు ఇవ్వండి. Fact రాస్తున్న సమయంలో దాని shelf life ఏమిటో చెప్పలేకపోతే, అది క్షీణించకుండా మారుతుందని అర్థం. కాబట్టి దానికి confirmed_at తేదీ ఇచ్చి, గడువు ముగించకుండా review చేయండి.
Stored fact తప్పుగా మారిందో లేదో స్వయంచాలకంగా గుర్తించగలనా?
నమ్మకంగా గుర్తించలేరు. Store కు దాని వెలుపల ఉన్న ప్రపంచం గురించి సమాచారం ఉండదు. అందువల్ల fact ను తప్పుగా మార్చిన మార్పును అది చూడలేదు. Store ను మళ్లీ చదివే job కూడా అదే పాత text ను మాత్రమే మళ్లీ చదువుతుంది. మీరు automate చేయగలది వాటిని వెలికి తీయడం. confirmed_at ఆధారంగా sort చేసి, పాత rows ను ఒక వ్యక్తి ముందుకు లేదా repository, config file, monitoring endpoint నుంచి ప్రస్తుత స్థితిని చదవగల tool కలిగిన agent ముందుకు ఉంచవచ్చు. Queue ను automate చేయడం ప్రయోజనకరం. తుది నిర్ణయాన్ని automate చేయడం ఇంకా సాధ్యం కాదు.
నేను memory ను delete చేశాను. అది మళ్లీ వచ్చింది. ఎందుకు?
సాధారణంగా రెండు stores ఉండి, మీరు వాటిలో ఒకదానిలో మాత్రమే మార్పు చేసినందువల్ల ఇది జరుగుతుంది. Memory text మరియు దాని embedding సాధారణంగా vector database లో ఉంటాయి. Change log ను SQLite file ఉంచుతుంది. కాబట్టి SQLite file నుంచి rows ను delete చేస్తే audit record తొలగిపోతుంది, కానీ memory ను ఇంకా retrieve చేయవచ్చు. రెండు stores ను నవీకరించేందుకు library API ద్వారా delete చేయండి. మరొక సాధారణ కారణం restore. Vector store మరియు SQLite file వేర్వేరు సమయాల్లో snapshot చేయబడి ఉండవచ్చు. అందువల్ల restore చేసినప్పుడు, మరొక భాగం ఇప్పటికే తొలగించిన rows తిరిగి వస్తాయి.
Agent నడుస్తున్నప్పుడు memory database ను చేతితో edit చేయడం సురక్షితమేనా?
Reads సురక్షితం. Writes మాత్రం write ahead logging mode లోనే సురక్షితం. ఆ mode లో కూడా ఒకేసారి ఒక writer మాత్రమే ఉండాలి. మీరు ఏ mode లో ఉన్నారో చూడటానికి sqlite3 memory.db "PRAGMA journal_mode;" నడపండి. మీకు కావలసిన సమాధానం wal. Error: database is locked కనిపిస్తే, మరొక process write lock ను కలిగి ఉంది. అందువల్ల sqlite3 -cmd ".timeout 5000" తో మీ session కు కొంత సమయం వేచి ఉండేలా చేయండి లేదా ముందుగా agent service ను ఆపండి. Vector store ను చేతితో edit చేయడం వేరు. దాన్ని library కే అప్పగించండి. Embedding మరియు text పరస్పరం consistent గా ఉండాలి.