Mit Elasticsearch können Sie Daten schnell und flexibel indexieren. Testen Sie es kostenlos in der Cloud oder führen Sie es lokal aus, um zu erfahren, wie einfach die Indizierung sein kann.
In diesem Artikel implementieren wir eine Suchmaschine für FAQs, wobei wir LlamaIndex zur Datenindizierung verwenden. Elasticsearch dient als unsere Vektordatenbank und ermöglicht die Vektorsuche, während RAG (Retrieval-Augmented Generation) den Kontext anreichert und so genauere Antworten liefert.

Was ist LlamaIndex?
LlamaIndex ist ein Framework, das die Erstellung von Agenten und Workflows erleichtert, die auf großen Sprachmodellen (LLMs) basieren und mit spezifischen oder privaten Daten interagieren. Es ermöglicht die Integration von Daten aus verschiedenen Quellen (APIs, PDFs, Datenbanken) in LLMs und ermöglicht so Aufgaben wie Recherche, Informationsgewinnung und die Generierung kontextbezogener Antworten.
Schlüsselkonzepte:
- Agenten: Intelligente Assistenten, die LLMs verwenden, um Aufgaben auszuführen, die von einfachen Antworten bis hin zu komplexen Aktionen reichen.
- Workflows: Mehrstufige Prozesse, die Agenten, Datenkonnektoren und Tools für fortgeschrittene Aufgaben kombinieren.
- Kontexterweiterung: Eine Technik, die das LLM mit externen Daten anreichert und so seine Trainingsbeschränkungen überwindet.
LlamaIndex- Integration mit Elasticsearch:
Elasticsearch kann auf verschiedene Weise mit LlamaIndex verwendet werden:
- Datenquelle: Verwenden Sie den Elasticsearch Reader, um Dokumente zu extrahieren.
- Einbettungsmodell: Daten werden für semantische Suchen in Vektoren kodiert.
- Vektorspeicherung: Verwenden Sie Elasticsearch als Repository für die Suche nach vektorisierten Dokumenten.
- Erweiterter Speicher: Konfigurieren Sie Strukturen wie Dokumentzusammenfassungen oder Wissensgraphen.
Verwendung von LlamaIndex und Elasticsearch zum Erstellen einer FAQ-Suche
Datenaufbereitung
Wir werden die FAQ zum Elasticsearch-Dienst als Beispiel verwenden. Jede Frage wurde von der Webseite extrahiert und in einer separaten Textdatei gespeichert. Sie können jeden beliebigen Ansatz zur Organisation der Daten verwenden; in diesem Beispiel haben wir uns dafür entschieden, die Dateien lokal zu speichern.
Beispieldatei:
Nach dem Speichern aller Fragen sieht das Verzeichnis folgendermaßen aus:

Installation der Abhängigkeiten
Die Datenerfassung und -suche werden wir mit Hilfe der Programmiersprache Python implementieren; ich habe Version 3.9 verwendet. Als Voraussetzung müssen die folgenden Abhängigkeiten installiert werden:
Elasticsearch und Kibana werden mit Docker erstellt und über docker-compose.yml so konfiguriert, dass sie in Version 8.16.2 ausgeführt werden. Dadurch wird die Schaffung der lokalen Umgebung erleichtert.
Dokumentenaufnahme mit LlamaIndex
Die Dokumente werden mithilfe von LlamaIndex in Elasticsearch indexiert. Zuerst laden wir die Dateien mit SimpleDirectoryReader, das das Laden von Dateien aus einem lokalen Verzeichnis ermöglicht. Nach dem Laden der Dokumente werden wir sie mithilfe des VectorStoreIndex indizieren.
Die Vektorspeicher in LlamaIndex sind für das Speichern und Verwalten von Dokumenteneinbettungen zuständig. LlamaIndex unterstützt verschiedene Arten von Vektorspeichern, und in diesem Fall verwenden wir Elasticsearch. Im StorageContext konfigurieren wir die Elasticsearch-Instanz. Da der Kontext lokal ist, waren keine zusätzlichen Parameter erforderlich. Für Konfigurationen in anderen Umgebungen konsultieren Sie bitte die Dokumentation, um die erforderlichen Parameter zu überprüfen: ElasticsearchStore-Konfiguration.
Standardmäßig verwendet LlamaIndex das OpenAI text-embedding-ada-002- Modell zur Generierung von Einbettungen. In diesem Beispiel verwenden wir jedoch das Modell text-embedding-3-small . Wichtig zu beachten ist, dass für die Nutzung des Modells ein OpenAI-API-Schlüssel erforderlich ist.
Nachfolgend finden Sie den vollständigen Code für die Dokumentenaufnahme.
Nach der Ausführung werden die Dokumente wie unten dargestellt im FAQ- Index indexiert:

Suche mit RAG
Um Suchvorgänge durchzuführen, konfigurieren wir den ElasticsearchStore- Client, indem wir die Felder index_name und es_url mit der Elasticsearch-URL belegen. In retrieval_strategy haben wir die AsyncDenseVectorStrategy für Vektorsuchen definiert. Es stehen auch andere Strategien zur Verfügung, wie zum Beispiel AsyncBM25Strategy (Stichwortsuche) und AsyncSparseVectorStrategy (dünnbesetzte Vektoren). Weitere Einzelheiten finden Sie in der offiziellen Dokumentation.
Als nächstes wird ein VectorStoreIndex- Objekt erstellt, in dem wir den vector_store mithilfe des ElasticsearchStore-Objekts konfigurieren. Mit der Methode as_retriever führen wir die Suche nach den relevantesten Dokumenten für eine Anfrage durch und legen die Anzahl der zurückgegebenen Ergebnisse über den Parameter similarity_top_k auf 5 fest.
Der nächste Schritt ist RAG. Die Ergebnisse der Vektorsuche werden in eine formatierte Eingabeaufforderung für das LLM integriert, wodurch eine kontextbezogene Antwort auf Basis der abgerufenen Informationen ermöglicht wird.
In der PromptTemplate definieren wir das Prompt-Format, das Folgendes umfasst:
- Kontext ({context_str}): Vom Abrufer abgerufene Dokumente.
- Anfrage ({query_str}): die Frage des Benutzers.
- Anleitung: Richtlinien für das Modell, um kontextbezogen zu reagieren, ohne auf externes Wissen zurückzugreifen.
Schließlich verarbeitet das LLM die Eingabeaufforderung und gibt eine präzise und kontextbezogene Antwort zurück.
Der vollständige Code ist unten aufgeführt:
Nun können wir unsere Suche durchführen, zum Beispiel: „Sind Elastic-Dienste kostenlos?“, und erhalten eine kontextbezogene Antwort, die auf den FAQ-Daten selbst basiert.
Zur Erstellung dieser Antwort wurden folgende Dokumente verwendet:
Fazit
Anhand von LlamaIndex haben wir demonstriert, wie man ein effizientes FAQ-Suchsystem mit Unterstützung für Elasticsearch als Vektordatenbank erstellt. Die Dokumente werden mithilfe von Einbettungen erfasst und indexiert, wodurch Vektorsuchen ermöglicht werden. Mithilfe einer PromptTemplate werden die Suchergebnisse in den Kontext eingebunden und an das LLM gesendet, das auf Basis der abgerufenen Dokumente präzise und kontextbezogene Antworten generiert.
Dieser Workflow integriert die Informationsabfrage mit der kontextbezogenen Antwortgenerierung, um genaue und relevante Ergebnisse zu liefern.
Referenzen
https://www.elastic.co/guide/en/cloud/current/ec-faq-getting-started.html
https://docs.llamaindex.ai/en/stable/api_reference/readers/elasticsearch/
https://docs.llamaindex.ai/en/stable/module_guides/indexing/vector_store_index/
https://docs.llamaindex.ai/en/stable/examples/query_engine/custom_query_engine/
Häufige Fragen
Was ist LlamaIndex?
LlamaIndex ist ein Framework, das die Erstellung von Agenten und Workflows erleichtert, die auf großen Sprachmodellen (LLMs) basieren und mit spezifischen oder privaten Daten interagieren.
Lässt sich LlamaIndex in Elasticsearch integrieren?
Ja, Elasticsearch kann mit LlamaIndex auf verschiedene Weise verwendet werden, unter anderem als Datenquelle (mithilfe des Elasticsearch Readers zum Extrahieren von Dokumenten), als Einbettungsmodell (Kodierung von Daten in Vektoren für semantische Suchen), als Vektorspeicher (Verwendung von Elasticsearch als Repository zum Durchsuchen vektorisierter Dokumente) und für die erweiterte Speicherung (Konfiguration von Strukturen wie Dokumentzusammenfassungen oder Wissensgraphen).




