Your text columns aren't fuzzy. Stop retrieving them as if they were.

Vector RAG turns "sales in France" into a nearest neighbor guess. Structured RAG types each string column as a foreign key into a real reference table, so a question becomes an exact relational join against public data and your company's own reference tables.

Structured RAG exact join from orders through city and country
Four levels of retrieval

How AI answers “sales in France”

The same question, at four levels of retrieval. Only the last one lets you check the answer.

LLM generates SQL query

The LLM writes SQL against your columns, but "France" is nowhere in the data. Your city column holds Paris and Strasbourg, and there is no country column to filter on. The query cannot be written at all.

Fails completely
LLM generates SQL query

Vector search on similarity

Embed every city and search for "France". Paris and Strasbourg come back because they read as French. So does Kehl, a German town 2km from Strasbourg. Nothing in the search checks which country a city is actually in.

Fails at times
Vector search on similarity

LLM answers similar vectors

Hand the nearest rows to an LLM and it usually returns the right total. But nobody can see which cities it counted as France, or why. You get a number with no way to see the rows behind it.

Succeeds, but a black box
LLM answers similar vectors

Prereasoner generates SQL query

The city column is typed as a foreign key: city → country → currency. "Sales in France" becomes an exact join, Kehl is excluded, and the query and matched rows come back with the answer.

Succeeds with transparency
Prereasoner generates SQL query
Your reference tables

Resolve against your company's own knowledge

The tenant namespace

Your tier column with values like gold and platinum lives in your own customer tier table. "Revenue from platinum customers in France" joins your tier table, world geography and forex in one exact, auditable query.

The tenant namespace
Head to head

Structured RAG vs vector RAG

On structured dataVector RAGStructured RAG
How a string column is usedEmbedded into an unnamed vectorTyped as a foreign key
Retrieval mechanismNearest neighbor similarityExact relational join
"Kehl" (German town near Strasbourg)Wrongly includedCorrectly excluded
Why a row was returnedA similarity score you cannot readThe join path, printable
Your private reference tablesMust be re-embedded, still fuzzyResolved exactly (tenant namespace)
LLM in the retrieval pathYesNone
How it works

Type, link, join, return

01 TYPE

Name each column

Type each string column against a public or private reference table.

02 LINK

Foreign keys

city → country → currency, or tier → your tier table. Each link is a key in a reference table.

03 JOIN

Exact query

The question becomes a deterministic join across those tables. No embeddings.

04 RETURN

With its path

Return each row with the join path used.

Start free

Your text columns aren't fuzzy. Stop retrieving them as if they were

Try the exact typed path on your own CSV, then add your company's reference tables when you need them.