How to Use Semantica as Persistent Memory for AI Agents: Implementation Guide

Semantica implements a hierarchical memory model through the AgentMemory class, which orchestrates short-term context buffers with configurable vector stores (pgvector, FAISS, Qdrant) to create persistent, retrievable knowledge bases that survive agent restarts.

Semantica is an open-source framework that equips AI agents with long-term memory capabilities through a sophisticated dual-layer storage architecture. The semantica-agi/semantica repository provides the AgentMemory manager, which automatically handles buffering recent context in memory while persisting long-term knowledge in vector databases. This approach enables developers to build agents that maintain continuity across sessions, retrieve semantically relevant historical data, and scale from prototype to production without changing core memory logic.

Understanding Semantica's Hierarchical Memory Architecture

The AgentMemory class in semantica/context/agent_memory.py serves as the central orchestrator for agent persistence. It implements a three-tier retrieval strategy that balances speed, relevance, and durability.

Short-Term Buffer for Immediate Context

At the top of the hierarchy sits a Python list that functions as a short-term buffer, retaining the 10 most recent memory items by default. This design ensures ultra-low latency for the most current context without requiring a vector search round-trip. When you call store(), the system immediately appends the new MemoryItem to this buffer (lines 34-37 of agent_memory.py), making it instantly available for retrieval.

Long-Term Vector Storage Backends

For durable knowledge retention, Semantica abstracts storage through the VectorStore interface defined in semantica/vector_store/vector_store.py (lines 12-22). The framework supports multiple production-grade backends:

  • FAISS, Qdrant, Weaviate, Milvus, Pinecone for dedicated vector databases
  • pgvector for PostgreSQL-based persistence
  • SQLite for lightweight file-based storage
  • In-memory stores for development and testing

Each backend implements standardized methods for search_vectors, filtering, and provenance tracking, allowing you to swap storage mechanisms without modifying agent logic.

The Retrieval Pipeline

When an agent queries its memory via retrieve(query), Semantica executes a prioritized search sequence (lines 49-87 of agent_memory.py):

  1. Short-term scan: Checks the recent buffer for exact or near-exact matches
  2. Vector similarity search: Falls back to the configured VectorStore for semantic retrieval using embeddings
  3. Keyword fallback: Performs text-based search if vector results are insufficient

Results are ranked by relevance score and returned according to the max_results parameter, blending recency with semantic similarity.

Configuring Persistent Storage Backends

Semantica's VectorStore dispatcher accepts a backend parameter that determines where embeddings persist. You can initialize storage that survives process restarts using either file-based checkpoints or database connections.

In-Memory Development Setup

For prototyping without external dependencies, use the built-in in-memory store. While this stores vectors in RAM, you can still achieve persistence through Semantica's JSON checkpointing API.

from semantica.context.agent_memory import AgentMemory
from semantica.vector_store.vector_store import VectorStore

# Initialize in-memory vector store with 384-dimension embeddings

vector_store = VectorStore(backend="inmemory", dimension=384)

# Create memory manager with 5-item short-term buffer

memory = AgentMemory(vector_store=vector_store, short_term_limit=5)

# Store facts with metadata

memory.store(
    content="The capital of France is Paris.",
    metadata={"type": "fact", "category": "geography"},
)
memory.store(
    content="Paris has a population of 2.1 million.",
    metadata={"type": "fact"},
)

# Semantic retrieval

results = memory.retrieve("What is the capital of France?")
print(results[0]["content"])  # Returns Paris fact

# Persist to disk as JSON checkpoint

memory.save("./agent_checkpoint")

# Later session: restore full memory state

memory.load("./agent_checkpoint")

The save() method serializes the short-term buffer, vector index, and metadata to JSON (lines 47-64 of agent_memory.py), while load() reconstructs the exact memory state including provenance information.

Production PostgreSQL Persistence

For production deployments requiring durable, scalable storage, configure the pgvector backend in semantica/vector_store/pgvector_store.py. This implementation (lines 80-95) stores embeddings in PostgreSQL tables with vector indexing.

from semantica.context.agent_memory import AgentMemory
from semantica.vector_store.vector_store import VectorStore

# Configure PostgreSQL connection

config = {
    "connection_string": "postgresql://user:pass@localhost/semantica",
    "table_name": "agent_memories",
    "dimension": 384,
    "distance_metric": "cosine",
}

# Initialize persistent vector store

vector_store = VectorStore(backend="pgvector", config=config)

# Create memory manager

memory = AgentMemory(vector_store=vector_store, short_term_limit=10)

