sakasurya's picture
judicialmind/greenleaf-law-embed-tiny: initial release
bff06c9
|
Raw
History Blame Contribute Delete
8.22 kB
---
license: apache-2.0
library_name: sentence-transformers
pipeline_tag: sentence-similarity
tags:
- sentence-transformers
- embeddings
- legal
- retrieval
- feature-extraction
- mteb
- mleb
- legal-tech
- case-law
- contracts
- judicialmind
---
# GreenLeaf Law Embed Tiny
**by [JudicialMind](https://judicialmind.ai)***The AI-Native Legal Intelligence System*
A 596M-parameter dense embedding model purpose-built for legal text retrieval. Scores **78.29% on MLEB-12** and **64.38% on MTEB(Law, v1)** — competitive with models 13x larger.
## Why GreenLeaf?
Most embedding models treat legal text like any other English prose. GreenLeaf doesn't. Every design decision — from bidirectional attention to jurisdiction-aware training data curation — targets the specific challenges of legal retrieval: long documents, precise citations, cross-references, and domain-specific terminology.
Built by [JudicialMind](https://judicialmind.ai) as part of our open research initiative to advance legal AI.
## Highlights
| | |
|---|---|
| **Parameters** | 596M |
| **Embedding Size** | 1024 |
| **Context** | 1024 tokens (supports up to 32,768) |
| **Attention** | Bidirectional — every token sees every other token |
| **Pooling** | Mean |
| **Precision** | bfloat16 (default), int8 and binary quantization built in |
| **License** | Apache 2.0 |
## Performance
### MLEB-12 — Massive Legal Embedding Benchmark
| Dataset | Score |
|---------|-------|
| Legal RAG Bench | 54.16 |
| Bar Exam QA | 68.38 |
| SCALR | 73.04 |
| ECHR Retrieval | 41.27 |
| Singaporean Judicial Keywords | 86.63 |
| GDPR Holdings Retrieval | 93.43 |
| UK Legislative Long Titles | 95.88 |
| Australian Tax Guidance | 78.66 |
| Irish Legislative Summaries | 91.92 |
| Contractual Clause Retrieval | 91.29 |
| License TL;DR Retrieval | 72.54 |
| Consumer Contracts QA | 92.29 |
| **Overall** | **78.29** |
### MTEB(Law, v1)
| Task | Score |
|------|-------|
| AILACasedocs | 40.73 |
| AILAStatutes | 58.68 |
| GerDaLIRSmall | 38.51 |
| LeCaRDv2 | 69.52 |
| LegalBenchConsumerContractsQA | 85.86 |
| LegalBenchCorporateLobbying | 94.94 |
| LegalQuAD | 58.62 |
| LegalSummarization | 68.22 |
| **Overall** | **64.38** |
### How It Compares
| Rank | Model | MLEB | Size |
|------|-------|------|------|
| 1 | Kanon 2 Embedder | 81.9% | — |
| 2 | Voyage 4 Large | 81.1% | 7B+ |
| 3 | Voyage 4 | 79.6% | — |
| **4** | **GreenLeaf Law Embed Tiny** | **78.3%** | **0.6B** |
| 5 | Voyage 4 Lite | 76.4% | — |
| 6 | Qwen3 Embedding 8B | 75.9% | 8B |
| 7 | Gemini Embedding 001 | 72.1% | — |
| 8 | Jina v5 Text Small | 71.0% | — |
| 9 | OpenAI Text Embedding 3 Large | 70.8% | — |
Best accuracy-per-parameter on the leaderboard. Runs on a laptop.
### Matryoshka Dimension Truncation
GreenLeaf embeddings are trained with Matryoshka Representation Learning — truncate to any dimension without retraining. Halving to 512d costs only **1.34%** accuracy; 128d retains **91.6%** of full performance.
| Dataset | 1024d | 512d | 256d | 128d |
|---------|-------|------|------|------|
| ECHR Retrieval | 40.77 | 41.35 | 38.18 | 33.58 |
| Legal RAG Bench | 54.38 | 49.93 | 39.98 | 34.71 |
| SCALR | 72.77 | 70.22 | 72.50 | 68.23 |
| Consumer Contracts QA | 92.14 | 92.27 | 91.13 | 88.66 |
| Singaporean Judicial Keywords | 86.07 | 84.30 | 82.63 | 79.52 |
| Australian Tax Guidance | 78.69 | 77.93 | 76.22 | 73.61 |
| Contractual Clause Retrieval | 91.20 | 90.05 | 87.71 | 83.31 |
| Irish Legislative Summaries | 91.29 | 90.22 | 89.51 | 86.90 |
| GDPR Holdings Retrieval | 93.53 | 93.11 | 92.32 | 89.96 |
| License TL;DR Retrieval | 73.91 | 72.83 | 70.44 | 71.32 |
| UK Legislative Long Titles | 95.88 | 95.62 | 96.99 | 96.73 |
| Bar Exam QA | 68.30 | 65.03 | 58.79 | 53.62 |
| **MLEB-12 Mean** | **78.24** | **76.90** | **74.70** | **71.68** |
| **Drop vs 1024d** | — | **-1.34%** | **-3.54%** | **-6.56%** |
```python
# Truncate at inference — no retraining needed
emb_512 = model.encode(texts)[:, :512]
emb_256 = model.encode(texts)[:, :256]
```
## Quick Start
### SentenceTransformers
```python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
"judicialmind/greenleaf-law-embed-tiny",
trust_remote_code=True,
)
texts = [
"The plaintiff filed a motion for summary judgment.",
"Contract terms must be interpreted in good faith.",
]
# Default: raw float embeddings (bfloat16)
embeddings = model.encode(texts) # Shape: (2, 1024)
# Optional: quantize for storage / speed
emb_int8 = model.encode(texts, quantization="int8")
emb_binary = model.encode(texts, quantization="binary")
```
### Text Embeddings Inference (TEI)
```bash
docker run --gpus all --shm-size 1g -p 8080:80 \
ghcr.io/huggingface/text-embeddings-inference:cuda-1.9 \
--model-id judicialmind/greenleaf-law-embed-tiny --dtype float32
```
```bash
curl http://0.0.0.0:8080/embed \
-H "Content-Type: application/json" \
-d '{"inputs": ["Legal text here"], "normalize": false}'
```
### ONNX
```python
import onnxruntime as ort
from transformers import AutoTokenizer
import numpy as np
tokenizer = AutoTokenizer.from_pretrained(
"judicialmind/greenleaf-law-embed-tiny", trust_remote_code=True
)
session = ort.InferenceSession("onnx/model.onnx")
texts = ["Legal document text here"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="np")
outputs = session.run(
[o.name for o in session.get_outputs()],
{"input_ids": inputs["input_ids"].astype(np.int64),
"attention_mask": inputs["attention_mask"].astype(np.int64)},
)
```
## Architecture
GreenLeaf uses a bidirectional transformer encoder derived from the Qwen3 architecture. The key modification: causal masking is removed across all 28 layers, so every token attends to the full input sequence in both directions.
This matters for legal text. A holding on page 12 can change the meaning of a defined term on page 1. A causal model can't see that. GreenLeaf can.
| Property | Value |
|----------|-------|
| Base architecture | Qwen3 |
| Hidden layers | 28 |
| Hidden size | 1024 |
| Attention heads | 16 (8 KV heads) |
| Intermediate size | 3072 |
| Vocabulary | 151,936 |
| Max position embeddings | 32,768 |
| Sliding window | None (full-context) |
| KV cache | Disabled |
| Tie embeddings | Yes |
### Quantization
Three output modes, selectable at inference:
| Mode | Output | Storage | Use case |
|------|--------|---------|----------|
| `None` (default) | float32 per dim | 4 KB/doc | Maximum accuracy |
| `"int8"` | int8 per dim | 1 KB/doc | 4x compression, minimal loss |
| `"binary"` | ±1 per dim | 128 B/doc | 32x compression, fast Hamming search |
| `"ubinary"` | packed bits | 128 B/doc | Same as binary, pre-packed |
## Training
Trained on a large-scale proprietary legal corpus spanning multiple jurisdictions (US, UK, EU, AU, SG, IE) and document types (case law, contracts, legislation, regulatory filings, tax guidance). Contrastive learning with hard negative mining.
## About JudicialMind
[JudicialMind](https://judicialmind.ai) builds an orchestrated system of specialized AI agents that work like a legal team — every agent with a domain expertise, composed into directed workflows that run end-to-end legal operations: intake, research, drafting, negotiation, dispute resolution.
We serve AmLaw firms, in-house legal teams, solo & boutique practices, and courts/ADR bodies.
**Open artifacts:**
- 📦 [judicialmind/legal-training-dataset](https://huggingface.co/datasets/judicialmind/legal-training-dataset) — 3.69M annotated query-passage pairs across 35 languages
- 🤖 More models coming soon — retrieval, reranking, and legal-reasoning models trained on our corpus
**Connect:**
- 🌐 [judicialmind.ai](https://judicialmind.ai)
- 📧 surya@judicialmind.ai
- 🧑‍⚖️ [Early access](https://judicialmind.ai/waitlist)
## Limitations
- 1024-token default context. Longer documents should be chunked (32k context available with `--max-length` override).
- Specialist model. For general-purpose embedding, a general-domain model will perform better on non-legal text.
## License
Apache 2.0. Free for commercial and research use.