Elasticsearch verfügt über native Integrationen mit den branchenführenden Gen-AI-Tools und -Anbietern. Sehen Sie sich unsere Webinare zu den Themen „RAG-Grundlagen“ oder zum „Erstellen produktionsreifer Apps“ mit der Elastic-Vektordatenbank an.
Um die besten Suchlösungen für Ihren Anwendungsfall zu entwickeln, starten Sie jetzt eine kostenlose Cloud-Testversion oder testen Sie Elastic auf Ihrem lokalen Rechner.
In diesem Blogbeitrag werden wir erläutern, wie man ein Q&A-Erlebnis mithilfe einer RAG-Technik (Retrieval Augmented Generation) und Elasticsearch als Vektordatenbank implementiert. Wir werden LlamaIndex und ein lokal laufendes Mistral LLM verwenden.
Bevor wir anfangen, werden wir uns einige Fachbegriffe ansehen.
Terminologie
LlamaIndex ist ein führendes Datenframework für die Entwicklung von LLM-Anwendungen (Large Language Model). LlamaIndex bietet Abstraktionen für verschiedene Phasen der Entwicklung einer RAG-Anwendung (Retrieval Augmented Generation). Frameworks wie LlamaIndex und LangChain bieten Abstraktionen, damit Anwendungen nicht eng an die APIs eines bestimmten LLM gekoppelt werden.
Elasticsearch wird von Elastic angeboten. Elastic ist ein Branchenführer hinter Elasticsearch, einer Such- und Analyse-Engine, die Volltextsuche für Präzision, Vektorsuche für semantisches Verständnis und Hybridsuche für das Beste aus beiden Welten unterstützt. Elasticsearch ist ein skalierbarer Datenspeicher und eine Vektordatenbank. Die in diesem Blog verwendeten Elasticsearch-Funktionen sind in der kostenlosen Open-Source-Version von Elasticsearch verfügbar.
Retrieval Augment Generation (RAG) ist eine KI-Technik bzw. ein KI-Muster, bei dem LLMs mit externem Wissen ausgestattet werden, um Antworten auf Benutzeranfragen zu generieren. Dadurch können die LLM-Antworten auf den jeweiligen Kontext zugeschnitten werden und sind spezifischer.
Mistral bietet sowohl Open-Source- als auch optimierte LLM-Modelle für Unternehmen an. In diesem Tutorial verwenden wir deren Open-Source-Modell Mistral-7b , das auf Ihrem Laptop läuft. Falls Sie das Modell nicht auf Ihrem Laptop ausführen möchten, können Sie alternativ die Cloud-Version nutzen. In diesem Fall müssen Sie den Code in diesem Blog anpassen, um die richtigen API-Schlüssel und Pakete zu verwenden.
Ollama hilft dabei, LLMs lokal auf Ihrem Laptop auszuführen. Wir werden Ollama verwenden, um das Open-Source-Modell Mistral-7b lokal auszuführen.
Einbettungen sind numerische Repräsentationen der Bedeutung von Texten/Medien. Es handelt sich um niedrigdimensionale Darstellungen hochdimensionaler Informationen.
Erstellung einer RAG-Anwendung mit LlamaIndex, Elasticsearch und Mistral: Szenarioübersicht
Szenario:
Wir verfügen über einen Beispieldatensatz (als JSON-Datei) mit Callcenter-Gesprächen zwischen Agenten und Kunden eines fiktiven Hausratversicherungsunternehmens. Wir werden eine einfache RAG-Anwendung entwickeln, die Fragen wie diese beantworten kann:
Give me summary of water related issues.
Hoher Durchfluss

