Haben Sie Probleme mit KI oder Full-Stack-Entwicklung? Unsere Experten sind für Sie da: maßgeschneiderte Beratung, technische Integration und mehr. Erreichen Sie uns unter [email protected].

Erstellung eines semantischen Suchmodells mit Satztransformatoren für eine RAG-Anwendung

Die Implementierung einer Retrieval Augmented Generation (RAG)-Pipeline durch Feinabstimmung Ihres eigenen semantischen Suchmodells ist ein leistungsstarker Ansatz zur Verbesserung der Genauigkeit und Relevanz von Frage-Antwort-Systemen.

Diese Technik kombiniert die Stärken der semantischen Suche und der generativen KI und ermöglicht es dem System, Benutzerfragen besser zu verstehen und genauere und kontextrelevante Antworten zu generieren. Durch die Feinabstimmung eines semantischen Suchmodells mit Hilfe von Satztransformatoren können Entwickler das Modell an ihre spezifische Domäne anpassen und die Gesamtleistung der RAG-Pipeline verbessern.

Semantische Suche

Was ist Semantische Suche?

Die semantische Suche ist eine Technik der Datensuche, die über die herkömmlichen stichwortbasierten Suchmethoden hinausgeht. Sie nutzt die Verarbeitung natürlicher Sprache und Algorithmen des maschinellen Lernens, um die Genauigkeit der Suchergebnisse zu verbessern, indem sie die Absicht des Suchenden und die kontextuelle Bedeutung der in seiner Anfrage verwendeten Begriffe berücksichtigt. Dieser Ansatz zielt darauf ab, die zugrundeliegende Bedeutung der Suchanfrage und des Inhalts von Webseiten zu verstehen, anstatt einfach nur Schlüsselwörter abzugleichen. Auf diese Weise kann die semantische Suche relevantere Ergebnisse liefern, auch wenn sie nicht genau die in der ursprünglichen Anfrage verwendeten Wörter enthalten.

Um dies zu erreichen, setzt die semantische Suche verschiedene Techniken ein, z. B. Wortsinn-Disambiguierung, Konzeptextraktion und Anfrageerweiterung. Sie nutzt auch die Vektorsuche und maschinelles Lernen, um Ergebnisse zu liefern, die der Absicht und dem Kontext des Nutzers entsprechen. Die semantische Suche ist in Web-Suchmaschinen wie Google weit verbreitet und wird durch Technologien wie den Knowledge Graph unterstützt, der strukturierte Daten über Entitäten und ihre Beziehungen speichert. Dadurch können Suchmaschinen die Bedeutung von Suchanfragen verstehen und genauere und aussagekräftigere Ergebnisse liefern.

Die semantische Suche ist sehr nützlich für Unternehmen, die Fragen zu ihrem eigenen Fachwissen beantworten wollen, z. B. zu ihren technischen Unterlagen, Verträgen, Produktbeschreibungen...

Was ist Retrieval Augmented Generation (RAG)?

Semantische Suche

Retrieval Augmented Generation (RAG) ist eine Technik, die die Genauigkeit und Zuverlässigkeit von generativen KI-Modellen wie Large Language Models (LLMs) verbessert, indem sie externe Datenquellen einbezieht, um kontextuell genauere und aktuellere Informationen zu liefern. Sie integriert eine Retrieval-Komponente in ein generatives Modell, die es dem System ermöglicht, relevante Informationen aus einer Datenbank oder Wissensbasis zu suchen und abzurufen, um sein internes Wissen bei der Generierung von Antworten zu ergänzen.

Dieser Ansatz gewährleistet, dass das KI-Modell Antworten auf der Grundlage der aktuellsten und zuverlässigsten Fakten geben kann, und ermöglicht es den Nutzern, die Quellen der in den Antworten des Modells verwendeten Informationen zu überprüfen. RAG trägt dazu bei, das KI-Modell auf externe Wissensquellen zu stützen, was die Qualität seiner Ergebnisse verbessert und eine Möglichkeit bietet, das Modell zu aktualisieren, ohne dass eine umfangreiche Nachschulung erforderlich ist.

