Overview
Contextual Compression reduces document size while preserving relevance:
- Extractive summarization
- Context-aware sentence selection
- Relevance scoring and filtering
- Dynamic compression based on query context
Implementation Example
from transformers import pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
class ContextualCompressor:
def __init__(self):
self.summarizer = pipeline("summarization")
self.vectorizer = TfidfVectorizer()
def compress(self, document, query, max_length=512):
# Split document into sentences
sentences = document.split('. ')
# Calculate relevance scores
tfidf_matrix = self.vectorizer.fit_transform(sentences + [query])
query_vec = tfidf_matrix[-1]
doc_matrix = tfidf_matrix[:-1]
scores = (query_vec * doc_matrix.T).toarray()[0]
# Select top sentences
top_indices = np.argsort(scores)[-5:][::-1]
selected = [sentences[i] for i in top_indices]
compressed = '. '.join(selected)
# Further summarize if needed
if len(compressed) > max_length:
compressed = self.summarizer(
compressed,
max_length=max_length,
min_length=30,
do_sample=False
)[0]['summary_text']
return compressed
# Usage
compressor = ContextualCompressor()
document = "..." # Your document text
compressed = compressor.compress(document, "RAG architecture")
When to Use
- When dealing with long documents
- For reducing computational overhead
- When only specific parts of documents are relevant
- For improving response generation quality