|
Download ENTERPRISE_RAG_GUIDE.md from Ramosh99/cognify: direct link, hf CLI and curl.
- Browser
- Download file 17.8 kB
-
https://huggingface.co/spaces/Ramosh99/cognify/resolve/main/ENTERPRISE_RAG_GUIDE.md
- Command line
-
hf download hf://spaces/Ramosh99/cognify/ENTERPRISE_RAG_GUIDE.md
-
curl -L -o ENTERPRISE_RAG_GUIDE.md https://huggingface.co/spaces/Ramosh99/cognify/resolve/main/ENTERPRISE_RAG_GUIDE.md
17.8 kB
| # 📘 Enterprise Production RAG: Complete Learning & Architecture Guide | |
| Welcome to the **CognifyAI Enterprise Production RAG** architectural study guide. This document explains every design decision, algorithmic strategy, data structure, and code implementation built into the system so you can master and extend production-grade Retrieval-Augmented Generation. | |
| --- | |
| ## 📑 Table of Contents | |
| 1. [Why Naive RAG Fails vs. Enterprise RAG](#1-why-naive-rag-fails-vs-enterprise-rag) | |
| 2. [End-to-End System Architecture](#2-end-to-end-system-architecture) | |
| 3. [Phase 1: Ingestion & Document Enrichment](#3-phase-1-ingestion--document-enrichment) | |
| * [1.1 Hierarchical AST Document Chunking](#11-hierarchical-ast-document-chunking) | |
| * [1.2 Contextual Breadcrumb Enrichment](#12-contextual-breadcrumb-enrichment) | |
| * [1.3 Small-to-Big Parent Context Storage](#13-small-to-big-parent-context-storage) | |
| 4. [Phase 2: Database Schema & Dual Indexing](#4-phase-2-database-schema--dual-indexing) | |
| * [2.1 HNSW Vector Indexing (pgvector)](#21-hnsw-vector-indexing-pgvector) | |
| * [2.2 TSVector Full-Text Search (GIN Index / BM25)](#22-tsvector-full-text-search-gin-index--bm25) | |
| * [2.3 Multi-Tenant RBAC Security Filtering](#23-multi-tenant-rbac-security-filtering) | |
| * [2.4 Reciprocal Rank Fusion (RRF)](#24-reciprocal-rank-fusion-rrf) | |
| 5. [Phase 3: Query Intelligence & Decomposition](#5-phase-3-query-intelligence--decomposition) | |
| * [3.1 Query Understanding & Filter Extraction](#31-query-understanding--filter-extraction) | |
| * [3.2 Multi-Query Rewriting](#32-multi-query-rewriting) | |
| * [3.3 Query Decomposition](#33-query-decomposition) | |
| 6. [Phase 4: Post-Retrieval Refinement](#6-phase-4-post-retrieval-refinement) | |
| * [4.1 Cross-Attention Re-ranking](#41-cross-attention-re-ranking) | |
| * [4.2 Relevance Filtering & Noise Cutoff](#42-relevance-filtering--noise-cutoff) | |
| * [4.3 Context Construction & Token Budgeting](#43-context-construction--token-budgeting) | |
| * [4.4 Grounded Prompt Construction](#44-grounded-prompt-construction) | |
| 7. [Phase 5: Generation & Truth Validation (Self-RAG)](#7-phase-5-generation--truth-validation-self-rag) | |
| * [5.1 Low-Temperature Deterministic Generation](#51-low-temperature-deterministic-generation) | |
| * [5.2 Grounding & Faithfulness Validation](#52-grounding--faithfulness-validation) | |
| * [5.3 Automated Hallucination Self-Correction](#53-automated-hallucination-self-correction) | |
| 8. [Codebase Map & File References](#8-codebase-map--file-references) | |
| 9. [Hands-On Verification Examples](#9-hands-on-verification-examples) | |
| --- | |
| ## 1. Why Naive RAG Fails vs. Enterprise RAG | |
| | Feature / Challenge | Naive Prototype RAG | Enterprise Production RAG (CognifyAI) | | |
| | :--- | :--- | :--- | | |
| | **Chunking** | Blind character or recursive token splitting (`chunk_size=500`). Breaks sentences and drops headers. | **Hierarchical AST Splitting**: Preserves Chapter ➔ Section ➔ Subsection ➔ Paragraph trees. | | |
| | **Chunk Context** | "Chunk amnesia": Isolated chunk has no context about what document or chapter it belongs to. | **Contextual Breadcrumb Enrichment**: Injects `[Doc > Section]:` breadcrumbs into text before embedding. | | |
| | **Retrieval Strategy** | Vector-only (Dense search). Misses exact product codes, acronyms, or specific keywords. | **Hybrid Search**: Combines Dense (HNSW pgvector) + Sparse (BM25 TSVector) with Reciprocal Rank Fusion (RRF). | | |
| | **Security / RBAC** | No filtering or in-memory filtering (prone to data leaks). | **Database-Level RBAC**: Security (`user_id`, `department`, `permissions`) enforced in SQL `WHERE` clauses. | | |
| | **Query Handling** | Passes raw user prompt directly into vector search. | **Query Understanding & Decomposition**: Resolves pronouns, extracts temporal filters, and splits multi-hop questions. | | |
| | **Post-Retrieval** | Dumps raw top-k chunks directly into the LLM prompt. | **Re-ranking & Relevance Filtering**: Cross-attention scoring removes irrelevant noise below threshold (`< 0.50`). | | |
| | **Context Assembly** | Stuffs chunks blindly, often exceeding token limits. | **Small-to-Big Context**: Retrieves small vectors for precision, injects larger parent sections for rich LLM context. | | |
| | **Hallucination Check** | None. Assumes LLM answered factually. | **Self-RAG Validation**: Audits facts and citations against source context with automated self-correction. | | |
| --- | |
| ## 2. End-to-End System Architecture | |
| ```mermaid | |
| flowchart TD | |
| subgraph INGESTION["1. Document Ingestion Pipeline"] | |
| Doc[User Document .pdf / .md / .txt] --> AST[Hierarchical AST Tree Parser] | |
| AST --> Breadcrumb[Breadcrumb Enrichment Engine] | |
| Breadcrumb --> ChunkVector[Dense Embedding Model BGE-768] | |
| Breadcrumb --> DBStore[(Supabase PostgreSQL)] | |
| end | |
| subgraph QUERY_PROCESSING["2. Query Understanding & Planning"] | |
| UserMsg[User Message / Chat History] --> QEngine[Query Planner Engine] | |
| QEngine --> QRewrite[Query Rewriting & Coreference] | |
| QEngine --> QDecomp[Multi-Hop Query Decomposition] | |
| QEngine --> QFilters[Entity & Department Tag Extraction] | |
| end | |
| subgraph RETRIEVAL["3. Hybrid Retrieval & Post-Processing"] | |
| QDecomp --> HybridRPC[match_documents_hybrid SQL RPC] | |
| DBStore --> HybridRPC | |
| HybridRPC --> DenseRank[Dense HNSW Cosine Rank] | |
| HybridRPC --> SparseRank[Sparse BM25 GIN Rank] | |
| DenseRank & SparseRank --> RRF[Reciprocal Rank Fusion] | |
| RRF --> Rerank[Cross-Attention Re-ranking] | |
| Rerank --> RelFilter[Relevance Cutoff Filter >= 0.50] | |
| end | |
| subgraph GENERATION_VALIDATION["4. Generation & Self-RAG Validation"] | |
| RelFilter --> CtxBuilder[Context & Prompt Construction] | |
| CtxBuilder --> LLMGen[Low-Temp LLM Generation] | |
| LLMGen --> Validator{Faithfulness & Grounding Audit} | |
| Validator -- "Passed" --> VerifiedAnswer[Final Grounded Response + Citations] | |
| Validator -- "Hallucination Detected" --> SelfCorrect[Automated Self-Correction] | |
| SelfCorrect --> VerifiedAnswer | |
| end | |
| ``` | |
| --- | |
| ## 3. Phase 1: Ingestion & Document Enrichment | |
| *Implemented in:* `backend/app/services/chunking_service.py` & `backend/app/services/rag_service.py` | |
| ### 1.1 Hierarchical AST Document Chunking | |
| Rather than cutting text every 500 characters, the document is parsed into an Abstract Syntax Tree (AST) following heading hierarchy: | |
| * **Level 1 (`# Title`):** Represents high-level document or chapter. | |
| * **Level 2 (`## Section`):** Represents functional modules or domains. | |
| * **Level 3 (`### Subsection`):** Represents specific policies or guidelines. | |
| * **Leaf nodes:** Individual coherent paragraphs. | |
| ### 1.2 Contextual Breadcrumb Enrichment | |
| When a paragraph says: *"Employees receive 14 days of annual leave."*, an isolated vector model has no idea which company, department, or contract type this applies to. | |
| We enrich the text before embedding: | |
| ``` | |
| HR Policy 2024 > Full-time Benefits > Leave Entitlements: | |
| Employees receive 14 days of annual leave. | |
| ``` | |
| **Why this matters:** The vector representation now retains global document semantics without mutating the raw text presentation. | |
| ### 1.3 Small-to-Big Parent Context Storage | |
| * **Problem:** Small chunks embed better because vectors capture specific semantics. However, LLMs generate better answers when they see surrounding context. | |
| * **Solution:** We embed the small chunk, but store `parent_text` (the entire containing section). During retrieval, the fine-grained vector matches the search, but we expand the context sent to the LLM to include the parent section. | |
| --- | |
| ## 4. Phase 2: Database Schema & Dual Indexing | |
| *Implemented in:* `backend/supabase_migration.sql` | |
| ```sql | |
| -- Schema with HNSW vector + TSVector Full-Text search + RBAC columns | |
| CREATE TABLE IF NOT EXISTS documents ( | |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), | |
| user_id UUID, -- User ownership | |
| text TEXT NOT NULL, -- Raw chunk | |
| enriched_text TEXT, -- Breadcrumb enriched | |
| parent_id UUID, -- Parent section ID | |
| parent_text TEXT, -- Surrounding parent text | |
| doc_title VARCHAR(512), | |
| section_title VARCHAR(512), | |
| topic VARCHAR(255), | |
| source VARCHAR(512), | |
| department VARCHAR(100), -- RBAC: e.g. 'engineering', 'hr' | |
| author VARCHAR(255), | |
| entities TEXT[], -- Extracted tags | |
| permissions TEXT[] DEFAULT ARRAY['public'],-- RBAC: ['public', 'admin'] | |
| embedding VECTOR(768), -- BGE Base Embedding | |
| fts TSVECTOR GENERATED ALWAYS AS ( -- BM25 Keyword Search | |
| to_tsvector('english', coalesce(doc_title, '') || ' ' || coalesce(section_title, '') || ' ' || coalesce(text, '')) | |
| ) STORED, | |
| created_at TIMESTAMPTZ DEFAULT NOW() | |
| ); | |
| ``` | |
| ### 2.1 HNSW Vector Indexing (pgvector) | |
| Hierarchical Navigable Small World (HNSW) creates a multi-layered geometric graph over embeddings. It replaces IVFFlat because: | |
| 1. It does not require periodic re-training or re-indexing when new documents are added. | |
| 2. It offers higher recall (>98%) at sub-millisecond query latencies. | |
| ### 2.2 TSVector Full-Text Search (GIN Index / BM25) | |
| Vectors fail at exact keyword queries (e.g. error codes `ERR-504`, acronyms `EBITDA`, product numbers). PostgreSQL's `tsvector` with a Generalized Inverted Index (GIN) provides BM25-equivalent sparse keyword search. | |
| ### 2.3 Multi-Tenant RBAC Security Filtering | |
| Security filtering is executed in SQL inside `match_documents_hybrid`: | |
| ```sql | |
| WHERE | |
| (p_user_id IS NULL OR d.user_id = p_user_id) | |
| AND (p_department IS NULL OR d.department IS NULL OR d.department = p_department) | |
| AND (p_permissions IS NULL OR d.permissions && p_permissions OR 'public' = ANY(d.permissions)) | |
| ``` | |
| This guarantees that users can never retrieve documents outside their authorized department or permissions. | |
| ### 2.4 Reciprocal Rank Fusion (RRF) | |
| Combines the rank positions of Dense and Sparse searches without needing normalized scores: | |
| $$\text{RRF Score}(d) = \frac{1}{k + \text{rank}_{\text{dense}}(d)} + \frac{1}{k + \text{rank}_{\text{sparse}}(d)}$$ | |
| where $k = 60$ is a smoothing constant. | |
| --- | |
| ## 5. Phase 3: Query Intelligence & Decomposition | |
| *Implemented in:* `backend/app/agents/chat_tools/query_planner.py` | |
| ### 3.1 Query Understanding | |
| Analyzes the user's natural language input along with conversation history to extract: | |
| * **Entities:** Specific names, products, or technologies. | |
| * **Temporal Filters:** Time ranges (e.g. `Q1 2024`, `annual`). | |
| * **Department Tags:** Automatically inferred organizational context. | |
| ### 3.2 Multi-Query Rewriting | |
| Resolves pronouns and ambiguous references: | |
| * *User input:* "What did we decide about its cost in the last review?" | |
| * *Rewritten:* "AWS infrastructure cost optimization decision meeting notes" | |
| ### 3.3 Query Decomposition | |
| Complex comparative or multi-hop questions cannot be answered in a single vector search. | |
| * *User input:* "Compare AWS vs Azure costs in Q1 and explain why AWS was selected." | |
| * *Decomposed Sub-queries:* | |
| 1. `AWS cloud infrastructure costs Q1` | |
| 2. `Azure cloud infrastructure costs Q1` | |
| 3. `Decision rationale selecting AWS over Azure` | |
| --- | |
| ## 6. Phase 4: Post-Retrieval Refinement | |
| *Implemented in:* `backend/app/services/rerank_service.py` & `backend/app/services/context_service.py` | |
| ### 4.1 Cross-Attention Re-ranking | |
| Vector embeddings compute cosine similarity independently. A re-ranker evaluates the **joint cross-attention** $(\text{Query} \times \text{Passage})$ to calculate true factual relevance on a scale of `0.00` to `1.00`. | |
| ### 4.2 Relevance Filtering & Noise Cutoff | |
| Even after top-k retrieval, chunks scoring below the minimum relevance threshold (`score < 0.50`) are discarded. This prevents off-topic passages from contaminating the prompt. | |
| ### 4.3 Context Construction | |
| * **Deduplication:** Removes duplicate content retrieved across sub-queries. | |
| * **Hierarchy Preservation:** Formats citations with full breadcrumb titles. | |
| * **Token Budget Guard:** Enforces character/token limits to prevent context overflow. | |
| ### 4.4 Grounded Prompt Construction | |
| Formats the prompt with strict system instructions: | |
| ``` | |
| --- EVIDENCE [1] --- | |
| Source: HR Policy > Leave Entitlements | |
| Relevance: 0.95 | |
| Content: Employees receive 14 days of paid annual leave. | |
| --- | |
| USER QUESTION: How many days of annual leave do employees receive? | |
| Provide a grounded, cited answer using ONLY the evidence above. Cite inline as [1], [2]. | |
| ``` | |
| --- | |
| ## 7. Phase 5: Generation & Truth Validation (Self-RAG) | |
| *Implemented in:* `backend/app/services/validation_service.py` & `backend/app/services/llm_service.py` | |
| ### 5.1 Low-Temperature Deterministic Generation | |
| We invoke the LLM with `temperature = 0.2` to ensure high factual precision and suppress creative hallucinations. | |
| ### 5.2 Grounding & Faithfulness Validation (Self-RAG) | |
| Before any answer is returned to the user, an automated Truth Auditor inspects: | |
| 1. Is every factual claim in the response supported by the provided evidence? | |
| 2. Are inline citations (`[1]`, `[2]`) valid and referencing existing evidence blocks? | |
| 3. Does the answer make ungrounded assertions? | |
| ### 5.3 Automated Hallucination Self-Correction | |
| If a hallucination is detected (e.g. claiming *60 days* instead of *30 days*): | |
| 1. The auditor generates structured feedback listing the hallucinated claims. | |
| 2. An automated correction agent rewrites the response to strictly conform to the source evidence. | |
| 3. If no evidence exists, the system safely triggers an honest refusal: | |
| > *"Based on your uploaded documents, I do not have enough relevant information to answer this question."* | |
| --- | |
| ## 8. Codebase Map & File References | |
| | File Path | Primary Responsibility | Key Functions / Classes | | |
| | :--- | :--- | :--- | | |
| | `backend/supabase_migration.sql` | Database schema, HNSW + GIN indexes, RBAC, RRF hybrid RPC | `match_documents_hybrid`, `match_documents` | | |
| | `backend/app/services/chunking_service.py` | AST hierarchical parsing & breadcrumb enrichment | `hierarchical_split`, `_build_breadcrumb` | | |
| | `backend/app/services/embedding_service.py` | Passage & query dense vector embedding | `embed_passage`, `embed_query`, `embed_batch` | | |
| | `backend/app/services/rag_service.py` | Ingestion orchestrator & hybrid retrieval coordinator | `RAGService.ingest`, `RAGService.retrieve` | | |
| | `backend/app/agents/chat_tools/query_planner.py` | Query understanding, rewriting, and multi-hop decomposition | `plan_enterprise_query`, `plan_query` | | |
| | `backend/app/services/rerank_service.py` | Cross-attention scoring & relevance cutoff filtering | `RerankService.rerank_and_filter` | | |
| | `backend/app/services/context_service.py` | Context deduplication, Small-to-Big assembly, prompt building | `ContextService.construct_context`, `build_grounded_prompt` | | |
| | `backend/app/services/validation_service.py` | Faithfulness auditor & hallucination self-correction | `ValidationService.validate_answer`, `_self_correct` | | |
| | `backend/app/services/llm_service.py` | End-to-end grounded RAG execution & Gemini integration | `LLMService.grounded_rag_answer` | | |
| | `backend/app/agents/chat_tools/retrieval.py` | Multi-query parallel retrieval agent tool | `retrieve_documents` | | |
| | `backend/app/agents/chat_tools/tutoring.py` | Chat integration routing to grounded RAG | `answer_study_question` | | |
| | `backend/app/api/endpoints/documents.py` | REST API endpoints for ingestion and hybrid search | `POST /documents/ingest/text`, `POST /documents/search` | | |
| --- | |
| ## 9. Hands-On Verification Examples | |
| ### Test 1: Hierarchical Chunking & Breadcrumbs | |
| ```powershell | |
| .\venv\Scripts\python.exe -c "from app.services.chunking_service import chunking_service; chunks = chunking_service.hierarchical_split('# Chapter 1: Security\n## Section 2: Passwords\nPasswords must be at least 12 characters.', doc_title='Security Policy'); print(chunks[0].enriched_text)" | |
| ``` | |
| **Output:** | |
| ``` | |
| Security Policy > Chapter 1: Security > Section 2: Passwords: | |
| Passwords must be at least 12 characters. | |
| ``` | |
| --- | |
| ### Test 2: Query Decomposition | |
| ```powershell | |
| .\venv\Scripts\python.exe -c "from app.agents.chat_tools.query_planner import plan_enterprise_query; plan = plan_enterprise_query(message='Compare AWS and Azure costs in Q1', history=[]); print(plan['sub_queries'])" | |
| ``` | |
| **Output:** | |
| ```python | |
| ['AWS cloud infrastructure costs Q1', 'Azure cloud infrastructure costs Q1', 'comparative analysis of AWS and Azure pricing models Q1'] | |
| ``` | |
| --- | |
| ### Test 3: Grounded Generation with Citations | |
| ```powershell | |
| .\venv\Scripts\python.exe -c "from app.services.llm_service import llm_service; mock_chunk = [{'text': 'Refunds are processed in 30 days.', 'parent_text': 'Policy > Refunds:\nRefunds are processed in 30 days.', 'doc_title': 'Policy', 'section_title': 'Refunds', 'score': 0.9}]; res = llm_service.grounded_rag_answer(query='What is the refund turnaround?', raw_candidates=mock_chunk); print(res['answer'])" | |
| ``` | |
| **Output:** | |
| ``` | |
| Refunds are processed in 30 days [1]. | |
| ``` | |
| --- | |
| ### Test 4: Hallucination Detection & Self-Correction | |
| ```powershell | |
| .\venv\Scripts\python.exe -c "from app.services.validation_service import validation_service; evidence = 'Refunds are processed in 30 days.'; hallucinated = 'Refunds take 60 days and include a gift card.'; res = validation_service.validate_answer(query='Refund timeline', response_text=hallucinated, context_evidence=evidence); print('Grounded:', res.is_grounded); print('Corrected:', res.corrected_response)" | |
| ``` | |
| **Output:** | |
| ``` | |
| Grounded: False | |
| Corrected: Refunds are processed in 30 days [1]. | |
| ``` | |
| --- | |
| *CognifyAI Enterprise RAG Architecture Guide — Designed for high-scale, zero-hallucination learning and enterprise retrieval.* | |