Knowledge graph & search
Bi-temporal entities, hybrid BM25 + embedding retrieval, and Ask (RAG).
Conclave builds a knowledge base across meetings, so you can ask a question and get a cited answer pulled from everything, not just the last call. It's all built at ingest; the read path stays operator-blind.
What gets extracted
- Entities — per-chunk LLM extraction of people, technologies, and affiliations (derived
types), stored bi-temporally (
valid_to/superseded_by) so the graph has history. - Entity resolution — lexical-first, definition-driven merge (tuned to avoid "black-hole" over-merges).
- Obligations & facts — structured action items and facts, also bi-temporal.
- Chunking — turn-aware (never splits mid-turn) with context headers, plus FTS5 + embeddings.
Hybrid search
Retrieval runs two lanes and fuses them:
- FTS5 BM25 (lexical) ∥ local nomic embeddings (768-d, 256-d Matryoshka ANN via
sqlite-vec). - Fused with Reciprocal Rank Fusion (RRF), then visibility-filtered.
It's pure SQL + local embeddings — no model call, no egress. That's what makes search
operator-blind. Surfaced at POST /search.
Ask (RAG) — the only read-path LLM call
POST /ask synthesizes an answer from retrieved contexts and is the single deliberate exception
to "no LLM on reads." Every answer is cited (quote, speaker, meeting). It's optional (returns 404
when disabled) and runs inside the TEE.
Cited or it didn't happen. Ask never free-associates — it answers from retrieved, visibility-scoped context and shows its sources, so an answer can always be traced back to the meeting it came from.
The graph, per-entity pages, obligations, and open-questions rollups are all browsable in the app.
Regulated data never lands here. When verifiable redaction strips PCI / PHI / PII from a transcript, insights are re-derived from the redacted text — so the knowledge base is built from the clean version, and the stripped data never enters the graph, the embeddings, or search.