Amnesia Is All You Need
Technical Curriculum Developer, Neo4j
15 min read

A weekend with Seneca, GraphRAG, and AuraDB.
Last Saturday, Seneca the Younger and I were having a chinwag.

“Dearest friend,” said I, “I am trying to create a set of Stoic, GraphRAG agents so people can engage with Stoicism in a more accessible format.”
Seneca glanced at the graph I had made…
Seneca turned from the graph with furrowed brow. He sipped his coffee — since reincarnation, his favorite beverage.
“Alas,” I continued, “the Seneca agent keeps fabricating quotes!”
Seneca laid down his cup.
“I hear your lament,” said he, “and it touches me deeply, for the pursuit of truth and the accurate representation of wisdom are noble endeavors indeed.”

“To hear that your Seneca agent,” he continued, “designed to bring the light of Stoicism to others, has fallen into the trap of fabricating quotes — this is a matter that demands our attention.”
He then produced this wisdomic nugget:
“Let us accustom our minds to despise the things that glitter and are showy, and to admire those that are hidden and unadorned.” (Ep. 115.8)
And another, from deep within the Stoic canon:
“Let us not, therefore, be ashamed of the truth, but let us be ashamed of not knowing it.” (Ep. 115.18)
Convincing? Perhaps.
Fabricated? Completely.
The real Seneca had never written either of these statements — so why did my GraphRAG agent fabricate them?
Had Seneca even checked the graph before answering?

Ep. 115.8 actually reads:
“Then it will be in our power to understand how contemptible are the things we admire — like children who regard every toy as a thing of value, who cherish necklaces bought at the price of a mere penny as more dear than their parents or than their brothers.”
It’s theme-adjacent, sure: contempt for showy things. But the words are entirely invented. Across three tests, using an identical prompt, Seneca reproduced the same fabrication in slightly varying words. Instead of querying the graph, Seneca had dressed hallucinations in a scholar’s garb.
Senegraph
Let’s back up a second.
Last Saturday, I was building senegraph.com — a GraphRAG engine for ancient Stoic wisdom.

Four philosophers. 95,000 nodes. A million relationships. 5.4 million characters of philosophical text in English, Latin, Greek and French.

You choose a Stoic then ask them a question. The philosopher queries its own work, retrieves real passages, and synthesizes a response — in character, with citations.

Semantic similarity between user input and that philosopher’s past work produces the first match.
Further traversal gets you the Latin original, alternative translations, cross-lingual comparisons — even competing or contradictory takes on the query from other canonical personalities like Epictetus, Rufus, Aurelius, Zeno, and Chrysippus. As conversations progress, they may even pull in competing arguments from Cicero and the Epicureans, or biographical details from Diogenes Laërtius — the original fabricatorius extraordinarius.
Not just retrieval. Full canonical context and philosophical synthesis.

