A library for managing LLM conversations and context
Project description
Generic LLM Memorizer
A library for AI agent long-term memory. Provides two tools — memorize and search — that any agent (pydantic-ai, Google ADK, etc.) can use to store and retrieve conversational knowledge.
Features
- Fact Extraction — Automatically extracts relevant facts from conversations (preferences, skills, context, events, demographics)
- User Profile — Builds and maintains a user profile (name, age, hobbies, occupation)
- Conversation Summary — Generates concise summaries of each conversation
- SKOS Knowledge Base — Stores ontological concepts following the SKOS standard
- Semantic Search — Hybrid search combining:
- Dense vector search (cosine similarity on embeddings) — requires optional
raginstall - Keyword search (TF-IDF) — built-in
- LLM reranking — re-ranks top results by semantic relevance
- Dense vector search (cosine similarity on embeddings) — requires optional
- Persistence — JSON files, one directory per user (pluggable
StorageBackend)
Installation
uv sync
# Optional: enable RAG with local sentence-transformers
uv sync --group rag
Quick Start
import asyncio
from pydantic import BaseModel
from generic_llm_memorizer import Memorizer
# Your LLM call function (OpenAI, Ollama, Anthropic, etc.)
async def my_llm_call(prompt: str, system_prompt: str, response_model: type[BaseModel]):
# Call your LLM API and return an instance of response_model
...
async def main():
mem = Memorizer(user_id="user_123", llm_call=my_llm_call)
# Tool 1: memorize a conversation
result = await mem.memorize(
conversation=[
"User: Bonjour, je m'appelle Marie et je suis développeuse Python",
"Assistant: Enchantée Marie !",
],
session_id="session_1",
)
print(f"Facts added: {result.facts_added}")
print(f"Profile updated: {result.profile_updated}")
print(f"Summary: {result.summary}")
# Tool 2: search stored memory
search_result = await mem.search("What does the user do?")
print(search_result.to_context_string())
asyncio.run(main())
With RAG (Dense Vector Search)
pip install generic-llm-memorizer[rag]
from generic_llm_memorizer import Memorizer
from generic_llm_memorizer.embeddings import SentenceTransformerEmbeddings
mem = Memorizer(
user_id="user_123",
llm_call=my_llm_call,
embedder=SentenceTransformerEmbeddings(),
)
# memorize() will now also build a vector index
# search() will use hybrid vector + keyword matching
With a custom embedding API
from generic_llm_memorizer.embeddings import OpenAIEmbeddings
async def my_embed_fn(texts: list[str]) -> list[list[float]]:
# call your embedding API
...
mem = Memorizer(
user_id="user_123",
llm_call=my_llm_call,
embedder=OpenAIEmbeddings(embed_fn=my_embed_fn),
)
API
Memorizer
Memorizer(
user_id: str,
llm_call: LLMCall,
store: StorageBackend | None = None, # defaults to FileStorageBackend
system_prompt: str | None = None,
batch_size: int = 10,
max_batches: int = 3,
embedder: EmbeddingProvider | None = None, # enables RAG vector search
)
memorize(conversation, session_id) -> MemorizeResult
Extract facts, profile, summary, and SKOS concepts from a conversation.
conversation: list[str]— Messages in"role: content"formatsession_id: str— Session identifier for persistence- Returns
MemorizeResult(facts_added, profile_updated, summary, skos_concepts_added)
search(query, scope=ALL, top_k=10, use_llm_rerank=True) -> SearchResult
Search stored memory. Uses hybrid vector + keyword + optional LLM rerank.
query: str— Natural language queryscope: SearchScope—FACTS,SKOS,PROFILE, orALLtop_k: int— Max results to returnuse_llm_rerank: bool— Whether to rerank with the LLM- Returns
SearchResult(facts, skos_concepts, user_profile)withto_context_string()
Storage
from generic_llm_memorizer import FileStorageBackend
store = FileStorageBackend(base_path="./my_memories")
mem = Memorizer(user_id="user_123", llm_call=my_llm_call, store=store)
Persisted to ./my_memories/{user_id}/:
memory.json— User profile and factsskos_knowledge_db.json— SKOS ontology{session_id}/conversation.json— Conversation history
RAG (Optional)
| Provider | Install | Class |
|---|---|---|
| Sentence Transformers (local) | pip install generic-llm-memorizer[rag] |
SentenceTransformerEmbeddings |
| OpenAI / any API | (included) | OpenAIEmbeddings |
Architecture
Memorizer
├── memorize()
│ ├── _extract_facts() → LLM → Facts
│ ├── _extract_user_profile() → LLM → User
│ ├── _summarize() → LLM → Summary
│ ├── _build_skos() → LLM → SkosKnowledgeDatabase
│ └── persist + rebuild indices
│
├── search()
│ ├── VectorIndex.search() → cosine similarity on embeddings (RAG)
│ ├── MemoryIndex.search() → TF-IDF keyword matching
│ ├── _merge_search_results() → dedup + merge
│ └── LLM rerank (optional)
│
├── FileStorageBackend → JSON files per user
└── EmbeddingProvider (RAG) → SentenceTransformer / OpenAI / custom
Development
# Run all unit tests
pytest
# Run with coverage
pytest --cov=generic_llm_memorizer
# Run integration tests (requires Ollama with gemma4:latest)
pytest tests/test_with_agent.py -v
Dependencies
- Python 3.12+
- pydantic
- scikit-learn
- sentence-transformers (optional, for RAG)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file generic_llm_memorizer-0.2.2.tar.gz.
File metadata
- Download URL: generic_llm_memorizer-0.2.2.tar.gz
- Upload date:
- Size: 24.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af001a1a4dade5fbc14643da4273fe3932fe01d98007882c20bcbdde81d1798c
|
|
| MD5 |
77ef6badb35ce7ad1230371799ad5d02
|
|
| BLAKE2b-256 |
eabcf86d0ba4c2b8b20209a990fc5b42c3ed6197fc491afb74f1951265d9c61c
|
File details
Details for the file generic_llm_memorizer-0.2.2-py3-none-any.whl.
File metadata
- Download URL: generic_llm_memorizer-0.2.2-py3-none-any.whl
- Upload date:
- Size: 19.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00b1fc5379583339bf768f2d99ee78a1c703a818c2ddc470546bc776f5f7b264
|
|
| MD5 |
3f8656cfb8117cf099676e69ceb7005e
|
|
| BLAKE2b-256 |
e933471518a362381dc41a2ad819e00a169fb8656099f3bb287da34b311e9606
|