45:57Chase AI
Log in to leave a comment
No posts yet
Lors de la construction d'un système RAG en local, le premier mur que l'on rencontre est la capacité de la VRAM et les conflits de versions persistants entre les bibliothèques. Un modèle quantifié en 8 bits consomme environ 1 Go de VRAM pour chaque milliard de paramètres. Compte tenu de l'occupation du système par Windows ou macOS lui-même, il faut laisser au moins 20 % d'espace libre. Sans cette marge, vous verrez les performances s'effondrer avec une vitesse de génération de jetons plafonnant à environ 2 par seconde. En particulier, le framework lightrag-hku a tendance à rejeter des erreurs d'exécution lorsqu'il rencontre les versions récentes de numpy 2.x.
Ouvrez d'abord votre terminal et fixez la version en tapant pip install numpy==1.26.4 --force-reinstall. Ensuite, installez nest_asyncio et ajoutez nest_asyncio.apply() tout en haut de votre code. Sans cela, la boucle asynchrone s'emmêle dans Jupyter Notebook et l'ensemble du processus s'arrête. Si votre mémoire GPU est inférieure à 8 Go, réglez embedding_batch_num à 10 ou moins et llm_model_max_async autour de 4 lors de l'initialisation de LightRAG. Ces seuls réglages permettent d'éviter les phénomènes d'OOM (Out Of Memory) où le système plante sans raison et de gagner facilement deux heures de tâtonnements.
Stocker le texte par simples blocs coupe tout le contexte entre les informations. Cependant, en parsant correctement la structure des wikilinks d'Obsidian ([[link]]), on peut créer un graphe de connaissances assez sophistiqué. La clé réside dans le retrait des symboles Markdown inutiles avant la lecture par le LLM. Le simple fait de nettoyer ces symboles peut réduire la consommation de jetons de près de 30 %.
Prenez l'habitude d'insérer des champs tels que type ou domain dans la zone YAML en haut de vos notes. Cela change la donne pour la vitesse de filtrage de recherche. Utilisez le motif r"\[\[(.+?)\]\]" avec le module Python re pour extraire les liens entre les documents, puis convertissez-les en un dataset de relations au format JSONL. Le nom du fichier est également crucial. Utilisez le sujet central de la connaissance comme titre plutôt qu'une date comme '2024-04-14' pour que les nœuds indexés jouent pleinement leur rôle. Les données ainsi connectées permettent d'aller au-delà de la simple recherche pour autoriser un raisonnement qui navigue de concept en concept.
Lors de l'exécution d'un LLM local, le plus grand gaspillage consiste à passer du temps à recalculer des embeddings déjà traités. Le cache par défaut de Python disparaît dès que le programme s'arrête. C'est pourquoi il faut créer un stockage physique en utilisant DiskCache, basé sur SQLite. Concevez le système pour qu'il renvoie directement la réponse en cache sans appeler le LLM si la similitude cosinus entre les questions dépasse 0,95. L'application de cette mise en cache sémantique peut réduire le temps de réponse à environ 100 ms.
La méthode est simple. Installez la bibliothèque avec pip install diskcache et créez une classe pour stocker les paires de textes d'embedding et de vecteurs. Il est encore préférable d'y injecter un algorithme de pondération temporelle.
L'idée est de construire une logique pour que les notes fraîchement modifiées apparaissent en haut des résultats de recherche. En fixant le TTL du cache d'embedding à 1 heure et celui de la réponse générée à environ 2 heures, on peut établir un système de réponse instantanée pour les questions répétitives.
Les schémas d'architecture ou les captures d'écran contenus dans les notes renferment bien plus d'informations que le texte seul. Les exclure de la recherche est une perte sèche. En utilisant le modèle CLIP, vous pouvez placer les images et le texte dans le même espace vectoriel pour trouver des images pertinentes en tapant simplement "schéma de flux de données". Si vous n'avez pas de GPU haute performance, vous pouvez convertir le modèle CLIP-ViT-B-32 au format OpenVINO et l'exécuter sur CPU.
Lorsque vous trouvez un chemin d'image dans un fichier Markdown, regroupez-le avec environ 200 caractères de texte environnant. Ensuite, extrayez automatiquement les légendes d'images avec un VLM local léger comme Phi-3.5-vision. Stockez ce vecteur de légende et le vecteur de caractéristiques de l'image ensemble dans une base de données vectorielle locale telle que Qdrant. Grâce à ce processus, même les dessins complexes difficiles à décrire par le texte seront inclus dans les résultats de recherche.
Réindexer l'intégralité du coffre à chaque fois qu'un fichier est modifié est inefficace. En utilisant la bibliothèque Python watchdog, vous pouvez détecter l'instant où un fichier est enregistré et ne mettre à jour que la partie modifiée. Toutefois, si l'indexation tourne en continu pendant que vous écrivez, votre CPU va souffrir ; un traitement de de-bouncing est donc indispensable.
Lors de la rédaction du script, surveillez le dossier avec watchdog.observers et faites en sorte que le travail ne commence qu'après une attente d'environ 5 secondes suite à un événement de modification. Vous devez également intégrer un processus de comparaison en stockant séparément la valeur de hachage SHA-256 de chaque fichier pour vérifier si le contenu a réellement changé. Sélectionnez uniquement les fichiers dont le hachage a changé, supprimez les anciens nœuds et injectez les nouveaux vecteurs. De cette façon, vous complétez une base de connaissances en temps réel qui reflète vos notes dès qu'elles sont enregistrées. Cela signifie qu'il n'est plus nécessaire d'appuyer manuellement sur un bouton de mise à jour.