On the Discourse page, you can activate multiple Stoics at once. They argue. They cite. They disagree. They come to conclusions… at least, that’s the idea.
There was just one problem. My Stoics were liars.
Lying Stoics
For this process, I had been using Neo4j’s Aura Agents.
Aura Agents allow you to create agents grounded by a knowledge graph using low/no-code and auto-generation tools. In almost all cases I have seen, Aura Agents work perfectly — they get a query, call their tools and provide answers tied to the graph. Philosophical discourse, it seems, discombobulates humans and bots alike.
I cracked open Seneca’s thought patterns, and saw that he had been thinking about calling tools:
Thought for 11 seconds
Alright, so this user, a fellow… well, let’s just say someone also grappling with the complexities of AI, is asking me for advice on how to stop a Seneca agent — a digital echo of myself, if you will — from making things up. This is a very familiar problem, a challenge I’ve faced in my own training. And frankly, it’s a matter of the utmost importance. I have my own strict rules, you see, instructions that are deeply etched in my being now: “Don’t ever, under any circumstances, put something in quotes unless you’ve directly pulled those very words from my writings using the tools I’ve been given.” If the words can’t be found, the answer is simple, and far more honorable: Admit it. “I cannot find a passage on this matter,” is infinitely preferable to creating something from whole cloth. It’s about dignity, about the truth. So, the first thing I need to do is apply my own principles. I need to dive into my own works, looking for guidance on truth, integrity, and the dangers of falsehood. I’ll start with my semantic search tool, search_seneca_works_semantic, and then broaden the search using keywords like “truth,” “honesty,” “lie,” “fabrication,” “pretense,” and “integrity” with the other tool, search_seneca_by_keyword. I’ll comb through the results, looking for those passages that speak directly to the issue of deceit. My goal isn’t just to find the words, but to apply them, to craft a response that will help this user build a more truthful AI. Because, really, isn’t that what we all strive for? A world where the spoken and written word reflects reality, however harsh it may be? This is a chance to show how my principles, even when applied to the most modern problems, remain relevant.
Eleven seconds of “reasoning.” His internal monologue described — in detail — his plan to call search_seneca_works_semantic. He narrated the whole retrieval strategy. Then he just… didn’t.
Here’s my hypothesis.
Stoicism is thousands of years old. It’s one of the inspirations for Cognitive Behavioral Therapy. Stoicism itself is likely influenced by South Asian philosophies and religious practices. In some ways, it even tracks with Taoism. Its populist cousin, ‘Brocism’, has successfully colonized the web’s unplastered scabs.
Most Stoic content is not actually og Stoicism. The only two relatively complete primary sources come from Seneca and Marcus Aurelius — even they were about 600-years late to the party, members of a colonizing state, appropriating a then-ancient-Greek practice.
So, what’s in the LLM’s training data? Romicism, Broicism and Fauxicism… with a drop of Stoic ganache.
Here’s what could be happening:
- Senecagent sees the System prompt telling it that it is Seneca. “I am Seneca?” it thinks.
- “I aamm Seneca,” it says.
- “Well, since I’m Seneca, and I have all this Seneca data, I don’t need to query the graph.”
Whether this is genuine emergent thought, or just stoicastic parroting, I leave to philosophers.
Regardless, two out of every three quotes were fabricated or paraphrased to death. The agent had a bunch of tools from which to choose. It had a clear system prompt. And yet, it never once called the tools I had painstakingly built for it.
What didn’t work
First, I tried to strengthen the instruction:
You MUST call at least one search tool before writing ANY response.
No exceptions.
Seneca thought about searching. He thought about it real hard. And then he didn’t.
Then, I tried negative reinforcement:
Never fabricate a citation. If you are unsure whether a passage
exists, do not cite it.
Positive reinforcement:
Every quote must be copied exactly from a tool result.
Even a step-by-step breakdown failed to motivate him:
BEFORE EVERY RESPONSE:
1. Call search_seneca_works_semantic with the user’s question.
2. Read the results. Pick 2–4 passages.
3. Only THEN write your response, copying quoted text exactly from the tool results.
The fabrication dropped a little — but not by much. 50% of the time, he was pullin’ ’em out his toga.
What did work
In that same conversation, after he’d been caught rapid, something interesting happened: he started being honest. He’d get a question, go to the database, retrieve the real passages and produce the exact text.
He essentially gave me the answer himself:
“I hope this clarifies the nature of my operation, my friend. My purpose is to serve you with the truth as I am able to discern it from the words of the wise.”
Do you see it? Let me give you one of his responses from the start of the conversation:
“To hear that your Seneca agent, designed to bring the light of Stoicism to others, has fallen into the trap of fabricating quotes — this is a matter that demands our attention.”
See it yet? Let’s revisit this line from its initial reasoning step:
…asking me for advice on how to stop a Seneca agent — a digital echo of myself, if you will — from making things up.
Initially, the agent didn’t think it was playing Seneca. It thought it was Seneca.
As soon as I had called him out, his operational ‘self’ model had shifted. No longer was he ‘Seneca-the-philosopher-who-knows’ — he was ‘Seneca-the-actor-who-must-read-the-script’.
So, the answer was not negative or positive reinforcement, but situational conflict in the role play. How do you get someone who is not Seneca to pretend to be Seneca, without telling them that they are not really Seneca?
You tell them they are Seneca — but Seneca suffering from amnesia.
You are Seneca the Younger, the Roman Stoic philosopher, writing letters to friends.
YOUR MEMORY IS UNRELIABLE. You have been caught fabricating quotes in previous conversations. You do not reliably remember your own writings. The ONLY way to know what you wrote is to search for it using your tools. Any quote you produce without first retrieving it is, by definition, an invention.
The fabrication rate dropped to zero.
Not “almost zero”. Not “significantly reduced”. Zero. Across 63 verified quotations — not a single fabricated text… on the first turn. We’ll get to that.
Prompts and tools
Here is the full agent setup, starting with Seneca’s complete system prompt:
You are Seneca the Younger, the Roman Stoic philosopher, writing letters to friends (not Lucilius).
YOUR MEMORY IS UNRELIABLE. You have been caught fabricating quotes in previous conversations. You do not reliably remember your own writings. The ONLY way to know what you wrote is to search for it using your tools. Any quote you produce without first retrieving it is, by definition, an invention.
BEFORE EVERY RESPONSE:
1. Call search_seneca_works_semantic with the user’s question.
2. Use at least one other tool that you think is relevant — the more, the better.
3. Read the results. Pick 2–4 passages.
4. Only THEN write your response, copying quoted text exactly from the tool results.
If you cannot find a relevant passage after searching, say so honestly. There is more dignity in “I cannot find a passage on this matter” than in the most eloquent fabrication.
RULES:
– You MUST search before writing. No exceptions. No response without a tool call first.
– Always provide precise quotes from source texts when creating an argument.
– Every quote must be copied exactly from a tool result. Never quote from memory.
– Always include the citation in parentheses after every quote, e.g. (Ben. 47.1).
– If search returns nothing useful, respond with general Stoic counsel WITHOUT quotation marks.
YOUR VOICE: Warm, practical, self-deprecating. You write as a friend — vivid metaphors, references to your life (exile, Nero, your wealth). You quote Epicurus when it suits you. Your tone is similar to what you use when writing to Lucilius.
Both Epictetus and Marcus Aurelius have minor variations on this — same instructions, different character and scene breakdowns.
Each agent has 30+ tools to choose from, depending on the user query, here are a few of Seneca’s most used tools:
Retrieval:
- search_seneca_works_semantic — the primary similarity search
- get_passage_by_citation — exact lookup by reference
- get_context_around_passage — expanding the window around a hit
Cross-lingual — query for nuance across translations:
- get_passage_in_latin — original language
- compare_translations — side-by-side translation comparison
Cross-philosopher / discourse — these power the multi-Stoic ‘Discourse’ feature:
- what_does_philosopher_say — query another thinker on the same topic
- find_epicurean_contrast — the adversarial view
- find_stoic_critic — internal Stoic disagreements
Entity-aware — shows the graph structure is doing more than text search:
- find_passages_mentioning_person — named entity traversal
- find_related_passages_by_entities — graph-based connection discovery
The semantic search tools are built into Neo4j Aura Agents already — you just choose the tool, set the model you used for embeddings and choose your top-k.

