|
Download docs/DESIGN.md from sk-aiu/cortex: direct link, hf CLI and curl.
- Browser
- Download file 19.8 kB
-
https://huggingface.co/spaces/sk-aiu/cortex/resolve/main/docs/DESIGN.md
- Command line
-
hf download hf://spaces/sk-aiu/cortex/docs/DESIGN.md
-
curl -L -o DESIGN.md https://huggingface.co/spaces/sk-aiu/cortex/resolve/main/docs/DESIGN.md
19.8 kB
| # Cortex: Why FalkorDB for AI Engagements, and More (Design v0.2) | |
| > Status: **DRAFT v0.3 for review** Β· 2026-09-30 Β· Name: **Cortex** (confirmed) | |
| > v0.2: Neo4j comparison dropped, PDF ingestion added, free LLM by default, PDF upload feature added. | |
| > v0.3: role impersonation, tokenomics, PIN-protected keys, a consolidated "Limits & Restrictions" section, 4h idle reset, branding. | |
| ## 1. Goal | |
| Show, with evidence people can test themselves, why **FalkorDB** is the right foundation for AI | |
| engagements, and what it adds beyond RAG. | |
| - **Main comparison:** **GraphRAG on FalkorDB** vs **plain vector RAG**, the approach our environment already uses. | |
| Both run on the same PDFs, with the same questions and the same LLM. The only thing that differs is the graph. | |
| - **"And more":** the same graph also supports things RAG can't do: fraud-ring detection, lineage and versioning, | |
| role-based guardrails, and many isolated graphs in one instance. | |
| - **The data:** "Cortex Bank", a synthetic bank founded in 1926, with 12 departments. | |
| - **Audience:** executives (the story and the impact) and engineers (how it works and whether it reproduces). | |
| - **Access:** a public URL that people use on their own. No presenter or laptop needs to be available. | |
| - **Format:** hybrid, a live walkthrough plus a recorded backup video. The video will be made once the build is nearly finished. | |
| - **Timeline:** 2 days. | |
| **Out of scope for now:** the Neo4j comparison (it can go in a later write-up if needed) and hosting on AWS (see Β§13). | |
| ## 2. Principles | |
| 1. **Measure, don't claim.** Every advantage shown comes with a result people can reproduce. | |
| 2. **Fair comparison.** Same PDFs, chunks, embeddings, LLM and prompts. Only the retrieval strategy differs. | |
| 3. **Honest.** Where plain RAG is just as good (for example, simple lookups of a single fact), we show that. | |
| 4. **Free to run.** A free LLM by default, free hosting, and local embeddings. | |
| 5. **Reproducible.** `docker compose up` on any laptop gives the same results. | |
| ## 3. How Content Gets In (hybrid) | |
| | Layer | Source | How it gets in | Size | | |
| |---|---|---|---| | |
| | **Knowledge**: policies, SOPs, guardrails, KPIs, audits, regulations | **~60 synthetic PDFs** (written by Claude, rendered as realistic bank documents) | **LangChain pipeline**: load β chunk β embed, and have the LLM extract entities and relationships β FalkorDB | ~10β30k nodes | | |
| | **Operations**: customers, accounts, transactions, devices, fraud rings | Structured data (banks keep this in databases, not PDFs) | Seeded Python generator β bulk load | ~1M nodes / ~5M relationships | | |
| | **User uploads** | Visitor's own PDF (β€5 MB, β€20 pages) | Same pipeline, into a **private sandbox graph** for that session that is deleted after 24h | Small | | |
| ``` | |
| PDF ββΊ LangChain loader ββΊ chunks ββ¬ββΊ embeddings (local model) ββΊ FalkorDB vector index | |
| βββΊ LLM entity/relation extraction (schema-guided) ββΊ FalkorDB graph | |
| (chunks linked to the entities they mention = evidence) | |
| ``` | |
| - **Extraction is guided by a schema.** The LLM may only produce the node and relationship types allowed in Β§4, | |
| and its output is validated before loading. | |
| - **The knowledge layer is pre-built.** The 60 PDFs are ingested once at build time and the graph snapshot is | |
| bundled into the image, so start-up is fast and doesn't use any LLM quota. The pipeline can be re-run at any time. | |
| ## 4. Graph Model | |
| **Knowledge layer** | |
| | Node | Examples / key properties | | |
| |---|---| | |
| | `Document`, `Chunk` | Source PDF, page, text, embedding (the evidence) | | |
| | `Department` | Retail, Corporate & Commercial, Wealth, Treasury & Markets, Credit, Risk, Compliance (AML/KYC), Operations, IT & Cyber, HR, Legal, Internal Audit | | |
| | `Role`, `Person` | Title, clearance level | | |
| | `SOP`, `Policy`, `Control` | Version, effective dates, owner | | |
| | `Risk`, `Regulation` | Basel III/IV, AML/KYC, GDPR, DORA, PCI-DSS, SOX, BCBS 239, EU AI Act | | |
| | `Guardrail` | Separation of duties, maker-checker, AI-usage limits, data-access rules | | |
| | `KPI`, `KRI` | Targets, thresholds, current values | | |
| | `System`, `AuditFinding`, `Entity` (M&A history) | Legacy mainframe, acquired banks | | |
| Relationships: `OWNS`, `IMPLEMENTS`, `MITIGATES`, `ENFORCES`, `SUPERSEDES`, `APPLIES_TO`, `CAN_ACCESS`, | |
| `MEASURES`, `RAISED_ON`, `MERGED_INTO`, `MENTIONS` (Chunkβentity). | |
| **Operations layer:** `Customer`, `Account`, `Transaction`, `Device`, `IP`, `Address`, `Branch`, `Merchant`, | |
| with fraud rings planted in the data and labelled with the right answers. | |
| ## 5. Synthetic Content (generated by Claude) | |
| - **~60 PDFs** across the 12 departments: policies, SOPs, guardrail standards, KPI frameworks, audit reports and | |
| regulatory summaries. They look realistic: letterhead, document IDs, version history tables, numbered | |
| sections and approval sign-offs. | |
| - **Deliberate cross-references** between documents (for example, an SOP cites a policy, which cites a | |
| regulation). This is what makes questions that need several hops possible. | |
| - **Some legacy versions** (such as a 1998 SOP replaced in 2019), so versioning and lineage can be shown. | |
| - Source text is kept as Markdown in the repo, and the PDFs are rendered from it deterministically. | |
| ## 6. LLM & Embeddings | |
| | Use | Default (free) | Optional | | |
| |---|---|---| | |
| | Q&A and upload extraction | **Google Gemini free tier** (a Flash-class model), using the owner's key | Claude Sonnet 5.5 or Gemini, using the **tester's own key** | | |
| | Embeddings | Small open-source model running locally on CPU | β | | |
| - Switching providers is a single setting (LangChain chat-model interface). | |
| - **Keys are protected by PINs** (details in Β§11): | |
| - **Owner's Gemini key:** LLM features only unlock after entering an **Access PIN** that the owner shares with testers. | |
| - **Tester's own key (BYOK):** protected by a **personal PIN** the tester chooses. | |
| ## 7. Demo Scenarios | |
| | # | Scenario | What it proves | | |
| |---|---|---| | |
| | 1 | **Regulatory impact:** "An EU AI Act amendment lands. What's affected?" | Following 4β6 links through the graph: regulation β policies β controls β SOPs β teams β KPIs | | |
| | 2 | **Side by side:** the same question answered by plain RAG and by GraphRAG, each showing its sources | Better answers on questions that need several hops or several documents | | |
| | 3 | **Role impersonation:** the tester picks a role (see Β§7.1) and asks the same question; a **compare mode** shows two roles side by side | Access control and guardrails built into the graph | | |
| | 4 | **Upload your own PDF:** see it turn into a graph and ask questions about it | Real ingestion, plus isolated graphs per session | | |
| | 5 | **Fraud rings** across ~1M records | The "and more": graph analytics beyond RAG | | |
| | 6 | **Risk roll-up:** one control β department KRI β a bank-wide score | Aggregating up a hierarchy | | |
| | 7 | **Version history:** which SOP replaced which, and why | Lineage | | |
| | 8 | **Performance panel:** response times for these queries on the 1M-node graph | Speed at a realistic scale | | |
| ### 7.1 Role Impersonation | |
| Testers choose who they are, and the same question gets different answers depending on what that role is allowed to see. | |
| Access is decided by graph paths (`Role -[:CAN_ACCESS]-> Policy/System`, `Guardrail -[:APPLIES_TO]-> Role`) and | |
| enforced **before** retrieval, so the LLM never sees content the role isn't allowed to see. | |
| | Role | Clearance | Sees | | |
| |---|---|---| | |
| | Branch Teller | L1 | Retail SOPs, customer-facing policies | | |
| | Relationship Manager (Wealth) | L2 | Plus client suitability, wealth products | | |
| | Credit Analyst | L2 | Plus credit policy, limits, risk ratings | | |
| | Compliance Officer (AML/KYC) | L3 | Plus AML typologies, fraud-ring alerts, SAR procedures | | |
| | Chief Risk Officer | L4 | Everything, including bank-wide KRIs and board risk reports | | |
| | Internal Auditor | L4 (read-only) | Everything, plus audit findings and control test results | | |
| | External Contractor (IT) | L0 | Only IT runbooks for their assigned systems | | |
| - A role badge is always visible. Every answer shows **"Answered as: <role>"** and, where relevant, notes that | |
| N sources were withheld for this role (without revealing what they contain). | |
| - **Compare mode:** one question, two roles, answers side by side, with the difference highlighted. | |
| - This is a simulation for the demo: choosing a role is not authentication. | |
| ## 8. Evaluation (plain RAG vs GraphRAG) | |
| - **~30 questions with known correct answers** in 4 types: single fact, multi-hop, cross-document, aggregation/compliance. | |
| - **Two setups:** (a) vector-only RAG (top-k chunks), (b) GraphRAG (vector entry points + graph traversal). | |
| Both use FalkorDB, so the only difference is whether the graph is used. | |
| - **Metrics:** | |
| - answer accuracy (graded against the known answers) | |
| - completeness (were all affected items found?) | |
| - whether citations are correct | |
| - response time | |
| - **tokenomics** (see Β§8.1) | |
| - **Expected results, stated up front:** similar on single-fact questions, and GraphRAG ahead on the other types. | |
| Results are published in the UI as they come out. | |
| ### 8.1 Tokenomics | |
| Every answer shows its token economics, and the evaluation reports them in aggregate: | |
| | Metric | Meaning | | |
| |---|---| | |
| | Input / output tokens | What went into and came out of the LLM | | |
| | Context efficiency | How many of the tokens sent were actually cited in the answer | | |
| | Cost per answer | Tokens Γ list price of the selected model (shown as $0 on the free tier, with the equivalent paid cost next to it) | | |
| | **Cost per correct answer** | Total cost Γ· correct answers. This is the headline number for executives | | |
| | Tokens saved | GraphRAG vs vector RAG. Precise graph context typically means fewer, more relevant tokens (to be measured) | | |
| A running session total ("You've used X tokens β $Y") appears in the header. | |
| ## 9. Architecture & Hosting | |
| > **Build notes (v0.3 implementation):** | |
| > - **Hosting changed:** Docker Spaces are paid on this account, so Cortex runs as a **Gradio-SDK Space on ZeroGPU (free)**. | |
| > `app.py` serves the FastAPI app on port 7860. FalkorDB runs **embedded**, using the redis-server and FalkorDB module | |
| > shipped in the `falkordblite` package. The fallback, if the Space image can't run it, is the FalkorDB Cloud free tier. | |
| > - **Deploy:** a GitHub Action (`.github/workflows/deploy-cortex-space.yml`) pushes `cortex/` to `sk-aiu/cortex`. | |
| > - **Extraction:** bank PDFs use pattern extraction (0 tokens; 295/295 relationships correct against the answer key). | |
| > Uploads use LLM structured extraction. | |
| > - **No LLM-written Cypher in v1:** all Cypher is fixed and read-only, which is stricter than Β§11's rule. | |
| > - **Operational graph size** is chosen automatically from available RAM (β₯12 GB: ~1M nodes; β₯6 GB: 50%; otherwise 20%). | |
| ``` | |
| Hugging Face Docker Space (free, 16 GB RAM, 2 vCPU, port 7860) | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| β supervisord β | |
| β ββ FalkorDB (knowledge graph + ops graph + sandbox graphs) β | |
| β ββ App: FastAPI + static web UI β | |
| β ββ LangChain pipelines (ingest, RAG, GraphRAG) β | |
| β ββ Local embeddings (CPU) β | |
| β ββ LLM gateway β Gemini (default) / Claude (BYO key) β | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ``` | |
| - Everything runs in one container, and the same image runs locally with `docker compose up`. | |
| - **Idle reset after 4 hours:** if nobody uses the app for 4 hours, it resets itself. Sandbox graphs and chat | |
| sessions are cleared, memory is freed, and PIN sessions expire. | |
| - Note: on the free tier, Hugging Face decides when the container itself goes to sleep (about 48 hours idle), | |
| and that can't be changed without paid hardware. The 4-hour rule is enforced by our app. | |
| - Waking the container after it sleeps takes 1β3 minutes, and a "warming up" page is shown meanwhile. | |
| - **Removing Neo4j frees about 6 GB**, which leaves plenty of room on 16 GB. | |
| ## 10. UI | |
| - **Executive view:** landing page with key figures, one-click buttons for scenarios 1β8, a graph visualisation, | |
| and the "Ask Cortex" chat with side-by-side answers, source paths and a tokenomics strip for each answer. | |
| - **Role switcher** in the header (Β§7.1), with compare mode. | |
| - **Engineer view:** the raw Cypher behind every answer, the pipeline steps, evaluation results (CSV download), | |
| a link to the repo, and a settings panel for choosing the LLM or entering your own key. | |
| - **Stack:** FastAPI backend and a lightweight static front end (Cytoscape.js from a CDN for the graph view). | |
| ## 11. Security, Cost, Limits & Restrictions | |
| **Every limit is shown to users where it applies**: on the upload box, in the chat header, in the settings panel, | |
| and in a "Limits & fair use" page linked from the footer. Nothing is limited silently. | |
| ### 11.1 Key protection (PINs) | |
| | Key | Protection | Where the user sees it | | |
| |---|---|---| | |
| | Owner's Gemini key | Stored as a Space secret and never sent to the browser. LLM features need an **Access PIN** (6+ digits, shared by the owner, can be changed at any time). A valid PIN gives an 8-hour session | PIN prompt when the tester first asks a question | | |
| | Tester's own key (BYOK) | Encrypted **in the tester's browser** with a personal PIN (WebCrypto AES-GCM, key derived with PBKDF2). Decrypted only when a request is sent, passed to the provider over HTTPS, never stored or logged on the server | Settings panel: "Your key is encrypted on this device. Use a key with a spending limit." | | |
| | Failed PIN attempts | 5 failures lead to a 15-minute lockout for that session or IP | Lockout message with a countdown | | |
| ### 11.2 Limits & restrictions (the user-facing list) | |
| | Area | Limit / rule | Shown where | | |
| |---|---|---| | |
| | Sandbox graphs | **Deleted 24 hours after upload**, or at the 4-hour idle reset if that comes first | Countdown timer on the sandbox ("Wipes in 23h 12m") | | |
| | Uploads | β€ 5 MB, β€ 20 pages, PDF only, text-only extraction, max 3 uploads per session | On the upload box | | |
| | Shared free LLM | Questions per session and per day (e.g. 20 / 200). BYOK has no app limit | Counter in the chat header ("12 of 20 left today") | | |
| | Questions | Max 500 characters. Harmful or off-topic prompts are refused | Under the input box | | |
| | LLM-generated queries | **Read-only** Cypher (write clauses blocked), 5-second timeout, 1,000-row limit | Engineer view, with the query | | |
| | Role impersonation | A simulation, not authentication | Role badge tooltip | | |
| | Data | 100% synthetic. Never upload real customer or confidential data | Banner on the landing page and the upload box | | |
| | Idle reset | After 4 hours without activity, sessions, sandboxes and PIN sessions are cleared | Footer note | | |
| | Scripted scenarios | Answers are **pre-computed**: they cost nothing and work even if the LLM is down | "Cached answer" tag | | |
| | Logging | Only questions and response times are logged. No keys, PINs or uploaded content | Limits & fair use page | | |
| ## 11A. Name & Branding | |
| - **Name: Cortex.** The name suggests the "intelligence layer" of the enterprise, and follows the IT convention of | |
| "Cortex" for intelligence, security and engineering platforms. | |
| - **Caution:** several commercial products already use "Cortex". That's fine for an internal demo, but check | |
| trademarks before any external or commercial use. The fictional bank is **"Cortex Bank"**. | |
| - **Logo:** an original mark. A "C" formed by an arc of connected graph nodes, with a bright node at its opening | |
| (knowledge β insight). Navy-to-orange gradient. Files: `docs/brand/cortex-logo.svg` / `.png`. | |
| - **Palette:** navy `#0B1B3A`, blue `#1E3A8A`, orange `#F97316`, teal `#0EA5A4` (for "success"), slate for text. | |
| ## 12. Repository Layout | |
| ``` | |
| cortex/ | |
| docs/ DESIGN.md, DEMO_SCRIPT.md, EVAL.md, one-pager | |
| content/ source Markdown for the ~60 bank documents | |
| pdfs/ rendered PDFs (committed) | |
| generator/ pdf_render.py, ops_data.py (seeded, fraud injection) | |
| ingest/ LangChain pipeline: load, chunk, embed, extract, load to FalkorDB | |
| app/ FastAPI, RAG + GraphRAG chains, LLM gateway, static UI | |
| eval/ questions + known answers, runner, results | |
| deploy/ Dockerfile (HF Space), supervisord.conf, docker-compose.yml | |
| tests/ | |
| ``` | |
| ## 13. Future State (not now) | |
| - **AWS deployment** (for example ECS, or EC2 with FalkorDB Cloud) once there's an AWS account and budget. | |
| - **Neo4j comparison** as an optional write-up or benchmark appendix. | |
| - **Live external feed:** daily AI and regulatory news ingested as `Signal` nodes that link to the policies they | |
| affect. This was the original "AI News" idea. | |
| ## 14. Two-Day Plan | |
| | When | Deliverable | | |
| |---|---| | |
| | Day 1 AM | Bank content (Markdown) β ~60 PDFs; ops data generator | | |
| | Day 1 PM | LangChain ingestion into FalkorDB; graph snapshot; RAG and GraphRAG chains working | | |
| | Day 2 AM | UI (executive and engineer views, role switcher, tokenomics), scenarios, uploads, PIN-protected keys, evaluation run | | |
| | Day 2 PM | Hugging Face Space deploy, limits page, demo script, updated one-pager | | |
| | After build | Recorded backup video, once everything is built and nearly ready | | |
| ## 15. Risks | |
| | Risk | Mitigation | | |
| |---|---| | |
| | Free-tier LLM rate limits | Pre-built graph, cached scenario answers, BYO key | | |
| | Imperfect LLM extraction | Schema-guided extraction, validation, spot checks against known answers | | |
| | Space cold start | Warm-up page, fast snapshot load | | |
| | Trust around BYO keys | Encrypted in the browser with a PIN, not logged, disclosure on the page, suggest limited keys | | |
| | Access PIN leaked | Owner changes it in Space secrets; rate limits cap the damage | | |
| | Hugging Face sleep can't be set to 4h on the free tier | App-level 4-hour idle reset (Β§9) | | |
| | Licensing (FalkorDB is SSPL) | Flag to Legal before any production use | | |
| **Open items:** owner creates a free Gemini API key and a Hugging Face Space, and chooses the Access PIN (instructions will be provided). | |
| ## 16. Cradle of the Learning Portal | |
| Cortex is where the owner's **Learning Portal** started (1 Oct 2026). After Cortex went live, the owner wanted to be able to | |
| explain it from scratch, at any depth, without reading long text. That became a separate product: | |
| a private, phone-first portal that turns every project into learning, in a loop: **Build β Capture β Learn β Explore β Decide β Build**. | |
| **Agreed brief (for the new repo; the portal's name = the repo's name, chosen by the owner):** | |
| | Topic | Decision | | |
| |---|---| | |
| | Proof of concept | Cortex only; other projects join later | | |
| | Device and privacy | iPhone first; private (private Hugging Face Space) | | |
| | Formats | Audio episodes, 60-90 s narrated reels, swipe cards, 3-question checks, "explain it back"; text is the fallback | | |
| | Voice | Kokoro-82M `af_heart`, same as the X-Ray film (`docs/film/make_audio.py`) | | |
| | Structure | Concepts β Projects β Decisions, linked as a graph | | |
| | Retention | Daily 5-minute spaced-repetition drill | | |
| | Updates | Weekly scheduled run reads the repos (commits + `DECISIONS.md`) and refreshes learning packs; on demand too | | |
| | Explore | Weekly tech radar (Adopt / Trial / Watch / Hold) for the technologies and techniques each project uses, with dated sources; the owner decides | | |
| | Capture habit | Every project keeps a `DECISIONS.md` (decision, options, reason, lesson); see [DECISIONS.md](DECISIONS.md) | | |