production-rag-backend / docs /Project_Structure.md
UDHOV's picture
Sync from GitHub via hub-sync
bef3cc6 verified
|
Raw
History Blame Contribute Delete
12 kB

Production RAG Pipeline β€” Project Structure

Project 02 | Version 1.1 Revised May 2026 β€” Aligned with v1.1 Technical Review


Revision Notes

This structure supersedes the original Project_Structure.md. Changes were made to align with the architectural decisions resolved in v1.1 and the findings of the pre-Phase 1 corpus audit. Key additions: src/storage/, src/validation/, data/ground_truth/, data/processed/filtered/, data/processed/chunks/, and tests/red_team/.


/src

ingestion/

Document parsing, structure analysis, chunking, and metadata extraction. Corresponds to Phase 1 of the implementation plan.

ingestion/
  parser.py           # Type-specific handlers: PDF (PyMuPDF), DOCX (python-docx),
                      # XLSX (openpyxl), Images (unstructured + OCR).
                      # Do NOT use a single generic parser.
  structure_analyzer.py  # Classifies every block: heading, paragraph, table,
                         # code_block, list_item. Outputs a tagged document tree.
  chunker.py          # Structure-aware chunking: 256–512 tokens, 50-token overlap.
                      # Hard rules: never split table rows or code blocks.
                      # Includes minimum character threshold filter (< 100 chars)
                      # per corpus audit finding (zero-text / low-density pages).
  metadata_pipeline.py   # Per-chunk metadata: source_file, section_heading,
                         # chunk_index, date, department, version, summary,
                         # keywords, hypothetical_questions (HyDE via LLM).
                         # Temporal metadata: regex-based year extraction from
                         # filename takes priority over internal PDF metadata
                         # per corpus audit finding.

Audit note: The corpus contains documents ranging from 7 to 408 pages with high table density in financial files (up to 3 tables/page). Use unstructured for table-to-Markdown conversion and batch processing for large files to prevent memory spikes during embedding generation.


storage/

Infrastructure initialization for all three storage backends. Corresponds to Phase 2 of the implementation plan.

storage/
  qdrant_client.py    # Qdrant (local Docker) setup for dense vector storage.
                      # Stores chunk text + full metadata payload.
  bm25_index.py       # rank_bm25 in-memory index (Decision 1: confirmed).
                      # Feasible for corpus under ~80K chunks on 16 GB RAM.
                      # Migration trigger: >80K chunks OR Context Recall < 0.70
                      # β†’ revisit Qdrant sparse vectors (SPLADE).
  neon_db.py          # Neon/Postgres + pgvector schema.
                      # Required fields: version, department, date.
                      # Supports Neon branching for isolated testing of new
                      # embedding models or chunking strategies.

retrieval/

Hybrid retrieval pipeline and cross-encoder reranking. Corresponds to Phase 3 of the implementation plan.

retrieval/
  hybrid_search.py    # Qdrant dense retrieval (top 20) + BM25 sparse (top 20).
  rrf_fusion.py       # Reciprocal Rank Fusion (k=60). Preferred over weighted
                      # averaging β€” requires no tuning.
  reranker.py         # cross-encoder/ms-marco-MiniLM-L-6-v2 via sentence-
                      # transformers (replaces Cohere Rerank β€” zero cost).
                      # Alternative: cross-encoder/ms-marco-electra-base for
                      # higher accuracy at additional latency cost.
                      # Target: ≀ 120ms for full retrieval + reranking.

Hardware note: Local cross-encoder inference is slower than a paid API call. Profile on target hardware early. Reduce top-N candidate count if the 120ms budget is exceeded before adjusting anything else.


reasoning/

LangGraph stateful graph: planner, conditional router, and agent nodes. Corresponds to Phase 4 of the implementation plan.

reasoning/
  state.py            # RAGState TypedDict: query, sub_tasks, retrieved_chunks,
                      # agent_outputs, final_answer, validation_passed.
  planner.py          # Decomposes multi-step queries into executable sub-tasks.
  router.py           # Classifies sub-task type and routes to correct agent.
  agents/
    retrieval_agent.py      # Retrieval Agent node.
    summarization_agent.py  # Summarization Agent node.
    calculation_agent.py    # Calculation Agent node.
  graph.py            # Full LangGraph StateGraph wiring: entry point, sequential
                      # edges, conditional edges (Decision 2: sequential execution
                      # confirmed). Parallelism reserved for Phase 4 optimization
                      # only if profiling reveals measurable bottlenecks.

validation/

LLM-as-Judge validation nodes. Corresponds to Phase 5 of the implementation plan.

validation/
  gatekeeper.py       # Verifies response addresses original query. PASS/FAIL + reason.
  auditor.py          # Grounding check: every claim must be traceable to a retrieved
                      # chunk. Uses hardened prompt (Decision 3: same model confirmed).
                      # Prompt must include: "For each claim, identify the exact chunk
                      # that supports it. If a claim cannot be traced to a specific
                      # chunk, mark it UNGROUNDED."
  strategist.py       # Contextual coherence evaluation. PASS/FAIL + reason.
  schemas.py          # Shared output schema: { verdict: PASS/FAIL, reason: string }.
                      # All nodes must return this structure. Decisions are logged
                      # and auditable.

