Aumento de avisos con contexto de base de datos

Completado

La recuperación obtiene los datos. Pero un blob JSON por sí solo no responde a la pregunta de nadie. Si un cliente pregunta sobre la compatibilidad de los pedales de bicicletas, tiene la información del producto de la base de datos, pero ahora necesita indicar al modelo de lenguaje qué hacer con él. Ese paso representa la "A" en RAG: aumentación.

Descripción de la estructura del mensaje de chat

Los diferentes modelos tienen diferentes API, pero la mayoría de los modelos basados en chat siguen un patrón similar. Usamos Azure OpenAI como ejemplo, pero los conceptos se aplican ampliamente.

Los modelos de chat de Azure OpenAI esperan mensajes con roles. El rol del sistema define cómo debe comportarse el asistente. El rol de usuario contiene la pregunta original y el contexto de la base de datos en el que el modelo debe fundamentar su respuesta. Opcionalmente, un rol de asistente puede mantener respuestas anteriores en una conversación de varios turnos. Este es un ejemplo simplificado de una estructura de un prompt:

{
  "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}"
    }
  ]
}

En este ejemplo, {retrieved_data} sería el JSON que creó a partir de la consulta del producto y {user_question} sería algo parecido a "¿Qué pedales son compatibles con mountain-500?"

El mensaje del sistema establece reglas básicas. El mensaje de usuario combina el contexto de la base de datos con la pregunta real.

Crear instrucciones en T-SQL

Puede compilar este JSON en el código de la aplicación, pero a menudo es conveniente mantenerlo todo en la base de datos. La consulta de recuperación, el formato de contexto y la creación de la solicitud consulta residen juntos, y las funciones JSON_OBJECT y JSON_ARRAY de T-SQL controlan el formato JSON.

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

La @payload variable contiene ahora un cuerpo de solicitud completo listo para la API de Azure OpenAI.

Base del modelo en los datos

Grounding indica al modelo que use los datos como origen de la verdad. Sin él, el modelo podría depender de sus datos de entrenamiento, que podrían estar obsoletos o incorrectos para el dominio. Un cliente que pregunta por las garantías de las bicicletas de Adventure Works no debería obtener información genérica sobre la garantía en Internet.

Las buenas instrucciones básicas establecen el ámbito ("usar solo los datos de producto proporcionados"), fomentan la honestidad ("si no tiene suficiente información, por ejemplo"), y pueden especificar el formato ("mantener las respuestas en menos de 100 palabras"). Este es un ejemplo del rol del sistema :

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

Estas instrucciones ayudan al modelo a centrarse y proporcionan respuestas útiles y precisas.

Control del comportamiento del modelo

La carga de la solicitud incluye un par de parámetros que afectan al modo en que el modelo genera respuestas:

  • max_tokens limita la longitud de la respuesta. Para obtener respuestas detalladas del producto, entre 500 y 1,000 palabras funcionan bien.
  • temperature controla la creatividad en una escala de 0 a 2. Los valores inferiores (de 0,3 a 0,5) producen respuestas fácticas más coherentes. Los valores más altos permiten que el modelo sea más creativo, lo cual normalmente no se desea para RAG.

Controlar los tokens y la temperatura ayuda a garantizar que el modelo se comporte de forma predecible cuando se base en los datos.

Construir la carga completa

Este es el modo en que puede crear una solicitud RAG para una consulta de producto usando las tablas Adventure Works.

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

La @payload variable ahora contiene todo lo que necesita el modelo: las instrucciones básicas, los datos de producto recuperados y la pregunta del cliente. Lo único que debe hacer es enviarlo al punto de conexión del modelo y gestionar la respuesta.

Conclusiones clave

Es en esta solicitud donde la recuperación resulta útil. El contexto JSON no significa nada a menos que indique al modelo cómo usarlo. Establezca reglas de anclaje claras en el mensaje del sistema para que el modelo se adhiera a sus datos. Mantenga la temperatura baja para las respuestas fácticas. Use JSON_OBJECT y JSON_ARRAY para compilar cargas JSON válidas directamente en T-SQL.