GLiClass is an efficient, zero-shot sequence classification model inspired by the GLiNER framework. It achieves comparable performance to traditional cross-encoder models while being significantly more computationally efficient, offering classification results approximately 10 times faster by performing classification in a single forward pass.
π Blog β’ π’ Discord β’ πΊ Demo β’ π€ Available models β’
Install GLiClass easily using pip:
pip install gliclass
Clone and install directly from GitHub:
git clone https://github.com/Knowledgator/GLiClass cd GLiClass python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt pip install .
Verify your installation:
import gliclass print(gliclass.__version__)
from gliclass import GLiClassModel, ZeroShotClassificationPipeline from transformers import AutoTokenizer model = GLiClassModel.from_pretrained("knowledgator/gliclass-small-v1.0") tokenizer = AutoTokenizer.from_pretrained("knowledgator/gliclass-small-v1.0") pipeline = ZeroShotClassificationPipeline( model, tokenizer, classification_type='multi-label', device='cuda:0' ) text = "One day I will see the world!" labels = ["travel", "dreams", "sport", "science", "politics"] results = pipeline(text, labels, threshold=0.5)[0] for result in results: print(f"{result['label']} => {result['score']:.3f}")
GLiClass now supports hierarchical label structures using dot notation:
hierarchical_labels = { "sentiment": ["positive", "negative", "neutral"], "topic": ["product", "service", "shipping"] } text = "The product quality is amazing but delivery was slow" results = pipeline(text, hierarchical_labels, threshold=0.5)[0] for result in results: print(f"{result['label']} => {result['score']:.3f}") # Output: # sentiment.positive => 0.892 # topic.product => 0.921 # topic.shipping => 0.763
Get hierarchical output matching your input structure:
results = pipeline(text, hierarchical_labels, return_hierarchical=True)[0] print(results) # Output: # { # "sentiment": {"positive": 0.892, "negative": 0.051, "neutral": 0.124}, # "topic": {"product": 0.921, "service": 0.153, "shipping": 0.763} # }
Improve classification accuracy with in-context examples using the <<EXAMPLE>> token:
examples = [ { "text": "Love this item, great quality!", "labels": ["positive", "product"] }, { "text": "Customer support was unhelpful", "labels": ["negative", "service"] } ] text = "Fast delivery and the item works perfectly!" labels = ["positive", "negative", "product", "service", "shipping"] results = pipeline(text, labels, examples=examples, threshold=0.5)[0] for result in results: print(f"{result['label']} => {result['score']:.3f}")
Add custom prompts to guide the classification task:
text = "The battery life on this phone is incredible" labels = ["positive", "negative", "neutral"] results = pipeline( text, labels, prompt="Classify the sentiment of this product review:", threshold=0.5 )[0]
Use per-text prompts for batch processing:
texts = ["Review about electronics", "Review about clothing"] prompts = [ "Analyze this electronics review:", "Analyze this clothing review:" ] results = pipeline(texts, labels, prompt=prompts)
Process long documents with automatic text chunking:
from gliclass import ZeroShotClassificationWithChunkingPipeline chunking_pipeline = ZeroShotClassificationWithChunkingPipeline( model, tokenizer, text_chunk_size=8192, text_chunk_overlap=256, labels_chunk_size=8 ) long_document = "..." # Very long text labels = ["category1", "category2", "category3"] results = chunking_pipeline(long_document, labels, threshold=0.5)
With new models trained with retrieval-agumented classification, such as this model you can specify examples to improve classification accuracy:
example = { "text": "A new machine learning platform automates complex data workflows but faces integration issues.", "all_labels": ["AI", "automation", "data_analysis", "usability", "integration"], "true_labels": ["AI", "integration", "automation"] } text = "The new AI-powered tool streamlines data analysis but has limited integration capabilities." labels = ["AI", "automation", "data_analysis", "usability", "integration"] results = pipeline(text, labels, threshold=0.1, rac_examples=[example])[0] for predict in results: print(f"{predict['label']} => {predict['score']:.3f}")
Deploy GLiClass with Ray Serve for production workloads with dynamic batching and memory-aware processing.
pip install gliclass[serve]
# Default model python -m gliclass.serve # Specify model and port python -m gliclass.serve --model knowledgator/gliclass-edge-v3.0 --port 8000 # With config file python -m gliclass.serve --config serve_configs/serve_config.yaml
from gliclass.serve import GLiClassClient client = GLiClassClient(url="http://localhost:8000/gliclass") result = client.classify( text="This is a great product!", labels=["positive", "negative", "neutral"], threshold=0.3, ) print(result) # [{"label": "positive", "score": 0.95}, ...]
The HTTP endpoint processes one text per request.
curl -X POST http://localhost:8000/gliclass \ -H "Content-Type: application/json" \ -d '{ "texts": "This is a great product!", "labels": ["positive", "negative", "neutral"], "threshold": 0.3 }' # Response: [{"label": "positive", "score": 0.95}, ...]
Note: For batch processing multiple texts, use the ZeroShotClassificationPipeline directly instead of the serving API.
See serve_configs/serve_config.yaml for full configuration options.
- Sentiment Analysis: Rapidly classify texts as positive, negative, or neutral.
- Document Classification: Efficiently organize and categorize large document collections.
- Search Results Re-ranking: Improve relevance and precision by reranking search outputs.
- News Categorization: Automatically tag and organize news articles into predefined categories.
- Fact Checking: Quickly validate and categorize statements based on factual accuracy.
Prepare your training data as follows:
[
{"text": "Sample text.", "all_labels": ["sports", "science", "business"], "true_labels": ["sports"]},
...
]Optionally, specify confidence scores explicitly:
[
{"text": "Sample text.", "all_labels": ["sports", "science"], "true_labels": {"sports": 0.9}},
...
]Please, refer to the train.py script to set up your training from scratch or fine-tune existing models.
GLiClass supports multiple architecture types:
- uni-encoder: Single encoder for both text and labels (default, most efficient)
- bi-encoder: Separate encoders for text and labels
- bi-encoder-fused: Bi-encoder with label embeddings fused into text encoding
- encoder-decoder: Encoder-decoder architecture for sequence-to-sequence tasks
from gliclass import GLiClassBiEncoder # Load a bi-encoder model model = GLiClassBiEncoder.from_pretrained("knowledgator/gliclass-biencoder-v1.0")
Configure how token embeddings are pooled:
first: First token (CLS token)avg: Average poolingmax: Max poolinglast: Last tokensum: Sum poolingrms: Root mean square poolingabs_max: Max of absolute valuesabs_avg: Average of absolute values
from gliclass import GLiClassModelConfig config = GLiClassModelConfig( pooling_strategy='avg', class_token_pooling='average' # or 'first' )
Choose different scoring mechanisms for classification:
simple: Dot product (fastest)weighted-dot: Weighted dot product with learned projectionsmlp: Multi-layer perceptron scorerhopfield: Hopfield network-based scorer
config = GLiClassModelConfig( scorer_type='mlp' )
GLiClass supports incremental, multi-session text classification over a decoder-KV model. Instead of re-encoding the full document on every update, it maintains a persistent KV cache per session and runs the scorer only when a pluggable strategy decides classification should fire.
pip install gliclass[streaming]
from gliclass.streaming import StreamingPipeline, SessionInput, EveryNTokensStrategy pipeline = StreamingPipeline(model, tokenizer, device="cuda", max_cache_len=1024) strategy = EveryNTokensStrategy(n=50) for chunk in text_chunks: outputs = pipeline([SessionInput( session_id="doc_001", text=chunk, labels=["science", "politics", "finance"], strategy=strategy, classification_type="multi-label", )]) if outputs[0].triggered: print(outputs[0].predictions)
Built-in strategies: EveryChunkStrategy, EveryNTokensStrategy, OnDelimiterStrategy, SlidingWindowStrategy, ComposedStrategy, NeverStrategy.
For full documentation on session management, KV cache internals, batching, CPU offloading, and custom strategies, see docs/streaming.md.
GLiClass supports optional flash attention backends for faster inference.
pip install flashdeberta # DeBERTa v2 pip install turbot5 # T5 / mT5
Enable via environment variable:
export USE_FLASHDEBERTA=1If flashdeberta is installed, DeBERTa v2 models will use FlashDebertaV2Model.
Otherwise, GLiClass falls back to DebertaV2Model.
Enable via environment variable:
export TURBOT5_ATTN_TYPE=triton-basicIf turbot5 is installed, T5 / mT5 models will use FlashT5EncoderModel.
Otherwise, GLiClass falls back to T5EncoderModel.
Notes:
- Flash backends are optional
- Enabled automatically when available
- No code changes required
Want it even tighter (single block), or is this the sweet spot?
If you find GLiClass useful in your research or project, please cite our papers:
@misc{stepanov2025gliclassgeneralistlightweightmodel, title={GLiClass: Generalist Lightweight Model for Sequence Classification Tasks}, author={Ihor Stepanov and Mykhailo Shtopko and Dmytro Vodianytskyi and Oleksandr Lukashov and Alexander Yavorskyi and Mykyta Yaroshenko}, year={2025}, eprint={2508.07662}, archivePrefix={arXiv}, primaryClass={cs.LG}, url={https://arxiv.org/abs/2508.07662}, }