
Lesezeit: ~ 10 Minuten
Bauen von Art Deco Rag Chatbot mit Pulsejet Github Repo: https://github.com/jet-egine/artdeco-chatbot
Dieser Blogpost kann aus den folgenden Links gelesen werden:
Großsprachige Modelle (LLMs) haben sich erheblich weiterentwickelt und ihre Fähigkeit, eine breite Palette von Fragen zu beantworten, verbessert. Sie stoßen jedoch immer noch Herausforderungen, insbesondere mit spezifischen oder neueren Informationen, was häufig zu Ungenauigkeiten oder "Halluzinationen" führt. Um diese Probleme anzugehen, integriert der Ansatz der Abruf Augmented Generation (RAG) einen Dokumentenabrufschritt in den Prozess der Antwortgenerierung. Dieser Ansatz verwendet einen Korpus von Dokumenten und verwendet Vektordatenbanken zum effizienten Abrufen, wodurch die Genauigkeit und Zuverlässigkeit von LLM -Antworten durch drei wichtige Schritte verbessert wird:
Vektordatenbanken ermöglichen eine schnelle Ähnlichkeitssuche und eine effiziente Datenverwaltung, wodurch Rag eine leistungsstarke Lösung zur Verbesserung der LLM -Funktionen macht.
Die Art -Deco -Ära, die sich über die brüllenden 1920er bis in die 1940er Jahre erstreckte, hinterließ ein schillerndes Erbe in der Architektur. Trotz der Fähigkeiten von Modellen wie Lama3.1 von Meta können ihre Antworten unzuverlässig sein, insbesondere für nuancierte oder detaillierte Abfragen, die für Art -Deco spezifisch sind. Unser Ziel mit dem Art -Deco -Chatbot ist es, Rag zu verwenden, um die Qualität der Antworten auf die Art -Deco -Architektur zu verbessern und diese mit den von herkömmlichen LLMs sowohl in Bezug auf Qualität als auch in Zeiteffizienz erzeugten zu vergleichen.
Durch die Gestaltung des Art -Deco -Chatbots möchten wir auch zeigen, wie ein komplexes Lappensystem erstellt werden kann. Sie können auf den vollständigen Code im Art Deco Chatbot Github -Repository zugreifen. Wenn Sie den Code untersuchen und dieses Readme lesen, lernen Sie:
Ollama ist ein Programm, mit dem LLM -Modelle auf lokalen Maschinen problemlos ausgeführt werden können.
ollama pull llama3.1 (LLM, die für RAG verwendet wird)ollama pull nomic-embed-text (Einbettungsmodell, das für RAG verwendet wird) In diesem Projekt wollen wir nicht nur Code schreiben, um zu zeigen, wie Lag durchgeführt werden kann, sondern auch die Ergebnisse von Lappen mit Abfragen mit verschiedenen LLMs vergleichen und bewertet. Einige dieser LLMs können nicht lokal ausgeführt werden (wie GPT-4o ), während andere rechnen und in Cloud-Diensten betrieben werden (wie Llama3.1:70b auf COQ).
Litellm bietet eine einheitliche Schnittstelle, um verschiedene LLMs abzufragen, wodurch unser Code sauberer und lesbarer wird. Das Überprüfen der Litellm Python -Bibliothek wird für dieses Projekt jedoch nicht erforderlich.
Holen Sie sich Ihre API -Schlüssel von OpenAI und COQ, um sie im Projekt zu verwenden. Beachten Sie, dass Sie möglicherweise für die Nutzung dieser Dienste in Rechnung gestellt werden. Während die Groq API zum Zeitpunkt des Schreibens kostenlos verwendet werden kann, ist die OpenAI API nicht frei.
Pulsejet ist eine Hochleistungs-Vektor-Datenbank, die ein effizientes Speicher und Abrufen von Dokumenteinbettungen ermöglicht. Pulsejet einrichten:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet Hinweis: Sie können den ersten Schritt überspringen, da Pulsejet bereits in der Datei requirements.txt enthalten ist.
Überprüfen Sie Pulsejet -Dokumente für Details zum Ausführen von Pulsejet Docker -Bildern und mithilfe der Pulsejet Python Library für Vector -Datenbankvorgänge.
Installieren Sie alle erforderlichen Abhängigkeiten durch Ausführen:
pip install -r requirements.txt
Dieses Projekt wurde unter Verwendung einer
conda-Umgebung mitPython 3.11entwickelt.
Da wir das Projekt in verschiedenen Umgebungen nicht getestet haben, empfehlen wir, diese Konfiguration für eine optimale Leistung und Kompatibilität einzuhalten.
Der Art Deco Chatbot verwendet zwei YAML -Dateien für die Konfiguration: config.template.yaml und secrets.yaml . Hier ist eine detaillierte Aufschlüsselung jedes Abschnitts:
Erstellen Sie mit Ihren API -Tasten eine secrets.yaml -Datei:
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "Hier ist eine detaillierte Erklärung für jeden Abschnitt:
true eingestellt ist, lädt das System Einbettungen aus der angegebenen Datei. Wenn false , generiert es neue Einbettungen und speichert sie in dieser Datei. Stellen Sie sicher, dass Sie diese Konfigurationsdateien mit Ihren spezifischen Einstellungen aktualisieren, bevor Sie das Projekt ausführen. Die Anpassung der Lag -Parameter kann die Leistung und Genauigkeit des Lappensystems erheblich beeinflussen. Experimentieren mit unterschiedlichen Werten können erforderlich sein, um die optimale Konfiguration für Ihren spezifischen Anwendungsfall und den Dokumentsatz zu finden.
wiki-bot.pyDieser Schritt ist optional , da die Inhaltsdateien aller abgekratzten Artikel von Wikipedia in der https://huggingface.co/datasets/jetengine/art_deco_usa_ds verfügbar sind.
Sie können diesen Datensatz herunterladen und alle Textdateien in das Verzeichnis rag_files kopieren. Wenn Sie vorbereitete Einbettungen verwenden möchten, die im nächsten Abschnitt erläutert werden, müssen Sie diesen Datensatz nicht herunterladen.
Es besteht keine Notwendigkeit, den Scraping -Vorgang zu wiederholen. Sie können den Rest dieses Abschnitts überspringen, wenn Sie nicht an einem Datenkratzprozess interessiert sind.
Unser ursprünglicher Schritt besteht darin, Wissen über die Art-Deco-Architektur zu sammeln. Wir konzentrieren uns auf US-Strukturen, angesichts ihrer Bedeutung in der Art-Deco-Bewegung. Das Wiki-Bot.Py-Skript automatisiert die Sammlung relevanter Wikipedia-Artikel und organisiert sie in ein strukturiertes Verzeichnis, um den Zugang zu erleichtern.
Führen Sie den Bot mit:
python wiki-bot.py
Wenn Sie Wiki-bot.py mit einem leeren Verzeichnis rag_files ausführen, speichert es den Inhalt der abgekratzten Wikipedia-Artikel in einem Unterordner namens text unter rag_files. Der Bot erstellt auch verschiedene Unterordner, um verschiedene Arten von Daten wie Artikel-URLs, Referenzen usw. zu organisieren, da unser aktueller Schwerpunkt nur auf dem Inhalt der Wikipedia-Artikel liegt, um die Unordnung zu reduzieren, haben wir nur den Inhalt aus dem Unterordner des text in unseren HG-Datensatz übertragen und alle anderen Unterdreher entfernt.
Wenn Sie den Bot selbst ausführen möchten, was optional ist, da die abgekratzten Dokumente bereits im Umarmungsgesicht verfügbar sind, müssten Sie entweder alle Dateien aus dem Text-Unterordner in das Verzeichnis rag_files kopieren und dann alle Unterordner in rag_files löschen oder einfach die rag_files_path in config.yaml zu rag_files/text ändern.
indexing.pyZeugen Sie die Dokumente durch Ausführen:
python indexing.py
Dieses Skript verarbeitet die Dokumente, erzeugt Einbettungen und speichert sie in Pulsejet. Wenn Sie keine Zeit für die Generierung von Einbettungen verlieren möchten, können Sie vorhandene Einbettungsdings von https://huggingface.co/jetengine/rag_art_deco_embedings herunterladen und in der Konfiguration use_precalculated_embeddings: true festlegen.
In unserer Setup -Erzeugung von Einbettungen dauert die Fertigstellung und das Einsetzen von Vektoren in Pulsejet ungefähr 4 Sekunden .
Das Skript gibt Zeitinformationen aus:
chat.pyStellen Sie sicher, dass Ihre Konfiguration korrekt ist, und dann ausführen:
python chat.py
Dieses Skript findet verschiedene LLMs und das RAG -System ab und ergibt zum Vergleich zu HTML-, JSON- und CSV -Formaten.
Pulsejet wird in diesem Projekt zur effizienten Speicherung und Abruf von Vektoren verwendet. Hier ist ein detaillierter Überblick darüber, wie Pulsejet in unser Art -Deco -Chatbot -Projekt integriert ist:
Initialisierung des Pulsejet -Clients :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) Dies schafft einen Pulsejet -Client. In unserem Projekt verwenden wir eine Remote -Pulsejet -Instanz, sodass der location auf "Remote" eingestellt ist. Dies stellt eine Verbindung zu einem Pulsejet -Server her, der in einem Docker -Container ausgeführt wird.
Erstellen einer Sammlung :
client . create_collection ( collection_name , vector_config ) Dadurch werden in Pulsejet eine neue Sammlung erstellt, um unsere Dokumenteinbettungen zu speichern. Der Parameter vector_config gibt die Konfiguration für den Vektorspeicher an, wie z.
Einfügen von Vektoren : In unserem Projekt verwenden wir das folgende Muster zum Einfügen von Vektoren:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )Dies mag zunächst verwirrend aussehen, aber hier ist, was es bedeutet:
collection[0] ist eigentlich unsere Pulsejet -Client -Instanz.collection[1] ist der Name der Sammlung, in die wir einfügen.embed ist der Vektor, den wir einfügen.meta ist zusätzliche Metadaten, die mit dem Vektor assoziiert sind.Dies entspricht dem Anruf:
client . insert_single ( collection_name , vector , meta )Für Masseninsertionen verwenden wir:
client . insert_multi ( collection_name , embeds )Dies fügt mehrere Einbettungen gleichzeitig ein, was für große Datensätze effizienter ist.
Vektoren suchen :
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None ) Dies führt eine Ähnlichkeitssuche in der angegebenen Pulsejet -Sammlung durch, um die relevantesten Dokumente für einen bestimmten Abfragevektor zu finden. Der limit gibt die maximale Anzahl der zurückgegebenen Ergebnisse an.
In unserem Projekt wird client['db'] verwendet, um auf die Datenbankmethoden des Pulsejet -Clients zuzugreifen. Dies entspricht der direkten Verwendung des Clients direkt:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )Schließen der Verbindung :
client . close ()Dies schließt die Verbindung zur Pulsejet -Datenbank, wenn sie nicht mehr benötigt wird.
Die PulsejetRagClient Klasse ist in pulsejet_rag_client.py definiert und bietet eine hochrangige Schnittstelle zum Interagieren mit Pulsejet im Kontext unseres Lappensystems. Hier ist eine Aufschlüsselung seiner Schlüsselkomponenten:
Initialisierung :
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])Der Client wird mit Konfigurationsparametern initialisiert, den Pulsejet -Client eingerichtet und relevante Konfigurationswerte gespeichert.
Erstellen einer Sammlung :
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " ) Diese Methode erstellt eine neue Sammlung im Pulsejet mit den angegebenen Parametern. Es verwendet die Funktion get_vector_size , um die entsprechende Vektorgröße für die Einbettungen zu bestimmen.
Einfügen von Vektoren :
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )Diese Methoden verarbeiten die Einführung von Einzel- und Mehrfachvektoren in die Pulsejet -Sammlung zusammen mit ihren zugehörigen Metadaten.
Vektoren suchen :
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []Diese Methode führt eine Ähnlichkeitssuche in der Pulsejet -Sammlung durch, um die relevantesten Dokumente für einen bestimmten Abfragevektor zu finden.
Schließen der Verbindung :
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )Diese Methode schließt die Verbindung zur Pulsejet -Datenbank, wenn sie nicht mehr benötigt wird.
Der PulsejetRagClient wird während des gesamten Projekts verwendet, um mit Pulsejet zu interagieren. So wird es normalerweise instanziiert und verwendet:
Schöpfung :
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )Indexierungsdokumente :
In indexing.py verwenden wir den Client, um die Sammlung zu erstellen und Vektoren einzufügen:
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) In rag.py verwenden wir den Client, um während des RAG -Prozesses nach ähnlichen Vektoren zu suchen:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )Nach Abschluss der Operationen schließen wir die Verbindung:
rag_client . close ()Diese Implementierung bietet eine saubere, eingekapselte Schnittstelle für alle Pulsejet -Operationen in unserem Lappensystem.
LLama3.1 dauern länger als die Beantwortung der einfachen Frage, die aufgrund der erhöhten Abfragelänge beantwortet werden.Der Art -Deco -Chatbot zeigt, wie LLMs besser mit Lappen genutzt werden können. Unser Projekt bietet eine umfassende Untersuchung der Lag -Implementierung, die jeden Schritt von Datenkratzen und Dokumentenstücken bis hin zur Einbettung der Erstellung und der Integration von Vektordatenbanken abdeckt.
Wenn die Dokumentbasis für ein Lappensystem größer wird, wird die Leistung von Einfügen und Suchvorgängen immer kritischer. Durch das Lernen, wie die Pulsejet-Vektor-Datenbank in ein vollwertiges Lag-System integriert wird, kann man von ihren Funktionen erheblich profitieren, insbesondere wenn man sich mit Lag-Anwendungen auf großen Dokumentbasen befasst.
Unsere Lappenantworten hätten genauer sein können. Um die Leistung unseres Art Deco Chatbot zu verbessern, erwägen wir mehrere experimentelle Ansätze:
Wir planen, dieses Projekt durch die folgenden Initiativen zu erweitern:
Wir ermutigen Sie, mit dem Art -Deco -Chatbot zu experimentieren, seine Parameter zu ändern und an Ihre eigenen Interessensbereiche anzupassen.
Autor: Güvenç Usanmaz