Memory

Module Memory — Mémoire Sémantique Hybride

Ce module gère la persistance sémantique de l’IA (Long-Term Memory). Il agit comme l’hippocampe du système RAISE en stockant les documents et contextes sous forme vectorielle (embeddings) pour permettre une recherche par le sens plutôt que par mot-clé exact.

🏗️ Architecture : Pattern Strategy

Le module est conçu autour d’une architecture flexible qui découple la logique métier du moteur de stockage sous-jacent.

graph TD
    subgraph "Application Layer"
        RAG[RAG Engine]
        CMD[Tauri Commands]
    end
    subgraph "Abstraction (mod.rs)"
        VS["Trait VectorStore"]
    end
    subgraph "Backends (Implementations)"
        QS[QdrantStore - gRPC]
        LS[LeannStore - HTTP]
    end
    subgraph "Infrastructure (Docker)"
        QD[(Qdrant DB)]
        LN[[LEANN Python Srv]]
    end
    RAG & CMD --> VS
    VS -.-> QS
    VS -.-> LS
    QS -->|gRPC:6334| QD
    LS -->|HTTP:8000| LN

1. L’Abstraction (VectorStore)

Nous définissons une interface générique (Trait) VectorStore. Tout moteur de base de données doit implémenter ces méthodes atomiques :

  • init_collection : Prépare l’index ou la table (ex: dimension des vecteurs).
  • add_documents : Stocke les documents, leurs vecteurs et leurs métadonnées.
  • search_similarity : Retrouve les documents les plus proches avec support du filtrage par métadonnées.

2. Les Moteurs (Backends)

CaractéristiqueQdrant (qdrant_store.rs)LEANN (leann_store.rs)
TypeServeur DB Autonome (Rust)Librairie/Service Python léger
ProtocolegRPCHTTP/REST
PerformanceTrès Haute (Production)Moyenne (Optimisé Low-RAM)
Usage IdéalServeur, Cloud, Gros volumesLocal-first, Laptop, Embarqué

⚙️ Configuration des Ports & Environnement

Le module s’appuie sur les variables d’environnement définies dans le fichier .env à la racine du projet pour la communication avec l’infrastructure Docker.

VariablePort par défautDescription
PORT_QDRANT_GRPC6334Port de communication binaire pour l’ingestion et la recherche Qdrant.
PORT_LEANN8000Port de l’API REST pour le moteur de recherche léger LEANN.
QDRANT_URLhttp://127.0.0.1:6334URL complète utilisée par le client Rust pour Qdrant.

🚀 Utilisation

Le choix du moteur se fait à l’initialisation. Grâce au polymorphisme, le reste de l’application manipule uniquement un Box<dyn VectorStore>.

use crate::ai::memory::{leann_store::LeannMemory, qdrant_store::QdrantMemory, VectorStore};
async fn setup_memory(use_cloud: bool) -> Result<Box<dyn VectorStore>, anyhow::Error> {
    let store: Box<dyn VectorStore> = if use_cloud {
        let port = std::env::var("PORT_QDRANT_GRPC").unwrap_or("6334".to_string());
        Box::new(QdrantMemory::new(&format!("http://127.0.0.1:{}", port))?)
    } else {
        let port = std::env::var("PORT_LEANN").unwrap_or("8000".to_string());
        Box::new(LeannMemory::new(&format!("http://127.0.0.1:{}", port))?)
    };
    // Initialisation & Recherche
    store.init_collection("ma_base", 384).await?;
    let results = store.search_similarity("ma_base", &vec![0.1; 384], 5, 0.4, None).await?;
    Ok(store)
}

🧪 Tests & Validation

Le module contient des tests unitaires et d’intégration consolidés.

Tests Unitaires (Statique)

Vérifie la logique interne et les clients sans nécessiter de base de données active.

cargo test ai::memory

Tests d’Intégration (Dynamique)

Ces tests vérifient la connexion réelle aux backends. Ils sont marqués #[ignore] et paniquent explicitement si Qdrant ou LEANN ne sont pas accessibles sur les ports configurés.

# Lancer les tests d'intégration (Nécessite Docker up)
cargo test ai::memory -- --ignored --nocapture

📂 Structure des Fichiers

src-tauri/src/ai/memory/
├── mod.rs            # Interface VectorStore, Structs & Tests d'intégration
├── qdrant_store.rs   # Implémentation gRPC pour Qdrant
├── leann_store.rs    # Implémentation HTTP pour le wrapper Python
└── README.md         # Documentation du module