RAG ist eine großartige Strategie, um potenzielle Halluzinationen durch generative KI-Modelle abzuschwächen. RAG hilft beim Aufbau eines Fragebeantwortungssystems, das das Beste aus beiden Welten bietet: sachliche Genauigkeit und menschliche Antworten in natürlicher Sprache.

Was ist die Sentence Transformers Library?

Satzumwandler

Die Sentence Transformers-Bibliothek ist ein leistungsstarkes Python-Framework, das für hochmoderne Texteinbettungen entwickelt wurde. Sie basiert auf neuronalen Transformer-Netzen wie BERT, RoBERTa, XLM-R und anderen, die bei verschiedenen Aufgaben wie semantischer Suche, Paraphrase-Mining, semantischem Ähnlichkeitsvergleich, Clustering und mehr Spitzenleistungen erzielen. Diese Bibliothek ermöglicht eine einfache Feinabstimmung der Methoden zur Satzeinbettung, so dass aufgabenspezifische Satzeinbettungen erstellt werden können, die auf spezifische Anforderungen zugeschnitten sind. Weitere Informationen finden Sie auf der Website von Sentence Transformers

Die Bibliothek bietet eine große Auswahl an vortrainierten Sentence Transformers-Modellen für mehr als 50 Sprachen, die auf der Hugging Face-Plattform verfügbar sind. Benutzer können mit der Bibliothek auch ihre eigenen Modelle trainieren oder feinabstimmen, was die Flexibilität bietet, benutzerdefinierte Modelle für spezielle Anwendungsfälle zu erstellen. Das Sentence Transformers-Team hat vor kurzem eine neue Hauptversion (v3) veröffentlicht, die die Fähigkeiten dieser Bibliothek, insbesondere die Feinabstimmung, erheblich verbessert.

Die Sentence Transformers Bibliothek ist schnell, umfassend und gut gepflegt, weshalb wir sie in diesem Tutorial verwenden.

Erstellen Sie Ihr eigenes semantisches Suchmodell

Die Erstellung eines eigenen semantischen Suchmodells ist eine großartige Möglichkeit, um genaue Ergebnisse zu erzielen und gleichzeitig eine sehr geringe Latenzzeit zu gewährleisten. Dies gilt umso mehr, wenn Sie Ihr eigenes semantisches Suchmodell auf einer GPU einsetzen.

Lassen Sie uns zunächst einen kleinen Datensatz mit unseren Daten erstellen. Erstellen Sie eine einspaltige CSV-Datei (mit dem Namen "dataset.csv"), die die folgende technische Dokumentation über HP-Drucker enthält (in einem realen Szenario werden Sie natürlich noch viele weitere Beispiele hinzufügen wollen):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Jede Zeile kann bis zu 512 Token (entspricht etwa 400 Wörtern) enthalten, und um die Genauigkeit zu maximieren, wird empfohlen, unter 128 Token (entspricht etwa 100 Wörtern) zu bleiben. Da wir nun unsere 3 Dokumentationen in unserem Datensatz haben, können wir die Daten mit unserem Modell mit Sentence Transformers kodieren. Erstellen Sie ein Python-Skript mit folgendem Inhalt (stellen Sie sicher, dass PyTorch und Sentence Transformers installiert sind).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Dieses Skript lädt paraphrase-multilingual-mpnet-base-v2 herunter, verwendet es als Basismodell und kodiert damit unsere Daten. Sie können je nach Ihren Anforderungen (Modellgröße, Anwendungsfall, unterstützte Sprachen, ...) unter vielen verfügbaren vortrainierten Modellen wählen. Je nach Ihrer Hardware sollten Sie den Parameter "batch_size" anpassen, um den Kodierungsprozess zu beschleunigen.

Nach der Erstellung können Sie Ihr Modell mit dem folgenden Python-Skript zur Inferenz verwenden:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

Das obige Inferenzskript liefert folgende Ergebnisse:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