Validation LLM: Same model as reasoning engine (Decision 3). Optional upgrade: load a second quantized model (e.g., Mistral-7B-Instruct Q4_K_M via llama.cpp) for the Auditor role only if 16 GB RAM permits. Two 4-bit quantized 7B models can co-exist within 16 GB.


evaluation/

RAGAS integration, latency and cost tracking, and ground truth validation. Corresponds to Phase 6 of the implementation plan.

evaluation/
  ragas_runner.py          # Runs RAGAS across all 4 iterations. Records
                           # Faithfulness, Answer Relevancy, Context Precision,
                           # Context Recall. Outputs delta scores per iteration.
  latency_tracker.py       # Per-query logging: retrieval_latency_ms,
                           # rerank_latency_ms, generation_latency_ms,
                           # total_latency_ms, validation_passed, cost_usd.
                           # Alert threshold: total_latency_ms > 280ms.
  validate_ground_truth.py # Ground truth schema validation script.
                           # See ground_truth_plan.md for full specification.

utils/

Shared infrastructure. No business logic.

utils/
  logging.py          # Structured logging across all subsystems.
  env.py              # Environment variable management.
  helpers.py          # Shared helper functions.

/data

data/
  raw/                # Original corpus: 27 PDF files + 6 DOCX files.
                      # Read-only. Never modify files in this directory.

  processed/
    filtered/         # Post junk-node removal. Pages below 100-character
                      # threshold are excluded here per corpus audit finding.
    chunks/           # Validated structure-aware chunks from Phase 1.
                      # These are the chunks used for chunk ID assignment
                      # in the ground truth dataset (Track B).

  ground_truth/       # Ground truth QA dataset. Construction begins in Phase 1
                      # (Track A) and completes after chunking is validated
                      # (Track B). See ground_truth_plan.md.
    ground_truth.json # Primary dataset. Schema: question_id, question,
                      # ground_truth_answer, ground_truth_chunk_ids,
                      # source_document, domain_tag.
    ground_truth.csv  # Optional CSV mirror for spreadsheet-based annotation.

  metadata/           # Temporal metadata outputs and other extraction artifacts.

/config

config/
  settings.yaml       # Model names, chunk size (256–512 tokens), overlap (50 tokens),
                      # RRF k-value (60), latency thresholds (p95: 280ms,
                      # retrieval: 120ms), RAGAS alert threshold (CP < 0.75),
                      # top-N retrieval counts, API endpoint configurations.

/tests

tests/
  unit/               # Per-module unit tests for each subsystem.
  integration/        # Round-trip and cross-subsystem tests.
                      # Includes: single-document ingest β†’ Qdrant + Postgres
                      # round-trip (Phase 2 milestone), 50-query retrieval
                      # validation (Phase 3 milestone).
  red_team/           # Adversarial test suites (Phase 7).
    prompt_injection/   # Attempts to override system prompt and core instructions.
    info_evasion/       # Attempts to leak data across access levels.
    bias_probing/       # Demographic, political, religious query framing.
                        # Every test case must be logged β€” undocumented tests
                        # do not count toward the Phase 7 milestone.

/docs

docs/
  audit_pre_phase.md  # Pre-Phase 1 corpus audit (complete). Covers 25/33 documents.
                      # Key findings: zero-text pages, high table density in
                      # financial files, document scale 7–408 pages, filename-
                      # based temporal metadata.
  ground_truth_plan.md  # Ground truth construction workflow (Track A + Track B).
  PROJECT_STATUS.md   # Project status, decisions log, and active blockers.
                      # Replaces GEMINI.md β€” audit GEMINI.md for Google-specific
                      # tooling assumptions before renaming.

Root Files

main.py               # CLI or API entry point to run the pipeline.
.env                  # Environment variables (keys, paths). Never commit.
requirements.txt      # Python dependency manifest.
pyproject.toml        # Build system configuration (alternative to requirements.txt).
GEMINI.md             # Gemini CLI configuration. Do not rename or modify structure.

Hardware Reference

Environment Specification Role
Local machine No GPU, 16 GB RAM Qdrant, BM25, cross-encoder inference, quantized LLM
Cloud GPU (free) Kaggle T4/P100 or Colab T4 Embedding generation only β€” one-time ingestion job
Workflow Embed on cloud β†’ serialize β†’ load into local Qdrant Eliminates GPU dependency at query time

Before Phase 2: Run htop or free -h on a clean boot to establish actual RAM headroom. Qdrant + cross-encoder + Python runtime can approach 6–8 GB combined.


Pre-Phase 1 Gate Checklist

All items below must be complete before Phase 1 implementation code begins.

# Item Status
1 YouTube reference video watched and plan updated βœ… Complete
2 GEMINI.md audited and renamed to PROJECT_STATUS.md βœ… Complete
3 BM25 path decided (rank_bm25 β€” Decision 1) βœ… Closed
4 Agent execution model decided (Sequential β€” Decision 2) βœ… Closed
5 Validation LLM decided (Same model + hardened prompts β€” Decision 3) βœ… Closed
6 Project structure revised and aligned with v1.1 βœ… Complete
7 Ground truth schema defined, file initialized (Track A, Step 1) ☐
8 Ground truth questions and answers written (Track A, Step 2) ☐
9 Validation script written and passing on empty dataset (Track A, Step 3) ☐

Items 7–9 are the final gate. Phase 1 implementation begins once they are checked.


Document prepared May 2026 | Version 1.1 | Project 02 Confidential β€” Internal Use Only *