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 gliclassClone 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:
importgliclassprint(gliclass.__version__)fromgliclassimportGLiClassModel, ZeroShotClassificationPipelinefromtransformersimportAutoTokenizermodel=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]
forresultinresults:
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]
forresultinresults:
print(f"{result['label']} => {result['score']:.3f}")
# Output:# sentiment.positive => 0.892# topic.product => 0.921# topic.shipping => 0.763Get 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]
forresultinresults:
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:
fromgliclassimportZeroShotClassificationWithChunkingPipelinechunking_pipeline=ZeroShotClassificationWithChunkingPipeline(
model,
tokenizer,
text_chunk_size=8192,
text_chunk_overlap=256,
labels_chunk_size=8
)
long_document="..."# Very long textlabels= ["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]
forpredictinresults:
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.yamlfromgliclass.serveimportGLiClassClientclient=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
fromgliclassimportGLiClassBiEncoder# Load a bi-encoder modelmodel=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
fromgliclassimportGLiClassModelConfigconfig=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]fromgliclass.streamingimportStreamingPipeline, SessionInput, EveryNTokensStrategypipeline=StreamingPipeline(model, tokenizer, device="cuda", max_cache_len=1024)
strategy=EveryNTokensStrategy(n=50)
forchunkintext_chunks:
outputs=pipeline([SessionInput(
session_id="doc_001",
text=chunk,
labels=["science", "politics", "finance"],
strategy=strategy,
classification_type="multi-label",
)])
ifoutputs[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 / mT5Enable 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}, }