Procurement Document Intelligence

From 80% to 95%+ accuracy on official documents.

Tender Intelligence turns EU & German procurement tenders into structured, searchable data — and scores every lot against your profile. This is a working demo built on the production stack: TanStack Start · PostgreSQL/pgvector · Claude. The approach to accuracy is architectural, not prompt-tuning.

The problem

Reading one tender is easy. Reading 75 of them correctly is the job.

Official procurement documents are long, structured, multilingual, and split into lots. General-purpose extraction gets to ~80% — close enough to look right, wrong often enough to miss a deadline or a qualifying criterion. Closing that last gap is an engineering problem, solved with retrieval and evaluation, not cleverer prompts.

How it works

Three pipelines: ingest, ask, match.

Architecture: ingest (parse, structure-aware chunk, Claude extract + embed, store in pgvector); ask (hybrid search, Cohere rerank, Claude grounded answer); match (search profile and lots into a Claude relevance judge producing X von Y Losen relevant).

Ingest

PDF → structure-aware chunking → Claude tool-use extraction (one Zod schema is the source of truth) + OpenAI embeddings → Postgres/pgvector.

Ask

Hybrid search (vector + Postgres full-text) → Cohere cross-encoder rerank → a grounded Claude answer with source citations.

Match

Each lot judged on its full content against a search profile — not vector similarity — producing the relevance metric below.

The metric that matters

Per-lot relevance: X von Y Losen relevant

A buyer's profile and a tender lot can share vocabulary without being a real fit. So relevance is an LLM judge over the full lot content — assessing genuine fit, with a score and a one-line reason per lot — rather than an embedding-similarity guess.

Lot relevance UI: a search profile scored against three procurement lots, showing 2 von 3 Losen relevant, each lot marked relevant or not with a confidence percentage and a one-line reason.
Stack

The same tools, end to end.

Framework
TypeScript, React 19, TanStack Start (SSR, server functions on Vite)
Database
PostgreSQL + pgvector + Drizzle ORM — hybrid vector + full-text search
Extraction
Anthropic Claude via tool_use; Vertex AI / Gemini multimodal path for scanned PDFs
Retrieval
OpenAI embeddings; Cohere rerank (optional, graceful fallback)
Accuracy
Per-field eval loop measuring precision against a labeled set