Dieses kleine Projekt zielt darauf ab, WordPress-Blogeinträge in eine Wissensdatenbank zu integrieren, die Retrieval-Augmented Generation (RAG)-Techniken nutzt.
Die Prämisse dieses Projekts ist einfach: Eine Reihe von Skripten führt bestimmte Aktionen über die Befehlszeile aus. Jedes Skript ist in sich abgeschlossen, wodurch jede Aktion relativ einfach in ihrem eigenen Kontext veranschaulicht werden kann.
Standardmäßig verwenden die enthaltenen Skripte kostenlose und Open-Source-Bibliotheken und -Modelle. Wenn Sie jedoch Zugriff darauf haben, ist eine Option zur Verwendung der LLMs von OpenAI verfügbar. Dieses Beispiel sollte auf der CPU lauffähig sein, wenn Sie keine kompatible GPU, sondern YMMV haben.
RAG nutzt zwei Komponenten: ein Retrieval-System und ein generatives Sprachmodell. Das Retrieval-System fragt für eine Anfrage relevante Dokumente aus einem Datenspeicher/Wissensdatenbank (z. B. einer Sammlung von Blogbeiträgen) ab. Die abgerufenen Dokumente werden dann in ein Sprachmodell eingespeist, das fundierte Antworten für den Benutzer generiert. Einer der Hauptvorteile der Verwendung von RAG besteht darin, dass das KI-System über die Trainingsdaten hinausgehen kann, ohne dass eine Feinabstimmung oder ein erneutes Training erforderlich ist – Daten können dynamisch im Datenspeicher hinzugefügt und aktualisiert werden. Abfrageergebnisse können nicht nur den vom Sprachmodell bereitgestellten Text umfassen, sondern auch eine Sammlung relevanter Dokumente oder Quellen. Weitere Informationen zu RAG finden Sie im IBM Research Blog.
Es ist ziemlich einfach, dieses Projekt in die Tat umzusetzen ...
Richten Sie zunächst die virtuelle Umgebung des Projekts ein und aktivieren Sie diese
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Sie können alle Abhängigkeiten für dieses Projekt installieren, indem Sie die Datei requirements.txt
verwenden. Wenn Sie dies tun, ist es in diesem Dokument nicht erforderlich, andere Pakete manuell über pip
zu installieren.
pip install -r requirements.txt
Erstellen Sie eine .env
Datei mit env.example
als Leitfaden.
cp env.example .env
Dies ist wichtig für das Herunterladen Ihrer WordPress-Daten. Stellen Sie sicher, dass Sie Ihren Wordpress-Benutzernamen, Ihr Anwendungskennwort und Ihre Blog-Domäne in die .env
kopieren. HINWEIS: Dabei wird davon ausgegangen, dass sich das Blog im Stammpfad befindet.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
Laden Sie den WordPress-Inhalt in das Verzeichnis ./data
herunter (vorerst wird davon ausgegangen, dass sich Ihr Blog im Stammverzeichnis der Domain befindet):
python3 wordpress-dl.py
PGVector wird zum Speichern und Abfragen von Texteinbettungen (Vektoren) in einer Postgresql-Datenbank verwendet. Ein Vorteil von PGVector besteht darin, dass es zu bestehenden Datenbanksystemen hinzugefügt werden kann und keine proprietären Produkte von Drittanbietern erfordert.
Für die Unterstützung der pgvector-Einbettung:
pip install pgvector psycopg2-binary
Stellen Sie sicher, dass Sie über die richtigen .env
Werte verfügen. Während die Standardeinstellungen für die lokale Entwicklung in Ordnung sind, besteht die Möglichkeit, dass Sie etwas anderes haben, wenn Sie eine vorhandene Postgres-Datenbank verwenden (dh das Docker-Image nicht ausführen). Hier verwenden wir ein Docker-Image, um die Einrichtung einfach zu halten. Sie können jedoch auch problemlos eine andere PostgreSQL-Instanz verwenden, wenn Sie die pgvector-Erweiterung selbst hinzufügen und laden können.
So führen Sie das Docker-Image in ./postgres
aus:
docker compose up
Führen Sie das Einbettungsskript aus, um den WordPress-Download durchzuführen und Einbettungen in der Postgres-Datenbank zu speichern. Dies kann einige Zeit dauern. _Wenn Sie Daten in die Datenbank einfügen möchten, also löschen und mit sauberen Daten beginnen möchten, übergeben Sie das CLI-Argument --embed
:
python3 embed.py --embed
Standardmäßig wird nur 1 Datensatz zum Testen eingefügt (dh wenn Sie nicht --limit
und dann eine ganze Zahl > 1 angeben, wird nur die Vektoreinbettung für den ersten Datensatz erstellt) – so können Sie einfacher testen, ohne zu viel zusätzliche Rechenzeit zu verbrauchen.
Wenn Sie an weiteren Informationen interessiert sind, übergeben Sie --verbose
Ein Beispielaufruf könnte wie folgt aussehen:
python3 embed.py --verbose --embed --limit 100
...aber erhöhen Sie Ihr Limit entsprechend der Größe Ihres WordPress-Blogs. Kein Problem, wenn die Anzahl größer ist als die Anzahl der Einträge – es ist intelligent genug, um bis zur maximalen Datensatzanzahl zu importieren.
Dieses Repo demonstriert sowohl lokale als auch API-basierte Anwendungsfälle. Einer der Vorteile eines lokal ausgeführten Modells besteht darin, dass Ihre Daten privat bleiben und nicht zum Trainieren der Modelle anderer verwendet werden. Darüber hinaus kann es zu Leistungssteigerungen kommen, wenn Abfragen lokal auf einem Server oder Netzwerk erfolgen. Auf selbst gehosteten Systemen fallen jedoch keine Kosten für die API-Nutzung an. Andererseits kann eine API-Nutzung erwünscht sein, da OpenAI viel größere Kontextfenster als das in diesem Projekt verwendete Modell hat und die OpenAI-Modelle recht gut sein können.
Für die Verwendung des lokalen Sprachmodells sind das Python-Paket „ trsnformers
und Pytorch ( torch
) erforderlich.
pip install transformers torch llama-cpp-python
Laden Sie als Nächstes das in diesem Offline-Ansatz verwendete Modell herunter. Da Sprachmodelle groß sein können (mehrere GB), habe ich ein kleineres Llama-Modell ausgewählt, das dies demonstriert. Es können sogar kleinere Modelle verwendet werden, oft jedoch an der Grenze der Kontextfenster, die entschärft werden können, aber außerhalb des Rahmens dieses Projekts liegen. Dieses Projekt verwendet TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(Wenn Sie huggingface-cli
nicht installiert haben, finden Sie hier Details).
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
Dieser Befehl lädt das Modell in den Cache-Verzeichnis des Benutzerkontos herunter und erstellt einen Symlink aus dem Modellverzeichnis.
Sobald das Modell heruntergeladen ist, können Sie die lokale Inferenz ausführen, was die Standardoption ist. Anweisungen finden Sie im nächsten Abschnitt „Abfrage“ .
Installation für die Nutzung der OpenAI-API erforderlich
pip install langchain_openai
Stellen Sie sicher, dass Ihr OpenAI-API-Schlüssel in Ihrer .env
Datei gespeichert ist. Sie können es auf der Registerkarte OpenAI Platform API Key konfigurieren: OPENAI_API_KEY="...
Dokumente (übrigens eingebettete und abgerufene) haben in diesem Projekt die folgende allgemeine Struktur.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
Ergebnisse werden oft als List
von Tupeln (idx, Dokument) zurückgegeben, daher ist es angebracht, die Liste aufzuzählen:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
Die nützlichsten Daten zur Erweiterung der LLM-Antworten werden in die metadata
aufgenommen, ein Wörterbuch der während der Einbettung eingegebenen Daten.
Das Ausführen von Abfragen über die CLI ist einfach.
...lokales Modell:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...mit OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
Erwarten Sie nach ein paar Augenblicken eine Antwort wie diese:
❓ '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 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
Es gibt zusätzliche Argumente, die beim Testen Ihrer Daten und Modelle hilfreich sein können. Führen Sie python3 query.py --help
aus, um weitere Optionen zu erhalten.