Ce petit projet vise à intégrer les entrées de blog WordPress dans une base de connaissances qui utilise les techniques de génération augmentée de récupération (RAG).
Le principe de ce projet est simple : une série de scripts effectueront des actions spécifiques via la ligne de commande. Chaque script est autonome, ce qui permet de démontrer relativement simplement chaque action dans son propre contexte.
Par défaut, les scripts inclus utilisent des bibliothèques et des modèles gratuits et open source, bien qu'une option permettant d'utiliser les LLM d'OpenAI soit disponible si vous y avez accès. Cet exemple devrait pouvoir fonctionner sur CPU si vous n'avez pas de GPU compatible, mais YMMV.
RAG utilise deux composants : un système de récupération et un modèle de langage génératif. Le système de récupération interroge les documents pertinents pour une requête à partir d'un magasin de données/base de connaissances (par exemple, une collection d'articles de blog). Les documents récupérés sont ensuite introduits dans un modèle de langage, qui produit des réponses éclairées pour l'utilisateur. L'un des principaux avantages de l'utilisation de RAG est qu'il permet au système d'IA de s'étendre au-delà des données d'entraînement sans avoir besoin d'un réglage précis ou d'un nouvel entraînement : les données peuvent être ajoutées et mises à jour de manière dynamique dans le magasin de données. Les résultats de la requête peuvent inclure non seulement le texte fourni par le modèle de langage, mais également un ensemble de documents ou de sources pertinents. Vous pouvez en savoir plus sur RAG sur le blog IBM Research.
C'est un projet assez facile à mettre en place et à exécuter...
Configurez d’abord l’environnement virtuel du projet et activez-le
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Vous pouvez installer toutes les dépendances de ce projet en utilisant le fichier requirements.txt
. Si vous le faites, il n'est pas nécessaire d'installer manuellement d'autres packages via pip
dans ce document.
pip install -r requirements.txt
Créez un fichier .env
en utilisant env.example
comme guide.
cp env.example .env
Cela sera important pour télécharger vos données WordPress. Assurez-vous de copier votre nom d'utilisateur Wordpress, votre mot de passe d'application et votre domaine de blog dans le .env
. REMARQUE : cela suppose que le blog se trouve au chemin racine.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
Téléchargez le contenu wordpress dans le répertoire ./data
(cela suppose que votre blog se trouve à la racine du domaine, pour l'instant) :
python3 wordpress-dl.py
PGVector est utilisé pour stocker et interroger des incorporations de texte (vecteurs) dans une base de données Postgresql. L'un des avantages de PGVector est qu'il peut être ajouté aux systèmes de bases de données existants et ne nécessite pas de produits tiers propriétaires.
Pour la prise en charge de l'intégration de pgvector :
pip install pgvector psycopg2-binary
Assurez-vous d'avoir les valeurs .env
appropriées. Bien que les valeurs par défaut conviennent au développement local, il est possible que vous obteniez quelque chose de différent si vous utilisez une base de données Postgres existante (c'est-à-dire si vous n'exécutez pas l'image Docker). Ici, nous utilisons une image Docker pour simplifier la configuration, mais vous pouvez facilement utiliser une autre instance PostgreSQL si vous pouvez ajouter et charger vous-même l'extension pgvector.
Pour exécuter l'image docker dans ./postgres
:
docker compose up
Exécutez le script d'intégration pour effectuer le téléchargement WordPress et enregistrer les intégrations dans la base de données Postgres. Cela peut prendre un certain temps. _Si vous souhaitez insérer des données dans la base de données, c'est-à-dire effacer et démarrer avec des données propres, transmettez l'argument CLI --embed
:
python3 embed.py --embed
Par défaut, un seul enregistrement est inséré pour le test (c'est-à-dire en ne spécifiant pas --limit
puis un entier > 1, cela ne créera que l'intégration vectorielle pour le premier enregistrement) - vous pouvez donc tester plus facilement sans passer trop de temps de calcul supplémentaire.
Si vous êtes curieux d'obtenir des informations supplémentaires, passez --verbose
Un exemple d'appel pourrait ressembler à :
python3 embed.py --verbose --embed --limit 100
... mais augmentez votre limite en fonction de votre blog WordPress. Pas de problème si le nombre est supérieur au nombre d'entrées - il est suffisamment intelligent pour importer jusqu'au nombre maximum d'enregistrements.
Ce référentiel présente des cas d'utilisation locaux et basés sur une API. L'un des avantages d'un modèle exécuté localement est que vos données restent privées et ne seront pas utilisées pour entraîner les modèles d'autres personnes. De plus, il peut y avoir des gains de performances en gardant les requêtes locales sur un serveur ou un réseau, mais cela n'entraîne pas de coûts d'utilisation de l'API sur les systèmes auto-hébergés. D'un autre côté, l'utilisation de l'API peut être souhaitée, car OpenAI a des fenêtres de contexte beaucoup plus grandes que le modèle utilisé dans ce projet, et les modèles OpenAI peuvent être assez bons.
L'utilisation du modèle de langage local nécessitera le package python trsnformers
et pytorch ( torch
)
pip install transformers torch llama-cpp-python
Téléchargez ensuite le modèle utilisé dans cette approche hors ligne. Étant donné que les modèles de langage peuvent être volumineux (plusieurs Go), j'ai choisi un modèle Llama plus petit qui le démontre. Des modèles encore plus petits peuvent être utilisés, mais souvent à la limite des fenêtres contextuelles, qui peuvent être allégées, mais en dehors du cadre de ce projet. Ce projet utilise TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(Si vous n'avez pas installé huggingface-cli
, vous pouvez trouver des détails ici).
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
Cette commande téléchargera le modèle vers le directeur de cache du compte utilisateur et créera un lien symbolique depuis le répertoire des modèles.
Une fois le modèle téléchargé, vous pouvez exécuter l'inférence locale, qui est l'option par défaut. Consultez la section suivante, Requête pour obtenir des instructions.
Installation requise pour l'utilisation de l'API OpenAI
pip install langchain_openai
Assurez-vous que votre clé API OpenAI est enregistrée dans votre fichier .env
. Vous pouvez le configurer dans l'onglet Clé API d'OpenAI Platform : OPENAI_API_KEY="...
Les documents (intégrés et récupérés, d'ailleurs) ont la structure générale suivante dans ce projet.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
Les résultats sont souvent renvoyés sous forme de List
de tuples (idx, Document), il est donc approprié d'énumérer la liste :
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
Les données les plus utiles pour augmenter les réponses LLM seront incluses dans la propriété metadata
, un dictionnaire de données introduit lors de l'intégration.
L’exécution de requêtes à partir de la CLI est simple.
...modèle local :
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...en utilisant OpenAI :
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
Après quelques instants, attendez-vous à voir une réponse comme celle-ci :
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
Il existe des arguments supplémentaires qui peuvent être utiles lors du test de vos données et de vos modèles. exécutez python3 query.py --help
pour plus d'options.