Erweitern von Eingabeaufforderungen mit Datenbankkontext
Der Abruf liefert die Daten. Ein JSON-Blob allein beantwortet jedoch nicht die Frage eines Benutzers. Wenn ein Kunde nach Fahrradpedalkompatibilität fragt, haben Sie die Produktinformationen aus Ihrer Datenbank, aber jetzt müssen Sie dem Sprachmodell mitteilen, was damit zu tun ist. Dieser Schritt stellt das „A“ in RAG dar: Augmentierung.
Grundlegendes zur Chatnachrichtenstruktur
Verschiedene Modelle weisen unterschiedliche APIs auf, aber die meisten chatbasierten Modelle folgen einem ähnlichen Muster. Wir verwenden Azure OpenAI als Beispiel, aber die Konzepte gelten allgemein.
Azure OpenAI-Chatmodelle erwarten Nachrichten mit Rollen. Die Systemrolle definiert, wie sich der Assistent verhalten soll. Die Benutzerrolle enthält die ursprüngliche Frage und den Datenbankkontext, in den das Modell seine Antwort legen soll. Optional kann die Rolle Assistent frühere Antworten in einer mehrteiligen Unterhaltung aufbewahren. Hier ist ein vereinfachtes Beispiel für eine Prompt-Struktur:
{
"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 diesem Beispiel wäre der JSON-Code, {retrieved_data} den Sie aus Ihrer Produktabfrage erstellt haben, und {user_question} wäre so etwas wie "Welche Pedale sind mit dem Mountain-500 kompatibel?"
Die Systemmeldung legt Grundregeln fest. Die Benutzernachricht kombiniert Ihren Datenbankkontext mit der tatsächlichen Frage.
Erstellen von Abfragen in T-SQL
Sie könnten diesen JSON-Code in Ihrem Anwendungscode erstellen, aber es ist oft praktisch, alles in der Datenbank zu behalten. Ihre Abrufabfrage, Ihre Kontextformatierung und Ihre Aufforderungsgestaltung werden gemeinsam ausgeführt, und die T-SQL-Funktionen JSON_OBJECT und JSON_ARRAY verarbeiten die JSON-Formatierung.
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
);
Die @payload Variable enthält nun einen vollständigen Anforderungstext, der für die Azure OpenAI-API bereit ist.
Verankern Sie das Modell in Ihrer Datenbasis
Das Grounding teilt dem Modell mit, Ihre Daten als Datenquelle zu verwenden. Ohne das Modell kann sich das Modell auf seine Schulungsdaten verlassen, was für Ihre Domäne veraltet oder falsch sein könnte. Ein Kunde, der nach Adventure Works Fahrradgarantien fragt, sollte keine generischen Garantieinformationen aus dem Internet erhalten.
Gute Grundanweisungen legen den Bereich fest ("Verwenden Sie nur die bereitgestellten Produktdaten"), ermutigen zur Ehrlichkeit ("wenn Sie nicht genügend Informationen haben, sagen Sie dies"), und können das Format angeben ("Halten Sie Antworten unter 100 Wörtern"). Hier ist ein Beispiel für die Systemrolle :
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';
Diese Anweisungen helfen dem Modell, fokussiert zu bleiben und nützliche, genaue Antworten bereitzustellen.
Steuermodellverhalten
Die Anforderungsnutzlast enthält einige Parameter, die sich darauf auswirken, wie das Modell Antworten generiert:
-
max_tokensschränkt die Antwortlänge ein. Für detaillierte Produktantworten funktioniert 500 bis 1.000 gut. -
temperaturesteuert Kreativität im Maßstab von 0 bis 2. Niedrigere Werte (0,3 bis 0,5) erzeugen konsistentere, sachliche Antworten. Höhere Werte ermöglichen es dem Modell, kreativer zu werden, was Sie normalerweise nicht für RAG wünschen.
Die Steuerung der Token und der Temperatur hilft sicherzustellen, dass das Modell ein vorhersehbares Verhalten zeigt, wenn es auf Ihre Daten gestützt wird.
Konstruktion der vollständigen Nutzlast
Hier erfahren Sie, wie Sie mithilfe von Adventure Works-Tabellen eine RAG-Eingabeaufforderung für eine Produktfrage erstellen können:
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
);
Die @payload Variable enthält nun alles, was das Modell benötigt: Ihre Erdungsanweisungen, die abgerufenen Produktdaten und die Frage des Kunden. Alles, was Sie tun müssen, ist es an den Modellendpunkt zu senden und die Antwort zu verarbeiten.
Wichtige Erkenntnisse
Die Eingabeaufforderung ist der Ort, an dem der Abruf nützlich wird. Ihr JSON-Kontext bedeutet nichts, es sei denn, Sie teilen dem Modell mit, wie es verwendet werden soll. Legen Sie klare Grundregeln in der Systemmeldung fest, sodass das Modell an Ihre Daten hält. Halten Sie die Temperatur niedrig, um faktenbezogene Antworten zu erhalten. Verwenden Sie JSON_OBJECT und JSON_ARRAY, um direkt in T-SQL gültige JSON-Payloads zu erstellen.