In der sich schnell entwickelnden Welt der KI überschreiten große Sprachmodelle Grenzen in Geschwindigkeit, Genauigkeit und Kosteneffizienz. Die kürzlich veröffentlichte Veröffentlichung von Deepseek R1, einem Open-Source-Modell, das OpenAs O1 mit sich bringt, ist ein heißes Thema im KI-Bereich, insbesondere angesichts der 27-fachen niedrigeren Kosten und der überlegenen Argumentationsfähigkeiten. Kombinieren Sie dies mit der binären Quantisierung von QDrant für effiziente und schnelle Vektorsuche. Wir können über 1.000 Seitendokumente indexieren. In diesem Artikel erstellen wir einen Bhagavad Gita AI-Assistenten, der in der Lage ist, 1.000 Seiten zu indizieren, komplexe Abfragen in Sekunden mit GRQ zu beantworten und Erkenntnisse mit domänenspezifischer Präzision zu liefern.
Dieser Artikel wurde als Teil des Data Science -Blogathon veröffentlicht.
Aus meiner bisherigen Erfahrung leistet Deepseek einen großartigen Job mit mathematischen Argumentation, kodierbedingten Anwendungsfällen und kontextbewussten Eingabeaufforderungen.
Was ist die binäre Quantisierung in Vektor -Datenbanken?Binärquantisierung (BQ) ist die Indexierungskompressionstechnik von QDrant, um die hochdimensionale Speicherung und das Abrufen von Vektoren zu optimieren. Durch die Konvertierung von 32-Bit-Gleitkommavektoren in 1-Bit-Binärwerte wird die Speicherverwendung durch 40X und die Suchgeschwindigkeiten dramatisch beschleunigt.
Binärquantisierung für die Verschiebungsdimensionsvektoren vermeiden (& lt; 1024), wobei der Informationsverlust die Genauigkeit erheblich beeinflusst. Die traditionelle Skalarquantisierung (z. B. Uint8) kann besser Einbettungen entsprechen.
unten ist das Flussdiagramm, das erklärt, wie wir Bhagwad Gita Assistant erstellen können:
Architekturübersicht
Befolgen wir nun die Schritte um eins:
Lassen Sie uns das Fundament unserer RAG -Pipeline mit Lamaindex einrichten. Wir müssen essentielle Pakete, einschließlich der Core Lamaindex -Bibliothek, der QDRant Vector Store -Integration, der Fastembed für Einbettungen und GROQ für LLM -Zugriff installieren.
Hinweis:
!pip install llama-index !pip install llama-index-vector-stores-qdrant llama-index-embeddings-fastembed !pip install llama-index-readers-file !pip install llama-index-llms-groq
Importieren wir nach Abschluss der Installation die erforderlichen Module.
import logging import sys import os import qdrant_client from qdrant_client import models from llama_index.core import SimpleDirectoryReader from llama_index.embeddings.fastembed import FastEmbedEmbedding from llama_index.llms.groq import Groq # deep seek r1 implementation
Hier übernehmen wir die entscheidende Aufgabe, Rohtext in Vektordarstellungen umzuwandeln. Der SimpleDirectoryReader lädt Dokumente aus einem angegebenen Ordner.
Erstellen Sie einen Ordner, d. H. Ein Datenverzeichnis, und fügen Sie alle Ihre Dokumente hinzu. In unserem Fall haben wir das Bhagavad Gita -Dokument heruntergeladen und im Datenordner gespeichert.
Sie können das ~ 900-seitige Bhagavad Gita-Dokument hier herunterladen: iskconmangaluru
!pip install llama-index !pip install llama-index-vector-stores-qdrant llama-index-embeddings-fastembed !pip install llama-index-readers-file !pip install llama-index-llms-groq
QDrant ist eine leichte, schnelle Python -Bibliothek für die effiziente Einbettungserzeugung. Es unterstützt beliebte Textmodelle und verwendet quantisierte Modellgewichte zusammen mit der ONNX -Laufzeit für Inferenz, um eine hohe Leistung ohne starke Abhängigkeiten zu gewährleisten.
Um die Textbrocken in Einbettung umzuwandeln, werden wir das Fastembed von QDrant verwenden. Wir verarbeiten diese in Stapeln von 50 Dokumenten, um den Speicher effizient zu verwalten.
import logging import sys import os import qdrant_client from qdrant_client import models from llama_index.core import SimpleDirectoryReader from llama_index.embeddings.fastembed import FastEmbedEmbedding from llama_index.llms.groq import Groq # deep seek r1 implementation
Zeit für den Konfigurieren von QDRant -Client, unsere Vektor -Datenbank, mit optimierten Einstellungen für die Leistung. Wir erstellen eine Sammlung mit dem Namen „Bhagavad-Gita“ mit spezifischen Vektorparametern und ermöglichen eine binäre Quantisierung für eine effiziente Speicherung und Abruf.
Es gibt drei Möglichkeiten, den QDrant -Client zu verwenden:
Beachten Sie, dass der Sammlungsname eindeutig sein muss, nachdem jede Daten geändert werden müssen.
data = SimpleDirectoryReader("data").load_data() texts = [doc.text for doc in data] embeddings = [] BATCH_SIZE = 50
Wir prüfen zuerst, ob eine Sammlung mit dem angegebenen Collection_Name in QDrant vorhanden ist. Wenn dies nicht der Fall ist, erstellen wir nur eine neue Sammlung, die zum Speichern von 1.024-dimensionalen Vektoren konfiguriert ist, und verwenden Cosinus-Ähnlichkeit für die Entfernungsmessung.
Wir ermöglichen einen On-Disk-Speicher für die ursprünglichen Vektoren und wenden eine binäre Quantisierung an, die die Vektoren komprimiert, um die Speicherverwendung zu reduzieren und die Suchgeschwindigkeit zu verbessern. Der Parameter "Always_Ram" stellt sicher, dass die quantisierten Vektoren für einen schnelleren Zugriff im RAM gehalten werden.
embed_model = FastEmbedEmbedding(model_name="thenlper/gte-large") for page in range(0, len(texts), BATCH_SIZE): page_content = texts[page:page + BATCH_SIZE] response = embed_model.get_text_embedding_batch(page_content) embeddings.extend(response)
Der Indexierungsprozess lädt unsere verarbeiteten Dokumente und ihre Einbettungen in QDrant in Stapeln hoch. Jedes Dokument wird neben seiner Vektordarstellung gespeichert und eine durchsuchbare Wissensbasis erstellt.
Die GPU wird zu diesem Zeitpunkt verwendet, und je nach Datengröße kann dieser Schritt einige Minuten dauern.
collection_name = "bhagavad-gita" client = qdrant_client.QdrantClient( #location=":memory:", url = "QDRANT_URL", # replace QDRANT_URL with your endpoint api_key = "QDRANT_API_KEY", # replace QDRANT_API_KEY with your API keys prefer_grpc=True )
Die Suchfunktion nimmt eine Benutzerabfrage an, konvertiert sie in eine Einbettung und ruft die relevantesten Dokumente von QDRant basierend auf der Ähnlichkeit von Cosinus ab. Wir demonstrieren dies mit einer Stichprobe-Abfrage über den Bhagavad-Gītā, der zeigen, wie man auf den abgerufenen Kontext zugreift und drucken kann.
!pip install llama-index !pip install llama-index-vector-stores-qdrant llama-index-embeddings-fastembed !pip install llama-index-readers-file !pip install llama-index-llms-groq
Für Rag ist es wichtig, die Interaktionsvorlage des Systems mithilfe von ChatpromptTemplate zu definieren. Die Vorlage erstellt einen spezialisierten Assistenten, der in Bhagavad-Gita kennt, in der Lage, mehrere Sprachen zu verstehen (Englisch, Hindi, Sanskrit).
Es enthält eine strukturierte Formatierung für die Kontextinjektion und Abfragehandhabung mit klaren Anweisungen zum Umgang mit außerhalb der Kontext.
import logging import sys import os import qdrant_client from qdrant_client import models from llama_index.core import SimpleDirectoryReader from llama_index.embeddings.fastembed import FastEmbedEmbedding from llama_index.llms.groq import Groq # deep seek r1 implementation
Die endgültige Pipeline bringt alles in einem zusammenhängenden Lappensystem zusammen. Es folgt dem Muster der Abruf-Augment-Generate: Abrufen relevanter Dokumente, erweitert sie mit unserer speziellen Eingabeaufforderung und Generierung von Antworten mithilfe des LLM. Hier für LLM werden wir Deepseek R-1 Distill LLAMA 70 B verwenden, die auf GROQ gehostet werden. Holen Sie sich Ihre Schlüssel von hier aus: GROQ-Konsole.
data = SimpleDirectoryReader("data").load_data() texts = [doc.text for doc in data] embeddings = [] BATCH_SIZE = 50
embed_model = FastEmbedEmbedding(model_name="thenlper/gte-large") for page in range(0, len(texts), BATCH_SIZE): page_content = texts[page:page + BATCH_SIZE] response = embed_model.get_text_embedding_batch(page_content) embeddings.extend(response)
Was ist nun, wenn Sie diese Anwendung erneut verwenden müssen? Sollen wir uns alle Schritte noch einmal unterziehen?
Die Antwort ist nein.
Es gibt keinen großen Unterschied in dem, was Sie bereits geschrieben haben. Wir werden die gleiche Such- und Pipeline -Funktion zusammen mit dem Sammlungsnamen wiederverwenden, den wir für die Ausführung der query_points ausführen müssen.
collection_name = "bhagavad-gita" client = qdrant_client.QdrantClient( #location=":memory:", url = "QDRANT_URL", # replace QDRANT_URL with your endpoint api_key = "QDRANT_API_KEY", # replace QDRANT_API_KEY with your API keys prefer_grpc=True )
Wir werden die gleichen oben genannten zwei Funktionen und message_template in der streamlit app.py verwenden.
In stromloser Nach jeder Benutzerfrage wird der Status aktualisiert. Um die gesamte Seite erneut zu aktualisieren, definieren wir einige Initialisierungsschritte unter streamlit cache_resource.
Denken Sie daran, wenn der Benutzer die Frage eingibt, lädt das Fastembed die Modellgewichte nur einmal herunter, das gilt auch für die Soinierung von COQ und QDrant.
if not client.collection_exists(collection_name=collection_name): client.create_collection( collection_name=collection_name, vectors_config=models.VectorParams(size=1024, distance=models.Distance.COSINE, on_disk=True), quantization_config=models.BinaryQuantization( binary=models.BinaryQuantizationConfig( always_ram=True, ), ), ) else: print("Collection already exists")
Wenn Sie die Antwortausgabe bemerkt haben, ist das Format & lt; denken & gt; Argumentation & lt;/denken & gt; Antwort.
Auf der Benutzeroberfläche möchte ich die Argumentation unter dem optimistischen Expander behalten, um den Argumentationsteil abzurufen.
for idx in range(0, len(texts), BATCH_SIZE): docs = texts[idx:idx + BATCH_SIZE] embeds = embeddings[idx:idx + BATCH_SIZE] client.upload_collection(collection_name=collection_name, vectors=embeds, payload=[{"context": context} for context in docs]) client.update_collection(collection_name= collection_name, optimizer_config=models.OptimizersConfigDiff(indexing_threshold=20000))
iteriert gespeicherte Nachrichten und zeigt sie in einer Chat-ähnlichen Oberfläche an. Für Assistentenantworten trennt es den Denkprozess (in einem erweiterbaren Abschnitt angezeigt) von der tatsächlichen Antwort unter Verwendung der Funktion extract_tininking_and_answer.
Das verbleibende Code -Stück ist ein Standardformat zum Definieren der Chatbot -Komponente in Streamlit, d. H. Eingabedehnung, das ein Eingabefeld für Benutzerfragen erstellt. Wenn eine Frage eingereicht wird, wird sie angezeigt und dem Nachrichtenverlauf hinzugefügt. Jetzt verarbeitet es die Frage des Benutzers über die RAG -Pipeline und zeigt einen Ladespinner an. Die Antwort wird in den Denkprozess aufgeteilt und beantwortet Komponenten.
!pip install llama-index !pip install llama-index-vector-stores-qdrant llama-index-embeddings-fastembed !pip install llama-index-readers-file !pip install llama-index-llms-groq
Durch Kombination der Argumentation von Deepseek R1, der Binärquantisierung von QDrant und Lamaindex haben wir einen AI-Assistenten gebaut, der 1000 Seiten mit 23-Sekunden-Sekunden-Antworten liefert. Dieses Projekt unterstreicht, wie domänenspezifische LLMs und optimierte Vektordatenbanken den Zugriff auf alte Texte demokratisieren und gleichzeitig die Kosteneffizienz beibehalten können. Wenn sich Open-Source-Modelle weiterentwickeln, sind die Möglichkeiten für Nischen-AI-Anwendungen unbegrenzt.
a. Minimale Auswirkungen auf den Rückruf! Die Überabtastung von QDrant hat die Top-Kandidaten mit ursprünglichen Vektoren erneut durchführen, die Genauigkeit beibehalten, während die Geschwindigkeit 40x und die Verringerung des Speicherverbrauchs um 97%gesteigert wird.
Q2. Kann der Fastembed nicht englische Texte wie Sanskrit/Hindi?a. Ja! Die Lag -Pipeline verwendet die Einbettungen von Fastembed und die Sprachflexibilität von Deepseek R1. Benutzerdefinierte Eingabeaufforderungen für die Eingabeaufforderung in Englisch, Hindi oder Sanskrit. Während Sie das Einbettungsmodell verwenden können, das Hindi -Token verstehen kann, verstehen Sie in unserem Fall das verwendete Token Englisch und Hindi -Text.
Q3. Warum Deepseek R1 über OpenAI O1?a auswählen. Deepseek R1 bietet 27x niedrigere API-Kosten, vergleichbare Argumentationsgenauigkeit (20,5% gegenüber O1s 21%) und überlegene Codierung/domänenspezifische Leistung. Es ist ideal für spezielle Aufgaben wie die Schriftanalyse, bei denen Kosten und fokussierte Fachwissen wichtig sind.
Die in diesem Artikel gezeigten Medien sind nicht im Besitz von Analytics Vidhya und wird nach Ermessen des Autors verwendet.
Das obige ist der detaillierte Inhalt vonBau eines Bhagavad Gita AI -Assistenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!