Vectorless
Not a page. The exact section — and the table inside it.
I kept chunking documents and hoping. The model is the better judge.
Every retrieval system I built came down to the same act of faith: cut the document into pieces, embed them, rank them by similarity and hope the top few were the ones that mattered. I took every precaution I knew of and still could not tell you, for any given question, whether the right passage had been found.
A model understands what a document means better than a similarity score does. The reason nobody lets it decide is cost and latency — every call is overhead, and a slow retriever is not one anybody uses.
So Vectorless is written in Go and built for concurrency, for the places where being wrong is expensive: healthcare, finance, anywhere an answer has to be traceable to the line it came from.
Halleluyah Oludele · founderBuilt, open source under Apache 2.0, and benchmarked in public on FinanceBench — 21 company filings with known correct answers. Not commercialised: the headline number is a benchmark, not an install count.
Only glyphs with a size and a position. Vectorless reads the typography — anything larger than the document’s own median type is a heading — and rebuilds the outline from that.
Contents page to real page numbers, then long sections split at their own headings. The section it hands you is six pages, not a hundred and eighty.
Each one is found from its ruling lines and word positions and becomes its own section with real cells — not a paragraph of loose numbers.
No embeddings, no chunks, no similarity score. A judge picks the section and gives a reason you can read — not a number nobody can argue with.
When the evidence is not in the document it abstains: no sections, no citations. An empty answer is safer than a confident wrong one.
Reasoning over a document has a name for being slow, because every hop is a model call. Go runs those side by side instead of one after another.
A near miss is a fabricated citation. Retrieval returns the adjacent clause or the superseded version, and the model bridges the gap by inventing one. Courts have started sanctioning that.
A dosage table split across two chunks is a patient-safety event, not a relevance miss. In a regulatory submission the structure is the meaning.
The classic failure is the right company and the wrong fiscal year. Fiscal years do not follow calendars, so filtering on a date quietly hands back the wrong filing.
A systematic review is structure-preserving retrieval with a methodology requirement bolted on. Which section a finding came from is part of the finding.
How a document gets its structure back
From raw glyphs to sections and tables
Nothing here is guessed from wording. The structure is recovered from geometry — type size against the document’s own median, and word positions grouped into rows within two points.
Did it find the evidence?
Share of known-correct pages located
From four pages in five to every single one, across 21 filings.
How small is the section?
Pages in the section it hands you
“Somewhere in these 183 pages” is not an answer. Six pages, and the table inside it, is.
And how long it takes
Seconds to map one filing (range across the corpus)
The slowest document used to take fourteen minutes. It now takes under two and a half — because the calls that used to queue up now run side by side.
See the full numbers and sources
Moving the whole mapping stage off a writing model
| Measure | Before | After |
|---|---|---|
| Documents with a usable map | 19 / 21 | 20 / 21 |
| Generative calls per document | 1 | 0 |
| Evidence pages inside a section | 44 / 44 | 45 / 45 |
| Time per document | 103–840 s | 12–143 s |
| Cost per document | $0.017–0.095 | $0.0003–0.0015 |
Source: docs/evaluations/2026-09-18-toc-extraction-on-a-judge.md. Section titles against the previous method: recall 0.961, precision 0.965 over 543 sections.
Splitting the sections that hold the evidence
| Tree | Sections | Section holding the answer | Right section | $ / question |
|---|---|---|---|---|
| Contents-page grain | 23 | 37 pages | 39 / 40 | 0.0035 |
| Split over 20 pages | 54 | 6 pages | 40 / 40 | 0.0039 |
Source: docs/evaluations/2026-09-19-leaf-granularity.md, run 19 September. All 47 evidence pages remain inside a section.
How the structure is recovered
| Step | What actually happens |
|---|---|
| Positioned words | Each word comes out with its font name, size and bounding box, from pdfgrab — our own Go port of pdfplumber |
| Heading test | A row is a heading when its type runs larger than the document’s median — measured per document, not assumed |
| Row grouping | Words are bucketed into lines by their top edge, within two points |
| Tables | Found per page from ruling lines and word positions, then emitted as their own section with real cells and flagged as a table so retrieval can lean on the numbers |
Source: pkg/parser/pdf.go in vectorless-engine, on pdfgrab — our Go port of Python’s pdfplumber, written for this and released on its own, MIT licensed, with parity on all four table-finding strategies.
Why a regulated buyer can say yes
| Capability | What it means |
|---|---|
| It abstains | When the evidence is not there the response comes back abstained=true with no sections and no citations. It does not reach for the nearest plausible passage |
| No similarity scores | No embeddings and no chunks anywhere — the engine’s own words. Sections are scored by a judge that returns a reason alongside the score |
| Replay | Every answer carries a trace token, and /v1/replay returns the same answer byte for byte from it. There is a test that asserts exactly that — byte-identical body, same token, same document |
| Runs where the documents are | One Go binary inside your own network. If the files cannot leave the building, every hosted competitor is out before the conversation starts |
| Measured on near misses | The benchmark scores path_correct@1 and sibling near-misses — the adjacent-clause failure, not generic relevance. Chunk-based systems score zero on the first by construction |
Source: internal/api/treewalk.go and its tests in vectorless-engine. These are the two questions a legal, clinical or financial buyer asks first, and they are the reason the audit trail exists at all.
What it is built on, and what you can install
| Piece | Detail |
|---|---|
| Engine | Go, Apache 2.0. Concurrency is the design, not a tuning flag — worker pools, error groups and semaphores throughout, and the benchmark corpus runs eight documents at a time |
| llmgate | Our own Go gateway: one client over Anthropic, OpenAI and Gemini, with routing, fallback and cost tracking. Apache 2.0, published separately |
| pdfgrab | Our Go port of pdfplumber, MIT. The positioned words and table detection above come from it |
| Install it | npm vectorless, PyPI vectorless-sdk, and hosted at vectorless.store |
Both libraries were pulled out of the engine and released on their own, so anything written in Go can use them. The engine is not the only thing we own — the routing layer and the parser underneath it are ours too.
Answering a question end to end
| Measure | Value |
|---|---|
| Questions | 40 |
| Right section | 37 / 40 (0.925) |
| Every evidence page found | 34 / 40 (0.850) |
| Pages read per question | 40.7 |
| Requests per question | 4.1 |
| Cost per question | $0.0029 |
Source: docs/evaluations/2026-09-18-retrieval-navigation-on-a-judge.md, run 5. Corpus throughout: FinanceBench, 21 filings, 40 questions, evidence pages from PatronusAI/financebench.
What we do not claim
- The 80% baseline was not really a location score — with no page numbers, a section inherited a whole 183-page part, so a page counted as “found” when it was not located at all.
- The first attempt at splitting made retrieval worse, and tightening the budget lost coverage from 47 to 39 of 47.
- A page-numbering bug had been corrupting every page-level stage until near-misses exposed it.
- Speculative fan-out was tried and was 31% slower. It is not in the engine.
- Timings are API latency in the hour of each run, not work. Cost and request count are the numbers to read.
What Vectorless has not been tested on.
- One kind of document21 US financial filings. No clinical, legal or academic corpus yet.
- It needs a contents pageA long document without one is the obvious failure case, and is untested.
- Retrieval, not answersWe measure whether the right page is found, not whether the final answer is correct.
- No adoption numbersWe report the benchmark. We do not report downloads.
Capital to finish these and take them to market.
Six products across healthcare, education and AI. Where we have numbers, they are on the page. Where we do not, the page says so.