This article is published in English.
Why Simpler Beats Elaborate in Today's AI Agent Architectures
This piece examines three 2024 arguments against vector databases, hypergraph memory, and orchestration complexity, showing simpler systems often outperform elaborate agent stacks.
Read enough content about AI agents from this year and a pattern emerges before any single argument does. Nearly everything proposed is additive. Bolt on a memory layer. Bolt on a graph. Bolt on an orchestration framework. Bolt on a retrieval pipeline with three stages of reranking. Add more agents whose job is to supervise the agents you already built. Underneath almost all of it sits the same unstated belief: that complexity equals progress, and that if your system isn't more elaborate than it was half a year ago, you must be falling behind.
A team building agent stacks has likely assembled parts of this same architecture, and might have justified some of those choices at the time. So when a handful of pieces surfaced this year making the opposite argument, that the elaborate addition probably wasn't worth the trouble, they deserved more attention than the usual "you don't need this" headline gets. Most contrarian tech writing is just hype running backward, equally confident and equally short on proof. These three arguments were different. Each rests on something verifiable: a benchmark score, a structural argument, or a straightforward account of how the work actually unfolds day to day. That's the standard worth applying here, and it's the standard the rest of this piece will hold itself to.
Three examples follow. In each, the field reached for more architecture when the real problem was something far less glamorous.
Case one: your agent probably doesn't need a vector database
Shipping agent memory backed by a vector store is a decision that tends to get made in seconds. Someone states the requirement, "the agent has to remember things between sessions," and the automatic response is: embed the data, store it, retrieve by similarity. It's the default not because anyone tested it against alternatives, but because every tutorial happens to do it that way.
That assumption is exactly what one piece from this year, Anubhav's "Your AI Agent Doesn't Need a Vector Database," put to the test. The result worth remembering is from the LoCoMo benchmark: a baseline made of nothing more than a directory of plain text files searched with grep beat several funded, purpose-built memory products, on the very benchmark those products were measured against. This wasn't a rigged toy comparison built to score a point. The more sophisticated systems, some combining embeddings, similarity search, and even graph-structured memory, still lost to something buildable in a single afternoon.
Once that result sinks in, the explanation stops feeling surprising. Vector similarity is a retrieval technique, not a reasoning technique. It excels at surfacing text that's semantically close to a query. It's poor at the things memory genuinely requires, such as recognizing that a fact recorded three weeks ago has since been overridden by yesterday's update, or that two stored entries flatly contradict one another and one must take precedence. A vector index has no built-in sense of time and no concept of a correction. It just hands back whatever sits nearest in embedding space and leaves the model to figure out, on its own, why two of the top five matches disagree.
There's a second mismatch, less about raw capability and more about familiarity. Language models have absorbed enormous amounts of training data centered on working with files: reading them, grepping through them, editing them, listing directories, tracing import chains. That's not a side effect, it's close to the core of what a large share of their training corpus consists of. A loop built around grep and reading files plays directly to that existing fluency. A vector database's query interface, by contrast, is a tool the model must figure out how to use effectively inside your particular context, without the depth of prior exposure it has to files. You end up substituting a skill the model already possesses for one it has to pick up on the fly, and you pay embedding and retrieval latency for that substitution.
Here's roughly how the decision could be framed now, after actually reasoning through it instead of defaulting to habit:
WHEN A FILESYSTEM + GREP BASELINE IS ENOUGH WHEN YOU ACTUALLY NEED A VECTOR STORE
------------------------------------------------ ------------------------------------------------
Single-agent or small-team memory Retrieval across a corpus too large to
fit or scan in context at all
Facts that change over time and need Cross-document semantic search where
correction, not just accumulation keyword overlap is genuinely weak
Memory the model itself writes, Centralized memory shared by many agents
manages, and re-reads in its own loop that needs access control and auditing
Debuggable state, plain text you can Multi-hop or relational reasoning across
open, diff, and edit by hand thousands of entities where similarity
search is doing real narrowing work
The write, manage, read cycle described in that piece deserves to be made concrete, since "just use files" can sound like a hand-wave until it's shown as working code. Here's a version that could run today, with no hosted service required:
import os
import subprocess
from datetime import datetime
MEMORY_DIR = "agent_memory"
def write_memory(topic: str, content: str) -> str:
os.makedirs(MEMORY_DIR, exist_ok=True)
path = os.path.join(MEMORY_DIR, f"{topic}.md")
timestamp = datetime.utcnow().isoformat()
with open(path, "a", encoding="utf-8") as f:
f.write(f"\n## {timestamp}\n{content}\n")
return path
def recall(query: str) -> str:
# ripgrep if you have it, grep -r works fine too
result = subprocess.run(
["rg", "-i", "-C", "2", query, MEMORY_DIR],
capture_output=True, text=True
)
return result.stdout or "no matches"
def list_topics() -> list[str]:
if not os.path.isdir(MEMORY_DIR):
return []
return [f[:-3] for f in os.listdir(MEMORY_DIR) if f.endswith(".md")]
Wire those three functions in as tools, let the model decide for itself when to write a note, when to search, and when to simply load an entire topic file into context because it's short enough to fit, and the result is a memory system with zero embedding cost, no vector database to host or pay for, and state that can be opened directly in a text editor when something goes wrong. If this setup is eventually outgrown, the reason will be obvious, because it will show up as a specific failure: a corpus too large to search quickly with plain text tools, or a multi-hop question that keyword search genuinely cannot answer. That's a far better justification for introducing a vector store than simply following what a tutorial happened to demonstrate.
You're not being told vector databases have no place in the world. The point is narrower: don't reach for one before actually measuring how far the unglamorous baseline gets you. Try full-context loading and filesystem-plus-grep first. Only bring in a paid memory product if it beats that baseline by a wide enough margin to justify what it costs, both in money and in the debuggability you give up. Most agent memory workloads never clear that bar.
Case two: hypergraphs won't save your RAG system either
If vector databases were last year's automatic choice, graph-based RAG has become this year's, and hypergraphs are the escalation that shows up once a team decides a plain knowledge graph still isn't expressive enough. The pitch sounds reasonable on its face: an ordinary graph edge links exactly two nodes, but plenty of real-world facts involve more than two participants at once. Consider a scenario where one employee signs off on a colleague's travel expenses on behalf of an entire department for a specific budget cycle — that single fact tangles together five distinct participants. Squeeze it into pairwise edges and you're stuck with a choice: either you lose the sense that this was one atomic event, or you split it across several binary edges that then have to be stitched back together at query time. A hyperedge, capable of linking any number of nodes simultaneously, looks like the more faithful way to model that. So teams go build hypergraph RAG systems on the belief that this added fidelity will translate into better retrieval.
A piece published this year by a writer named Dustin, titled "Hypergraphs Won't Make Your RAG System Better. Here's What They Actually Change," tested that belief against the real implementation behind a hypergraph RAG paper, not just its abstract. What turned up was almost comedic: HyperGraphRAG, a system whose entire premise is that native hyperedges matter, actually stores everything internally in a standard graph database using ordinary binary edges. Even more telling, the paper's own authors demonstrate that this translation — breaking each hyperedge into a small cluster of binary edges wrapped around a reified node standing in for the event — throws nothing away. Nothing about the underlying structure is lost in the conversion. The supposedly more honest hypergraph representation and the "boring" binary-edge version can be reconstructed from one another exactly.
That's not some minor footnote about implementation — it undercuts the entire argument. If a native hyperedge and a role-reified cluster of binary edges encode the same incidence structure, and each can be trivially rebuilt from the other, then picking one over the other isn't really a modeling choice with downstream consequences. It's just a storage format decision. A commenter on that piece, Felix Anderson, stated the relevant math about as cleanly as it can be stated: a hyperedge and a role-reified binary graph describe the same incidence structure, and hypertree width shifts by only a constant factor when arity is bounded. Hypertree width is the actual complexity measure that determines how expensive a query is to evaluate — not hop count, and not how many participants got crammed into one edge. If switching representations only moves that number by a constant, and each fact involves a bounded number of participants (which is true of almost every real-world fact — a handful of people in an approval chain, not thousands), then all the engineering effort spent on the switch buys nothing on the dimension that actually governs query cost.
It's worth being fair about why this misconception is easy to fall into. Hop count is intuitive: more nodes standing between a question and its answer feels like it should mean a harder query. Hypertree width isn't intuitive at all — it comes out of the theory of constraint satisfaction and query complexity, and it can move in ways that hop count never signals unless someone specifically goes and checks. It's entirely possible to add structural sophistication that shrinks the hop count for one carefully chosen example query while leaving the underlying complexity class untouched, or even making it slightly worse. A paper's cherry-picked worked examples can look impressive and still say nothing meaningful about the general case.
Here's the side-by-side comparison worth reviewing before choosing between a plain graph, a reified graph, or a native hypergraph store:
REPRESENTATION WHAT IT ADDS WHAT IT ACTUALLY CHANGES
--------------------- ------------------------------- --------------------------------
Plain binary graph Simplest to build and query Baseline; loses atomicity of
with standard graph tooling multi-participant facts
Reified binary graph Recovers atomicity via an Same incidence structure as a
(event node + roles) explicit "event" node hyperedge; hypertree width
shifts by a constant only
Native hypergraph Hyperedges as first-class No reduction in query
store objects, arguably cleaner complexity class over a
to write against reified graph; new storage
engine to run and maintain
None of this is an argument that graph structure is worthless for RAG. Multi-hop relational retrieval really does benefit from graph structure compared to flat vector search — that much isn't in question. What's in question is the additional leap from an ordinary graph to a hypergraph, and once you look past the pitch and into the actual proof, the honest conclusion is that this leap buys a data model that looks cleaner and costs a new category of infrastructure to run, all without touching the number that determines whether queries run fast or slow. If retrieval quality is the problem, the fix with actual evidence behind it is usually a better graph construction pipeline or a smarter retrieval strategy over the graph already in place — not a more exotic edge type.
Case three: the real bottleneck was never the code itself
The first two arguments concerned retrieval architecture, a subject that sits squarely in familiar territory. This third one lands differently, because it isn't about picking the right tool — it's about what a senior engineer's job is actually made of, and it hit closer to home than expected.
Patrick Koss, a tech lead overseeing a five-engineer team at a company with over a thousand employees, titled his piece "AI can't do 95% of my job (and i'm a software engineer)." The opening claim reads almost like an admission of defeat before it turns into an argument: writing code is the smallest slice of how he spends his time, by a wide margin. His team follows a "you build it, you run it" model, meaning on-call responsibility for the systems they own falls to his own engineers rather than a separate ops group that gets to treat production issues as somebody else's problem. His mornings begin around 8:30 with pull request review, and the code showing up in those PRs — much of it typed out by AI agents doing the bulk of the drafting — is noticeably better than what he was reviewing a couple of years back. He isn't questioning whether AI can produce good code today. He concedes that point entirely, and then observes that it barely changes what his job actually requires of him.
That's the detail worth pausing on, because it undercuts an assumption baked into a lot of agent-stack reasoning, including plenty of arguments made in this space: the idea that capability dictates automation. The logic usually goes that once a model can write correct code, code production stops being human work, and so the share of "the job" that gets automated should track the share of the job that used to involve writing code. Koss's counterpoint is that this equation was broken well before AI entered the picture — AI just makes the mistake more visible. A tech lead's role was never primarily about producing code. It was always primarily about coordination: choosing what gets built and in what sequence, negotiating scope among stakeholders with conflicting priorities, reviewing and standing behind other people's technical decisions, carrying the pager, mentoring less experienced engineers, and translating between what a stakeholder requested and what the system can realistically support without breaking. None of that is coding work in disguise. It's organizational and interpersonal work that happens to output code along the way — and a highly automatable output at that — nested inside a much larger set of responsibilities that resist automation precisely because they're not about producing artifacts. They're about producing agreement, tradeoffs, and accountability among people.
This may be the most underappreciated observation in this year's conversation about agents, more significant than any single benchmark number, because it explains why "the model got dramatically better at coding" and "my job got dramatically easier" haven't moved in lockstep for a lot of senior engineers, even those actively using these tools and getting genuine value from them. Watching SWE-bench scores climb from single digits into the seventies over a couple of years represents a real and substantial jump in capability. But that jump doesn't automatically translate into a job that's 70 percent lighter, because the job was never 70 percent code production in the first place — especially once you're senior enough that the role also includes owning the on-call rotation and the roadmap, not just the pull requests.
The honest caveat is that this argument doesn't generalize quite as cleanly as the first two. Claims about vector databases and hypergraphs are technical enough that you can check them against a benchmark or a proof, and that verification is exactly what happened earlier. The question of how much of a senior engineer's job is coordination versus coding is going to shift depending on company size, team maturity, how much of the organizational overhead is genuinely load-bearing versus just dysfunction, and how senior the individual is. A five-person team inside a thousand-person company running "you build it, you run it" is one particular shape of job, not a stand-in for every engineering role. Even so, the underlying correction seems to hold broadly: agent capability sets a ceiling on how much of the code-writing portion of a job could theoretically be automated, but it tells you almost nothing about how much of the coordination portion can be, since that portion was never limited by typing speed or code quality to begin with.
The common thread
Put these three cases side by side and the real lesson has nothing specifically to do with vector databases, hypergraphs, or agent capability. It has to do with a mismatch between where each field assumed the difficulty lived and where it was actually located.
CASE WHERE COMPLEXITY WAS ADDED WHERE THE REAL BOTTLENECK WAS
------------------ ---------------------------------- --------------------------------
Agent memory Vector embeddings, similarity Whether the model can use a
search, sometimes a graph layer retrieval method it already
on top of that has deep fluency with
RAG structure Native hyperedges, a new The complexity class governing
storage engine, more query cost, which the fancier
elaborate graph modeling structure barely touches
"How much of the An assumption that model Whether the job was ever
job gets automated" capability alone predicts mostly about the thing the
the automatable fraction model is good at
None of the more elaborate options is inherently a bad idea. Vector databases solve real problems in the right context, hypergraphs may well turn out to help in some situation not covered here, and AI agents genuinely do eliminate real busywork from real engineering jobs, a point the researcher behind the third case makes explicitly. The mistake wasn't reaching for sophistication, it was skipping the step of verifying that the sophistication targets the actual constraint, rather than the constraint that happens to be the most convenient one to build an impressive fix for.
That habit shows up far beyond agent engineering, too. Adding another layer is almost always easier than pausing to ask whether the plain, unglamorous baseline was ever fairly tested against it. A new abstraction reads as visible progress, something you can point to and call an upgrade. Checking whether grep already covers the case, or whether your query complexity genuinely improved, or whether the thing consuming your week was ever what you assumed it was, that work is slower and far less satisfying, and it can end with the conclusion that you should stop building rather than keep going.
Here's a condensed version of the checklist worth running against any stack before adding the next layer to it:
1. Have I benchmarked the boring baseline, not just assumed it loses?
(full-context, grep, a plain graph, a human doing the coordination)
2. Does the new structure change the metric that actually governs cost
or quality, or does it just look more sophisticated on a diagram?
3. Am I reaching for this because a benchmark or proof told me to,
or because it's what the tutorials and the funded products default to?
4. If I strip this layer back out, what specifically breaks?
If I can't name it precisely, I probably don't need the layer yet.
5. Am I solving the bottleneck I actually have, or the bottleneck
that's most interesting to build a sophisticated solution for?
None of this argues for doing less engineering overall. It argues for directing engineering effort toward confirming where the bottleneck really sits before constructing an elaborate solution that presumes you already know the answer. The three examples covered here weren't contrarian for shock value. They earned that label because someone did the unglamorous work of checking, and the check disagreed with the default assumption. That's a considerably higher bar than a sharp headline attached to a strong opinion, and it's the bar worth applying to your own stack going forward.