Context Compression
Intelligent compression of retrieved context to fit token budgets
from praisonaiagents import Agent
agent = Agent(
name="compress-agent",
instructions="Compress conversation history to save context space.",
compress_context=True,
)
agent.start("Summarise older messages to free context window space.")Context Compression
Context compression reduces retrieved content to fit within token budgets while preserving query-relevant information.
The user retrieves large knowledge chunks; compression deduplicates and trims text to fit the token budget.
How It Works
Overview
The ContextCompressor provides:
- Deduplication of similar content
- Query-focused extraction of relevant sentences
- Token-aware truncation to fit budgets
- LLM summarization fallback for aggressive compression
Quick Start
- Compress retrieved chunks
python from praisonaiagents.rag import ContextCompressor compressor = ContextCompressor(max_tokens=4000, target_ratio=0.5) chunks = ["Long document content here...", "Another document..."] result = compressor.compress(chunks, query="API authentication") print(f"Saved {result.original_tokens - result.compressed_tokens} tokens") - Search with compression via CLI
bash praisonai knowledge search "query" --compress --max-context-tokens 2000
Compression Strategies
Deduplication
Removes duplicate or near-duplicate content:
compressor = ContextCompressor(
deduplicate=True,
similarity_threshold=0.9,
)
result = compressor.compress(chunks)Query-Focused Extraction
Extracts sentences most relevant to the query:
compressor = ContextCompressor(
max_tokens=2000,
extraction_method="query_focused",
)
result = compressor.compress(
chunks,
query="How do I authenticate with the API?",
)Truncation
Simple truncation to fit token budget:
compressor = ContextCompressor(
max_tokens=1000,
truncation_strategy="end", # or "start", "middle"
)
result = compressor.compress(chunks)LLM Summarization
Uses LLM for aggressive compression:
compressor = ContextCompressor(
max_tokens=500,
use_llm_summarization=True,
summarization_model="gpt-4o-mini",
)
result = compressor.compress(chunks, query=query)Compression Results
CompressionResult Structure
from dataclasses import dataclass
from typing import List
@dataclass
class CompressionResult:
chunks: List[str]
original_tokens: int
compressed_tokens: int
method_used: str
metadata: dict = NoneWorking with Results
result = compressor.compress(chunks, query=query)
print(f"Method used: {result.method_used}")
print(f"Original: {result.original_tokens} tokens")
print(f"Compressed: {result.compressed_tokens} tokens")
print(f"Ratio: {result.compressed_tokens / result.original_tokens:.2%}")
# Use compressed chunks
for chunk in result.chunks:
print(chunk[:200] + "...")CLI Usage
# Search with compression
praisonai knowledge search "query" --compress
# Specify compression ratio
praisonai knowledge search "query" --compress --compression-ratio 0.3
# Specify max tokens
praisonai knowledge search "query" --compress --max-context-tokens 2000
# Verbose output
praisonai knowledge search "query" --compress --verboseIntegration with Agents
from praisonaiagents import Agent
agent = Agent(
name="CompressedRetriever",
instructions="Answer questions using the knowledge base.",
knowledge={
"sources": ["./docs"],
"retrieval_k": 10,
}
)
response = agent.chat("Summarize the authentication methods")Best Practices
Enable LLM summarisation for long chats
llm_summarize=True preserves decisions and facts better than blunt truncation.
Hook memory before compress
Use on_pre_compress to persist important facts before messages are discarded.
Pair with smart retrieval
Re-fetch compressed-away details via hybrid search instead of keeping everything inline.
Log compression events
Review observability history to confirm compression helps rather than hurts answer quality.
API Reference
ContextCompressor
class ContextCompressor:
def __init__(
self,
max_tokens: int = 4000,
target_ratio: float = 0.5,
deduplicate: bool = True,
similarity_threshold: float = 0.9,
use_llm_summarization: bool = False,
summarization_model: str = "gpt-4o-mini",
):
"""Initialize context compressor."""
def compress(
self,
chunks: List[str],
query: str = None,
) -> CompressionResult:
"""Compress chunks to fit token budget."""
def estimate_tokens(self, text: str) -> int:
"""Estimate token count for text."""CompressionResult
@dataclass
class CompressionResult:
chunks: List[str]
original_tokens: int
compressed_tokens: int
method_used: str
metadata: dict = None