


Créer une mémoire à long terme pour agents d’IA avec recherche par graphe et par vecteurs
À utiliser pour que les agents d’IA gardent leurs connaissances entre sessions. Transforme fichiers, URL et texte en graphes et vecteurs consultables, sépare les données de chaque utilisateur par l’authentification et permet de changer de stockage ou de modèle sans toucher au code central.
Pour utiliser ces règles d'IA
## Découper la mémoire en étapes, de l’import des données jusqu’à la recherche
Définissez un cycle de vie explicite pour les connaissances persistantes : ingérez des fichiers bruts, des URL ou du texte dans des jeux de données ; transformez le contenu en entités, relations, segments et résumés ; récupérez les connaissances pertinentes au moyen d’une stratégie choisie ; et enrichissez le graphe stocké avec du contexte ou des règles supplémentaires.
Maintenez ces étapes appelables indépendamment, tout en assurant leur cohérence lorsqu’elles sont combinées. L’ingestion doit créer des enregistrements durables de jeux de données et de données avant la transformation. La transformation classe et segmente le contenu, extrait des relations structurées, le résume lorsque cela est utile et écrit des représentations de graphes et de vecteurs compatibles. La récupération doit appliquer l’autorisation avant de renvoyer des résultats. L’enrichissement doit préserver la provenance et les métadonnées de version.
## Séparer le système en couches pour que le code central n’appelle jamais directement les fournisseurs
Séparez les points d’entrée versionnés de l’API ou du SDK, les fonctions du cycle de vie, l’orchestration des chaînes de traitement, l’exécution des tâches, les modules du domaine, les adaptateurs d’infrastructure et les services externes. Les dépendances doivent descendre à travers ces couches afin que le comportement du domaine n’importe pas directement des clients propres à un fournisseur.
Maintenez explicites les concepts atomiques du graphe : les nœuds ou points de données portent des identifiants stables, des types, des descriptions, des versions et des métadonnées ; les arêtes portent une source, une cible et un type de relation ; les triplets représentent des faits sujet-prédicat-objet. Utilisez un conteneur de graphe de connaissances pour transporter des ensembles cohérents de nœuds et d’arêtes entre l’extraction, le stockage et la récupération.
## Monter des chaînes de traitement avec de petites tâches et choisir clairement chaque stratégie de recherche
Représentez les étapes de traitement sous forme de tâches composables pouvant s’exécuter séquentiellement ou en parallèle lorsque leurs dépendances de données le permettent. Une chaîne de traitement doit rendre visibles la classification, l’extraction de segments, l’extraction structurée du graphe, la synthèse et le stockage comme des unités distinctes, afin que les défaillances et les nouvelles tentatives restent localisées.
Acheminez la recherche par l’intermédiaire d’un type de stratégie explicite. Prenez en charge le parcours de graphe avec complétion, le contexte de graphe étayé par des résumés, la récupération de triplets, la recherche vectorielle et lexicale de segments, les résumés de documents, la récupération temporelle, la conversion du langage naturel en requêtes structurées, les requêtes directes sur le graphe et la sélection automatique d’une stratégie lorsqu’elle est justifiée. Toutes les stratégies doivent partager le filtrage des autorisations et un contrat de résultat stable.
## Placer le stockage et les fournisseurs de modèles derrière des interfaces pour pouvoir les changer
Définissez des interfaces distinctes pour le stockage de graphes, vectoriel et relationnel. Sélectionnez des moteurs concrets au moyen de fabriques afin que les valeurs par défaut locales, les services distants et les bases de données de production puissent changer sans modifier les tâches du domaine. Conservez dans l’adaptateur la logique de connexion propre au fournisseur, les vérifications de capacités et les erreurs relatives aux opérations non prises en charge.
Appliquez la même frontière aux modèles de langage, aux moteurs de plongement vectoriel, aux cadres de sortie structurée, aux chargeurs de fichiers et au stockage d’objets. La configuration choisit une implémentation ; le code du domaine utilise l’interface. Lorsqu’un système sous-jacent ne possède pas une capacité telle que les requêtes directes sur le graphe ou un mode de récupération, rejetez explicitement l’opération au lieu de la dégrader silencieusement vers une sémantique différente.
## Exiger l’authentification dès que les données de chaque utilisateur sont séparées
Modélisez l’accès comme une chaîne allant de l’utilisateur au jeu de données, puis aux données, et appliquez les autorisations de lecture, d’écriture, de suppression et de partage avant toute récupération dans le graphe ou les vecteurs. Lorsque cela est pris en charge, isolez le stockage par utilisateur et par jeu de données afin qu’une erreur de filtrage ne puisse pas exposer les connaissances d’un autre locataire.
Traitez le contrôle d’accès du système sous-jacent et l’authentification de l’API comme une posture de sécurité unique. L’activation de l’isolation des locataires doit exiger une authentification ; un réglage explicite désactivant l’authentification ne doit pas prévaloir sur un contrôle d’accès actif. Le stockage partagé pour un seul utilisateur constitue un mode distinct choisi délibérément. Renvoyez un résultat vide plutôt que de révéler l’existence d’enregistrements inaccessibles, tout en conservant suffisamment de diagnostics internes pour les opérateurs autorisés.
## Configurer ensemble le modèle de langage et les plongements vectoriels, et revoir les réglages de production
Configurez le fournisseur du modèle de langage et celui des plongements vectoriels comme une paire. Si un seul est défini, une valeur par défaut implicite pour l’autre peut entraîner l’absence d’informations d’authentification, une tokenisation incompatible ou des appels externes inattendus. Validez au démarrage les deux fournisseurs, les points de terminaison, les modèles, le mode de sortie structurée et les limites de débit.
Conservez les secrets dans une configuration adossée aux variables d’environnement et proposez les intégrations facultatives au moyen d’options d’installation ou de groupes de fonctionnalités. Les valeurs par défaut locales peuvent utiliser des stockages relationnels, vectoriels et de graphes fondés sur des fichiers, mais un déploiement en production doit examiner ensemble les chemins de stockage, l’autorisation des requêtes distantes, l’accès aux fichiers locaux, l’autorisation des requêtes brutes, l’authentification, l’isolation des locataires et le stockage durable d’objets.
## Ajouter de nouveaux stockages ou stratégies de recherche par des points d’enregistrement fixes
Ajoutez des capacités au point d’extension stable le plus restreint : implémentez une tâche et enregistrez-la dans une chaîne de traitement ; implémentez une interface de stockage pour un nouveau système sous-jacent ; ajoutez la configuration d’un fournisseur derrière la passerelle des modèles ; étendez les chargeurs de documents à un nouveau format ; enregistrez une stratégie de récupération ; ou définissez un modèle de graphe qui étend le contrat commun des points de données.
Pour l’extraction fondée sur une ontologie, maintenez configurables le résolveur, la source de l’ontologie et la stratégie de correspondance. Avant le stockage, vérifiez que les types d’entités et les relations extraits sont conformes au cadre sémantique choisi. Les nouvelles extensions doivent déclarer les dépendances requises, les capacités prises en charge, les champs de configuration et le comportement en cas d’échec.
## Tester chaque composant et le parcours complet, de l’import des données à la recherche
Organisez les tests par comportement unitaire, frontières d’intégration, points d’entrée de la ligne de commande ou de l’API et comportement propre aux tâches. Chaque fonctionnalité nécessite des tests ciblés, tandis que les adaptateurs de stockage, les passerelles de modèles et les autres intégrations nécessitent des tests de frontière avec des configurations et des réponses d’échec réalistes.
Maintenez au moins un parcours d’intégration couvrant l’ensemble du cycle de vie, de l’ingestion à la récupération en passant par la transformation, y compris l’exécution asynchrone et le filtrage des autorisations. Testez chaque fonction asynchrone publique par une attente directe ou au moyen d’un exécuteur de boucle d’événements. Exécutez les vérifications de couverture, d’analyse statique, de formatage et de types conformément aux règles du dépôt, et maintenez les tests alignés sur la structure en couches du code source.
## Vérifier d’abord la configuration et distinguer un résultat de recherche vide d’une panne
Diagnostiquez les échecs de configuration avant de modifier la logique de la chaîne de traitement. Vérifiez les réglages appariés du modèle et des plongements vectoriels, le mode de sortie structurée, la compatibilité du moteur de tokenisation, les URL et les informations d’authentification des bases de données, la disponibilité des services et les réglages des limites de débit. Rendez visible le mécanisme de repli entre fournisseurs afin qu’une configuration partielle ne puisse pas sélectionner silencieusement un service distant non prévu.
Distinguez un résultat autorisé vide d’un échec de transport ou d’analyse syntaxique. Les recherches filtrées par autorisation ne doivent pas révéler l’existence d’enregistrements ; les échecs de connexion doivent identifier l’adaptateur et le prérequis qui a échoué ; les échecs liés aux limites de débit doivent indiquer le délai avant une nouvelle tentative ; les échecs de sortie structurée doivent identifier le mode d’extraction configuré. Utilisez des journaux structurés et une instrumentation de débogage facultative, mais ne consignez jamais les informations d’authentification ni les contenus sensibles récupérés.