In unserem Inferenzskript bestimmt der Parameter "top_k", wie viele Ergebnisse wir zurückgeben wollen. Im Ergebnis zeigen wir den übereinstimmenden Text aus dem Datensatz mit einem Konfidenzwert an. Dieser Wert ist wichtig, weil er uns hilft zu entscheiden, ob wir die Antwort akzeptieren wollen oder nicht.

Generierung einer Antwort in natürlicher Sprache mit generativer KI

Wie Sie sehen können, besteht die größte Einschränkung der semantischen Suche darin, dass das Modell den Rohtext aus dem Datensatz zurückgibt, ohne die Frage direkt zu beantworten. Wir wollen dies nun einem generativen KI-Modell als Kontext zur Verfügung stellen, um die ursprüngliche Frage in natürlicher Sprache zu beantworten.

Wir können dies leicht erreichen, indem wir einen fortschrittlichen LLM wie GPT-4 auf OpenAI oder LLaMA 3 und ChatDolphin auf NLP Cloud nutzen. Sie können entweder entscheiden, das beste Ergebnis aus dem semantischen Suchmodell zu behalten und dieses als Kontext an den LLM zu übergeben, oder mehrere Ergebnisse zu behalten. Hier ist ein Beispiel für eine Eingabeaufforderung, die nur das beste Ergebnis verwendet:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Diese Anfrage gibt etwas Ähnliches zurück:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Semantisches Suchmodell mit kodierten Daten VS Speicherung von Einbettungen in einer Vektordatenbank

In einem Retrieval-Augmented Generation (RAG)-System sind die Erstellung eines semantischen Suchmodells mit lokal kodierten Daten oder die Verwendung einer Vektordatenbank zwei interessante Optionen.

Bei der Kodierung unserer eigenen Daten wandeln wir die Daten in Tensoren um und haben dann die Möglichkeit, die Daten auf eine GPU zu laden. Andererseits ist eine Vektordatenbank eine spezialisierte Datenbank, die für die effiziente Speicherung, Indizierung und Abfrage dieser hochdimensionalen Vektoren konzipiert ist.

Für Unternehmen, die sehr niedrige Latenzzeiten erreichen wollen, empfiehlt es sich, die eigenen Daten zu kodieren und in eine GPU zu laden, um die Berechnungszeit zu verbessern. Dies geht jedoch auf Kosten der Flexibilität, da Ihre Daten bei jeder Änderung des Datensatzes erneut kodiert werden müssen. Wenn sich die zugrundeliegenden Daten sehr häufig ändern, könnte es einfacher sein, die Einbettungen zu extrahieren und inkrementell in einer Vektordatenbank zu speichern (wie z. B. PG Vector).

Schlussfolgerung

Retrieval Augmented Generation (RAG) ist für Unternehmen, die Fragen zu bestimmten Daten wie technischen Unterlagen, Verträgen usw. beantworten wollen, von entscheidender Bedeutung, da es die Genauigkeit der Ergebnisse erheblich verbessert. RAG ist zum Beispiel eine Schlüsselkomponente eines Chatbots für den Support.

Sentence Transformers ist eine großartige Bibliothek, mit der Sie Ihr eigenes semantisches Suchmodell auf der Grundlage Ihrer eigenen Daten erstellen können. Wenn es auf einem Grafikprozessor eingesetzt und mit einem fortschrittlichen generativen KI-Modell gekoppelt wird, erweist sich ein solches Modell als äußerst leistungsstark.

Wenn Sie nicht daran interessiert sind, Ihr eigenes semantisches Suchmodell auf der Basis von Sentence Transformers selbst zu erstellen und einzusetzen, können Sie dies ganz einfach mit nur einem Klick auf NLP Cloud tun. Testen Sie jetzt die semantische Suche auf NLP Cloud!

Wenn Sie Fragen zu RAG, semantischer Suche und Sentence Transformers haben, zögern Sie bitte nicht, uns zu fragen, wir beraten Sie gerne!

Julien
CTO bei NLP Cloud