Herstelcontext voorbereiden voor uitbreiding

Voltooid

U begrijpt nu wat RAG is en wanneer u deze wilt gebruiken. In de volgende lessen leert u hoe u elke stap van de RAG-werkstroom in T-SQL implementeert.

Overweeg het volgende scenario: Een klant vraagt 'Welke pedalen passen bij de mountainbike die ik vorige maand heb gekocht?' U voert een query uit op de database, zoekt de volgorde, identificeert het fietsmodel en zoekt compatibele onderdelen. Deze stap vertegenwoordigt de 'R' in RAG: retrieval. We gaan die gegevens ophalen en voorbereiden voor het taalmodel. Er zijn veel manieren om gegevens op te halen uit SQL, maar voor RAG is het doel het model te voorzien van gestructureerde context die daadwerkelijk kan worden gebruikt.

Relationele gegevens converteren naar JSON

Taalmodellen verwerken tekst, niet relationele structuren. Als u onbewerkte queryresultaten doorgeeft, kan het model geen kolomnamen, gegevenstypen of relaties interpreteren. JSON lost dit probleem op door structuur in een tekstindeling te behouden. Veldnamen blijven gekoppeld aan waarden. Geneste objecten vertegenwoordigen relaties. Het model kan 'ProductName': 'Mountain-500' lezen en verwijzen naar dat specifieke product in het antwoord.

JSON houdt ook dingen voorspelbaar. Wanneer het model een antwoord retourneert, weet u dat het antwoord afkomstig is van velden die u expliciet hebt opgegeven. Als u in plaats daarvan ongestructureerde tekst hebt gedumpt, hebt u minder controle over wat het model gebruikt om het antwoord te formuleren.

Queryresultaten opmaken met FOR JSON

U hoeft geen JSON-tekenreeksen handmatig te maken. Voeg FOR JSON toe aan het einde van uw SELECT en SQL doet de rest.

  • FOR JSON AUTO indeling van uitvoer op basis van uw querystructuur. Kolomnamen worden automatisch veldnamen.

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

    Deze query retourneert iets als: [{"Name":"Mountain-500 Black, 48","ListPrice":564.99,"Color":"Black"}]

  • FOR JSON PATH geeft u expliciet controle over de JSON-structuur. Je definieert de veldnamen en de neststructuur met kolomaliassen.

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

    Deze query retourneert iets als: [{"product":{"name":"Mountain-500 Black, 48","price":564.99,"size":"48"}}]

JSON-uitvoeropties beheren

Met een aantal opties kunt u de uitvoer vormgeven:

  • WITHOUT_ARRAY_WRAPPER verwijdert de vierkante haken wanneer u één record opzoekt. Deze optie is handig voor RAG omdat u vaak één klant, één product of één bestelling tegelijk ophaalt.

    SELECT Name, Description, Size, Weight
    FROM Production.Product
    WHERE ProductID = @ProductID
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
    
  • INCLUDE_NULL_VALUES houdt null-velden in de uitvoer in plaats van ze weg te laten. Gebruik deze parameter wanneer het ontbreken van een waarde zinvol is.

  • ROOT('name') verpakt de volledige uitvoer in een benoemd hoofdelement, waardoor het model kan begrijpen wat voor soort gegevens het ontvangt.

Kiezen wat u wilt opnemen

Niet elke kolom hoort in uw context. Interne id's, controletijdstempels en magazijncodes helpen het model bijvoorbeeld niet om vragen van klanten te beantwoorden. Ze verbruiken tokens en voegen alleen ruis toe.

Neem voor een productvraag de productnaam, beschrijving, specificaties en prijzen op. Sla de rowguid, gewijzigde datum en stopgezette parameter over, tenzij ze rechtstreeks relevant zijn.

Tokenlimieten zijn ook belangrijk. Elk token dat u verzendt, kost geld en telt mee voor het contextvenster van het model. Als u meerdere producten opvraagt, moet u elk product compact houden. Het model presteert beter met gerichte context dan met alles wat u mogelijk kunt opnemen.

Meerdere bronnen combineren

RAG-context komt vaak uit meerdere tabellen. Een vraag over pedaalcompatibiliteit heeft productdetails, specificaties en gerelateerde onderdelen nodig. U kunt beginnen met het zoeken naar relevante producten met vectorzoekopdrachten en vervolgens andere tabellen samenvoegen om de volledige afbeelding uit te bouwen.

Zo ziet dat er in de praktijk uit. Converteer eerst de vraag van de gebruiker naar een insluiting. Gebruik vervolgens VECTOR_DISTANCE om de dichtstbijzijnde overeenkomsten te vinden, de gerelateerde tabellen samen te voegen en alles op te maken als JSON:

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
);

De variabele @context bevat nu een JSON-tekenreeks die gereed is voor de prompt. Deze JSON-tekenreeks is het resultaat dat is opgemaakt voor verrijking.

Belangrijke punten

Het doel is om het taalmodel gestructureerde context te geven die het daadwerkelijk kan gebruiken. JSON behoudt de betekenis van uw gegevens terwijl deze leesbaar blijft als tekst. Gebruik FOR JSON AUTO deze functie als u snelle resultaten wilt en FOR JSON PATH wanneer u controle nodig hebt over veldnamen en nesten. Voeg WITHOUT_ARRAY_WRAPPER toe voor query's met één record. Houd uw JSON slank door alleen de nodige kolommen voor het model op te nemen. Minder ruis betekent betere antwoorden en lagere tokenkosten.