Préparez le contexte de récupération en vue de l’augmentation.
Vous comprenez maintenant ce que RAG est et quand l’utiliser. Dans les unités suivantes, vous allez apprendre à implémenter chaque étape du flux de travail RAG dans T-SQL.
Considérez le scénario suivant : Un client demande « Quelles pédales correspondent au vélo de montagne que j’ai acheté le mois dernier ? » Vous interrogez la base de données, recherchez leur ordre, identifiez le modèle de vélo et recherchez les composants compatibles. Cette étape représente le « R » dans RAG : récupération. Récupérons et préparons ces données pour le modèle de langage. Il existe de nombreuses façons de récupérer des données à partir de SQL, mais pour RAG, l’objectif est de fournir au modèle un contexte structuré qu’il peut réellement utiliser.
Convertir des données relationnelles en JSON
Les modèles de langage traitent du texte, et non des structures relationnelles. Si vous transmettez des résultats de requête bruts, le modèle n’a aucun moyen d’interpréter les noms de colonnes, les types de données ou les relations. JSON résout ce problème en préservant la structure dans un format de texte. Les noms de champs restent attachés aux valeurs. Les objets imbriqués représentent des relations. Le modèle peut lire « ProductName » : « Mountain-500 » et référencer ce produit spécifique dans sa réponse.
JSON conserve également les choses prévisibles. Lorsque le modèle retourne une réponse, vous savez que la réponse provient des champs que vous avez fournis explicitement. Si vous transmettiez du texte non structuré à la place, vous auriez moins de contrôle sur les éléments que le modèle utilise pour formuler sa réponse.
Mettre en forme les résultats de requête avec FOR JSON
Il n’est pas nécessaire de générer manuellement des chaînes JSON. Il suffit d'ajouter FOR JSON à la fin de votre SELECT et SQL effectue le travail :
FOR JSON AUTOmet en forme la sortie en fonction de votre structure de requête. Les noms de colonnes deviennent automatiquement des noms de champs.SELECT Name, ListPrice, Color FROM Production.Product WHERE ProductID = @ProductID FOR JSON AUTO;Cette requête retourne quelque chose comme suit :
[{"Name":"Mountain-500 Black, 48","ListPrice":564.99,"Color":"Black"}]FOR JSON PATHvous donne un contrôle explicite sur la structure JSON. Vous définissez les noms de champs et l’imbrication à l’aide d’alias de colonne.SELECT Name AS 'product.name', ListPrice AS 'product.price', Size AS 'product.size' FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH;Cette requête retourne quelque chose comme suit :
[{"product":{"name":"Mountain-500 Black, 48","price":564.99,"size":"48"}}]
Contrôler les options de sortie JSON
Quelques options vous permettent de mettre en forme la sortie :
WITHOUT_ARRAY_WRAPPERsupprime les crochets lorsque vous récupérez un enregistrement unique. Cette option est utile pour RAG, car vous récupérez souvent un client, un produit ou une commande à la fois.SELECT Name, Description, Size, Weight FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;INCLUDE_NULL_VALUESconserve les champs Null dans la sortie au lieu de les omettre. Utilisez ce paramètre lorsque l’absence d’une valeur est significative.ROOT('name')encapsule la sortie entière dans un élément racine nommé, qui peut aider le modèle à comprendre le type de données qu’il reçoit.
Choisir ce qu’il faut inclure
Chaque colonne n’appartient pas à votre contexte. Par exemple, les ID internes, les horodatages d’audit et les codes d’entrepôt n’aident pas le modèle à répondre aux questions des clients. Ils se contentent de consommer des jetons et de générer du bruit.
Pour une question de produit, incluez le nom du produit, la description, les spécifications et la tarification. Ne tenez pas compte du rowguid, de la date de modification et de l’indicateur de discontinuation, sauf s’ils présentent une pertinence directe.
Les limites des jetons sont également importantes. Chaque jeton que vous envoyez coûte de l’argent et compte par rapport à la fenêtre de contexte du modèle. Lorsque vous récupérez plusieurs produits, veillez à ce que chacun demeure léger. Le modèle fonctionne mieux avec le contexte ciblé que tout ce que vous pourriez inclure.
Combiner plusieurs sources
Le contexte RAG provient souvent de plusieurs tables. Une question de compatibilité de pédale a besoin des détails du produit, des spécifications et des composants associés. Vous pouvez commencer par rechercher des produits pertinents avec la recherche vectorielle, puis joindre d’autres tables pour générer l’image complète.
Voici ce que cela ressemble dans la pratique. Tout d'abord, convertissez la question de l'utilisateur en vecteur d'intégration. Ensuite, utilisez VECTOR_DISTANCE pour rechercher les correspondances les plus proches, joindre les tables associées et mettre en forme tout en 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
);
La variable @context contient maintenant une chaîne JSON prête pour l’invite. Cette chaîne JSON est votre résultat de récupération mis en forme pour l’augmentation.
Points clés à prendre
L’objectif est de fournir au modèle de langage un contexte structuré qu’il peut réellement utiliser. JSON conserve la signification de vos données tout en la conservant lisible en tant que texte. Utilisez FOR JSON AUTO quand vous désirez des résultats rapides et FOR JSON PATH quand vous avez besoin de contrôler les noms de champs et l'imbrication des données. Ajouter WITHOUT_ARRAY_WRAPPER pour les requêtes à enregistrement unique. Conservez votre json maigre en incluant uniquement les colonnes dont le modèle a besoin. Moins de bruit signifie de meilleures réponses et des coûts de jeton inférieurs.