Privacy

Private knowledge bases for AI.

"Upload your documents and chat with them" is now a commodity pitch. What separates offerings is the word before "knowledge base" — and most people never check what private actually means.

Published 2026-07-12·~7 min read·VeelIQ

The value proposition is obvious: your documents hold answers no general model has, so indexing them for AI retrieval makes every assistant dramatically more useful. The risk is equally obvious: those documents are contracts, research, client records, personal files. Before any of them leave your disk, "private" needs a definition sharper than a marketing adjective.

What "private" must mean, concretely

1. No training on your content

The first question for any provider: is my content ever used to train or fine-tune models? The acceptable answer is an unqualified no, stated in the privacy policy, not in a FAQ that can change. Training is how private data becomes public behavior.

2. Tenant isolation with teeth

Multi-tenant services store many users' data on shared infrastructure; the question is what enforces separation. Application-level filtering ("we add a WHERE clause") fails open — one bug and queries cross tenants. Database-enforced row-level security (RLS) fails closed: the database itself refuses to return rows that don't belong to the authenticated user, no matter what the application layer does. Ask which model your provider uses.

3. Scoped, revocable access

Retrieval endpoints should be per-user and token-scoped, so possession of a URL grants access to exactly one tenant's corpus — and revoking the token kills access without a migration.

4. Deletion that deletes

Removing a source should remove its chunks and embeddings from the index, not just hide the filename. You should be able to enumerate every source the system holds for you.

5. Conversation boundaries

Subtle but important for AI knowledge bases specifically: does the provider see your conversations, or only the retrieval queries? A tool-provider architecture — where the knowledge base answers discrete tool calls and never receives the surrounding chat — structurally limits what the provider can know. Metadata-only logging (tool name, timestamp, latency) is the right posture.

The architecture spectrum

ApproachPrivacy modelTrade-off
Local-only (e.g. notes app + local index)Data never leaves your machinePer-device setup; no cross-client access; you run the pipeline
Self-hosted RAG stackYour infrastructure, your rulesReal engineering and ops burden; you own every failure
Hosted context layer (e.g. VeelIQ Context)Provider-enforced isolation (RLS), no-training policy, tool-call-only visibilityTrust shifts to the provider's stated and audited posture
Upload-to-chatbot (files into a chat app)Varies by vendor and plan; often entangled with product improvement clausesKnowledge locked to one vendor; least user control

There is no universally correct row — a hospital's constraints aren't a freelancer's. The failure is not choosing consciously. The VeelIQ vs Obsidian comparison walks the local-vs-hosted trade-off in detail.

Retrieval-specific risks people miss

An evaluation checklist

  1. Written no-training commitment covering documents, memories, and queries?
  2. Isolation enforced in the database (RLS) rather than only in application code?
  3. Per-user scoped endpoints with revocable tokens?
  4. Full source listing plus true deletion of chunks and vectors?
  5. Provider sees tool calls only — never full conversations?
  6. Workspace separation for contexts that must not mix?
  7. Open-standard access (MCP), so leaving doesn't strand your corpus inside one app?

For the record, this checklist is VeelIQ Context's design brief: RLS isolation on every table, no training on content, metadata-only logging, per-token endpoints, deletable sources, workspaces, and MCP as the only interface. Details in the privacy FAQ and privacy policy.

Key takeaways

Related reading

Private, verified.

RLS isolation, no training on your content, tool calls only. Try it with a non-sensitive document first — we'd do the same.

Try Context free