Prompts aanvullen met databasecontext

Voltooid

Ophalen levert u de gegevens op. Maar een JSON-blob zelf beantwoordt niemands vraag. Als een klant vraagt over fietspedaalcompatibiliteit, hebt u de productgegevens uit uw database, maar nu moet u het taalmodel vertellen wat u ermee moet doen. Deze stap vertegenwoordigt de 'A' in RAG: uitbreiding.

Inzicht in de structuur van het chatbericht

Verschillende modellen hebben verschillende API's, maar de meeste op chat gebaseerde modellen volgen een vergelijkbaar patroon. We gebruiken Azure OpenAI als voorbeeld, maar de concepten zijn breed van toepassing.

Azure OpenAI-chatmodellen verwachten berichten met rollen. De systeemrol definieert hoe de assistent zich moet gedragen. De gebruikersrol bevat de oorspronkelijke vraag en de databasecontext waarin het model het antwoord moet bepalen. Een assistentrol kan optioneel vorige antwoorden in een meertrapsgesprek opslaan. Hier volgt een vereenvoudigd voorbeeld van een promptstructuur:

{
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant that answers questions about products. Use only the provided context to answer. If the context doesn't contain enough information, say so."
    },
    {
      "role": "user", 
      "content": "Context: {retrieved_data}\n\nQuestion: {user_question}"
    }
  ]
}

In dit voorbeeld {retrieved_data} zou dit de JSON zijn die u hebt gebouwd op basis van uw productquery en {user_question} zou het ongeveer zijn als 'Welke pedalen zijn compatibel met de Mountain-500?'

Het systeembericht stelt grondregels in. Het gebruikersbericht combineert uw databasecontext met de werkelijke vraag.

Buildprompts in T-SQL

U kunt deze JSON bouwen in uw toepassingscode, maar het is vaak handig om deze allemaal in de database te bewaren. Uw ophaalquery, uw contextopmaak en uw promptconstructie werken samen, en de functies JSON_OBJECT en JSON_ARRAY van T-SQL verwerken de JSON-opmaak.

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

-- @context contains retrieved product data as JSON from the retrieval step

DECLARE @systemMessage NVARCHAR(MAX) = 'You are a customer service assistant for Adventure Works. Answer questions using only the provided product information. Be concise and helpful.';

DECLARE @userMessage NVARCHAR(MAX) = 'Product information: ' + @context + CHAR(10) + CHAR(10) + 'Customer question: ' + @userQuestion;

DECLARE @payload NVARCHAR(MAX) = JSON_OBJECT(
    'messages': JSON_ARRAY(
        JSON_OBJECT('role': 'system', 'content': @systemMessage),
        JSON_OBJECT('role': 'user', 'content': @userMessage)
    ),
    'max_tokens': 500,
    'temperature': 0.7
);

De @payload variabele bevat nu een volledige aanvraagbody die gereed is voor de Azure OpenAI-API.

Het model op uw gegevens baseren

Grounding geeft het model de opdracht om uw data te hanteren als de enige, betrouwbare bron. Zonder dit kan het model afhankelijk zijn van de trainingsgegevens, die mogelijk verouderd of onjuist zijn voor uw domein. Een klant die vraagt over Adventure Works-fietsgaranties, mag geen algemene garantiegegevens van internet krijgen.

Goede basisinstructies stellen het bereik vast ("gebruik alleen de opgegeven productgegevens"), moedigen eerlijkheid aan ("als u niet voldoende informatie heeft, zeg dat dan") en kunnen het formaat specificeren ('houd antwoorden onder de 100 woorden'). Hier volgt een voorbeeld voor de systeemrol :

DECLARE @systemMessage NVARCHAR(MAX) = 
'You are an Adventure Works product expert. Follow these rules:
1. Answer only using the product information provided
2. Do not invent features or specifications
3. If information is missing, tell the customer you''ll need to check
4. Keep responses under 100 words
5. Suggest related products when relevant';

Deze instructies helpen het model gefocust te blijven en nuttige, nauwkeurige antwoorden te geven.

Gedrag van besturingsmodel

De nettolading van de aanvraag bevat een aantal parameters die van invloed zijn op de wijze waarop het model reacties genereert:

  • max_tokens beperkt de antwoordlengte. Voor gedetailleerde productantwoorden werkt 500 tot 1.000 goed.
  • temperature bepaalt creativiteit op een schaal van 0 tot 2. Lagere waarden (0,3 tot 0,5) produceren consistentere, feitelijke reacties. Met hogere waarden kan het model creatiever worden, wat u meestal niet wilt voor RAG.

Door de tokens en temperatuur te beheersen, zorgt u ervoor dat het model zich voorspelbaar gedraagt wanneer het gebaseerd is op uw gegevens.

De volledige payload opbouwen

U kunt als volgt een RAG-prompt maken voor een productvraag met behulp van Adventure Works-tabellen:

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

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

-- Get product context using vector search
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
);

-- Build the prompt
SET @payload = JSON_OBJECT(
    'messages': JSON_ARRAY(
        JSON_OBJECT(
            'role': 'system', 
            'content': 'You are an Adventure Works product assistant. Use only the provided product data to answer questions.'
        ),
        JSON_OBJECT(
            'role': 'user', 
            'content': 'Product data: ' + @context + CHAR(10) + 'Question: ' + @userQuestion
        )
    ),
    'max_tokens': 500,
    'temperature': 0.5
);

De @payload variabele bevat nu alles wat het model nodig heeft: uw grondinstructies, de opgehaalde productgegevens en de vraag van de klant. U hoeft het alleen maar naar het modeleindpunt te verzenden en het antwoord af te handelen.

Belangrijke punten

De aanwijzing is waar het ophalen nuttig wordt. Uw JSON-context betekent niets, tenzij u het model vertelt hoe u dit kunt gebruiken. Stel duidelijke grondregels in het systeembericht in, zodat het model aan uw gegevens blijft hangen. Houd temperatuur laag voor feitelijke antwoorden. Gebruik JSON_OBJECT en JSON_ARRAY om geldige JSON-inhoud rechtstreeks in T-SQL te bouwen.