# Store survives process restarts automatically

memory.store(
    content="GPT-4 architecture details...",
    metadata={"type": "model_info", "source": "documentation"},
)

# Retrieve across sessions

results = memory.retrieve("GPT-4 architecture")

Note that the pgvector implementation validates dependencies (psycopg and pgvector Python client) on initialization (lines 19-30 of pgvector_store.py), raising a ProcessingError with installation instructions if requirements are missing.

Implementing the Complete Memory Workflow

To integrate Semantica as your agent's persistent memory, follow this operational pattern:

  1. Initialize the AgentMemory with your chosen VectorStore backend during agent startup
  2. Store observations using memory.store(content, metadata) after each interaction or tool use
  3. Retrieve relevant context via memory.retrieve(query, max_results=5) before prompting your LLM
  4. Persist state periodically using memory.save() or rely on database backend durability
  5. Restore from checkpoints on agent restart using memory.load() (for file-based stores) or automatic reconnection (for database stores)

This workflow ensures that agent knowledge accumulates over time rather than resetting between conversations.

Integrating with LangChain Agents

Semantica provides a compatibility layer in semantica/integrations/langchain/vectorstore.py that exposes its hierarchical memory to LangChain agents. The SemanticaVectorStore class wraps the native storage backend to comply with LangChain's BaseRetriever interface.

from semantica.integrations.langchain.vectorstore import SemanticaVectorStore
from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory

# Wrap Semantica for LangChain compatibility

semantica_store = SemanticaVectorStore(backend="inmemory", dimension=384)

# Create LangChain memory object

memory = VectorStoreRetrieverMemory(vectorstore=semantica_store)

# Initialize agent with persistent memory

llm = OpenAI()
agent = initialize_agent(
    tools=[],  # Add your tools here

    llm=llm,
    agent="zero-shot-react-description",
    memory=memory,
)

# Agent automatically stores/retrieves via Semantica

agent.run("What is the capital of France?")

This integration maintains Semantica's hierarchical retrieval semantics (short-term buffer priority, then vector search) while conforming to LangChain's expected interfaces.

Summary

  • AgentMemory in semantica/context/agent_memory.py provides the central API for store(), retrieve(), save(), and load() operations
  • Dual-layer architecture combines a Python list short-term buffer (default 10 items) with pluggable vector backends for long-term storage
  • VectorStore abstraction supports FAISS, Qdrant, Weaviate, Milvus, Pinecone, pgvector, SQLite, and in-memory backends via semantica/vector_store/vector_store.py
  • Retrieval pipeline prioritizes recent buffer contents, then semantic vector search, then keyword fallback (lines 49-87)
  • Persistence mechanisms include JSON checkpointing for file-based workflows or automatic database persistence for production backends like pgvector
  • LangChain integration available through semantica/integrations/langchain/vectorstore.py for ecosystem compatibility

Frequently Asked Questions

How does Semantica handle memory retention across agent restarts?

Semantica offers two persistence strategies depending on your backend choice. For development, use AgentMemory.save(path) to write a JSON checkpoint containing the short-term buffer, vector index, and metadata to disk, then restore with AgentMemory.load(path) (lines 47-64 of agent_memory.py). For production, configure a database backend like pgvector, where vectors persist automatically in PostgreSQL tables and survive process restarts without manual checkpointing.

What is the difference between short-term and long-term memory in Semantica?

The short-term buffer is a Python list caching the 10 most recent MemoryItem objects for instantaneous retrieval without embedding overhead. Long-term storage persists vector embeddings in your chosen backend (FAISS, pgvector, etc.), enabling semantic similarity search across the entire agent history. The retrieve() method queries the short-term buffer first, then falls back to vector search if results are insufficient.

Can I use Semantica with existing LangChain or LlamaIndex agents?

Yes. The semantica/integrations/langchain/vectorstore.py module provides a SemanticaVectorStore wrapper that implements LangChain's BaseRetriever interface. This allows you to pass Semantica's hierarchical memory system directly into LangChain's VectorStoreRetrieverMemory or agent initializers without modifying existing agent code, while preserving Semantica's optimized retrieval pipeline.

Which vector database backend should I choose for production?

Select pgvector if you require ACID compliance, existing PostgreSQL infrastructure, or relational metadata queries. Choose FAISS for high-performance local file-based storage, or Qdrant/Weaviate/Pinecone for distributed cloud deployments. All backends implement the same VectorStore interface defined in semantica/vector_store/vector_store.py, making migration as simple as changing the backend parameter and connection config.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →