PII Detection
Semantic Router provides built-in Personally Identifiable Information (PII) detection to protect sensitive data in user queries. The system uses fine-tuned BERT models to identify and handle various types of PII according to configurable policies.
Overview​
The PII detection system:
- Identifies common PII types in user queries
 - Enforces model-specific PII policies
 - Blocks or masks sensitive information based on configuration
 - Filters model candidates based on PII compliance
 - Logs policy violations for monitoring
 
Supported PII Types​
The system can detect the following PII types:
| PII Type | Description | Examples | 
|---|---|---|
PERSON | Person names | "John Smith", "Mary Johnson" | 
EMAIL_ADDRESS | Email addresses | "user@example.com" | 
PHONE_NUMBER | Phone numbers | "+1-555-123-4567", "(555) 123-4567" | 
US_SSN | US Social Security Numbers | "123-45-6789" | 
STREET_ADDRESS | Physical addresses | "123 Main St, New York, NY" | 
GPE | Geopolitical entities | Countries, states, cities | 
ORGANIZATION | Organization names | "Microsoft", "OpenAI" | 
CREDIT_CARD | Credit card numbers | "4111-1111-1111-1111" | 
US_DRIVER_LICENSE | US Driver's License | "D123456789" | 
IBAN_CODE | International Bank Account Number | "GB82 WEST 1234 5698 7654 32" | 
IP_ADDRESS | IP addresses | "192.168.1.1", "2001:db8::1" | 
DOMAIN_NAME | Domain/website names | "example.com", "google.com" | 
DATE_TIME | Date/time information | "2024-01-15", "January 15th" | 
AGE | Age information | "25 years old", "born in 1990" | 
NRP | Nationality/Religious/Political groups | "American", "Christian", "Democrat" | 
ZIP_CODE | ZIP/postal codes | "10001", "SW1A 1AA" | 
Configuration​
Basic PII Detection​
Enable PII detection in your configuration:
# config/config.yaml
classifier:
  pii_model:
    model_id: "models/pii_classifier_modernbert-base_model"
    threshold: 0.7                 # Global detection threshold (0.0-1.0)
    use_cpu: true                  # Run on CPU
    pii_mapping_path: "config/pii_type_mapping.json"  # Path to PII type mapping
Category-Level PII Detection​
New in v0.x: Configure PII detection thresholds at the category level for fine-grained control based on category-specific requirements and consequences.
# Global PII configuration - applies to all categories by default
classifier:
  pii_model:
    model_id: "models/pii_classifier_modernbert-base_model"
    threshold: 0.7  # Global default threshold
    use_cpu: true
    pii_mapping_path: "config/pii_type_mapping.json"
# Category-specific PII settings
categories:
  # Healthcare category: High threshold for critical PII
  - name: healthcare
    description: "Healthcare and medical queries"
    pii_enabled: true       # Enable PII detection (default: inherits from global)
    pii_threshold: 0.9      # Higher threshold for stricter detection
    model_scores:
      - model: secure-llm
        score: 0.9
        use_reasoning: false
  # Finance category: Very high threshold for financial PII
  - name: finance
    description: "Financial queries"
    pii_enabled: true
    pii_threshold: 0.95     # Very strict for SSN, credit cards, etc.
    model_scores:
      - model: secure-llm
        score: 0.9
        use_reasoning: false
  # Code generation: Lower threshold to reduce false positives
  - name: code_generation
    description: "Code and technical content"
    pii_enabled: true
    pii_threshold: 0.5      # Lower to avoid flagging code artifacts as PII
    model_scores:
      - model: general-llm
        score: 0.9
        use_reasoning: true
  # Testing: Disable PII detection
  - name: testing
    description: "Test scenarios"
    pii_enabled: false      # Disable for testing
    model_scores:
      - model: general-llm
        score: 0.6
        use_reasoning: false
  # General: Uses global settings
  - name: general
    description: "General queries"
    # pii_enabled and pii_threshold not specified - inherits global settings
    model_scores:
      - model: general-llm
        score: 0.5
        use_reasoning: false
Configuration Inheritance:
pii_enabled: If not specified, inherits from global PII model configuration (enabled ifpii_modelis configured)pii_threshold: If not specified, inherits fromclassifier.pii_model.threshold
Threshold Guidelines by Category:
- Critical categories (healthcare, finance, legal): 0.9-0.95 - Strict detection, fewer false positives
 - Customer-facing (support, sales): 0.75-0.85 - Balanced detection
 - Internal tools (code, testing): 0.5-0.65 - Relaxed to reduce false positives
 - Public content (docs, marketing): 0.6-0.75 - Broader detection before publication
 
