Vorbereitung der Abrufkontextualisierung für die Erweiterung

Abgeschlossen

Sie wissen jetzt, was RAG ist und wann sie verwendet werden soll. In den folgenden Einheiten erfahren Sie, wie Sie jeden Schritt des RAG-Workflows in T-SQL implementieren.

Betrachten Sie das folgende Szenario: Ein Kunde fragt: "Welche Pedale passen zum Mountainbike, das ich im letzten Monat gekauft habe?" Sie fragen die Datenbank ab, suchen deren Reihenfolge, identifizieren das Fahrradmodell und suchen kompatible Komponenten. Dieser Schritt stellt das "R" in RAG dar: Abruf. Lassen Sie uns diese Daten für das Sprachmodell abrufen und vorbereiten. Es gibt viele Möglichkeiten zum Abrufen von Daten aus SQL, aber für RAG besteht das Ziel darin, das Modell mit strukturiertem Kontext bereitzustellen, den es tatsächlich verwenden kann.

Konvertieren relationaler Daten in JSON

Sprachmodelle verarbeiten Text, nicht relationale Strukturen. Wenn Sie rohe Abfrageergebnisse übergeben, hat das Modell keine Möglichkeit, Spaltennamen, Datentypen oder Beziehungen zu interpretieren. JSON löst dieses Problem durch Beibehalten der Struktur in einem Textformat. Feldnamen bleiben werten zugeordnet. Geschachtelte Objekte stellen Beziehungen dar. Das Modell kann "ProductName": "Mountain-500" lesen und in seiner Antwort auf dieses spezifische Produkt verweisen.

JSON sorgt auch für vorhersehbare Dinge. Wenn das Modell eine Antwort zurückgibt, wissen Sie, dass die Antwort aus Feldern stammt, die Sie explizit angegeben haben. Wenn Sie stattdessen unstrukturierten Text gedumpt haben, haben Sie weniger Kontrolle darüber, was das Modell verwendet, um seine Antwort zu formulieren.

Formatieren von Abfrageergebnissen mit FOR JSON

Es ist nicht erforderlich, JSON-Zeichenfolgen manuell zu erstellen. Fügen Sie einfach FOR JSON am Ende Ihrer SELECT-Anweisung hinzu und SQL erledigt den Rest.

  • FOR JSON AUTO formatiert die Ausgabe basierend auf der Abfragestruktur. Spaltennamen werden automatisch zu Feldnamen.

    SELECT Name, ListPrice, Color
    FROM Production.Product
    WHERE ProductID = @ProductID
    FOR JSON AUTO;
    

    Diese Abfrage gibt etwa folgendes zurück: [{"Name":"Mountain-500 Black, 48","ListPrice":564.99,"Color":"Black"}]

  • FOR JSON PATH bietet Ihnen explizite Kontrolle über die JSON-Struktur. Sie definieren die Feldnamen und die Verschachtelung mithilfe von Spaltenaliasen.

    SELECT 
        Name AS 'product.name',
        ListPrice AS 'product.price',
        Size AS 'product.size'
    FROM Production.Product
    WHERE ProductID = @ProductID
    FOR JSON PATH;
    

    Diese Abfrage gibt etwa folgendes zurück: [{"product":{"name":"Mountain-500 Black, 48","price":564.99,"size":"48"}}]

Steuern von JSON-Ausgabeoptionen

Mit einigen Optionen können Sie die Ausgabe gestalten:

  • WITHOUT_ARRAY_WRAPPER entfernt die eckigen Klammern, wenn Sie einen einzelnen Datensatz abrufen. Diese Option ist für RAG nützlich, da Sie häufig einen Kunden, ein Produkt oder eine Bestellung gleichzeitig abrufen.

    SELECT Name, Description, Size, Weight
    FROM Production.Product
    WHERE ProductID = @ProductID
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
    
  • INCLUDE_NULL_VALUES behält NULL-Felder in der Ausgabe bei, anstatt sie auszulassen. Verwenden Sie diesen Parameter, wenn das Fehlen eines Werts sinnvoll ist.

  • ROOT('name') umschließt die gesamte Ausgabe in einem benannten Stammelement, was dem Modell helfen kann, zu verstehen, welche Art von Daten sie empfängt.

Auswählen, was einbezogen werden soll

Nicht jede Spalte gehört zu Ihrem Kontext. Beispielsweise helfen interne IDs, Überwachungszeitstempel und Lagercodes dem Modell nicht bei der Beantwortung von Kundenfragen. Sie verbrauchen lediglich Token und fügen Rauschen hinzu.

Fügen Sie für eine Produktfrage den Produktnamen, die Beschreibung, die Spezifikationen und die Preise ein. Überspringen Sie die Flags für rowguid, Datumsänderung und Einstellung, wenn sie nicht direkt relevant sind.

Tokenlimits sind ebenfalls wichtig. Jedes Token, das Sie senden, kostet Geld und zählt im Kontextfenster des Modells. Wenn Sie mehrere Produkte abrufen, halten Sie diese schlank. Das Modell funktioniert besser mit fokussierten Kontexten als mit allem, was Sie möglicherweise einbeziehen könnten.

Kombinieren mehrerer Quellen

RAG-Kontext stammt häufig aus mehreren Tabellen. Eine Pedalkompatibilitätsfrage benötigt Produktdetails, Spezifikationen und zugehörige Komponenten. Sie können beginnen, relevante Produkte mit der Vektorsuche zu finden, und dann andere Tabellen verknüpfen, um das vollständige Bild zu erstellen.

Das sieht in der Praxis so aus. Konvertieren Sie zunächst die Frage des Benutzers in eine Einbettung. Verwenden Sie dann, VECTOR_DISTANCE um die nächstgelegenen Übereinstimmungen zu finden, die verknüpften Tabellen zu verknüpfen und alles als JSON zu formatieren:

DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';
DECLARE @questionVector VECTOR(1536);
DECLARE @context NVARCHAR(MAX);

-- Generate embedding for the question
SELECT @questionVector = AI_GENERATE_EMBEDDINGS(@userQuestion USE MODEL my_embedding_model);

-- Find relevant products and format as JSON
SET @context = (
    SELECT TOP 3
        p.Name AS ProductName,
        p.Color,
        p.Size,
        pc.Name AS Category,
        pm.Name AS Model
    FROM Production.Product p
    INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
    INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
    INNER JOIN Production.ProductModel pm ON p.ProductModelID = pm.ProductModelID
    ORDER BY VECTOR_DISTANCE('cosine', p.DescriptionVector, @questionVector)
    FOR JSON PATH
);

Die Variable @context enthält nun eine JSON-Zeichenfolge, die für die Eingabeaufforderung bereit ist. Diese JSON-Zeichenfolge ist Ihr Abrufergebnis, das für die Erweiterung formatiert ist.

Wichtige Erkenntnisse

Ziel ist es, dem Sprachmodell strukturierten Kontext zu verleihen, den es tatsächlich verwenden kann. JSON behält die Bedeutung Ihrer Daten bei, während sie als Text lesbar bleibt. Verwenden Sie FOR JSON AUTO, wenn Sie schnelle Ergebnisse erzielen möchten, und FOR JSON PATH, wenn Sie die Kontrolle über Feldnamen und Schachtelungen benötigen. Fügen Sie WITHOUT_ARRAY_WRAPPER für Einzeldatensatzabfragen hinzu. Halten Sie Ihren JSON-Code schlanker, indem Sie nur die Spalten einschließen, die das Modell benötigt. Weniger Rauschen bedeutet bessere Antworten und niedrigere Tokenkosten.