Wir betreiben Mistral LLM lokal mit Ollama.
Als nächstes laden wir Konversationen aus der JSON-Datei als Documents in den ElasticsearchStore (einen VectorStore, der von Elasticsearch unterstützt wird). Beim Laden der Dokumente erstellen wir Einbettungen mithilfe des lokal laufenden Mistral-Modells. Wir speichern diese Einbettungen zusammen mit den Konversationen im LlamaIndex Elasticsearch Vector Store (ElasticsearchStore).
Wir konfigurieren eine LlamaIndex IngestionPipeline und stellen ihr den lokal verwendeten LLM zur Verfügung, in diesem Fall Mistral, das über Ollama läuft.
Wenn wir eine Frage stellen wie „Geben Sie mir eine Zusammenfassung der wichtigsten wasserbezogenen Probleme.“ Elasticsearch führt eine semantische Suche durch und liefert Konversationen zum Thema Wasser. Diese Konversationen werden zusammen mit der ursprünglichen Frage an das lokal laufende LLM gesendet, um eine Antwort zu generieren.
Schritte zum Erstellen der RAG-Anwendung
Mistral lokal ausführen
Laden Sie Ollama herunter und installieren Sie es. Nach der Installation von Ollama führen Sie diesen Befehl aus, um Mistralherunterzuladen und auszuführen.
Das Herunterladen und erstmalige lokale Ausführen des Modells kann einige Minuten dauern. Prüfen Sie, ob Mistral weht, indem Sie eine Frage wie die folgende stellen: „Schreibe ein Gedicht über Wolken“ und prüfen Sie, ob Ihnen das Gedicht gefällt. Bitte lassen Sie ollama laufen, da wir später über Code mit dem Mistral-Modell interagieren müssen.
Elasticsearch installieren
Elasticsearch lässt sich entweder durch Erstellen einer Cloud-Bereitstellung (Anleitung hier) oder durch Ausführen in Docker (Anleitung hier) in Betrieb nehmen. Sie können auch eine produktionsreife, selbstgehostete Elasticsearch-Bereitstellung erstellen, indem Sie hier beginnen.
Sofern Sie die Cloud-Bereitstellung nutzen, besorgen Sie sich den API-Schlüssel und die Cloud-ID für die Bereitstellung, wie in der Anleitung beschrieben. Wir werden sie später verwenden.
RAG-Anwendung
Der vollständige Code ist als Referenz in diesem GitHub-Repository zu finden. Das Klonen des Repos ist optional, da wir den Code im Folgenden durchgehen werden.
Erstellen Sie in Ihrer bevorzugten IDE eine neue Python-Anwendung mit den folgenden 3 Dateien.
index.pyHierhin wird der Code für die Indizierung von Daten eingefügt.query.pyHier wird der Code für Abfragen und die Interaktion mit LLM eingefügt..envdort, wo Konfigurationseigenschaften wie API-Schlüssel gespeichert werden.
Wir müssen einige Pakete installieren. Wir beginnen damit, eine neue virtuelle Python-Umgebung im Stammverzeichnis Ihrer Anwendung zu erstellen.
Aktivieren Sie die virtuelle Umgebung und installieren Sie die unten aufgeführten erforderlichen Pakete.
Indexierungsdaten
Laden Sie die Datei conversations.json herunter, die Konversationen zwischen Kunden und Callcenter-Mitarbeitern unseres fiktiven Hausversicherungsunternehmens enthält. Platzieren Sie die Datei im Stammverzeichnis der Anwendung zusammen mit den beiden Python-Dateien und der .env-Datei. die Datei, die Sie zuvor erstellt haben. Nachfolgend ein Beispiel für den Inhalt der Datei.
Wir definieren eine Funktion namens get_documents_from_file in index.py , die die JSON-Datei liest und eine Liste von Dokumenten erstellt. Dokumentobjekte sind die grundlegende Informationseinheit, mit der LlamaIndex arbeitet.
IngestionPipeline erstellen
Fügen Sie zunächst die Elasticsearch CloudID und die API-Schlüssel, die Sie im Abschnitt Install Elasticsearch erhalten haben, in die Datei .env ein. Ihre .env -Datei sollte wie folgt aussehen (mit realen Werten).
Mit LlamaIndex IngestionPipeline können Sie eine Pipeline aus mehreren Komponenten zusammensetzen. Fügen Sie den unten stehenden Code in die Datei index.py ein.
Wie bereits erwähnt, kann die LlamaIndex IngestPipeline aus mehreren Komponenten zusammengesetzt sein. Wir fügen der Pipeline in Zeile pipeline = IngestionPipeline(... 3 Komponenten hinzu.
- SentenceSplitter: Wie aus der Definition von
get_documents_from_file()hervorgeht, verfügt jedes Dokument über ein Textfeld, das die in der JSON-Datei gefundene Konversation enthält. Dieses Textfeld enthält einen langen Text. Damit die semantische Suche gut funktioniert, muss der Text in kleinere Abschnitte unterteilt werden. Die Klasse SentenceSplitter erledigt das für uns. Diese Abschnitte werden in der LlamaIndex-Terminologie als Knoten bezeichnet. Die Knoten enthalten Metadaten, die auf das Dokument verweisen, zu dem sie gehören. Alternativ können Sie auch Elasticsearch Ingestpipeline für das Chunking verwenden, wie in diesem Blog gezeigt. - OllamaEmbedding: Embedding-Modelle wandeln einen Textabschnitt in Zahlen (auch Vektoren genannt) um. Die numerische Darstellung ermöglicht uns die semantische Suche, bei der die Suchergebnisse der Bedeutung des Wortes entsprechen, anstatt nur eine Textsuche durchzuführen. Wir stellen der IngestionPipeline
OllamaEmbedding("mistral")zur Verfügung. Die mit SentenceSplitter aufgeteilten Chunks werden über Ollama an das auf Ihrem lokalen Rechner laufende Mistral-Modell gesendet. Mistral erstellt dann Einbettungen für die Chunks. - ElasticsearchStore: Der LlamaIndex ElasticsearchStore-Vektorspeicher sichert die in einen Elasticsearch-Index erstellten Einbettungen. ElasticsearchStore kümmert sich um das Erstellen und Befüllen des angegebenen Elasticsearch-Index mit Inhalten. Beim Erstellen des ElasticsearchStore (referenziert durch
es_vector_store) geben wir den Namen des Elasticsearch-Index an, den wir erstellen möchten (callsin unserem Fall ), das Feld im Index, in dem die Einbettungen gespeichert werden sollen (conversation_vectorin unserem Fall ) und das Feld, in dem der Text gespeichert werden soll (conversationin unserem Fall ). Zusammenfassend lässt sich sagen, dass auf Basis unserer KonfigurationElasticsearchStoreein neuer Index in Elasticsearch mitconversation_vectorundconversationals Feldern (neben anderen automatisch erstellten Feldern) erstellt wird.
Um das Ganze zusammenzuführen, starten wir die Pipeline durch den Aufruf von pipeline.run(documents=documents).
Führen Sie das Skript index.py aus, um die Ingest-Pipeline zu starten:
Sobald der Pipeline-Lauf abgeschlossen ist, sollte in Elasticsearch ein neuer Index mit dem Namen calls angezeigt werden. Wenn Sie eine einfache Elasticsearch-Abfrage über die Entwicklerkonsole ausführen, sollten Sie die geladenen Daten zusammen mit den Einbettungen sehen können.
Zusammenfassend lässt sich sagen, dass wir bisher Dokumente aus einer JSON-Datei erstellt, diese in Abschnitte unterteilt, Einbettungen für diese Abschnitte erstellt und die Einbettungen (sowie die Textkonversation) in einem Vektorspeicher (ElasticsearchStore) gespeichert haben.
Abfrage
Mit dem llamaIndex VectorStoreIndex können Sie relevante Dokumente abrufen und Daten abfragen. Standardmäßig speichert VectorStoreIndex Einbettungen im Arbeitsspeicher in einem SimpleVectorStore. Alternativ können jedoch externe Vektorspeicher (wie ElasticsearchStore) verwendet werden, um die Einbettungen persistent zu machen.
Öffnen Sie query.py und fügen Sie den folgenden Code ein.
Wir definieren ein lokales LLM (local_llm), das auf das Mistral-Modell verweist, das auf Ollama läuft. Als nächstes erstellen wir einen VectorStoreIndex (index) aus dem zuvor erstellten ElasticsearchStore-Vektorspeicher und erhalten dann eine Abfrage-Engine aus dem Index. Beim Erstellen der Abfrage-Engine verweisen wir auf das lokale LLM, das zur Beantwortung verwendet werden soll. Wir geben außerdem (similarity_top_k=10) an, um die Anzahl der Dokumente zu konfigurieren, die aus dem Vektorspeicher abgerufen und an das LLM gesendet werden sollen, um eine Antwort zu erhalten.
Führen Sie das Skript query.py aus, um den RAG-Ablauf auszuführen:
Wir senden die Anfrage Give me summary of water related issues (Sie können query gerne anpassen) und die Antwort des LLM, die mit zugehörigen Dokumenten geliefert wird, sollte in etwa wie folgt aussehen.
Im gegebenen Kontext sehen wir mehrere Fälle, in denen Kunden nach einer Deckung für Wasserschäden gefragt haben. In zwei Fällen verursachten Überschwemmungen Schäden an Kellern, in einem weiteren Fall waren Dachlecks das Problem. Die Agenten bestätigten, dass beide Arten von Wasserschäden durch ihre jeweiligen Versicherungsbedingungen abgedeckt sind. Daher sind Probleme im Zusammenhang mit Wasser, wie Überschwemmungen und Dachlecks, typischerweise durch Wohngebäudeversicherungen abgedeckt.
Einige Einschränkungen:
Dieser Blogbeitrag ist eine Einführung für Anfänger in die RAG-Technik mit Elasticsearch und lässt daher die Konfiguration von Funktionen aus, die es Ihnen ermöglichen, diesen Ausgangspunkt in die Produktion zu überführen. Bei der Entwicklung für Produktionsanwendungen sollten Sie komplexere Aspekte berücksichtigen, wie z. B. die Möglichkeit, Ihre Daten mit Document Level Security zu schützen, Ihre Daten im Rahmen einer Elasticsearch Ingest-Pipeline in Chunking-Aufteilung aufzuteilen oder sogar andere ML-Jobs auf denselben Daten auszuführen, die für GenAI/Chat/Q&A-Anwendungsfälle verwendet werden.
Sie könnten auch in Erwägung ziehen, Daten aus verschiedenen externen Quellen (z. B. Azure Blob Storage, Dropbox, Gmail usw.) zu beziehen und Einbettungen mithilfe von Elastic Connectors zu erstellen.
Elastic macht all das und noch viel mehr möglich und bietet eine umfassende Lösung auf Unternehmensebene für GenAI-Anwendungsfälle und darüber hinaus.
Was kommt als Nächstes?
- Möglicherweise ist Ihnen aufgefallen, dass wir 10 thematisch zusammenhängende Konversationen zusammen mit der Benutzerfrage an das LLM senden, damit dieses eine Antwort formulieren kann. Diese Gespräche können personenbezogene Daten (PII) wie Name, Geburtsdatum, Adresse usw. enthalten. In unserem Fall ist das LLM lokal, daher ist ein Datenleck kein Problem. Wenn Sie jedoch ein LLM in der Cloud (z. B. OpenAI) verwenden möchten, ist es nicht wünschenswert, Texte zu senden, die personenbezogene Daten enthalten. In einem Folgeblogbeitrag werden wir sehen, wie man personenbezogene Daten maskiert, bevor man sie im RAG-Flow an externe LLMs sendet.
- In diesem Beitrag haben wir ein lokales LLM verwendet. Im kommenden Beitrag über die Maskierung personenbezogener Daten in RAG werden wir uns ansehen, wie man einfach von einem lokalen LLM zu einem öffentlichen LLM wechseln kann.
Häufige Fragen
Was ist LlamaIndex?
LlamaIndex ist ein führendes Datenframework für die Entwicklung von LLM-Anwendungen (Large Language Model).
Was ist Mistral?
Mistral ist ein Unternehmen, das sowohl Open-Source- als auch optimierte LLM-Modelle für Unternehmen anbietet.