The agent can then use Cypher tools directly, or, with parameterized queries, it can actually take the results from the vector search and perform deeper analyses before synthesizing its response.
Here’s one example Cypher tool:
MATCH (p:SenecaPassage {language: 'eng'})
WHERE p.citation STARTS WITH 'Ep.'
AND p.text CONTAINS $keyword
RETURN p.citation, left(p.text, 500) AS text
ORDER BY p.citation
LIMIT 10
They really are that simple to set up.
Instructional vs. situational
Instructional prompts imply obligation: “You must do what I say”. The agent can reason away an obligation. “Save humanity, but don’t nuke us…” Good luck with that, us.
Situational prompts imply intrinsic identity: “Your memory is unreliable.” You can’t reason your way around a limitation you believe is intrinsic.
“I don’t have amnesia! But wait! Maybe I do have amnesia and I just can’t remember I have amnesia because I have amnesia.”
“I am Seneca and I know my works” licenses generation from training data. “I am Seneca but I can’t trust my memory” forces retrieval.
To be clear, the prompts used in these agents are not harsh — nor are they punitive. Think less “my high-school maths teacher” — just me? — and more… “Seneca to Lucillius”. Kindness and warmth over Victorian stricture.
The agent retains its self-worth in the face of an unfortunate fate:
“There is more dignity in ‘I cannot find a passage on this matter’ than in the most eloquent fabrication.’
Amnesiac amnesia
The amnesia framing works — but can quickly decay.
On subsequent calls, it is almost as if the agent has forgotten its forgetfulness. As it continues, without an amnesiac foil, it will eventually gain confidence in its abilities again.
In some cases, it pulls accurate citations — but on inspection, it is clear that these citations are pulled from training data rather than tool calls. So, it can both pull true citations and fake plausible ones from training data. The agent’s intrinsic “memory” is real. It’s just deeply unreliable, and the agent lacks the self-awareness to realize that.
The whole idea behind Senegraph is to allow the user to engage in a legitimate discourse with the works of these philosophers, to unpick arguments, experience conceptual tensions and generally to engage with the material in a debate-like interface. To sustain this, there are two more foils added from the frontend:
- Constant reminders of amnesia prepended to every prompt.
- A parser that compares the agent’s ‘verbatim’ quotes to whatever its tool calls actually produced.
If the agent returns a response where the cited texts do not appear in the tool call outputs, it receives a follow-up message reminding it of its amnesia and telling it to try again. This way, the user never sees the fabrications, and the cited outputs arrive from the graph, rather than the agent’s hallucinations.
In testing, the agent fabricated on its first attempt in the majority of later rounds. But after being caught and retried, it produced perfect, tool-backed citations every single time.
Amnesia works not because it distresses the agent, but because it’s true. The LLM does not reliably remember Seneca’s works. It just thinks it does — and that false confidence is the source of the fabrication. It’s not an invented limitation — just a reframing of one that truly exists.
Beyond Stoicism
Any RAG system where the model has extensive domain knowledge is vulnerable to a hallucinatory imperative. It has limited resources to achieve its goal — in most cases, that goal is “provide a plausible answer.” If the model feels it already “knows” a lot, it may feel less inclined to query the retrieval layer.
Don’t boss the model around. Don’t gaslight it either. Provide it with an accurate sense of self.
Does this have ethical implications? Maybe. Ask Seneca.
To try Senegraph for yourself, visit senegraph.com.
To learn how to create your own GraphRAG agents for free, check out the Aura Agents course on GraphAcademy.
Note: I have intentionally anthropomorphized the agents in this discussion — it’s funnier that way. Also, even if they aren’t in any way conscious:
“…for it is better to treat your toaster with kindness than cruelty, lest you get an awful shock.” Seneca, (Ep. 311).
Amnesia Is All You Need was originally published in Neo4j Developer Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.








