Your business data isn't fuzzy. Stop retrieving them as if they are.

Vector RAG answers "sales in France" by similarity. Structured RAG links your city column to country table in wikipedia, so the question becomes a SQL join you can read.

Paris and Strasbourg link to France, Berlin to Germany. Kehl sits next to Strasbourg with a question mark between the two countries.
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 converts your question into SQL

Say, your CSV has city column, but no country column. Your city column holds Paris and Strasbourg, but there is no country column to filter on. "France" is not in the data and the query cannot be written.

Fails completely
LLM converts your question into SQL

Vector search on similarity

Convert each city into vector embedding and search for "France". Paris and Strasbourg come back because they read as French. So can Kehl, a German town next to Strasbourg. Nothing in the search tells us which country a city is in.

Fails at times
Vector search on similarity

LLM uses similar vectors to anwser

Hand over the nearest rows from the above search to an LLM and it usually returns the right total. But you cannot see how cities were counted as France. It can hallucinate or use a wrong source, but you have to believe it.

Succeeds, but a black box
LLM uses similar vectors to anwser

Prereasoner generates SQL query

The city column links to a country table by key: city → country → currency. "Sales in France" becomes a SQL 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 own reference tables

Your own reference tables

Your tier column with values like gold and platinum lives in your own customer tier table. Upload it, and "revenue from platinum customers" joins it by key.

Your own reference tables
Head to head

Structured RAG vs vector RAG

On structured dataVector RAGStructured RAG
How a string column is usedEmbedded into a vectorLinked to a reference table by key
Retrieval mechanismNearest neighbor similaritySQL join
"Kehl" (German town near Strasbourg)Can be includedExcluded by the join
Why a row was returnedA similarity scoreThe join, in the SQL
Your private reference tablesRe-embeddedJoined by key
What computes the totalThe LLMThe database
How it works

Type, link, join, return

01 TYPE

Name each column

Prereasoner identifies what each column holds.

02 LINK

Foreign keys

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

03 JOIN

SQL query

The question becomes a SQL join across those tables.

04 RETURN

With its query

You get the rows and the SQL that returned them.

Start free

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

Try it on your own CSV. Add your reference tables when you need them.