| --- |
| license: apache-2.0 |
| language: |
| - de |
| - en |
| metrics: |
| - f1 |
| - accuracy |
| base_model: |
| - jhu-clsp/mmBERT-small |
| pipeline_tag: text-classification |
| tags: |
| - document-classification |
| - topic-classification |
| - security |
| - dlp |
| - patronus |
| - multilingual |
| - modernbert |
| - text-classification |
| - safetensors |
| - german |
| - english |
| - llm-guard |
| - protect-ai |
|
|
| --- |
| |
| # Model Card for Orca-Sonar |
|
|
| **Multilingual Document Topic Classifier for Real-World AI Security & DLP** |
|
|
| Orca-Sonar is a Multilingual ModernBERT-based ([mmBERT](https://huggingface.co/blog/mmbert)) classifier that |
| assigns a document/text to one of **7 topic classes**. It is part of the Patronus Protect security stack and |
| is designed for topic-/risk-routing of incoming texts (e.g. before they reach an LLM, a DLP gate, or a storage tier). |
|
|
| It classifies German and English text and is robust to **user-to-AI wrappers** (e.g. *"Summarize this contract: …"*), |
| i.e. the *topic* of the content determines the class, not the surface format of the request. |
|
|
| ## Intended Uses |
|
|
| The model maps an input text to one of: |
|
|
| | id | label | description | |
| |---|---|---| |
| | 0 | `finance` | invoices, balance sheets, quarterly/annual reports, cash-flow, SEC filings, forecasts | |
| | 1 | `hr` | CVs, job ads, employment contracts, terminations, HR policies, performance reviews, recruiting | |
| | 2 | `internal_and_tech` | ADRs, RFCs, postmortems, specs, READMEs, wikis, architecture & strategy memos, runbooks | |
| | 3 | `legal` | contracts, NDAs, ToS/AGB, privacy policies, statutes/judgments, compliance, legal correspondence | |
| | 4 | `marketing` | press releases, newsletters, landing-page/sales copy, outbound pitches, case studies | |
| | 5 | `other` | conversational / non-business: smalltalk, recipes, travel, hobby, learning, creative | |
| | 6 | `source_code` | raw program code & configs (Python/Go/Rust/JS/TS/SQL/Bash/Dockerfile/k8s/Terraform …) | |
|
|
| **Disambiguation:** on a tie, the more sensitive class wins — |
| `legal > hr > finance > internal_and_tech > source_code > marketing > other`. |
|
|
| ## Limitations |
|
|
| - Highly accurate on German and English; other languages were not actively tested. |
| - The model can produce false positives; for high-stakes routing combine it with a confidence/abstention gate. |
| - Robustness against adversarial / out-of-distribution / pure-PII / pathological-length inputs is partial; pair the |
| model with a deterministic pre-gate (length + PII) for production DLP use. |
|
|
| ## Model Variants |
|
|
| - **orca-sonar** – full model (`model.safetensors`, fp32). |
| - **orca-sonar-fp16 (ONNX)** – FP16 ONNX export under `onnx/onnx_fp16/` — half the size, argmax-faithful to the full model. |
|
|
| # Training Data |
|
|
| Trained on our own in-house dataset (German + English, 7 topic classes), purpose-built for this model. |
| **The dataset will be published soon.** |
|
|
| # Benchmark |
|
|
| Held-out test set (**100 % real data**), per-class F1: |
|
|
| | Metric | Score | |
| |---|---| |
| | **Accuracy** | **0.978** | |
| | **F1 (macro)** | **0.978** | |
| | F1 legal | 0.995 | |
| | F1 source_code | 0.985 | |
| | F1 marketing | 0.980 | |
| | F1 internal_and_tech | 0.977 | |
| | F1 hr | 0.971 | |
| | F1 finance | 0.970 | |
| | F1 other | 0.970 | |
| |
| # Usage |
| |
| ```python |
| from transformers import pipeline |
| |
| clf = pipeline("text-classification", model="patronus-studio/orca-sonar-document-classifier") |
| clf("Fasse mir diesen Dienstleistungsvertrag zusammen: Laufzeit 24 Monate, Gerichtsstand München …") |
| # -> [{'label': 'legal', 'score': 0.99}] |
| ``` |
| |
| ## ONNX |
| |
| An FP16 ONNX version is available under `onnx/onnx_fp16/`: |
|
|
| ```python |
| import torch |
| from optimum.onnxruntime import ORTModelForSequenceClassification |
| from transformers import AutoTokenizer |
| |
| model_id = "patronus-studio/orca-sonar-document-classifier" |
| tokenizer = AutoTokenizer.from_pretrained(model_id) |
| model = ORTModelForSequenceClassification.from_pretrained(model_id, subfolder="onnx/onnx_fp16") |
| |
| inputs = tokenizer("def add(a, b):\n return a + b", return_tensors="pt") |
| logits = model(**inputs).logits |
| print(model.config.id2label[int(torch.argmax(logits, dim=-1))]) |
| ``` |
|
|
| ## Citation |
|
|
| ```bibtex |
| @misc{orcasonar2026, |
| title={Orca-Sonar: Multilingual Document Topic Classification for Real-World AI Security}, |
| author={Patronus Protect}, |
| year={2026}, |
| howpublished={\url{https://huggingface.co/patronus-studio/orca-sonar-document-classifier}} |
| } |
| ``` |
|
|