Skip to main content

Middleware that prevents sensitive information leakage in RAG pipelines by analyzing the context assembly graph

Project description

RagContextGuard

Prevent sensitive information leakage in RAG pipelines.

RagContextGuard is a lightweight Python middleware that analyzes retrieved document chunks before they reach your LLM. It detects when innocent-looking chunks combine to reveal secrets.

Installation

pip install -e .

This installs rag-context-guard with its dependencies (pyyaml).

Quick Demo

Run the included demo to see RagContextGuard in action:

python demo.py

The demo simulates a RAG retrieval with 3 chunks — one combines financial data with an entity identifier, triggering a policy violation.

Running Tests

The project includes a comprehensive test suite. Run it to verify the installation:

python test_comprehensive.py

Expected output: [PASS] All tests passed! (9/9 tests). If you've added custom policies or modified the engine, run this to verify correctness.

How It Works

  1. Classifications: Each chunk carries one or more labels (e.g., "financial", "pii", "confidential"). These come from your existing metadata or an optional LLM classifier you provide.
  2. Set Analysis: RagContextGuard checks whether the union of all chunk classifications satisfies any policy rule's trigger.all_present condition.
  3. Path Analysis: Multi-hop collusion detection finds when a shared classification bridges two otherwise-safe rules, creating a dangerous combination.
  4. Actions: Rules can block (halt pipeline) or warn (log only).

Policy Format

Policies are YAML files. Create your own or use the built-ins.

rules:
  - name: financial_entity_reveal
    description: "Block combining financial metrics with entity identifiers"
    action: block   # or "warn"
    trigger:
      all_present:
        - financial
        - entity_identifier
    message: "Financial data combined with entity identifier  client financials exposed"

Matching: A rule fires when all classifications listed in trigger.all_present appear across the retrieved chunk set (any chunk, any order). A chunk may carry multiple classifications.

Usage

from rag_context_guard import GuardMiddleware, policies

# Use built-in policy
guard = GuardMiddleware(policies.DEFAULT)

# Or your custom file
# guard = GuardMiddleware("my_policy.yaml")

Chunk format

Each chunk is a dict with:

  • text (str): The document content
  • meta (dict): At minimum, include classification (str or list) or classifications (list)

Any extra metadata fields are ignored by the policy engine.

Built-in Policies

Policy Use case Rules
policies.DEFAULT General data leakage prevention 7
policies.FINANCE Financial services confidentiality 6
policies.HIPAA Protected Health Information (PHI) 6
policies.GDPR EU personal data compliance 6
from rag_context_guard import GuardMiddleware, policies

guard = GuardMiddleware(policies.FINANCE)

Optional: LLM-Based Classification

If your chunks lack pre-computed classification metadata, you can provide a classifier function that runs an LLM to tag chunks:

from rag_context_guard import GuardMiddleware
from langchain_ollama import OllamaLLM   # pip install langchain-ollama

The classifier is called only for chunks without existing classifications.

Running Tests

The project includes a comprehensive test suite:

python test_comprehensive.py

Expected output: [PASS] All tests passed! (9/9 tests). If you've added custom policies or modified the engine, run this to verify correctness.

API Reference

GuardMiddleware

Main entry point.

GuardMiddleware(policy_path=None, classifier=None)
  • policy_path: BuiltinPolicy constant or path to YAML file (default: built-in DEFAULT)
  • classifier: Optional callable (str) -> str | list[str] | None

Methods:

  • analyze(chunks: List[dict]) -> AnalysisResult
  • get_rules() -> List[PolicyRule]

AnalysisResult

Returned by analyze():

  • is_safe: boolTrue if no block violations
  • violations: List[Violation] — all blocking issues
  • warnings: List[Violation] — all warn-level issues
  • safe_subset: List[Chunk] — chunks not involved in any block violation
  • risk_explanation: str — human-readable summary

Violation

  • rule_name: str
  • message: str
  • triggering_chunks: List[Chunk]
  • action: Action (Action.BLOCK or Action.WARN)

Creating Custom Policies

Copy src/rag_context_guard/policies/example.yaml and adapt:

rules:
  - name: healthcare_pii_exposure
    action: block
    trigger:
      all_present: [healthcare, pii]
    message: "Healthcare data combined with PII  exposure risk"

Then load it:

guard = GuardMiddleware("my_policy.yaml")

Project Structure

rag-context-guard/
├── src/rag_context_guard/
│   ├── guard.py           # GuardMiddleware
│   ├── graph_analyzer.py  # Policy evaluation engine
│   ├── policy.py          # YAML policy loader
│   ├── models.py          # Dataclasses (Chunk, Violation, AnalysisResult)
│   └── policies/          # Built-in YAML policies
│       ├── default.yaml
│       ├── finance.yaml
│       ├── hipaa.yaml
│       └── gdpr.yaml
├── demo.py                # Example usage (no external LLM needed)
├── test_comprehensive.py  # Full test suite
├── pyproject.toml         # Dependency + build config
└── README.md

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rag_context_guard-0.1.1.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rag_context_guard-0.1.1-py3-none-any.whl (14.6 kB view details)

Uploaded Python 3

File details

Details for the file rag_context_guard-0.1.1.tar.gz.

File metadata

  • Download URL: rag_context_guard-0.1.1.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for rag_context_guard-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4155e315c9f3c690d8d85a13027481b7c4d9b575903b3ec5c6ebe05cccef9221
MD5 ce849a92b164ab11189958d4cb386645
BLAKE2b-256 e1582d134fc341a24af3df20b1e8054d0c0e8aef18331fbf3cb40de33b5b5bc2

See more details on using hashes here.

File details

Details for the file rag_context_guard-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for rag_context_guard-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 525fb543a2618fd9d220f3b03d08bc4cc9565d3edb2c82fd6663885c4269a133
MD5 901adf9c6e2241a9a12d9e20317ba14e
BLAKE2b-256 48e5e0f3e160fb829a8c65a390479e914d36dba585314c20876d5a292a598d25

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page