Model-Specific PII Policies​
Configure different PII policies for different models:
# vLLM endpoints configuration
vllm_endpoints:
  - name: secure-model
    address: "127.0.0.1"
    port: 8080
  - name: general-model
    address: "127.0.0.1"
    port: 8081
# Model-specific configurations
model_config:
  secure-llm:
    pii_policy:
      allow_by_default: false      # Block all PII by default
      pii_types:                   # Only allow these specific types
        - "EMAIL_ADDRESS"
        - "GPE"
        - "ORGANIZATION"
  general-llm:
    pii_policy:
      allow_by_default: true       # Allow all PII by default
      pii_types: []                # Not used when allow_by_default is true
How PII Detection Works​
The PII detection system works as follows:
- Detection: The PII classifier model analyzes incoming text to identify PII types
 - Policy Check: The system checks if the detected PII types are allowed for the target model
 - Routing Decision: Models that don't allow the detected PII types are filtered out
 - Logging: All PII detections and policy decisions are logged for monitoring
 
API Integration​
PII detection is automatically integrated into the routing process. When a request is made to the router, the system:
- Analyzes the input text for PII using the configured classifier
 - Checks PII policies for candidate models
 - Filters out models that don't allow the detected PII types
 - Routes to an appropriate model that can handle the PII
 
Note: The current implementation uses the global PII threshold during automatic routing. To use category-specific thresholds, you can:
- Configure thresholds appropriately for each category in your config
 - Access category-specific thresholds using 
config.GetPIIThresholdForCategory(categoryName)in your code - Call 
classifier.ClassifyPIIWithThreshold(text, threshold)with the category-specific threshold when you have category context 
Classification Endpoint​
You can also check PII detection directly using the classification API:
curl -X POST http://localhost:8080/api/v1/classify \
  -H "Content-Type: application/json" \
  -d '{
    "text": "My email is john.doe@example.com and I live in New York"
  }'
The response includes PII information along with category classification results.
Monitoring and Metrics​
The system exposes PII-related metrics:
# Prometheus metrics
pii_detections_total{type="EMAIL_ADDRESS"} 45
pii_detections_total{type="PERSON"} 23
pii_policy_violations_total{model="secure-model"} 12
pii_requests_blocked_total 8
pii_requests_masked_total 15
Best Practices​
1. Threshold Tuning​
- Start with 
threshold: 0.7for balanced accuracy - Increase to 
0.8-0.9for high-security environments - Decrease to 
0.5-0.6for broader detection - Use category-level thresholds for fine-grained control based on PII type consequences
 
Category-Specific Threshold Guidelines​
Different categories have different PII sensitivity requirements:
Critical Categories (Healthcare, Finance, Legal):
- Threshold: 
0.9-0.95 - Rationale: High precision required; false positives on medical/financial terms are costly
 - Example PII: SSN, Credit Cards, Medical Records
 - Risk if too low: Too many false positives disrupt workflows
 
Customer-Facing Categories (Support, Sales):
- Threshold: 
0.75-0.85 - Rationale: Balance between catching PII and avoiding false positives
 - Example PII: Email, Phone, Names, Addresses
 - Risk if too low: Moderate false positive rate
 
Internal Tools (Code Generation, Development):
- Threshold: 
0.5-0.65 - Rationale: Code/technical content often triggers false positives; lower threshold needed
 - Example PII: Variable names, test data that looks like PII
 - Risk if too high: May still flag harmless code artifacts
 
Public Content (Documentation, Marketing):
- Threshold: 
0.6-0.75 - Rationale: Broader detection before publication; acceptable to review more false positives
 - Example PII: Author names, example emails, placeholder data
 - Risk if too high: May miss PII that could be published
 
2. Policy Design​
- Use 
allow_by_default: falsefor sensitive models - Explicitly list allowed PII types for clarity
 - Consider different policies for different use cases
 - Combine category-level thresholds with model-level policies for defense in depth
 
3. Action Selection​
- Use 
blockfor high-security scenarios - Use 
maskwhen processing is still needed - Use 
allowwith logging for audit requirements 
4. Model Filtering​
- Configure PII policies to automatically filter model candidates
 - Ensure at least one model can handle each PII scenario
 - Test policy combinations thoroughly
 
Troubleshooting​
Common Issues​
High False Positives
- Lower the detection threshold
 - Review training data for edge cases
 - Consider custom model fine-tuning
 
Missed PII Detection
- Increase detection sensitivity
 - Check if PII type is supported
 - Verify model is properly loaded
 
Policy Conflicts
- Ensure at least one model allows detected PII types
 - Check 
allow_by_defaultsettings - Review 
pii_types_allowedlists 
Debug Mode​
Enable detailed PII logging:
logging:
  level: debug
  pii_detection: true
This will log all PII detection decisions and policy evaluations.