Preparación del contexto de recuperación para el aumento
Ahora comprende qué es RAG y cuándo usarlo. En las unidades siguientes, aprenderá a implementar cada paso del flujo de trabajo rag en T-SQL.
Considere el siguiente escenario: Un cliente pregunta "¿Qué pedales encajan en la bicicleta de montaña que compré el mes pasado?" Consulte la base de datos, busque su orden, identifique el modelo de bicicleta y busque componentes compatibles. Ese paso representa la "R" en RAG: recuperación. Vamos a recuperar y preparar esos datos para el modelo de lenguaje. Hay muchas maneras de recuperar datos de SQL, pero para RAG, el objetivo es proporcionar el modelo con contexto estructurado que realmente puede usar.
Conversión de datos relacionales en JSON
Los modelos de lenguaje procesan texto, no estructuras relacionales. Si pasa los resultados de la consulta sin procesar, el modelo no tiene forma de interpretar los nombres de las columnas, los tipos de datos o las relaciones. JSON resuelve este problema conservando la estructura en un formato de texto. Los nombres de campo permanecen adjuntos a los valores. Los objetos anidados representan relaciones. El modelo puede leer "ProductName": "Mountain-500" y hacer referencia a ese producto específico en su respuesta.
JSON también mantiene las cosas predecibles. Cuando el modelo devuelve una respuesta, sabe que la respuesta procede de campos proporcionados explícitamente. Si en su lugar volcara texto no estructurado, tendría menos control sobre lo que el modelo utiliza para formular su respuesta.
Dar formato a los resultados de la consulta con FOR JSON
No es necesario compilar cadenas JSON manualmente. Solo tiene que agregar FOR JSON al final de select y SQL hace el trabajo:
FOR JSON AUTOda formato a la salida en función de la estructura de consulta. Los nombres de columna se convierten automáticamente en nombres de campo.SELECT Name, ListPrice, Color FROM Production.Product WHERE ProductID = @ProductID FOR JSON AUTO;Esta consulta devuelve algo parecido a:
[{"Name":"Mountain-500 Black, 48","ListPrice":564.99,"Color":"Black"}]FOR JSON PATHproporciona control explícito sobre la estructura JSON. Los nombres de campo y el anidamiento se definen mediante alias de columna.SELECT Name AS 'product.name', ListPrice AS 'product.price', Size AS 'product.size' FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH;Esta consulta devuelve algo parecido a:
[{"product":{"name":"Mountain-500 Black, 48","price":564.99,"size":"48"}}]
Control de las opciones de salida JSON
Algunas opciones le permiten dar forma a la salida:
WITHOUT_ARRAY_WRAPPERquita los corchetes al recuperar un único registro. Esta opción es útil para RAG porque a menudo recupera un cliente, un producto o un pedido a la vez.SELECT Name, Description, Size, Weight FROM Production.Product WHERE ProductID = @ProductID FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;INCLUDE_NULL_VALUESmantiene los campos NULL en la salida en lugar de omitirlos. Use este parámetro cuando la ausencia de un valor sea significativa.ROOT('name')envuelve toda la salida dentro de un elemento raíz nombrado, lo que puede ayudar al modelo a comprender qué tipo de datos está recibiendo.
Elección de lo que se va a incluir
No todas las columnas pertenecen a tu contexto. Por ejemplo, los identificadores internos, las marcas de tiempo de auditoría y los códigos de almacenamiento no ayudan al modelo a responder a las preguntas del cliente. Solo consumen tokens y agregan ruido.
Para una pregunta sobre un producto, incluya el nombre del producto, la descripción, las especificaciones y los precios. Omita el atributo rowguid, la fecha de modificación y la bandera de discontinuidad, a menos que sean directamente relevantes.
Los límites del token también son importantes. Cada token que envía cuesta dinero y cuenta en la ventana de contexto del modelo. Si va a recuperar varios productos, mantenga cada uno ajustado. El modelo funciona mejor con un contexto enfocado que con todo lo que podrías incluir.
Combinar varios orígenes
El contexto rag suele provendr de varias tablas. Una pregunta de compatibilidad de pedal necesita detalles del producto, especificaciones y componentes relacionados. Puede empezar por buscar productos relevantes con búsqueda de vectores y, a continuación, unir otras tablas para crear la imagen completa.
Esto es lo que parece en la práctica. En primer lugar, convierta la pregunta del usuario en una inserción. A continuación, use VECTOR_DISTANCE para buscar las coincidencias más cercanas, combinar las tablas relacionadas y dar formato a todo como 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 ahora contiene una cadena JSON lista para el mensaje. Esta cadena JSON es el resultado de consulta formateado para augmentación.
Conclusiones clave
El objetivo es proporcionar un contexto estructurado que el modelo de lenguaje pueda realmente usar. JSON conserva el significado de los datos mientras se mantiene legible como texto. Use FOR JSON AUTO cuando desee resultados rápidos y FOR JSON PATH cuando necesite controlar los nombres de campo y el anidamiento. Agregue WITHOUT_ARRAY_WRAPPER para consultas de registro único. Mantenga su JSON conciso incluyendo solo las columnas que el modelo necesita. Menos ruido significa mejores respuestas y menores costos de token.