In dieser Anwendung wird die Aufnahme aller Beispieldokumente mit dem Befehl flask create-index ausgelöst. Die Implementierung dieses Befehls befindet sich in der Datei app.py im Verzeichnis api . Sie importiert einfach das Modul index_data.py aus dem Verzeichnis data und ruft dessen Funktion main() auf, die einen vollständigen Import aller in der Datei data.json gespeicherten Dokumente durchführt.

Dokumentstruktur

Die Struktur jedes Dokuments ist wie folgt:

  • name: der Dokumenttitel
  • url: eine URL zu dem auf einer externen Website gehosteten Dokument
  • summary: eine kurze Zusammenfassung des Inhalts des Dokuments
  • content: der Hauptteil des Dokuments
  • created_onErstellungsdatum
  • updated_at: Aktualisierungsdatum (kann fehlen, wenn das Dokument nie aktualisiert wurde)
  • category: die Kategorie des Dokuments, die github, sharepoint oder sein kann teams
  • rolePermissions: eine Liste der Rollenberechtigungen

Diese Beispielanwendung verwendet das Feld content als zu indizierenden Text und fügt name, summary, url, category und updated_at als zugehörige Metadaten hinzu.

Der folgende Python-Codeausschnitt zeigt, wie die Dokumente importiert werden:

Hier wird das Modul json aus der Python-Standardbibliothek verwendet, um die Datendatei zu lesen, und anschließend wird für jedes eingebundene Dokument ein Objekt Document aus Langchain erstellt. Dokumente verfügen über ein page_content -Attribut, das den in Vektoren umzuwandelnden und zu durchsuchenden Inhalt definiert, sowie über eine Reihe zusätzlicher Felder, die als Metadaten gespeichert werden. Die metadata_keys bestimmt, welche Felder aus dem Quellinhalt als Dokumentmetadaten gespeichert werden sollen.

Je nach Ihren Aufnahmeanforderungen kann die Methode verfeinert oder geändert werden. Das Langchain-Projekt bietet eine große Auswahl an Dokumentenladern , die je nach Format des Quellinhalts verwendet werden können.

Das Elastic Learned Sparse EncodeR (ELSER)-Modell

Der in dieser Anwendung verwendete Elasticsearch-Index ist so konfiguriert, dass er automatisch Sparse Vector Embeddings für alle eingefügten Dokumente erstellt. Die Funktion install_elser() in index_data.py stellt sicher, dass das ELSER-Modell auf der von Ihnen verwendeten Elasticsearch-Instanz installiert und bereitgestellt wird.

Textaufteilung

Das Feld content in diesen Dokumenten ist lang, was bedeutet, dass es durch eine einzelne Einbettung nicht vollständig dargestellt werden kann. Die gängige Lösung bei der Arbeit mit großen Textmengen besteht darin, den Text in kürzere Abschnitte zu unterteilen und anschließend Einbettungen für die einzelnen Abschnitte zu erhalten, die alle gespeichert und indiziert werden.

In dieser Anwendung wird die Klasse RecursiveCharacterTextSplitter aus der Langchain -Bibliothek verwendet, gepaart mit dem tiktoken- Encoder von OpenAI, der die Längen der Passagen in Token zählt, den gleichen Einheiten, die LLMs verwenden.

Betrachten Sie das folgende Beispiel, das veranschaulicht, wie die Textaufteilung in der Anwendung funktioniert:

Durch Setzen des Arguments chunk_size des Textsplitters kann die Länge der resultierenden Passagen gesteuert werden. Die chunk_overlap ermöglicht eine gewisse Überlappung der Passagen, was oft zu besseren Einbettungen beiträgt.

In der eigentlichen Anwendung wird der Splitter mit den folgenden Argumenten initialisiert:

Sie können diese Werte gerne ändern und beobachten, wie sich die Änderungen auf die Qualität des Chatbots auswirken. Jedes Mal, wenn Sie die Konfiguration des Splitters ändern, sollten Sie den Index durch Ausführen des Befehls flask create-index neu generieren.

Beachten Sie, dass es bei der Textaufteilung in Kombination mit dem ELSER-Modell weitere Aspekte zu berücksichtigen gilt. Für Produktionsanwendungen müssen Sie möglicherweise eine andere Tokenisierungsmethode wählen, wie in diesem Tutorial beschrieben.

Dokumentenspeicher

Die Dokumente werden in einem Elasticsearch-Index gespeichert. Der Name des Index wird durch die Umgebungsvariable ES_INDEX gesteuert, die in der Datei .env definiert ist. Datei. Standardmäßig lautet der Name dieses Index workplace-app-docs.

Die Anwendung verwendet die Klasse ElasticsearchStore , die Teil der Elasticsearch-Integration in Langchain ist, und nutzt die offizielle Elasticsearch-Clientbibliothek für Python.

Die vollständige Logik, die den Elasticsearch-Index verwaltet, wird im Folgenden dargestellt:

Die Methode ElasticsearchStore.from_documents() importiert alle in workplace_docs gespeicherten Document -Instanzen und schreibt sie an den im Argument index_name angegebenen Index. Alle Operationen werden über den im Argument es_connection angegebenen Client ausgeführt.

Das Argument strategy definiert die Art und Weise, wie dieser Index verwendet wird. Für diese Anwendung gibt die Klasse SparseVectorRetrievalStrategy an, dass für jedes Dokument Sparse Vector Embeddings verwaltet werden sollen. Dadurch wird dem Index eine Pipeline hinzugefügt, die Einbettungen mithilfe des angeforderten Modells (in diesem Fall ELSER Version 2) generiert.

Die Elasticsearch-Integration mit Langchain bietet weitere Strategien, die je nach Anwendungsfall eingesetzt werden können. Insbesondere kann die ApproxRetrievalStrategy verwendet werden, wenn dichte Vektoreinbettungen zum Einsatz kommen.

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus