RAG vs. High quality-Tuning erklärt: Was sie tatsächlich tun und wann sie jeweils eingesetzt werden


ich habe ziemlich viel über RAG geschrieben, angefangen mit dem Per Anhalter durch RAG mit ChatGPT-API und LangChainund dann verschiedene Themen im Zusammenhang mit RAG und KI erkunden, z Chunking, Hybridsuche, Neuordnung, Kontextbezogenes Abrufenund a dreiteilige Serie zur Bewertung der Retrievalqualität. Mit anderen Worten: Wir haben auf der RAG-Seite viel abgedeckt.

Worüber wir nicht so explizit gesprochen haben, ist die andere wichtige Technik, zu der Menschen greifen, wenn sie eine LLM-App für eine bestimmte Domäne verbessern möchten. Das heißt Feinabstimmung. Und insbesondere haben wir nicht darüber gesprochen, was passiert, wenn man die beiden nebeneinander legt und versucht herauszufinden, welches man tatsächlich braucht.

Wenn Sie suchen „RAG vs. Feinabstimmung„On-line finden Sie viele Inhalte, die dies als einen Wettbewerb mit einem Gewinner behandeln. Für einige gewinnt RAG, weil die Einrichtung billiger ist, für andere gewinnt die Feinabstimmung, weil sie bessere Ergebnisse liefert usw. Das Drawback bei dieser Formulierung ist, dass sie grundsätzlich irreführend ist, da es sich bei RAG und Feinabstimmung nicht um konkurrierende Techniken handelt, sondern um Techniken, die unterschiedliche Probleme auf verschiedenen Ebenen einer KI-Anwendung lösen. Um eine gute Entscheidung zu treffen, ist es notwendig zu verstehen, was jeder einzelne tatsächlich tut.

Additionally schauen wir mal rein!

🍨 DataCream ist ein Publication über KI, Daten und Technologie. Wenn Sie sich für diese Themen interessieren, Abonnieren Sie hier!

Was ist RAG und was macht es eigentlich?

Wenn Sie diese Serie verfolgt haben, haben Sie bereits ein solides Gespür für RAG. Aber sagen wir es noch einmal, denn die genaue Definition ist wichtig für den Vergleich mit der anschließenden Feinabstimmung.

RAG (Retrieval-Augmented Technology) ist additionally eine Technik, die die Reaktion eines LLM verbessert, indem relevante externe Informationen zum Zeitpunkt der Inferenz abgerufen und in die Eingabeaufforderung eingefügt werden. Das Modell selbst wird in keiner Weise verändert. Was sich ändert, ist das, was es als Eingabe betrachtet.

Die Pipeline sieht in etwa so aus:

  • Zunächst werden externe Dokumente (die Wissensbasis, die wir nutzen möchten) in Vektoreinbettungen verarbeitet und in einer Vektordatenbank gespeichert.
  • Wenn ein Benutzer eine Abfrage sendet, wird die Abfrage auch in eine Einbettung umgewandelt und die semantisch ähnlichsten Dokumentblöcke werden aus der Datenbank abgerufen.
  • Diese Blöcke werden dann zusammen mit der Anfrage des Benutzers an das LLM übergeben, sodass das Modell eine Antwort generieren kann, die auf diesem spezifischen abgerufenen Kontext basiert.

Und das ist es.

Hier ist ein minimales RAG-Beispiel mit der OpenAI-API:

from openai import OpenAI
import numpy as np

consumer = OpenAI(api_key="your_api_key")

# our tiny data base
paperwork = (
    "pialgorithms is an AI-powered doc administration platform.",
    "pialgorithms permits groups to look, extract, and automate doc workflows.",
    "pialgorithms was based in Athens, Greece.",
)

# embed the data base
def embed(texts):
    response = consumer.embeddings.create(
        mannequin="text-embedding-3-small",
        enter=texts
    )
    return (r.embedding for r in response.information)

doc_embeddings = embed(paperwork)

# embed the consumer question and retrieve probably the most related chunk
question = "The place is pialgorithms primarily based?"
query_embedding = embed((question))(0)

# cosine similarity
def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

similarities = (cosine_similarity(query_embedding, doc_emb) for doc_emb in doc_embeddings)
best_match = paperwork(np.argmax(similarities))

# inject retrieved context into the immediate
response = consumer.chat.completions.create(
    mannequin="gpt-4o-mini",
    messages=(
        {
            "position": "system",
            "content material": f"Reply the consumer's query utilizing solely the next context:nn{best_match}"
        },
        {
            "position": "consumer",
            "content material": question
        }
    )
)

print(response.decisions(0).message.content material)
# pialgorithms relies in Athens, Greece.

Nehmen wir uns einen Second Zeit, um zu verstehen, was hier wirklich passiert. Natürlich hat das Mannequin keine Ahnung, was Pialgorithmen stammt aus seinem Coaching, aber da wir den richtigen Dokumentblock abgerufen und in die Eingabeaufforderung eingefügt haben, kann das Modell genau antworten. Das Wissen kommt zum Zeitpunkt der Abfrage von außerhalb des Modells und das Modell selbst bleibt unberührt.

Dies ist der Kern dessen, was RAG tut: Es gewährt dem Modell zum Zeitpunkt der Inferenz dynamisch Zugriff auf externes Wissen, auf das es nie trainiert wurde.

Und basierend auf der Artwork und Weise, wie es funktioniert, schneidet RAG bei bestimmten Arten von Aufgaben intestine ab, wie zum Beispiel:

  • Beantwortung von Fragen zu Dokumenten, Wissensdatenbanken oder Daten, die das Modell noch nie gesehen hat
  • Ohne Umschulung auf dem Laufenden bleiben, da die Wissensbasis jederzeit selbstständig aktualisiert werden kann
  • Bereitstellung nachvollziehbarer, zitierfähiger Antworten, da Sie genau wissen, welcher Dokumentabschnitt abgerufen wurde
  • Sicherer Umgang mit privaten oder geschützten Informationen, ohne diese Informationen in das Modell einzubeziehen

Auf der anderen Seite wird RAG Folgendes nicht tun: Es wird das Verhalten, den Ton, den Argumentationsstil oder die Aufgabenleistung des Modells nicht ändern. Wenn Ihr Modell dazu neigt, ausführlicher zu sein, wird RAG es nicht prägnanter machen. Wenn Probleme mit einem bestimmten Ausgabeformat auftreten, kann RAG das Drawback nicht beheben.

Was ist Feinabstimmung und was bewirkt sie eigentlich?

Unter Feinabstimmung versteht man den Prozess, bei dem ein vorab trainiertes Modell mit einem neuen, aufgabenspezifischen Datensatz weiter trainiert und aktualisiert wird Gewichte dabei. Anders ausgedrückt: Während RAG die Eingaben des Modells ändert, verändert die Feinabstimmung das Modell selbst.

Genauer gesagt, ein Basismodell wie GPT-4o-mini wird anhand eines umfangreichen allgemeinen Datensatzes vorab trainiert. Bei der Feinabstimmung wird dieses Modell verwendet und eine zusätzliche, kürzere Trainingsschleife für bestimmte Beispiele ausgeführt, die für unseren spezifischen Anwendungsfall related sind. Diese Beispiele liegen typischerweise in Kind von Eingabe-Ausgabe-Paaren vor. Auf diese Weise werden die Gewichte des Modells angepasst, sodass Ausgaben erzeugt werden, die eher diesen Beispielpaaren ähneln.

So würde eine Feinabstimmungsaufgabe mithilfe der OpenAI-API aussehen:

from openai import OpenAI
import json

consumer = OpenAI(api_key="your_api_key")

# Step 1: put together coaching information as a JSONL file
# every instance is a dialog with a desired output
training_examples = (
    {
        "messages": (
            {"position": "system", "content material": "You're a concise technical assistant. All the time reply in a single sentence."},
            {"position": "consumer", "content material": "What's a vector database?"},
            {"position": "assistant", "content material": "A vector database shops and retrieves information as high-dimensional numerical vectors, enabling quick semantic similarity search."}
        )
    },
    {
        "messages": (
            {"position": "system", "content material": "You're a concise technical assistant. All the time reply in a single sentence."},
            {"position": "consumer", "content material": "What's chunking in RAG?"},
            {"position": "assistant", "content material": "Chunking is the method of splitting massive paperwork into smaller items earlier than embedding them, in order that they match inside mannequin context limits and enhance retrieval precision."}
        )
    },
    # in observe you'll need no less than 50-100 examples
)

# save as JSONL
with open("training_data.jsonl", "w") as f:
    for instance in training_examples:
        f.write(json.dumps(instance) + "n")

# add the coaching file
with open("training_data.jsonl", "rb") as f:
    training_file = consumer.recordsdata.create(file=f, function="fine-tune")

# create the fine-tuning job
fine_tune_job = consumer.fine_tuning.jobs.create(
    training_file=training_file.id,
    mannequin="gpt-4o-mini-2024-07-18"
)
print(fine_tune_job.id)

Sobald die Feinabstimmungsaufgabe abgeschlossen ist, gibt OpenAI eine eindeutige Modellkennung für Ihr neu optimiertes Modell im Format zurück ft:base-model:your-org:your-suffix:unique-id. Dies ist jetzt ein eigenständiges Modell, das getrennt von der Foundation in Ihrem OpenAI-Konto lebt gpt-4o-mini.

An printwir würden zurückkommen id Für dieses fein abgestimmte Modell sieht es etwa so aus:

ft:gpt-4o-mini-2024-07-18:your-org:your-suffix:abc123

Wir können es dann genau wie jedes andere Modell aufrufen, indem wir einfach diesen Bezeichner im übergeben mannequin Parameter:

# as soon as the job is full, use the fine-tuned mannequin
response = consumer.chat.completions.create(
    mannequin="ft:gpt-4o-mini-2024-07-18:your-org:your-suffix:abc123",
    messages=(
        {"position": "consumer", "content material": "What's immediate caching?"}
    )
)
print(response.decisions(0).message.content material)

Der Unterschied besteht darin, dass dieses Modell das Verhalten, auf das wir es trainiert haben, bereits verinnerlicht hat: In unserem Beispiel antwortet es nun konsistent in einem prägnanten Satz, ohne dass wir es bei jeder Systemaufforderung dazu anweisen müssen. Das sind die Dinge, in denen Feinabstimmung wirklich intestine ist: konsistente Formatierung, spezifischer Ton, Einhaltung einer bestimmten Ausgabestruktur oder verbesserte Leistung bei einem ganz bestimmten Aufgabentyp. Und das ist im Wesentlichen die Aufgabe der Feinabstimmung.

Beachten Sie, wie Die Feinabstimmung hat keinen Einfluss auf die Integration spezifischer Informationen in das Modell. Anders als man intuitiv annehmen könnte, führt die Feinabstimmung eines Modells anhand der Dokumente Ihres Unternehmens nicht dazu, dass das Modell diese Informationen „erlernt“ und Fragen dazu zuverlässig beantworten kann. Es kann tatsächlich dazu führen, dass sich das Modell hier und da bestimmte Fakten aus Trainingsbeispielen merkt, aber dieses Auswendiglernen ist brüchig und unzuverlässig. Das wahrscheinlichste Ergebnis wäre, dass ein Modell über Themen halluziniert, die in den Trainingsbeispielen auftauchen, und nicht, dass sich ein Modell genau an bestimmte Particulars erinnert, die in diesen Beispielen auftauchen. Wenn Sie additionally den Abruf von Wissen benötigen, ist RAG das richtige Werkzeug, nicht die Feinabstimmung.

Genauer gesagt funktioniert die Feinabstimmung bei Folgendem tatsächlich intestine:

  • Dem Modell ein einheitliches Ausgabeformat, einen einheitlichen Ton oder einen einheitlichen Stil „beibringen“.
  • Verbessern der Leistung bei einem bestimmten, engen Aufgabentyp (z. B. immer gültiges JSON generieren, immer in drei Aufzählungspunkten zusammenfassen usw.)
  • Reduzierung des Bedarfs an langen, sich wiederholenden Systemaufforderungen durch die Integration dieser Anweisungen in das Modell
  • Anpassung des Modells an domänenspezifische Sprache oder Terminologie, damit es das richtige Vokabular versteht und verwendet

Dennoch funktioniert die Feinabstimmung nicht so intestine in:

  • Durch die Hinzufügung verlässlichen Faktenwissens kann sich das Modell genau erinnern
  • Das Modell mit sich ändernden Informationen auf dem neuesten Stand halten
  • Bereitstellung nachvollziehbarer, zitierfähiger Antworten

Wann verwenden wir additionally jedes und wann verwenden wir beide?

Nachdem wir nun verstanden haben, was jede Technik tatsächlich bewirkt, ist das „RAG vs. FeinabstimmungDie Antwort auf diese Frage wird viel einfacher, da es sich in den meisten Fällen überhaupt nicht um eine „gegen“-Frage handelt.

RAG und Feinabstimmung erfolgen auf verschiedenen Ebenen einer KI-Anwendung. RAG arbeitet auf der Wissensebene, d. h. es steuert, auf welche Informationen das Modell Zugriff hat. Auf der anderen Seite erfolgt die Feinabstimmung auf der Verhaltensebene, das heißt, sie definiert die Artwork und Weise, wie das Modell die bereitgestellten Informationen verarbeitet und Antworten generiert. Diese beiden Ebenen sind unabhängig voneinander, was bedeutet, dass Sie RAG, Feinabstimmung oder beides verwenden können, je nachdem, was Sie erreichen möchten.

Hier ist additionally ein praktischer Entscheidungsrahmen für die Entscheidung, was verwendet werden soll:

Das Szenario, in dem wir sowohl RAG als auch Feinabstimmung verwenden, ist in realen Produktionssystemen tatsächlich das häufigste. Der einfachste Weg, die beiden in Einklang zu bringen, ist dieser: Feinabstimmung des Verhaltens, Verwendung von RAG für Wissen.

Stellen Sie sich zum Beispiel vor, wir entwickeln einen Kundensupport-Assistenten für ein Softwareprodukt und benötigen ihn für Folgendes:

  1. Antworten Sie immer in einem bestimmten Ton und Format, im Einklang mit unserer Softwaremarke
  2. Verfügen Sie über genaue und aktuelle Kenntnisse der Dokumentation unseres Produkts

Für eine solche Aufgabe müssten wir sowohl RAG als auch Feinabstimmung nutzen. Eine Feinabstimmung würde insbesondere die erste Anforderung erfüllen, indem es dem Modell ermöglicht, aus Beispielen idealer Antworten des Kundensupports zu lernen und ihm den richtigen Ton, den richtigen Detaillierungsgrad und das richtige Ausgabeformat beizubringen. Die zweite Anforderung würde durch RAG abgedeckt: Zum Zeitpunkt der Inferenz werden die relevantesten Informationen aus der Produktdokumentation abgerufen und in die Eingabeaufforderung eingefügt, sodass das Modell zuverlässige Antworten liefern kann, die auf der Dokumentation basieren.

In der Praxis können wir additionally Feinabstimmung und RAG kombinieren, indem wir ein feinabgestimmtes Modell auf die gleiche Weise aufrufen, wie wir jedes andere Modell aufrufen würden, aber auch abgerufenen Kontext in die Systemeingabeaufforderung einfügen, genau wie wir es in einer Customary-RAG-Pipeline tun würden.

# combining fine-tuned mannequin with RAG
response = consumer.chat.completions.create(
    mannequin="ft:gpt-4o-mini-2024-07-18:your-org:support-style:abc123",  # fine-tuned for tone/format
    messages=(
        {
            "position": "system",
            "content material": f"You're a useful help assistant for pialgorithms. "
                       f"Use solely the next documentation to reply:nn{retrieved_context}"  # RAG context
        },
        {
            "position": "consumer",
            "content material": user_question
        }
    )
)

Durch die Feinabstimmung weiß das Modell, wie es angemessen reagieren soll, und RAG sagt ihm, was es sagen soll. Es handelt sich additionally nicht um die Frage „Feinabstimmung vs. RAG“, sondern vielmehr ergänzen sich Feinabstimmung und RAG und bewirken unterschiedliche Aufgaben.

In meinen Gedanken

Was ich an der Debatte zwischen RAG und Feinabstimmung am interessantesten finde, ist, wie oft sie als Frage formuliert wird, welche Technik besser ist, während die nützlichere Frage darin besteht, welches Drawback Sie eigentlich lösen möchten.

RAG und Feinabstimmung adressieren verschiedene Fehlermodi eines Foundation-LLM. Wenn ein Basismodell scheitert, weil es etwas nicht weiß, handelt es sich um ein Wissensproblem, und RAG löst es. Wenn ein Basismodell ausfällt, weil es sich inkonsistent verhält oder Ausgaben im falschen Format erzeugt, handelt es sich um ein Verhaltensproblem, das durch Feinabstimmung gelöst werden kann. Wenn Ihr Modell aus beiden Gründen gleichzeitig ausfällt, benötigen Sie möglicherweise tatsächlich beides.

✨ Danke fürs Lesen! ✨


Wenn du es bis hierher geschafft hast, Vielleicht finden Sie Pialgorithmen nützlich: eine von uns entwickelte Plattform, die Groups dabei hilft, organisatorisches Wissen sicher an einem Ort zu verwalten.


Hat Ihnen dieser Beitrag gefallen? Begleiten Sie mich auf 💌 Unterstapel und 💼 LinkedIn


Alle Bilder vom Autor, sofern nicht anders angegeben.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert