brain / docs /decisions /002-structured-ingestion-specific-processing.md
Leon4gr45's picture
Upload folder using huggingface_hub
b888532 verified
|
Raw History Blame Contribute Delete
3.5 kB
# ADR-002: Structured Ingestion Dual-Mode Contract
## Status
Accepted
## Date
2026-08-05
## Context
BrainAPI exposes two write surfaces:
- `POST /ingest/` — free-text Scout → Architect → optional Janitor (LoCoMo / LongMemEval / BEAM path).
- `POST /ingest/structured` — caller-supplied event triples, with optional free-text enrichment.
Callers building recommenders and catalogs need a **deterministic, LLM-free** write path for known facts (purchases, catalog edges), while still allowing LLM enrichment when text requires indirect intelligence. Before this ADR, “no LLM” was implied only by omitting `text`, and name+type anchors could still call `KGAgent.verify_entity_existence` (LLM). That made deterministic guarantees untestable.
Benchmarks never call `/ingest/structured`. Changing default `/ingest/` or global `PIPELINE_MODE` would invalidate published LoCoMo/BEAM brains. Dual-mode must therefore stay request-scoped on the structured endpoint only.
See also: `docs/research/01-ingestion-extraction.md`, `docs/research/15-ecommerce-gnn-recsys-landscape.md` §7.
## Decision
**1. Explicit `mode` on `IngestionStructuredRequestBody`:** `deterministic` | `hybrid` | `enrich`.
When `mode` is omitted:
- `text` present → `hybrid`
- else → `deterministic`
**2. Mode semantics**
| Mode | Submitted triples | Text / LLM | Anchor resolution |
| --- | --- | --- | --- |
| `deterministic` | Persist via `ingestion_triples_to_relationships` → `process_architect_relationships` | Never run Scout/Architect/Janitor/KGAgent verify. `text` may be stored as provenance only. | UUID lookup, or exact name+type match. Missing name+type anchor → hard fail (no LLM verify, no create-via-verify). |
| `hybrid` | Persist first; authoritative | If `text` set: Scout/Architect `run_structured` with `persist_submitted=False`; enrichment edges tagged `properties.source=llm_enrichment` | Existing behavior (exact match, else vector + LLM verify / create) |
| `enrich` | Same as hybrid | Same as hybrid (LLM backfill when text present) | Same as hybrid |
Submitted edges are tagged `properties.source=structured_deterministic`.
**3. Probability Isolation**
LLM uncertainty is confined to the intelligence lane (`hybrid`/`enrich` with text, or free-text `/ingest/`). Known facts stay on the deterministic lane. Do **not** introduce a process-global “skip LLM” flag that alters `/ingest/`.
**4. Benchmark isolation**
- Do not change default free-text `/ingest/` semantics or `PIPELINE_MODE` defaults for this contract.
- Do not use `PIPELINE_MODE=lightweight` as a structured/deterministic substitute.
- Recsys / interaction structured data should use dedicated brains (e.g. `*recsys*`), never published eval brains (`beam1m1clean`, `locomoconv26*`).
**5. Embeddings**
Deterministic mode still runs embedding encode + vector write in `process_architect_relationships`. “No LLM” ≠ “no model calls.”
## Alternatives Considered
- Global `INGEST_SKIP_LLM` env — rejected; would risk LoCoMo/BEAM.
- Relying on omitted `text` alone — rejected; silent LLM on ambiguous anchors.
- `PIPELINE_MODE=lightweight` as cheap structured path — rejected; different graph shape.
## Consequences
- Callers can assert zero Scout/Architect/KGAgent constructions under `mode=deterministic`.
- Hybrid enrichment is additive and provenance-tagged for recommend ranking.
- ADR-001 remains the broader ingestion-structure decision; this ADR owns structured-only dual-mode.