# Context
> **Context engineering and memory management system for intelligent agents using RAG and Knowledge Graphs.**
---
## 🎯 Overview
- :material-graph:{ .lg .middle } **Context Graph**
---
Build dynamic context graphs from conversations and entities
- :material-brain:{ .lg .middle } **Agent Memory**
---
Persistent memory management with vector storage integration
- :material-link-variant:{ .lg .middle } **Entity Linking**
---
Link entities across documents and conversations
- :material-magnify:{ .lg .middle } **Hybrid Retrieval**
---
Retrieve context using Vector + Graph + Keyword search
- :material-history:{ .lg .middle } **Conversation History**
---
Manage and synthesize conversation history
- :material-bullseye-arrow:{ .lg .middle } **Intent Analysis**
---
Extract and track user intent and sentiment
!!! tip "When to Use"
- **Agent Development**: When building agents that need long-term memory
- **RAG Applications**: For advanced Retrieval-Augmented Generation
- **Personalization**: To maintain user-specific context and preferences
---
## ⚙️ Algorithms Used
### Context Graph Construction
- **Graph Building**: Node/Edge construction from extracted entities
- **Graph Traversal**: BFS/DFS for multi-hop context discovery
- **Intent Extraction**: NLP-based intent classification
- **Sentiment Analysis**: Sentiment scoring and extraction
### Agent Memory
- **Vector Embedding**: Dense vector generation for memory items
- **Vector Search**: Cosine similarity search (k-NN)
- **Retention Policy**: Time-based decay and cleanup
- **Memory Indexing**: Deque-based sliding window for short-term memory
### Entity Linking
- **URI Generation**: Hash-based deterministic IDs
- **Text Similarity**: Jaccard/Levenshtein for name matching
- **Graph Lookup**: Entity resolution against Knowledge Graph
- **Bidirectional Linking**: Symmetric link creation
### Context Retrieval
- **Hybrid Scoring**: `α * VectorScore + β * GraphScore + γ * KeywordScore`
- **Graph Expansion**: Retrieving neighbors of retrieved entities
- **Deduplication**: Content-based result merging
- **Result Ranking**: Weighted aggregation of scores
---
## Main Classes
### AgentContext
High-level interface for agent context management, RAG, and GraphRAG. Provides generic methods (`store`, `retrieve`, `forget`, `conversation`) that auto-detect content types and retrieval strategies.
**Methods:**
| Method | Description | Parameters |
|--------|-------------|------------|
| `store(content, ...)` | Store content (memory or documents) | `extract_entities: bool = True`, `extract_relationships: bool = True`, `link_entities: bool = True`, `auto_extract: bool = False` |
| `retrieve(query, ...)` | Retrieve relevant context | `use_graph: Optional[bool] = None`, `include_entities: bool = True`, `include_relationships: bool = False`, `expand_graph: bool = True`, `deduplicate: bool = True` |
| `forget(...)` | Delete memories | `memory_id`, `conversation_id`, `user_id`, `days_old` |
| `conversation(conversation_id, ...)` | Get conversation history | `reverse: bool = False`, `include_metadata: bool = True` |
| `get_memory(memory_id)` | Get specific memory by ID | `memory_id: str` |
| `stats()` | Get memory statistics | None |
| `link(text, entities, ...)` | Link entities in text | `similarity_threshold: float = 0.8` |
| `build_graph(...)` | Build context graph manually | `entities`, `relationships`, `conversations`, `link_entities: bool = True` |
**Initialization:**
```python
AgentContext(
vector_store, # Required
knowledge_graph=None, # Optional (enables GraphRAG)
retention_days=30, # Optional
max_memories=10000, # Optional
use_graph_expansion=True, # Boolean flag
max_expansion_hops=2, # Optional
hybrid_alpha=0.5 # Optional
)
```
**Example:**
```python
from semantica.context import AgentContext
# Simple RAG
context = AgentContext(vector_store=vs)
memory_id = context.store("User likes Python", conversation_id="conv1")
results = context.retrieve("Python programming")
# GraphRAG
context = AgentContext(vector_store=vs, knowledge_graph=kg)
stats = context.store(["Doc 1", "Doc 2"], extract_entities=True)
results = context.retrieve("Python", use_graph=None) # Auto-detects GraphRAG
# Conversation management
history = context.conversation("conv1", reverse=True)
deleted = context.forget(conversation_id="conv1")
```
**Boolean Flags:**
- **Store**: `extract_entities`, `extract_relationships`, `link_entities`
- **Retrieve**: `use_graph` (None=auto-detect), `include_entities`, `include_relationships`, `expand_graph`
- **Conversation**: `reverse`, `include_metadata`
### ContextGraphBuilder
Builds and manages the context graph.
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `build_from_entities_and_relationships(entities, relationships)` | Build graph from entities and relationships | Node/Edge creation |
| `build_from_conversations(conversations, link_entities, extract_intents, extract_sentiments)` | Build graph from conversations | Intent/Entity extraction |
| `add_node(node_id, node_type, content, **metadata)` | Add node to graph | Node creation |
| `add_edge(source_id, target_id, edge_type, weight, **metadata)` | Add edge to graph | Edge creation |
| `get_neighbors(node_id, max_hops)` | Get neighbor nodes | BFS Traversal |
| `query(node_type, edge_type, **filters)` | Query graph nodes and edges | Type-based filtering |
**Example:**
```python
from semantica.context import ContextGraphBuilder
builder = ContextGraphBuilder()
graph = builder.build_from_entities_and_relationships(
entities=extracted_entities,
relationships=extracted_rels
)
# Add nodes and edges manually
builder.add_node("node1", "entity", "Python programming")
builder.add_edge("node1", "node2", "related_to", weight=0.9)
# Query and traverse
neighbors = builder.get_neighbors("node1", max_hops=2)
results = builder.query(node_type="entity", confidence=0.8)
```
### AgentMemory
Manages persistent agent memory.
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `store(content, metadata, entities, relationships, **options)` | Store memory item | Embedding + Vector Store |
| `retrieve(query, max_results, min_score, **filters)` | Retrieve relevant memories | Vector Similarity |
| `get_memory(memory_id)` | Get specific memory item | Dictionary lookup |
| `delete_memory(memory_id)` | Delete memory item | Cascading deletion |
| `clear_memory(**filters)` | Clear memories by filters | Filter-based deletion |
| `get_conversation_history(conversation_id, max_items)` | Get conversation history | Temporal filtering |
| `get_statistics()` | Get memory statistics | Counter aggregation |
**Example:**
```python
from semantica.context import AgentMemory
memory = AgentMemory(vector_store=vs, knowledge_graph=kg)
memory_id = memory.store("User prefers Python over Java", metadata={"type": "preference"})
relevant = memory.retrieve("What language does the user like?", max_results=5)
# Get specific memory
memory_item = memory.get_memory(memory_id)
# Get statistics
stats = memory.get_statistics()
```
### EntityLinker
Links entities across different contexts.
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `assign_uri(entity_id, entity_text, entity_type)` | Assign unique URI to entity | Hash-based/Text-based URI |
| `link(text, entities, context)` | Link entities in text to knowledge graph | Similarity matching |
| `link_entities(entity1_id, entity2_id, link_type, confidence, source, **metadata)` | Create explicit link between entities | Bidirectional linking |
| `get_entity_links(entity_id)` | Get all links for an entity | Dictionary lookup |
| `get_entity_uri(entity_id)` | Get URI for an entity | Registry lookup |
| `find_similar_entities(entity_text, entity_type, threshold)` | Find similar entities in knowledge graph | Text similarity |
| `build_entity_web()` | Build entity connection web | Graph construction |
**Example:**
```python
from semantica.context import EntityLinker
linker = EntityLinker(knowledge_graph=kg, similarity_threshold=0.8)
uri = linker.assign_uri("entity_1", "Python", "PROGRAMMING_LANGUAGE")
linked_entities = linker.link("Python is used for ML", entities=entities)
linker.link_entities("e1", "e2", "related_to", confidence=0.9)
similar = linker.find_similar_entities("Python", entity_type="PROGRAMMING_LANGUAGE")
web = linker.build_entity_web()
```
### ContextRetriever
Orchestrates hybrid retrieval.
**Methods:**
| Method | Description | Algorithm |
|--------|-------------|-----------|
| `retrieve(query, max_results, use_graph_expansion, min_relevance_score, **options)` | Retrieve relevant context for query | Hybrid (Vector+Graph+Memory) |
**Example:**
```python
from semantica.context import ContextRetriever
retriever = ContextRetriever(
memory_store=memory,
knowledge_graph=kg,
vector_store=vs,
use_graph_expansion=True,
max_expansion_hops=2
)
results = retriever.retrieve("Python programming", max_results=5, min_relevance_score=0.5)
for result in results:
print(f"{result.content}: {result.score:.2f}")
print(f"Related entities: {len(result.related_entities)}")
```
---
## Methods Module
The methods module provides simple, reusable functions for context operations.
**Functions:**
| Function | Description |
|----------|-------------|
| `build_context_graph(entities, relationships, conversations, method, **kwargs)` | Build context graph using specified method |
| `store_memory(content, vector_store, knowledge_graph, method, **kwargs)` | Store memory using specified method |
| `retrieve_context(query, memory_store, knowledge_graph, vector_store, method, max_results, **kwargs)` | Retrieve context using specified method |
| `link_entities(entities, knowledge_graph, method, **kwargs)` | Link entities using specified method |
| `get_context_method(task, name)` | Get registered context method |
| `list_available_methods(task)` | List all available context methods |
**Example:**
```python
from semantica.context.methods import (
build_context_graph,
store_memory,
retrieve_context,
link_entities,
get_context_method,
list_available_methods
)
# Build graph
graph = build_context_graph(entities, relationships, method="entities_relationships")
# Store memory
memory_id = store_memory("User asked about Python", vector_store=vs, method="store")
# Retrieve context
results = retrieve_context("Python programming", vector_store=vs, method="hybrid")
# Link entities
linked = link_entities(entities, knowledge_graph=kg, method="similarity")
# List available methods
all_methods = list_available_methods()
graph_methods = list_available_methods("graph")
```
## Registry Module
The registry module allows registering custom context methods.
**MethodRegistry Methods:**
| Method | Description |
|--------|-------------|
| `register(task, name, method_func)` | Register a method for a specific task |
| `get(task, name)` | Get a registered method |
| `list_all(task)` | List all registered methods |
| `unregister(task, name)` | Unregister a method |
**Example:**
```python
from semantica.context import registry
def custom_graph_builder(entities, relationships, **kwargs):
"""Custom graph building method."""
return {"nodes": [], "edges": [], "statistics": {}}
# Register custom method
registry.method_registry.register("graph", "custom_builder", custom_graph_builder)
# List registered methods
methods = registry.method_registry.list_all("graph")
# Unregister method
registry.method_registry.unregister("graph", "custom_builder")
```
## Configuration Module
The configuration module provides centralized configuration management.
**ContextConfig Methods:**
| Method | Description |
|--------|-------------|
| `set(key, value)` | Set a configuration value |
| `get(key, default)` | Get a configuration value |
| `set_method_config(method_name, config)` | Set method-specific configuration |
| `get_method_config(method_name)` | Get method-specific configuration |
| `get_all()` | Get all configurations |
**Example:**
```python
from semantica.context import config
# Get configuration
retention = config.context_config.get("retention_policy", default="unlimited")
max_size = config.context_config.get("max_memory_size", default=10000)
# Set configuration
config.context_config.set("retention_policy", "30_days")
config.context_config.set("max_memory_size", 5000)
# Method-specific configuration
config.context_config.set_method_config("graph", {
"extract_entities": True,
"extract_relationships": True
})
method_config = config.context_config.get_method_config("graph")
# Load from config file
context_config = config.ContextConfig(config_file="context_config.yaml")
all_configs = context_config.get_all()
```
---
## Configuration
### Environment Variables
```bash
export CONTEXT_RETENTION_POLICY=30_days
export CONTEXT_MAX_MEMORY_SIZE=5000
export CONTEXT_SIMILARITY_THRESHOLD=0.8
```
### YAML Configuration
```yaml
context:
retention_policy:
max_days: 30
max_items: 1000
retrieval:
hybrid_weights:
vector: 0.6
graph: 0.3
keyword: 0.1
graph:
max_depth: 2
include_attributes: true
```
---
## Integration Examples
### Chatbot with Memory
```python
from semantica.context import AgentMemory, ContextRetriever
from semantica.llm import LLMClient
# 1. Initialize
memory = AgentMemory(vector_store=vs)
retriever = ContextRetriever(memory=memory, graph=kg)
llm = LLMClient()
def chat(user_input):
# 2. Retrieve Context
context = retriever.retrieve(user_input)
# 3. Generate Response
response = llm.generate(user_input, context=context)
# 4. Update Memory
memory.store(f"User: {user_input}")
memory.store(f"Agent: {response}")
return response
```
---
## Best Practices
1. **Prune Regularly**: Use retention policies to keep memory relevant and performant.
2. **Use Hybrid Retrieval**: Relying solely on vector search misses structural relationships; use graph context too.
3. **Enrich Metadata**: Store rich metadata (timestamp, source, type) with memories for better filtering.
4. **Link Entities**: Ensure `EntityLinker` is used to connect mentions of the same entity across conversations.
---
## Troubleshooting
**Issue**: Retrieval returns irrelevant old memories.
**Solution**: Adjust retention policy or increase vector similarity threshold.
```python
memory = AgentMemory(
retention_policy="7_days",
max_memory_size=1000
)
```
**Issue**: Context graph growing too large.
**Solution**: Use `prune_graph` or limit hop depth during retrieval.
---
## See Also
- [Vector Store Module](vector_store.md) - Underlying storage for memory
- [Knowledge Graph Module](kg.md) - Underlying graph structure
- [Embeddings Module](embeddings.md) - Vector generation