Consulta de una base de conocimiento mediante la acción de recuperación o el punto de conexión de MCP

Nota

Búsqueda de Azure AI está disponible a través del portal de Azure, las API REST y los SDK de Azure. También respalda Foundry IQ, la capa de conocimiento administrada que transforma el contenido empresarial en bases de conocimiento reutilizables y compatibles con permisos para agentes en el portal de Microsoft Foundry.

Importante

Las características, funcionalidades o propiedades marcadas (versión preliminar) no están cubiertas por un contrato de nivel de servicio, no se recomiendan para cargas de trabajo de producción y pueden cambiar o restringirse antes de que estén disponibles con carácter general. Los términos de la versión preliminar Búsqueda de Azure AI se aplican a todas las funciones de vista previa, ya sea independiente o parte de una característica disponible con carácter general.

En una canalización de recuperación agente, la acción de recuperación invoca el procesamiento de consultas en paralelo desde una base de conocimiento. Puede llamar a la acción de recuperación directamente mediante las API REST del servicio de búsqueda o un SDK de Azure. Cada base de conocimiento también expone un punto de conexión del Protocolo de contexto de modelo (MCP) para su consumo por parte de agentes compatibles con MCP.

En este artículo se explica cómo invocar ambos métodos de recuperación con comprobación opcional de permisos. Primero se aborda la acción de recuperación y más adelante el punto de conexión de MCP, porque actualmente el resultado de la herramienta MCP difiere del formato de respuesta de REST y del SDK.

Para configurar una canalización que conecta Búsqueda de Azure AI al servicio de agente Foundry a través de MCP, consulte Tutorial: Crear una solución de recuperación agente de extremo a extremo.

Soporte para el uso

Portal de Azure Portal de Microsoft Foundry SDK de .NET SDK de Python SDK de Java SDK de JavaScript REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Requisitos previos

  • Si llama al punto de conexión de MCP a través de la API de respuestas de OpenAI de Azure, necesita lo siguiente:

    • Un LLM implementado y el rol de usuario OpenAI de Cognitive Services (o una clave de API) en el recurso Foundry. Puede reutilizar el LLM y el recurso especificados en la base de conocimiento, si procede.

    • El Azure.AI.OpenAI paquete: dotnet add package Azure.AI.OpenAI

  • Paquete Azure.Search.Documents requerido:

    • Para las funciones de 2026-08-01-preview, el paquete preliminar más reciente: dotnet add package Azure.Search.Documents --prerelease

    • Para las funciones de 2026-04-01, el paquete estable más reciente: dotnet add package Azure.Search.Documents

  • Para la autenticación sin claves, el Azure.Identity paquete: dotnet add package Azure.Identity

  • Si llama al punto de conexión de MCP a través de la API de respuestas de OpenAI de Azure, necesita lo siguiente:

    • Un LLM implementado y el rol de usuario OpenAI de Cognitive Services (o una clave de API) en el recurso Foundry. Puede reutilizar el LLM y el recurso especificados en la base de conocimiento, si procede.

    • El openai paquete: pip install openai

  • Paquete azure-search-documents requerido:

    • Para las funciones de 2026-08-01-preview, el paquete preliminar más reciente: pip install --pre azure-search-documents

    • Para las funciones de 2026-04-01, el paquete estable más reciente: pip install azure-search-documents

  • Para la autenticación sin claves, el azure-identity paquete: pip install azure-identity

  • Versión necesaria de la API REST del servicio search:

  • Para la autenticación sin claves, incluya un token de Microsoft Entra ID en el Authorization encabezado de cada solicitud HTTP.

Limitations

Para los orígenes de conocimiento del índice de búsqueda, cuando habilita la reordenación, la operación de recuperación utiliza la configuración semántica del origen de conocimiento. No aplica los perfiles de puntuación del índice subyacente, incluido defaultScoringProfile. Las respuestas de recuperación tampoco muestran @search.rerankerBoostedScore.

Llamada a la acción de recuperación

Especifique la acción de recuperación en una base de conocimiento. El cuerpo de la solicitud incluye la entrada de la consulta y una lista opcional de orígenes de conocimiento a los que dirigirse.

La versión 2026-04-01 de la API solo admite la entrada intents y una recuperación extractiva básica. No se admiten las capacidades exclusivamente en versión preliminar, como la entrada messages, la planificación de consultas, la síntesis de respuestas y el esfuerzo configurable de razonamiento. Se usa 2026-08-01-preview para una funcionalidad completa.

using Azure.Identity;
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Create knowledge base retrieval client
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<search-endpoint>"),
    knowledgeBaseName: "<knowledge-base-name>",
    credential: new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You can answer questions about the Earth at night. "
                + "Sources have a JSON format with a ref_id that must be cited in the answer. "
                + "If you do not have the answer, respond with 'I do not know'."
            )
        }
    ) { Role = "assistant" }
);
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "Why is the Phoenix nighttime street grid so sharply visible from space, "
                + "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
            )
        }
    ) { Role = "user" }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

# Create knowledge base retrieval client
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You can answer questions about the Earth at night. "
                    "Sources have a JSON format with a ref_id that must be cited in the answer. "
                    "If you do not have the answer, respond with 'I do not know'."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Why is the Phoenix nighttime street grid so sharply visible from space, "
                    "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="earth-at-night-blob-ks",
        )
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

@search-endpoint = <search-endpoint> // Example: https://my-service.search.windows.net
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You can answer questions about the Earth at night. Sources have a JSON format with a ref_id that must be cited in the answer. If you do not have the answer, respond with 'I do not know'."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Why is the Phoenix nighttime street grid so sharply visible from space, whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "earth-at-night-blob-ks",
            "kind": "searchIndex"
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Proporcionar imágenes para responder a la síntesis (versión preliminar)

Para las fuentes de conocimiento blob, OneLake indexado y SharePoint indexado que configure con un almacén de activos, puede proporcionar imágenes incrustadas en documentos al modelo de síntesis de respuestas posterior junto con el texto. Establezca enableImageServing en la entrada correspondiente de knowledgeSourceParams para anular el valor predeterminado configurado en la definición de la base de conocimientos. La respuesta de recuperación no incluye campos específicos para las rutas de imagen individuales ni para los bytes de imagen proporcionados al modelo.

La entrega de imágenes solo se ejecuta cuando outputMode es answerSynthesis y no es compatible con fuentes de conocimiento que configuren ingestionPermissionOptions. Para conocer los pasos de configuración, la tabla de precedencia y cómo inspeccionar las estadísticas de servicio de imágenes, consulte Mostrar imágenes incrustadas en documentos en recuperación de agentes (versión preliminar).

Deshabilitar la reordenación para una fuente de conocimiento (versión preliminar)

A partir de la versión 2026-08-01-preview de la API, configure "resultsProcessing": "none" en una entrada knowledgeSourceParams para omitir la reordenación de una fuente de conocimiento específica y conservar el orden original de sus resultados. También puede almacenar resultsProcessing en el origen de conocimiento como valor predeterminado. Todos los tipos de origen de conocimiento admiten esta propiedad.

En el ejemplo siguiente, se omite la reclasificación para product-catalog-ks en una solicitud de recuperación.

using System;
using System.Linq;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var client = new KnowledgeBaseRetrievalClient(
    new Uri("<search-endpoint>"),
    "product-catalog-kb",
    new DefaultAzureCredential());

var request = new KnowledgeBaseRetrievalRequest
{
    IncludeActivity = true
};
request.Intents.Add(
    new KnowledgeRetrievalSemanticIntent(
        "Find the power adapter for SKU 88421."));
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("product-catalog-ks")
    {
        AlwaysQuerySource = true,
        IncludeReferences = true,
        ResultsProcessing = KnowledgeSourceResultsProcessing.None
    });

var result = await client.RetrieveAsync(request);
Console.WriteLine(
    $"References with a reranker score: "
    + $"{result.Value.References.Count(x => x.RerankerScore.HasValue)}");

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
    SearchIndexKnowledgeSourceParams,
)

client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="product-catalog-kb",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="Find the power adapter for SKU 88421."
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-catalog-ks",
            always_query_source=True,
            include_references=True,
            results_processing="none",
        )
    ],
)

result = client.retrieve(request)
reranked_count = sum(
    reference.reranker_score is not None
    for reference in result.references
)
print("References with a reranker score:", reranked_count)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Run: az account get-access-token --scope https://search.azure.com/.default --query accessToken -o tsv
@knowledge-base-name = product-catalog-kb

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "intents": [
    {
      "type": "semantic",
      "search": "Find the power adapter for SKU 88421."
    }
  ],
  "includeActivity": true,
  "knowledgeSourceParams": [
    {
      "knowledgeSourceName": "product-catalog-ks",
      "kind": "searchIndex",
      "alwaysQuerySource": true,
      "includeReferences": true,
      "resultsProcessing": "none"
    }
  ]
}

Reference:Recuperación de Conocimiento - Retrieve

Establece "resultsProcessing": "rerank", u omítelo cuando no exista un valor predeterminado almacenado, para utilizar el canal de reclasificación. Búsqueda de Azure AI resuelve el valor efectivo de cada origen en este orden:

  1. resultsProcessing en knowledgeSourceParams en la solicitud de recuperación.
  2. resultsProcessing almacenado en la fuente de conocimiento.
  3. rerank cuando ninguna propiedad está presente.

Para un origen de conocimiento del servidor MCP, un resultsProcessing valor establecido en una herramienta individual tiene prioridad sobre la solicitud y los valores almacenados.

Tip

resultsProcessing cambia cómo se procesan los resultados, no los orígenes que se consultan. Establezca alwaysQuerySource en true si se debe consultar la fuente de conocimiento.

Cuando el valor efectivo es none:

  • Las referencias del origen de conocimiento omiten rerankerScorey los resultados mantienen su orden subyacente dentro de la actividad de recuperación del origen.
  • Cuando alguna fuente omite la reclasificación, Búsqueda de Azure AI distribuye los resultados finales entre las actividades por turnos, siguiendo el orden de declaración de las fuentes de conocimiento. Las actividades reordenadas siguen ordenadas por puntuación.
  • Se siguen aplicando límites de desduplicación y por origen, documento y token, por lo que no todos los resultados recuperados aparecen en la respuesta.

Búsqueda de Azure AI valida rerankerThreshold en este orden:

  1. La búsqueda resuelve resultsProcessing a partir de la solicitud de recuperación y del valor almacenado de la fuente de conocimiento.
  2. Si el valor resuelto es none y la solicitud incluye rerankerThreshold, Search devuelve 400 Bad Request.
  3. Para una herramienta del servidor MCP, Search aplica el valor de nivel de herramienta resultsProcessing después de validar la solicitud.

Como resultado, una configuración de la herramienta MCP no cambia si la solicitud pasa la validación. Un valor a nivel de herramienta none no provoca un error de umbral, y un valor a nivel de herramienta rerank no evita que se produzca un error cuando la solicitud o el valor almacenado se resuelve en none.

Para confirmar qué modo se ejecutó, compruebe si las referencias del origen de conocimiento incluyen rerankerScore. No confíe en semanticConfigurationName, que puede ser null en lugar de omitirse.

Comportamiento del índice de búsqueda

En el caso de los orígenes de conocimiento que tienen como destino un índice de búsqueda, el tipo de consulta implícito es semanticy no hay ningún modo de búsqueda. Cuando se ejecuta la reclasificación, la ejecución de consultas usa semanticConfigurationName. Otras opciones de configuración de origen, incluidas searchFields y sourceDataFields, se aplican en ambos modos.

La recuperación agéntica no acepta entradas scoringProfile o scoringParameters. Si necesita priorización por actualidad para las fuentes de conocimiento indexadas, use la recuperación basada en la actualidad (versión preliminar) en lugar de un perfil de puntuación del índice.

Si el índice incluye campos vectoriales, necesita una definición de vectorizador válida para que el motor de recuperación agente pueda vectorizar las entradas de consulta. De lo contrario, se omiten los campos vectoriales.

Para obtener más información, consulte Creación de un índice para la recuperación autónoma.

Transmitir resultados recuperados (versión preliminar)

A partir de la versión de la 2026-08-01-preview API, puede recibir resultados de recuperación como una secuencia de eventos enviados por el servidor (SSE) en lugar de esperar una única respuesta JSON. Mediante el streaming, el cliente puede mostrar la planeación de consultas, la actividad de origen y la respuesta sintetizada o la respuesta extraída en ese orden a medida que cada elemento esté disponible.

using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var client = new KnowledgeBaseRetrievalClient(
    new Uri("<search-endpoint>"),
    "<knowledge-base-name>",
    new DefaultAzureCredential());

var request = new KnowledgeBaseRetrievalRequest
{
    OutputMode = KnowledgeRetrievalOutputMode.ExtractiveData,
    RetrievalReasoningEffort =
        new KnowledgeRetrievalMinimalReasoningEffort(),
    IncludeActivity = true,
};
request.Intents.Add(
    new KnowledgeRetrievalSemanticIntent("What is the return policy?"));
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "<knowledge-source-name>")
    {
        ResultsProcessing = KnowledgeSourceResultsProcessing.None,
        IncludeReferences = true,
    });

var eventCounts = new Dictionary<string, int>();

await foreach (var item in client.RetrieveStreamAsync(request))
{
    eventCounts.TryGetValue(item.EventType, out var count);
    eventCounts[item.EventType] = count + 1;
}

foreach (var (eventType, count) in eventCounts)
{
    Console.WriteLine($"{eventType}: {count}");
}

Reference:KnowledgeBaseRetrievalClient

from collections import Counter

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
    KnowledgeSourceResultsProcessing,
)
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalMinimalReasoningEffort,
    KnowledgeRetrievalOutputMode,
    KnowledgeRetrievalSemanticIntent,
    SearchIndexKnowledgeSourceParams,
)


client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="What is the return policy?"
        )
    ],
    output_mode=KnowledgeRetrievalOutputMode.EXTRACTIVE_DATA,
    retrieval_reasoning_effort=KnowledgeRetrievalMinimalReasoningEffort(),
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="<knowledge-source-name>",
            results_processing=KnowledgeSourceResultsProcessing.NONE,
            include_references=True,
        )
    ],
)

event_counts = Counter()

with client.retrieve_stream(request) as stream:
    for event in stream:
        event_counts[event.event_type] += 1

for event_type, count in event_counts.items():
    print(f"{event_type}: {count}")

Reference:KnowledgeBaseRetrievalClient

Para habilitar la transmisión en secuencias, incluya el encabezado Accept: text/event-stream en una solicitud de recuperación. Sin este encabezado, la acción de recuperación devuelve su respuesta JSON estándar.

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Accept: text/event-stream
Authorization: Bearer {{search-access-token}}

{
    "intents": [
        {
            "type": "semantic",
            "search": "What is the return policy?"
        }
    ],
    "outputMode": "extractiveData",
    "retrievalReasoningEffort": {
        "kind": "minimal"
    },
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "{{knowledge-source-name}}",
            "kind": "searchIndex",
            "resultsProcessing": "none",
            "includeReferences": true
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Ciclo de vida de los eventos

En lugar de devolver una única respuesta, el servicio mantiene abierta una conexión HTTP (tipo text/event-stream; charset=utf-8de contenido) y envía una secuencia de eventos a medida que los datos están disponibles. Cada evento tiene una línea que asigna un event: nombre al tipo de evento, una data: línea con un valor JSON y una línea en blanco que marca el final del evento.

Un flujo correcto sigue el siguiente ciclo de vida:

Event Cuando se envía Qué contiene
retrieval.started Primer evento de cada solicitud en streaming. El ID de la solicitud, el nombre de la base de conocimiento, el modo de salida y el esfuerzo de razonamiento efectivo una vez que el servicio resuelva los valores predeterminados de la solicitud y de la base de conocimiento. Si el valor efectivo kind es auto, el evento notifica auto; no predice la escalación posterior.
activity.started Cuando el servicio inicia una actividad de planificación de consultas, de origen o de modelo. Se pueden iniciar varias actividades antes de que se complete una actividad anterior. La actividad id, type, la hora de inicio y el nombre del origen de conocimiento opcional.
activity.completed Cuando finalice esa actividad. Correlácionalo con su evento activity.started haciendo coincidir id. El registro de actividad completado.
answer.completed Una vez, solo cuando outputMode es answerSynthesis. messageIndex identifica la posición del mensaje en la matriz de respuesta final y message contiene la respuesta sintetizada completa. No hay ningún evento delta de token a token.
references.completed Una vez resueltas todas las referencias. Los datos del evento son el array completo de referencias, sin un objeto contenedor.
response.completed Evento terminal para un flujo correcto o parcialmente correcto. 200 o 206, el código de estado y el cuerpo completo de la respuesta de recuperación, que tiene la misma estructura que una llamada JSON sin streaming. Para obtener información sobre lo que significa cada código de estado, consulte Solución de problemas de la acción de recuperación.
error En lugar de references.completed y response.completed cuando la recuperación falla tras la apertura del flujo. El error y cualquier registro de actividad que se haya completado antes del fallo.

Los eventos llegan en orden. Cada evento activity.started precede al evento activity.completed con el mismo id, pero las actividades pueden intercalarse. Los registros de actividad completados también incluyen las fechas y horas startedAt y completedAt. Mientras la secuencia está inactiva, el servidor envía un : heartbeat comentario aproximadamente cada 15 segundos para mantener abierta la conexión. Los clientes SSE pueden omitir estos comentarios.

En el ejemplo siguiente se muestra una respuesta transmitida, con cargas abreviadas para mejorar la legibilidad.

event: retrieval.started
data: {"requestId":"<request-id>","outputMode":"answerSynthesis"}

event: activity.started
data: {"id":0,"type":"searchIndex","startedAt":"<timestamp>"}

: heartbeat

event: activity.completed
data: {"id":0,"startedAt":"<start>","completedAt":"<end>"}

event: answer.completed
data: {"messageIndex":0,"message":{"content":[{"type":"text","text":"..."}]}}

event: references.completed
data: [{"type":"searchIndex","id":"0","activitySource":0}]

event: response.completed
data: {"statusCode":200,"response":{}}

Gestionar errores, cancelaciones y mecanismos de respaldo

  • Errores previos: si se produce un error en la validación de la solicitud antes de que se abra la secuencia, como para un cuerpo de solicitud con formato incorrecto, la acción de recuperación devuelve una respuesta de error JSON estándar y nunca abre la secuencia.

  • Errores de secuencia media: si se produce un error en la recuperación después de que se abra la secuencia, el evento de terminal es error en lugar de references.completed y response.completed. El evento puede incluir los registros de actividad que se completaron antes del error. El código de estado HTTP permanece 200 una vez que se inicia la secuencia, así que compruebe el evento de terminal, no el código de estado HTTP, para determinar si se ha realizado correctamente.

  • Cancelación o desconexión: si el cliente cancela la solicitud o se desconecta antes de que finalice la secuencia, el servicio cancela la recuperación y finaliza la secuencia sin un evento de terminal. Trate los eventos recibidos antes de la cancelación o desconexión como incompletos.

  • Respuesta alternativa en JSON: Con 2026-08-01-preview, si falta el encabezado Accept o se usa un valor como application/json, */*, text/* o text/event-stream;q=0, se devuelve la respuesta JSON estándar descrita en Revisar la respuesta. Solicitar text/event-stream en una versión anterior de la API devuelve 406 Not Acceptable.

Filtrar los orígenes de conocimiento del índice de búsqueda en el momento de la consulta

Al recuperar desde una fuente de conocimiento del índice de búsqueda, puede aplicar un filtro OData durante la consulta para limitar los resultados a documentos o campos específicos. La expresión de filtro usa la sintaxis de OData y se pasa a través del filterAddOn parámetro .

Sintaxis y ejemplos de filtros

El filterAddOn parámetro acepta expresiones de filtro de OData. Entre los patrones de ejemplo se incluyen:

  • Campos de metadatos: city eq 'Phoenix', status eq 'active'
  • Intervalos de fechas: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Intervalos numéricos: price ge 100 and price le 5000
  • Coincidencia de texto: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Operadores lógicos: (category eq 'News' or category eq 'Analysis') and status eq 'published'
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<search-endpoint>"),
    knowledgeBaseName: "<knowledge-base-name>",
    credential: new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "You are a support agent. Answer questions based on published documentation. "
                + "If you don't know the answer, say so."
            )
        }
    ) { Role = "assistant" }
);

retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What is the process for submitting an expense report?"
            )
        }
    ) { Role = "user" }
);

// Apply a filter to search only published documents
var searchIndexParams = new SearchIndexKnowledgeSourceParams(
    knowledgeSourceName: "internal-documentation-ks"
);
searchIndexParams.FilterAddOn = "status eq 'published'";

retrievalRequest.KnowledgeSourceParams.Add(searchIndexParams);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=DefaultAzureCredential(),
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="assistant",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="You are a support agent. Answer questions based on published documentation. "
                    "If you don't know the answer, say so."
                )
            ],
        ),
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="What is the process for submitting an expense report?"
                )
            ],
        ),
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="internal-documentation-ks",
            # Apply a filter to search only published documents
            filter_add_on="status eq 'published'",
        )
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
    "messages": [
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "You are a support agent. Answer questions based on published documentation. If you don't know the answer, say so."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What is the process for submitting an expense report?"
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "internal-documentation-ks",
            "kind": "searchIndex",
            "filterAddOn": "status eq 'published'"
        }
    ]
}

Ejemplo de varios filtros

Puede combinar varios filtros para refinar aún más los resultados.

searchIndexParams.FilterAddOn = "(status eq 'published' or status eq 'internal') and created ge 2025-01-01";
filter_add_on="(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
{
    "knowledgeSourceName": "internal-documentation-ks",
    "kind": "searchIndex",
    "filterAddOn": "(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
}

Invalidar sugerencias de consulta almacenadas en el momento de la consulta (versión preliminar)

A partir de la versión de la API 2026-08-01-preview, puede anular las indicaciones de consulta almacenadas en una fuente de conocimiento de un índice de búsqueda para una sola solicitud de recuperación estableciendo queryHintOverrides en la entrada knowledgeSourceParams.

La sobrescritura reemplaza el objeto completo almacenado queryHints en lugar de fusionarlo entrada por entrada, así que incluye todas las indicaciones que quieras aplicar. Omitir queryHintOverrides para usar las sugerencias almacenadas.

Cuando el esfuerzo de razonamiento de recuperación no es minimal, una respuesta HTTP 400 depende de las sugerencias de filtro almacenadas, no del contenido de anulación ni del tipo de refuerzo. El servicio valida las sugerencias de filtro almacenadas en el modelo de base de conocimiento antes de aplicar queryHintOverrides. Por lo tanto, un modelo de la familia GPT-4o o GPT-4.1 rechaza la solicitud incluso cuando la anulación está vacía o solo contiene ajustes de refuerzo. Las potenciaciones almacenadas por sí solas no desencadenan esta validación. Use un modelo compatible o quite primero las sugerencias de filtro almacenadas.

En el ejemplo siguiente se reemplazan todas las sugerencias almacenadas por un fieldValue aumento del contenido japonés. El servicio no aplica ningún filtro almacenado u otro aumento almacenado a esta solicitud.

using System;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var endpoint = new Uri("<search-endpoint>");
var retrievalClient = new KnowledgeBaseRetrievalClient(
    endpoint,
    "product-kb",
    new DefaultAzureCredential());

var languageBoost =
    new SearchIndexKnowledgeSourceFieldValueBoost(
        "language",
        2.0);
languageBoost.FieldValues.Add("ja-JP");
var queryHintOverrides =
    new SearchIndexKnowledgeSourceQueryHints();
queryHintOverrides.Boosts.Add(languageBoost);

var request = new KnowledgeBaseRetrievalRequest
{
    RetrievalReasoningEffort =
        new KnowledgeRetrievalLowReasoningEffort(),
    IncludeActivity = true
};
request.Messages.Add(
    new KnowledgeBaseMessage([
        new KnowledgeBaseMessageTextContent(
            "Find Japanese service guidance for Model-X200.")
    ])
    {
        Role = "user"
    });
request.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "product-docs-ks")
    {
        QueryHintOverrides = queryHintOverrides
    });

var result = await retrievalClient.RetrieveAsync(request);

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

from azure.identity import DefaultAzureCredential
from azure.search.documents.indexes.models import (
    SearchIndexKnowledgeSourceFieldValueBoost,
    SearchIndexKnowledgeSourceQueryHints,
)
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalLowReasoningEffort,
    SearchIndexKnowledgeSourceParams,
)

retrieval_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    credential=DefaultAzureCredential(),
    knowledge_base_name="product-kb",
)

query_hint_overrides = SearchIndexKnowledgeSourceQueryHints(
    boosts=[
        SearchIndexKnowledgeSourceFieldValueBoost(
            field="language",
            field_values=["ja-JP"],
            boost=2.0,
        )
    ]
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Find Japanese service guidance for Model-X200."
                )
            ],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-docs-ks",
            query_hint_overrides=query_hint_overrides,
        )
    ],
    retrieval_reasoning_effort=(
        KnowledgeRetrievalLowReasoningEffort()
    ),
    include_activity=True,
)

result = retrieval_client.retrieve(request)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases('product-kb')/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "messages": [{
    "role": "user",
    "content": [{
      "type": "text",
      "text": "Find Japanese service guidance for Model-X200."
    }]
  }],
  "knowledgeSourceParams": [{
    "knowledgeSourceName": "product-docs-ks",
    "kind": "searchIndex",
    "queryHintOverrides": {
      "boosts": [{
        "kind": "fieldValue",
        "field": "language",
        "fieldValues": ["ja-JP"],
        "boost": 2.0
      }]
    }
  }],
  "retrievalReasoningEffort": {"kind": "low"},
  "includeActivity": true
}

Reference:Recuperación de Conocimiento - Retrieve

Para confirmar que el servicio aplicó la anulación, establezca includeActivity en la solicitud e inspeccione la actividad searchIndex devuelta. Su queryHintProcessing objeto informa de lo que generó el modelo. En este ejemplo, incluye un generatedBoost para el refuerzo de idioma, pero no generatedFilter porque la anulación reemplazó la sugerencia de filtro almacenada. Dado que las sugerencias de consulta se realizan según el mejor esfuerzo posible, trata esta actividad como una confirmación en lugar de como una comprobación de una expresión exacta.

{
  "type": "searchIndex",
  "queryHintProcessing": {
    "generatedBoost": "language:(ja\\-JP)^2"
  },
  "searchIndexArguments": {
    "queryType": "full"
  }
}

Para obtener la definición almacenada, los tipos de sugerencias admitidos y la composición con filtros deterministas, consulte Configuración de sugerencias de consulta (versión preliminar).

Aplicar permisos en tiempo de consulta (versión preliminar)

Los cambios en los permisos de acceso que establezca fuera de 2026-08-01-preview pueden tardar en aparecer en los resultados de recuperación de 2026-08-01-preview.

Si los orígenes de conocimiento contienen contenido protegido con permisos, pase la identidad del usuario final en la solicitud de recuperación para que cada usuario vea solo el contenido al que está autorizado para acceder. En el caso de los orígenes indexados, el motor de recuperación usa esta identidad para filtrar los resultados y devuelve resultados sin filtrar si se omite. Los orígenes remotos también utilizan la autorización de la solicitud de recuperación, pero aplican los permisos en el origen y pueden requerir un token y un encabezado específicos de ese origen.

El cumplimiento de permisos tiene dos partes:

  • Tiempo de ingesta: solo para los orígenes de conocimiento indexados, establezca ingestionPermissionOptions para ingerir metadatos de permisos junto con el contenido.

  • Tiempo de consulta: pase la autorización del usuario en el encabezado requerido por el origen de conocimiento. La mayoría de las fuentes usan x-ms-query-source-authorization. La excepción es Work IQ, que usa x-ms-query-work-iq-source-authorization.

Configuración durante la ingesta

En la tabla siguiente se muestran los orígenes de conocimiento que requieren configuración de tiempo de ingesta y cómo cada origen gestiona los permisos.

Origen de conocimiento Requiere ingestionPermissionOptions Cómo se aplican los permisos
Blob o ADLS Gen2 ✅ Ámbitos de RBAC ingeridos, ACL o Microsoft Purview asociados con la identidad del usuario.
OneLake ✅ Etiquetas de confidencialidad de Microsoft Purview del documento ingerido comparadas con la identidad del usuario.
SharePoint indexado ✅ Las ACL de SharePoint ingeridas o las etiquetas de confidencialidad Microsoft Purview asociadas con la identidad del usuario.
SharePoint remoto ❌ La API de Recuperación de Copilot realiza consultas a SharePoint directamente mediante el token del usuario.
Fabric Agente de datos ❌ El motor de recuperación intercambia el token del usuario por un token con ámbito de Microsoft Fabric y consultas al agente de datos en su nombre.
Ontología de tejido ❌ El motor de recuperación canjea el token del usuario por un token limitado al ámbito de Microsoft Fabric y consulta el elemento de ontología en nombre del usuario.
IQ de trabajo ❌ El motor de recuperación cambia una afirmación de usuario de app-audience procedente de x-ms-query-work-iq-source-authorization por un token con ámbito de Work IQ.

Si no se configura ingestionPermissionOptions al crear el origen de conocimiento indexado, el índice no contiene metadatos de permiso. El sistema devuelve resultados sin filtrar, independientemente del encabezado. Para solucionar este problema, vuelva a crear el origen de conocimiento con los valores adecuados ingestionPermissionOptions .

Autorización en tiempo de consulta

Para fuentes de conocimiento ajenas a Work IQ, pasa la identidad del usuario final incluyendo un token de acceso con ámbito https://search.azure.com/.default en la solicitud de recuperación. Este token es independiente de la credencial de servicio que se usa para acceder al servicio de búsqueda. No necesita permisos de servicio de búsqueda y solo representa al usuario cuyo acceso a contenido se evalúa. Para obtener más información, consulte Aplicación de ACL y RBAC en tiempo de consulta.

Para orígenes de conocimiento de Work IQ, esta sección no se aplica. Use el flujo de aserción de usuario específico de Work IQ descrito en Aplicar permisos en el momento de la consulta.

En el SDK de .NET, pase el token como parámetro querySourceAuthorization en RetrieveAsync:

using Azure;
using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

// Service credential: Authenticates to the search service
var serviceCredential = new DefaultAzureCredential();

// User identity token: Represents the end user for document-level permissions filtering
var userTokenContext = new Azure.Core.TokenRequestContext(
    new[] { "https://search.azure.com/.default" }
);
string userToken = (await serviceCredential.GetTokenAsync(userTokenContext)).Token;

// Create the retrieval client with the service credential
var kbClient = new KnowledgeBaseRetrievalClient(
    endpoint: new Uri("<search-endpoint>"),
    knowledgeBaseName: "<knowledge-base-name>",
    credential: serviceCredential
);

var request = new KnowledgeBaseRetrievalRequest();
request.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "What companies are in the financial sector?")
        }
    ) { Role = "user" }
);

// Pass the user identity token for permissions filtering
var result = await kbClient.RetrieveAsync(
    request, querySourceAuthorization: userToken);

var text = (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text;
Console.WriteLine(text);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

En el SDK de Python, pase el token como parámetro query_source_authorization en retrieve:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage, KnowledgeBaseMessageTextContent,
    KnowledgeBaseRetrievalRequest,
)

# Service credential: Authenticates to the search service
service_credential = DefaultAzureCredential()

# User identity token: Represents the end user for document-level permissions filtering
user_token_provider = get_bearer_token_provider(
    service_credential, "https://search.azure.com/.default")
user_token = user_token_provider()

# Create the retrieval client with the service credential
kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="<knowledge-base-name>",
    credential=service_credential,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(
                text="What companies are in the financial sector?")],
        )
    ]
)

# Pass the user identity token for permissions filtering
result = kb_client.retrieve(
    retrieval_request=request, query_source_authorization=user_token)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

En la API REST, incluya el x-ms-query-source-authorization encabezado con el token de acceso del usuario:

@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Service credential
@user-access-token = <user-access-token> // User identity token

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
x-ms-query-source-authorization: {{user-access-token}}

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What companies are in the financial sector?"
                }
            ]
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Revisión de la respuesta

La acción de recuperación devuelve tres componentes principales:

Respuesta extraída

La respuesta extraída es una cadena unificada única que normalmente se pasa a un LLM. LLM consume la cadena como datos de base y lo usa para formular una respuesta. Su llamada a la API del LLM incluye la cadena unificada y las instrucciones para el modelo, como si usar el fundamento exclusivamente o como complemento.

El cuerpo de la respuesta se estructura en el formato de estilo de mensaje de chat y el contenido se serializa JSON.

"response": [
    {
        "role": "assistant",
        "content": [
            {
                "type": "text",
                "text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
            }
        ]
    }
]

Puntos clave:

  • content.type tiene un valor válido: text.

  • content.text es una cadena codificada en JSON que contiene los documentos más relevantes (o fragmentos) que se encuentran en el índice de búsqueda, dadas las entradas del historial de consultas y chat. Esta cadena es los datos de base que usa un LLM para formular una respuesta a la pregunta del usuario.

    • Esta parte de la respuesta consta de 200 fragmentos o menos, excluyendo los resultados que no cumplan con el umbral mínimo de una puntuación de 2.5 en el reranker.

    • La cadena comienza con el identificador de referencia del fragmento (usado con fines de cita) y los campos especificados en la configuración semántica del índice de destino. En este ejemplo, supongamos que la configuración semántica del índice de destino tiene un campo "title", un campo "terms" y un campo "content".

  • Las respuestas de recuperación no incluyen @search.rerankerBoostedScore.

  • La maxOutputSizeInTokens propiedad (maxOutputSize en 2026-05-01-preview y versiones posteriores) de la solicitud de recuperación determina la longitud de la cadena.

    • Puede omitirse de la respuesta un documento que supere el maxOutputSizeInTokens presupuesto de salida. La matriz de actividad incluye una advertencia cuando el documento más relevante supera el tamaño máximo de salida. Para conservar más contenido, aumente maxOutputSizeInTokens. Para obtener más información, consulte Respuestas vacías.

Matriz de actividad

La matriz de actividad genera el plan de consulta, que proporciona transparencia operativa para las operaciones de seguimiento, las implicaciones de facturación y las invocaciones de recursos. También incluye subconsultas enviadas a la canalización de recuperación. Para una 206 Partial Content respuesta, la matriz incluye errores de las fuentes de conocimiento que han generado un error. Una 502 Bad Gateway respuesta puede proporcionar detalles de error solo en el error de nivel superior.

La matriz de actividad incluye los siguientes componentes:

Sección Descripción
Actividad específica del origen Para cada origen de conocimiento incluido en la consulta, esta sección informa sobre el tiempo transcurrido y qué argumentos se usaron en la consulta, incluido el clasificador semántico. Los tipos de origen de conocimiento incluyen searchIndex, azureBloby otros orígenes de conocimiento admitidos.
agenticReasoning En esta sección se informa sobre el consumo de tokens para el razonamiento agente durante la recuperación, que depende del esfuerzo de razonamiento de recuperación especificado (versión preliminar).
modelQueryPlanning En el caso de las bases de conocimiento que usan un LLM para la planeación de consultas, esta sección informa sobre el recuento de tokens que se usa para la entrada y el recuento de tokens de las subconsultas. Incluye un campo model con un campo modelName que contiene el nombre público del modelo, no el nombre de la implementación, del modelo que ejecutó la actividad.
modelAnswerSynthesis En el caso de las bases de conocimiento que usan la síntesis de respuestas (versión preliminar), esta sección informa sobre el recuento de tokens para formular la respuesta y el recuento de tokens de la salida de la respuesta. Incluye un campo model con un campo modelName que contiene el nombre público del modelo, no el nombre de la implementación, del modelo que ejecutó la actividad.
modelWebSummarization En el caso de las bases de conocimiento que usan el resumen web, esta sección informa sobre el consumo de tokens para resumir los resultados web. Incluye un campo model con un campo modelName que contiene el nombre público del modelo, no el nombre de la implementación, del modelo que ejecutó la actividad.
model En el caso de los registros de actividad respaldados por modelos, en esta sección se identifica el modelo usado para realizar la actividad. Esta sección solo aparece cuando estableces includeActivity en true.
imageServing Para las fuentes de conocimiento que tienen habilitada la publicación de imágenes (versión preliminar), en esta sección se indica imagesRetrieved, imagesSentToModel, totalImageSizeBytes y si la opción verbalizationUsed en el momento de la indexación estaba activada. Inspeccione verbalizationUsed e imagesSentToModel independientemente. Una respuesta puede indicar verbalizationUsed como true y seguir enviando imágenes al modelo posterior. Para buscar el número de imágenes eliminadas, reste imagesSentToModel de imagesRetrieved.

En el ejemplo siguiente se muestra la matriz de actividad.

  "activity": [
    {
      "type": "modelQueryPlanning",
      "id": 0,
      "inputTokens": 2302,
      "outputTokens": 109,
      "elapsedMs": 2396
    },
    {
      "type": "searchIndex",
      "id": 1,
      "knowledgeSourceName": "demo-financials-ks",
      "queryTime": "2025-11-04T19:25:23.683Z",
      "count": 26,
      "elapsedMs": 1137,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "searchIndex",
      "id": 2,
      "knowledgeSourceName": "demo-healthcare-ks",
      "queryTime": "2025-11-04T19:25:24.186Z",
      "count": 17,
      "elapsedMs": 494,
      "searchIndexArguments": {
        "search": "List of companies in the financial sector according to SEC GICS classification",
        "filter": null,
        "sourceDataFields": [ ],
        "searchFields": [ ],
        "semanticConfigurationName": "en-semantic-config"
      }
    },
    {
      "type": "agenticReasoning",
      "id": 3,
      "retrievalReasoningEffort": {
        "kind": "low"
      },
      "reasoningTokens": 103368
    },
    {
      "type": "modelAnswerSynthesis",
      "id": 4,
      "inputTokens": 5821,
      "outputTokens": 344,
      "elapsedMs": 3837
    }
  ]

Matriz de referencias

La matriz de referencias procede directamente de los datos de base subyacentes. Incluye el sourceData utilizado para generar la respuesta y consta de todos los documentos que el motor de recuperación agente encuentra y clasifica semánticamente.

La matriz de referencias incluye los siguientes componentes:

Campo Descripción
type Tipo de origen de conocimiento que generó la referencia, como searchIndex.
id Identificador de referencia de un elemento dentro de una respuesta. No es la clave del documento en el índice de búsqueda. Úselo para proporcionar citas.
activitySource Hace referencia cruzada a la id de la entrada de actividad que generó la referencia, lo que resulta útil para la vinculación de citas.
docKey Para una referencia indexada, la clave del documento en el índice de búsqueda subyacente.
sourceData Los datos de referencia utilizados para generar la respuesta. Para una referencia indexada, los campos pueden incluir un id y campos semánticos, como title, terms y content. La forma varía según el tipo de referencia.
citationUrl (versión preliminar) Una URL de solo lectura generada por el servicio que apunta al documento de referencia en el índice subyacente. Se devuelve solo para los orígenes de conocimiento indexados. Para seguir la URL, consulta Buscar documentos con URL de citas (vista previa).

En el ejemplo siguiente se muestra la matriz de referencias.

  "references": [
    {
      "type": "searchIndex",
      "id": "0",
      "activitySource": 2,
      "docKey": "policy=aug-2026",
      "citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
      "sourceData": null
    },
    {
      "type": "searchIndex",
      "id": "1",
      "activitySource": 2,
      "docKey": "2",
      "citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/2?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
      "sourceData": null
    }
  ]

Buscar documentos con direcciones URL de cita (versión preliminar)

A partir de la versión de la API 2026-08-01-preview, una referencia a una fuente de conocimiento indexada puede incluir un citationUrl en la respuesta de recuperación. Use esta dirección URL para capturar los campos indizado de esa referencia, como title y content, para que pueda representar una vista previa de citas en la que se muestra dónde procede una respuesta sin abrir el documento de origen original. La citationUrl es una consulta autenticada en el índice subyacente, independiente de la fuente docUrl y blobUrl.

En el ejemplo siguiente se muestra una dirección URL de cita saneada.

"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview"

Los campos seleccionados y su orden dependen de la configuración de origen y recuperación indizada.

Importante

Siga la dirección URL completa de la respuesta textual y represente los campos JSON devueltos en la aplicación. No construya, analice ni normalice la dirección URL.

Dada una dirección URL de cita, los ejemplos siguientes obtienen un token de acceso para el servicio de búsqueda. Llaman a la URL con ese token en el encabezado Authorization. La identidad que ha iniciado sesión necesita el rol Lector de datos de índice de búsqueda.

Búsqueda de Azure AI métodos de búsqueda de documentos del SDK requieren el punto de conexión, el nombre del índice, la clave del documento, los campos seleccionados y la versión de api como entradas independientes. No aceptan una dirección URL de cita absoluta. En estos ejemplos se usa HTTP GET autenticado para conservar la dirección URL completa generada por el servicio.

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;

// citationUrl comes from a retrieve response
string citationUrl = "<citation-url>";

var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
    new TokenRequestContext(
        new[] { "https://search.azure.com/.default" }));

using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", token.Token);

string document = await httpClient.GetStringAsync(citationUrl);
Console.WriteLine(document);

Reference:DefaultAzureCredential

import json
from urllib.request import Request, urlopen

from azure.identity import DefaultAzureCredential

# citation_url comes from a retrieve response
citation_url = "<citation-url>"

credential = DefaultAzureCredential()
token = credential.get_token("https://search.azure.com/.default")
document_request = Request(
    citation_url,
    headers={"Authorization": f"Bearer {token.token}"},
)
with urlopen(document_request) as response:
    document = json.load(response)

print(json.dumps(document, indent=2))

Reference:DefaultAzureCredential

GET {{citation-url}}
Authorization: Bearer {{search-access-token}}

Referencia:Documentos - Obtener

La búsqueda de documentos devuelve los campos de índice seleccionados como JSON:

{
  "id": "policy=aug-2026",
  "title": "Escaped citation key",
  "content": "Citation interoperability uses an escaped document key for the August preview.",
  "category": "release",
  "language": "en-US"
}

Al consumir una dirección URL de cita, tenga en cuenta lo siguiente:

  • Compruebe si hay citationUrl antes de mostrar una cita. Puede faltar si la respuesta omite las referencias o el servicio no puede resolver el índice de respaldo o la clave del documento.

  • Si la solicitud de recuperación incluye x-ms-query-source-authorization para el control de acceso de nivel de documento, use el mismo token de usuario cuando siga la dirección URL.

  • La dirección URL solo es válida mientras el índice de respaldo y la clave de documento permanecen sin cambios.

Inspeccionar los metadatos de la etiqueta de sensibilidad en la respuesta (versión preliminar)

El mismo comportamiento de tiempo descrito en Aplicar permisos en el momento de la consulta se aplica aquí: los cambios en los permisos de acceso establecidos fuera de 2026-08-01-preview pueden tardar tiempo en aparecer en 2026-08-01-preview las respuestas de recuperación.

Al consultar una base de conocimiento que ingiere etiquetas de confidencialidad de Microsoft Purview, la respuesta de recuperación incluye metadatos de las etiquetas en dos niveles:

Ubicación Campo Descripción
Por referencia sensitivityLabelInfo La etiqueta de confidencialidad aplicada a cada documento que se devuelve en la matriz references.
Respuesta metadata.responseSensitivityLabelInfo Etiqueta agregada que representa la etiqueta de confidencialidad de mayor prioridad entre todos los documentos referenciados en la respuesta. Resulta útil para banners de visualización del lado cliente y aplicación de directivas.

Microsoft Graph calcula la etiqueta del nivel de respuesta a partir de las etiquetas por referencia usando las reglas de herencia de etiquetas de Microsoft Purview. Normalmente, la etiqueta más restrictiva gana.

En el ejemplo siguiente se muestra una respuesta de recuperación con dos documentos a los que se hace referencia (uno Confidential, uno Internal) y la etiqueta de nivel de respuesta resultante.

{
  "response": [
    {
      "role": "assistant",
      "content": [
        { "type": "text", "text": "[ ... grounding data ... ]" }
      ]
    }
  ],
  "references": [
    {
      "type": "azureBlob",
      "id": "0",
      "activitySource": 1,
      "docKey": "contract-2026.pdf",
      "sensitivityLabelInfo": {
        "labelId": "<label-guid>",
        "labelName": "Confidential",
        "color": "#FF0000",
        "tooltip": "Confidential — Recipients can read but not forward.",
        "isEncrypted": true,
        "priority": 3
      },
      "sourceData": null
    },
    {
      "type": "azureBlob",
      "id": "1",
      "activitySource": 1,
      "docKey": "policy-overview.pdf",
      "sensitivityLabelInfo": {
        "labelId": "<label-guid>",
        "labelName": "Internal",
        "color": "#FFA500",
        "tooltip": "For internal use only.",
        "isEncrypted": false,
        "priority": 1
      },
      "sourceData": null
    }
  ],
  "metadata": {
    "responseSensitivityLabelInfo": {
      "labelId": "<label-guid>",
      "labelName": "Confidential",
      "color": "#FF0000",
      "tooltip": "Confidential — Recipients can read but not forward.",
      "isEncrypted": true,
      "priority": 3
    }
  }
}

Tipos de referencia que muestran etiquetas de confidencialidad

El nombre del campo y la disponibilidad de los metadatos de etiqueta dependen del tipo de origen de conocimiento que generó cada referencia.

Referencia type Campo de etiqueta Disponible cuando...
azureBlob sensitivityLabelInfo La fuente de conocimientos del blob incluye sensitivityLabel en ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo El origen de conocimiento de OneLake incluye sensitivityLabel en ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo La fuente de conocimiento indexada de SharePoint incluye sensitivityLabel en ingestionPermissionOptions.
searchIndex sensitivityLabelInfo El índice subyacente tiene purviewEnabled establecido en true y un campo marcado con sensitivityLabel: true.

Mostrar y auditar recomendaciones

  • Utilice sensitivityLabelInfo.labelId para consultar la definición completa de la etiqueta a través de las API de etiquetas de confidencialidad de Microsoft Graph cuando necesite propiedades adicionales, como controles de directiva o permisos.

  • Utilice metadata.responseSensitivityLabelInfo para representar un banner de confidencialidad de nivel de respuesta o aplicar controles de directiva, como deshabilitar copiar y compartir, en toda la respuesta.

  • Si su fuente de conocimientos apunta a un índice fragmentado, por ejemplo, uno completado mediante vectorización integrada o una aptitud personalizada de División de texto, asegúrese de que el conjunto de aptitudes proyecte la etiqueta de confidencialidad en cada fila de fragmento. Sin este mapeo, las referencias a nivel de fragmento no se filtran correctamente al realizar la consulta.

  • Para obtener acceso administrativo auditable al contenido etiquetado, consulte Lectura elevada para investigaciones administrativas.

Comportamiento del servidor MCP

El punto de conexión de MCP expuesto por cada base de conocimiento muestra los mismos campos de etiqueta de confidencialidad que la API REST. Cuando un cliente compatible con MCP invoca la herramienta knowledge_base_retrieve, el resultado de la herramienta contiene la misma sensitivityLabelInfo por referencia y metadata.responseSensitivityLabelInfo de nivel de respuesta que se documentó anteriormente en esta sección. Los clientes MCP aplican controles de directivas y visualización en función de las etiquetas basándose en estos campos.

Recuperar ejemplos de acciones (versión preliminar)

En los ejemplos siguientes se muestran diferentes formas de llamar a la acción de recuperación mediante la versión de la 2026-08-01-preview API. Esta versión admite el conjunto de características completo, incluida la síntesis de respuestas y un esfuerzo de razonamiento configurable. Para consultar el uso de 2026-04-01, consulte las secciones anteriores.

Inspeccionar los nombres de los modelos en los registros de actividad

Establezca true en includeActivity para devolver campos de identidad del modelo en los registros de actividad respaldados por modelos. Use estos campos para confirmar qué modelo configurado controló el planeamiento de consultas, la síntesis de respuestas o el resumen web durante una solicitud de recuperación. En el ejemplo siguiente se invalida el procesamiento de resultados almacenado para el origen seleccionado en la solicitud.

using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

var kbClient = new KnowledgeBaseRetrievalClient(
    new Uri("<search-endpoint>"),
    "<knowledge-base-name>",
    new DefaultAzureCredential()
);

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[]
        {
            new KnowledgeBaseMessageTextContent(
                "Which policy applies to returns?"
            )
        }
    ) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams(
        "<knowledge-source-name>"
    )
    {
        ResultsProcessing = KnowledgeSourceResultsProcessing.None
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
foreach (var activity in result.Value.Activity)
{
    KnowledgeBaseActivityRecordModel? model = activity switch
    {
        KnowledgeBaseModelQueryPlanningActivityRecord queryPlanning =>
            queryPlanning.Model,
        KnowledgeBaseModelAnswerSynthesisActivityRecord answerSynthesis =>
            answerSynthesis.Model,
        KnowledgeBaseModelWebSummarizationActivityRecord webSummarization =>
            webSummarization.Model,
        _ => null
    };

    if (model is not null)
    {
        Console.WriteLine(
            $"modelName={model.ModelName}, deploymentId={model.DeploymentId}");
    }
}

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import (
    KnowledgeBaseRetrievalClient,
)
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseMessage,
    KnowledgeBaseMessageTextContent,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
    KnowledgeBaseRetrievalRequest,
    SearchIndexKnowledgeSourceParams,
)

kb_client = KnowledgeBaseRetrievalClient(
    "<search-endpoint>",
    DefaultAzureCredential(),
    knowledge_base_name="<knowledge-base-name>",
)

model_activity_types = (
    KnowledgeBaseModelQueryPlanningActivityRecord,
    KnowledgeBaseModelAnswerSynthesisActivityRecord,
    KnowledgeBaseModelWebSummarizationActivityRecord,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Which policy applies to returns?"
                )
            ],
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="<knowledge-source-name>",
            results_processing="none",
        )
    ],
)

result = kb_client.retrieve(request)
for entry in result.activity or []:
    if isinstance(entry, model_activity_types) and entry.model:
        print(
            "modelName=", entry.model.model_name,
            "deploymentId=", entry.model.deployment_id,
        )

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "Which policy applies to returns?" }
            ]
        }
    ],
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "{{knowledge-source-name}}",
            "kind": "searchIndex",
            "resultsProcessing": "none"
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

En el fragmento de respuesta siguiente se muestra la identidad del modelo anidado:

{
  "activity": [
    {
      "type": "modelQueryPlanning",
      "id": 0,
      "model": {
        "modelName": "gpt-5-mini",
        "deploymentId": "gpt-5-mini-deployment"
      },
      "inputTokens": 1842,
      "outputTokens": 87,
      "elapsedMs": 1923
    },
    {
      "type": "searchIndex",
      "id": 1,
      "knowledgeSourceName": "operations-ks",
      "count": 12,
      "elapsedMs": 234
    },
    {
      "type": "modelAnswerSynthesis",
      "id": 2,
      "model": {
        "modelName": "gpt-5-mini",
        "deploymentId": "gpt-5-mini-deployment"
      },
      "inputTokens": 2418,
      "outputTokens": 179,
      "elapsedMs": 931
    }
  ]
}

Requerir una fuente de conocimiento para tener éxito

Establezca failOnError en knowledgeSourceParams para marcar un origen de conocimiento según sea necesario. Use este parámetro cuando una respuesta parcial sería engañosa o no conforme si ese origen no está disponible. La solicitud devuelve 502 Bad Gateway si falla una fuente requerida, incluso si otra fuente funciona correctamente. Para obtener instrucciones de control, consulte Solución de problemas de la acción de recuperación.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("Which HR policy applies?")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("hr-policy-ks")
    {
        FailOnError = true,
        AlwaysQuerySource = true
    }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("hr-faq-ks")
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referencia:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="Which HR policy applies?")],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="hr-policy-ks",
            fail_on_error=True,
            always_query_source=True,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="hr-faq-ks",
        ),
    ],
)

result = kb_client.retrieve(request)

Referencia:SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "Which HR policy applies?" }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "hr-policy-ks",
            "kind": "searchIndex",
            "failOnError": true,
            "alwaysQuerySource": true
        },
        {
            "knowledgeSourceName": "hr-faq-ks",
            "kind": "searchIndex"
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Excluir una fuente de conocimiento de una solicitud

A partir de la versión de la API 2026-08-01-preview, establezca neverQuerySource en true para cada origen de conocimiento que quiera excluir de una solicitud de recuperación. En el momento de la solicitud, neverQuerySource anula un valor alwaysQuerySource almacenado para esa solicitud sin cambiar el valor almacenado.

En el ejemplo siguiente se consulta una base de conocimiento que contiene product-docs-ks y troubleshooting-ks, excluyendo troubleshooting-ks de la solicitud.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent(
                "Explain the official SSO provisioning steps.")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("product-docs-ks")
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("troubleshooting-ks")
    {
        NeverQuerySource = true
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referencia:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[
                KnowledgeBaseMessageTextContent(
                    text="Explain the official SSO provisioning steps."
                )
            ],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="product-docs-ks",
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="troubleshooting-ks",
            never_query_source=True,
        ),
    ],
)

result = kb_client.retrieve(request)

Referencia:SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Explain the official SSO provisioning steps."
                }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "product-docs-ks",
            "kind": "searchIndex"
        },
        {
            "knowledgeSourceName": "troubleshooting-ks",
            "kind": "searchIndex",
            "neverQuerySource": true
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Ajustar documentos candidatos por fuente de conocimientos

Establezca maxOutputDocuments en knowledgeSourceParams para limitar cuántos documentos candidatos aporta un origen de conocimiento específico antes de la selección final de resultados. Use este parámetro cuando quiera enlazar la entrada de un origen a la canalización sin afectar a otros.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What safety procedures apply?")
        }
    ) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("operations-ks")
    {
        MaxOutputDocuments = 50
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);

Referencia:SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What safety procedures apply?")],
        )
    ],
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="operations-ks",
            max_output_documents=50,
        ),
    ],
)

result = kb_client.retrieve(request)

Referencia:SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases/operations-kb/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What safety procedures apply?" }
            ]
        }
    ],
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "operations-ks",
            "kind": "searchIndex",
            "maxOutputDocuments": 50
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Limitar los documentos finales de puesta en tierra

El parámetro de nivel maxOutputDocuments superior limita el número de documentos de base que se devuelven en la respuesta de recuperación final. Use este parámetro cuando la aplicación necesite una cita predecible o un recuento de referencias.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What is the return policy?")
        }
    ) { Role = "user" }
);
retrievalRequest.OutputMode = "extractedData";
retrievalRequest.MaxOutputDocuments = 3;
retrievalRequest.MaxOutputSizeInTokens = 6000;

var result = await kbClient.RetrieveAsync(retrievalRequest);

Reference:KnowledgeBaseRetrievalRequest

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What is the return policy?")],
        )
    ],
    output_mode="extractedData",
    max_output_documents=3,
    max_output_size_in_tokens=6000,
)

result = kb_client.retrieve(request)

Reference:KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What is the return policy?" }
            ]
        }
    ],
    "outputMode": "extractedData",
    "maxOutputDocuments": 3,
    "maxOutputSizeInTokens": 6000
}

Reference:Recuperación de Conocimiento - Retrieve

En la tabla siguiente se muestra cómo maxOutputDocuments e maxOutputSizeInTokens interactúan entre las cuatro combinaciones.

maxOutputDocuments maxOutputSizeInTokens Comportamiento
Sin especificar Sin especificar Usa el comportamiento predeterminado maxOutputSizeInTokens del límite de respuesta.
Sin especificar Especificado Descarta documentos una vez alcanzado el límite de tamaño de carga.
Especificado Sin especificar Devuelve hasta el número especificado de documentos de fundamentación y no aplica ningún límite de maxOutputSizeInTokens.
Especificado Especificado Devuelve hasta maxOutputDocuments documentos o tantos documentos como quepan dentro de maxOutputSizeInTokens, según qué límite se alcance primero.

Verificar que la base de conocimiento recupere los valores predeterminados

Una base de conocimiento puede almacenar los valores predeterminados de toda la solicitud en retrieveDefaults. Envía dos solicitudes de recuperación para verificar la herencia y las sustituciones específicas de la solicitud.

Antes de comenzar, complete Configurar los límites de recuperación predeterminados (versión preliminar). La primera solicitud omite los tres límites de toda la solicitud, por lo que se aplican los valores almacenados de 45 segundos, ocho documentos y 12 000 tokens. La segunda solicitud los reemplaza por 20 segundos, un documento y 5000 tokens.

using System;
using Azure.Identity;
using Azure.Search.Documents;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;

string searchEndpoint = "<search-endpoint>";

var options = new SearchClientOptions(
    SearchClientOptions.ServiceVersion.V2026_08_01_Preview);
var kbClient = new KnowledgeBaseRetrievalClient(
    new Uri(searchEndpoint),
    "your-knowledge-base",
    new DefaultAzureCredential(),
    options);

KnowledgeBaseRetrievalRequest CreateRequest()
{
    var request = new KnowledgeBaseRetrievalRequest();
    request.Intents.Add(new KnowledgeRetrievalSemanticIntent(
        "Summarize the latest support guidance."));
    return request;
}

var inherited = await kbClient.RetrieveAsync(CreateRequest());
Console.WriteLine(
    $"Stored defaults: {inherited.Value.References.Count} references");

KnowledgeBaseRetrievalRequest overriddenRequest = CreateRequest();
overriddenRequest.MaxRuntimeInSeconds = 20;
overriddenRequest.MaxOutputDocuments = 1;
overriddenRequest.MaxOutputSize = 5000;

var overridden = await kbClient.RetrieveAsync(overriddenRequest);
Console.WriteLine(
    $"Request overrides: {overridden.Value.References.Count} references");

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
)

kb_client = KnowledgeBaseRetrievalClient(
    endpoint="<search-endpoint>",
    knowledge_base_name="your-knowledge-base",
    credential=DefaultAzureCredential(),
    api_version="2026-08-01-preview",
)


def create_request(**limits):
    return KnowledgeBaseRetrievalRequest(
        intents=[
            KnowledgeRetrievalSemanticIntent(
                search="Summarize the latest support guidance.",
            )
        ],
        **limits,
    )


inherited = kb_client.retrieve(create_request())
print(f"Stored defaults: {len(inherited.references or [])} references")

overridden = kb_client.retrieve(
    create_request(
        max_runtime_in_seconds=20,
        max_output_documents=1,
        max_output_size=5000,
    )
)
print(f"Request overrides: {len(overridden.references or [])} references")

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

En primer lugar, envíe una solicitud que omita los tres campos de límite de toda la solicitud.

POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "intents": [
    {
      "type": "semantic",
      "search": "Summarize the latest support guidance."
    }
  ]
}

A continuación, invalide los tres valores de una solicitud.

POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}

{
  "intents": [
    {
      "type": "semantic",
      "search": "Summarize the latest support guidance."
    }
  ],
  "maxRuntimeInSeconds": 20,
  "maxOutputDocuments": 1,
  "maxOutputSize": 5000
}

Reference:Recuperación de Conocimiento - Retrieve

El recuento de referencias muestra si se aplica el valor almacenado o de nivel maxOutputDocuments de solicitud: la primera respuesta contiene como máximo ocho referencias y la segunda contiene como máximo una. Una respuesta puede contener menos referencias cuando coinciden menos documentos. La respuesta no informa del presupuesto efectivo de tokens de ejecución o de salida, pero esos valores siguen rigiendo el procesamiento de las solicitudes. Las anulaciones de la solicitud no cambian los valores predeterminados almacenados.

Invalidación del esfuerzo de razonamiento predeterminado y establecimiento de límites de solicitudes

En el ejemplo siguiente se especifica la síntesis de respuesta, por lo que el esfuerzo de razonamiento de recuperación debe ser low o medium. También establece maxRuntimeInSeconds para limitar el tiempo de ejecución de recuperación y maxOutputSizeInTokens para limitar el tamaño de la carga de respuesta.

maxRuntimeInSeconds acepta valores de 10 a 600 segundos y tiene como valor predeterminado 90 segundos. El máximo de 600 segundos (10 minutos) solo se aplica a la solicitud de recuperación de Búsqueda de Azure AI.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort();
retrievalRequest.OutputMode = "answerSynthesis";
retrievalRequest.MaxRuntimeInSeconds = 30;
retrievalRequest.MaxOutputSizeInTokens = 6000;

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import (
    KnowledgeRetrievalLowReasoningEffort,
    KnowledgeRetrievalOutputMode,
)

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    retrieval_reasoning_effort=KnowledgeRetrievalLowReasoningEffort(),
    output_mode=KnowledgeRetrievalOutputMode.ANSWER_SYNTHESIS,
    max_runtime_in_seconds=30,
    max_output_size_in_tokens=6000,
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/kb-override/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "retrievalReasoningEffort": { "kind": "low" },
    "outputMode": "answerSynthesis",
    "maxRuntimeInSeconds": 30,
    "maxOutputSizeInTokens": 6000
}

Reference:Recuperación de Conocimiento - Retrieve

Permitir que el servicio elija el esfuerzo de razonamiento

Establezca retrievalReasoningEffort.kind en auto en una solicitud de recuperación para anular el valor predeterminado de la base de conocimiento. Para obtener más información sobre el razonamiento automático, consulte Establecimiento del esfuerzo de razonamiento de recuperación (versión preliminar).

{
  "retrievalReasoningEffort": {
    "kind": "auto"
  }
}

Reference:Recuperación de Conocimiento - Retrieve

Establecimiento de referencias para cada origen de conocimiento

Use includeReferences y includeReferenceSourceData en knowledgeSourceParams para controlar qué orígenes aparecen en la matriz de referencias y cuánto datos de origen incluye cada entrada. En el ejemplo siguiente se usa el esfuerzo de razonamiento predeterminado de la base de conocimiento.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
    new KnowledgeBaseMessage(
        content: new[] {
            new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
        }
    ) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-financials-ks")
    {
        IncludeReferences = true,
        IncludeReferenceSourceData = true
    }
);

retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-communicationservices-ks")
    {
        IncludeReferences = false,
        IncludeReferenceSourceData = false
    }
);

retrievalRequest.KnowledgeSourceParams.Add(
    new SearchIndexKnowledgeSourceParams("demo-healthcare-ks")
    {
        IncludeReferences = true,
        IncludeReferenceSourceData = false,
        AlwaysQuerySource = true
    }
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import SearchIndexKnowledgeSourceParams

request = KnowledgeBaseRetrievalRequest(
    messages=[
        KnowledgeBaseMessage(
            role="user",
            content=[KnowledgeBaseMessageTextContent(text="What companies are in the financial sector?")],
        )
    ],
    include_activity=True,
    knowledge_source_params=[
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-financials-ks",
            include_references=True,
            include_reference_source_data=True,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-communicationservices-ks",
            include_references=False,
            include_reference_source_data=False,
        ),
        SearchIndexKnowledgeSourceParams(
            knowledge_source_name="demo-healthcare-ks",
            include_references=True,
            include_reference_source_data=False,
            always_query_source=True,
        ),
    ],
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, SearchIndexKnowledgeSourceParams

POST {{search-endpoint}}/knowledgebases/kb-medium-example/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "messages": [
        {
            "role": "user",
            "content": [
                { "type": "text", "text": "What companies are in the financial sector?" }
            ]
        }
    ],
    "includeActivity": true,
    "knowledgeSourceParams": [
        {
            "knowledgeSourceName": "demo-financials-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": true
        },
        {
            "knowledgeSourceName": "demo-communicationservices-ks",
            "kind": "searchIndex",
            "includeReferences": false,
            "includeReferenceSourceData": false
        },
        {
            "knowledgeSourceName": "demo-healthcare-ks",
            "kind": "searchIndex",
            "includeReferences": true,
            "includeReferenceSourceData": false,
            "alwaysQuerySource": true
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Uso del esfuerzo mínimo de razonamiento

En el ejemplo siguiente, no hay LLM para la planificación inteligente de consultas ni la síntesis de respuestas. La cadena de consulta va al motor de recuperación agente para la búsqueda de palabras clave o la búsqueda híbrida.

var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Intents.Add(
    new KnowledgeRetrievalSemanticIntent("what is a brokerage")
);

var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
    (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

from azure.search.documents.knowledgebases.models import (
    KnowledgeBaseRetrievalRequest,
    KnowledgeRetrievalSemanticIntent,
)

request = KnowledgeBaseRetrievalRequest(
    intents=[
        KnowledgeRetrievalSemanticIntent(
            search="what is a brokerage",
        )
    ]
)

result = kb_client.retrieve(request)
print(result.response[0].content[0].text)

Reference:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest

POST {{search-endpoint}}/knowledgebases/kb-minimal/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json

{
    "intents": [
        {
            "type": "semantic",
            "search": "what is a brokerage"
        }
    ]
}

Reference:Recuperación de Conocimiento - Retrieve

Solucionar problemas de la acción de recuperación

En 2026-08-01-preview, el estado de la respuesta indica si la recuperación se realizó correctamente, en parte se realizó correctamente o no, y qué hacer a continuación. Use la tabla siguiente para asignar cada estado a su significado y, a continuación, consulte la sección correspondiente para obtener instrucciones de solución de problemas.

Situación Meaning
200 OK Recuperación completada correctamente. Todavía se puede omitir un documento si su contenido supera el presupuesto de salida. Para obtener más información, consulte Respuestas vacías.
400 Bad Request Se produjo un error en la validación de la solicitud de recuperación antes de que se iniciara la recuperación.
206 Partial Content Al menos un origen tuvo éxito y no se marcó ningún origen que falló failOnError. La respuesta contiene los resultados de las fuentes que han tenido éxito.
502 Bad Gateway Todos los orígenes seleccionados han fallado, o ha fallado un origen marcado como failOnError: true.

Para cualquier respuesta distinta de 200, registre la versión de la API, la marca temporal, el cuerpo saneado de la solicitud, los encabezados de la respuesta y el identificador de solicitud o de correlación. Estos detalles le ayudan a diagnosticar el error y compartir el problema con el soporte técnico, si es necesario.

400 Bad Request

Use el error de nivel superior para identificar la propiedad no válida de la solicitud. Entre las causas comunes se incluyen las siguientes:

  • Un knowledgeSourceName en knowledgeSourceParams no está adjunto a la base de conocimiento, o el kind no coincide con la fuente adjunta.
  • Un valor de solicitud está fuera de su intervalo admitido o una opción requiere otra opción que no está habilitada. Por ejemplo, includeReferenceSourceData requiere includeReferences.
  • retrievalReasoningEffort.kind es auto, pero la solicitud usa una versión de API anterior a 2026-08-01-preview.
  • La solicitud usa auto, lowo medium, pero la base de conocimiento no define un modelo.
  • Para la exclusión de fuentes en el momento de la solicitud (versión preliminar), la misma entrada establece tanto alwaysQuerySource como neverQuerySource en true, o bien se excluyen todas las fuentes de conocimiento adjuntas.

Antes de reintentar la solicitud, corrija la propiedad identificada por el error de nivel superior.

206 Partial Content

Inspeccione cada activity entrada que contenga un error. Una actividad de recuperación de origen identifica el origen de conocimiento con errores y una actividad de modelo identifica la fase de procesamiento con errores. El cuerpo de la respuesta sigue conteniendo los resultados que han tenido éxito.

En el caso de los errores de actividad de recuperación de origen, las causas comunes son:

  • Entrada no válida en tiempo de consulta, como una expresión filterAddOn mal formada.
  • Desfase de configuración de origen de conocimiento o índice, como un campo cambiado, una configuración semántica que falta o un vectorizador no válido.
  • Falta la autorización de dependencia o no es válida, o la identidad utilizada para consultar la fuente no tiene permisos suficientes.
  • Dependencia limitación de ancho de banda, tiempo de espera agotado o errores transitorios de disponibilidad.

Para un error de actividad del modelo, use la actividad type para identificar la fase de procesamiento con errores. Por ejemplo, un modelWebSummarization error indica que no se pudo resumir el resultado web .

Si su aplicación admite resultados parciales, procese los resultados satisfactorios y registre cada fase fallida del origen o del modelo. Corrija los errores de configuración, autorización y permisos antes de reintentar. En caso de limitaciones de ancho de banda, tiempos de espera agotados o errores transitorios de disponibilidad, utiliza reintentos limitados con retroceso.

Si los resultados no son seguros sin un origen específico y su tipo de origen admite alwaysQuerySource, establezca tanto alwaysQuerySource como failOnError. La primera opción garantiza que la fuente quede seleccionada, y la segunda devuelve un error grave si falla su consulta. Los orígenes de conocimiento del servidor MCP (versión preliminar) no admiten alwaysQuerySource; para esos orígenes, failOnError solo se aplica cuando se selecciona el origen. failOnError no se aplica a los errores de actividad del modelo.

502 Bad Gateway

El error de nivel superior describe una de las dos vías de fallo grave:

  • Se produjo un error en cada origen seleccionado: Cada origen seleccionado devolvió un error. Un origen que se completa correctamente con cero documentos coincidentes no es un origen con errores. Inspeccione todos los errores de origen de una configuración compartida, autorización, dependencia o problema de disponibilidad.
  • Error failOnError de origen: no se pudo consultar un origen necesario. Es posible que otras fuentes hayan tenido éxito, pero el servicio no devuelve un resultado parcial porque la fuente requerida falló.

Los fallos subyacentes de la fuente suelen ser, por lo general, del mismo tipo que los descritos para 206 Partial Content: entrada no válida específica de la fuente, desajuste en la configuración de la fuente o del índice, autorización o permisos de dependencias, limitación de velocidad, tiempos de espera o disponibilidad transitoria de las dependencias.

Una respuesta de error grave 502 podría omitir el array activity y proporcionar el nombre de la fuente y el fallo subyacente únicamente en el mensaje de error de nivel superior. Corrija los errores de configuración, autorización y permisos antes de reintentar. Utiliza reintentos limitados con retroceso únicamente en caso de limitaciones de ancho de banda, tiempos de espera agotados o errores transitorios de disponibilidad. No interprete una respuesta 502 Bad Gateway como una interrupción del servicio de Búsqueda de Azure AI sin examinar el fallo subyacente en el origen.

Respuestas vacías

El paso de búsqueda podría encontrar un documento, pero el servicio aun así puede omitirlo de la respuesta final si su contenido fundamentado supera el presupuesto de salida de maxOutputSizeInTokens (maxOutputSize en 2026-05-01-preview y versiones posteriores). Cuando se produce esta condición, la matriz de actividad muestra que se encontraron coincidencias y el registro de actividad incluye una advertencia de que el documento más relevante superó el tamaño máximo de salida. La lista de referencias y el contenido de la respuesta fundamentada están vacíos para ese documento. Para conservar más contenido, aumente maxOutputSizeInTokens.

Para evitar este comportamiento, indexe documentos de origen grandes como fragmentos más pequeños con identificadores estables y metadatos de origen. Esto se aplica especialmente a largos manuales, directivas o artículos de knowledge base.

Llame al punto de conexión del MCP

Advertencia

Las implementaciones de MCP son susceptibles a riesgos, como ataques, errores en cascada y pérdida de supervisión humana. Puede mitigar estos riesgos evaluando los servidores MCP en términos de seguridad y fiabilidad, siguiendo las prácticas recomendadas de Microsoft y las prácticas recomendadas del sector, e implementando mecanismos de aprobación y supervisando comportamientos en cascada.

MCP es un protocolo abierto que normaliza cómo las aplicaciones de inteligencia artificial se conectan a herramientas y orígenes de datos externos.

En Búsqueda de Azure AI, cada base de conocimiento es un servidor MCP independiente que expone la herramienta knowledge_base_retrieve. Cualquier cliente compatible con MCP, incluido Foundry Agent Service, GitHub Copilot, Claude y Cursor, puede invocar esta herramienta para consultar la base de conocimiento.

Autenticar en el punto de conexión MCP

Cada base de conocimiento tiene un punto de conexión MCP en la siguiente dirección URL:

https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>

La versión de API que especifique determina lo que devuelve la conexión. Al usar 2026-08-01-preview, la base de conocimiento devuelve respuestas sintetizadas cuando la base de conocimiento subyacente está configurada con un LLM y un nivel de razonamiento compatible. Al utilizar 2026-04-01, la recuperación siempre es mínima y extractiva, y la conexión devuelve únicamente datos de fundamentación.

La autenticación en este punto de conexión depende del cliente MCP. Cuando usas la API Responses de Azure OpenAI con la herramienta MCP knowledge_base_retrieve, autenticas tanto la llamada a la API Responses de Azure OpenAI como la solicitud MCP a Búsqueda de Azure AI. Si el cliente MCP llama directamente a este punto de conexión, solo se autentica en Búsqueda de Azure AI.

Para Búsqueda de Azure AI autenticación, use uno de los métodos siguientes:

Nota

Los clientes de MCP configuran encabezados personalizados de forma diferente. Por ejemplo, Foundry Agent Service inserta encabezados a través de conexiones de proyecto, mientras que los clientes como GitHub Copilot requieren encabezados en JSON del servidor MCP.

Uso de un token de portador para la autenticación MCP

El método recomendado para la autenticación MCP es un token de portador, que evita almacenar claves confidenciales en los archivos de configuración. La identidad detrás del token debe tener asignado el rol Lector de datos de índice de búsqueda en el servicio de búsqueda. Para obtener más información, consulte Connect your app to Búsqueda de Azure AI using identities.

#pragma warning disable OPENAI001

using Azure.AI.OpenAI;
using Azure.Core;
using Azure.Identity;
using OpenAI.Responses;
using System;
using System.Collections.Generic;

string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")!; // Example: https://<resource-name>.openai.azure.com
string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
DefaultAzureCredential credential = new();

// Create the Azure OpenAI Responses client
AzureOpenAIClient azureClient = new(new Uri(openAiEndpoint), credential);
ResponsesClient openAIClient = azureClient.GetResponsesClient();

// Get a bearer token for Azure AI Search
string searchToken = credential.GetToken(
    new TokenRequestContext(new[] { "https://search.azure.com/.default" })
).Token;

// Configure the MCP tool for knowledge base retrieval
McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "search_kb",
    serverUri: new Uri(mcpServerUrl),
    headers: new Dictionary<string, string>
    {
        ["Authorization"] = $"Bearer {searchToken}",
    },
    allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);

// Build the response request with the MCP tool attached
CreateResponseOptions options = new()
{
    Model = "MODEL_NAME",
    InputItems =
    {
        ResponseItem.CreateUserMessageItem(
            "What causes the strongest nighttime brightness patterns in this dataset?")
    },
    Tools = { mcpTool }
};

ResponseResult response = await openAIClient.CreateResponseAsync(options);
Console.WriteLine(response.GetOutputText());

Reference:Use the Azure OpenAI Responses API

import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI

openai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"] # Example: https://<resource-name>.openai.azure.com
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
credential = DefaultAzureCredential()

# Create token providers for Azure OpenAI and Azure AI Search
openai_token_provider = get_bearer_token_provider(
    credential, "https://cognitiveservices.azure.com/.default"
)
search_token_provider = get_bearer_token_provider(
    credential, "https://search.azure.com/.default"
)

# Create the Azure OpenAI client
client = AzureOpenAI(
    azure_endpoint=openai_endpoint,
    azure_ad_token_provider=openai_token_provider,
    api_version=os.environ["OPENAI_API_VERSION"], # Example: 2025-04-01-preview
)

# Create a response using the MCP tool configuration
response = client.responses.create(
    model="MODEL_NAME",
    input="What causes the strongest nighttime brightness patterns in this dataset?",
    tools=[
        {
            "type": "mcp",
            "server_label": "search_kb",
            "server_url": mcp_server_url,
            "allowed_tools": ["knowledge_base_retrieve"],
            "headers": {
                "Authorization": f"Bearer {search_token_provider()}"
            },
            "require_approval": "never",
        }
    ],
)

print(response.output_text)

Reference:Use the Azure OpenAI Responses API

// This code snippet is currently unavailable.

Uso de una clave de administrador para la autenticación de MCP

Una clave de administrador concede acceso completo de lectura y escritura al servicio de búsqueda, por lo que úselo solo en entornos de desarrollo o cuando un token de portador no esté disponible. Para obtener más información, consulte Connect to Búsqueda de Azure AI using API keys.

Tip

En el ejemplo siguiente solo se muestra el encabezado que difiere del ejemplo de token de portador. Para obtener la configuración completa, consulte Uso de un token de portador para la autenticación MCP.

#pragma warning disable OPENAI001

using OpenAI.Responses;
using System;
using System.Collections.Generic;

string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
string searchAdminKey = Environment.GetEnvironmentVariable("AZURE_SEARCH_ADMIN_KEY")!; // Example: <search-api-key>

McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "search_kb",
    serverUri: new Uri(mcpServerUrl),
    headers: new Dictionary<string, string> { ["api-key"] = searchAdminKey },
    allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);

Reference:Use the Azure OpenAI Responses API

import os

mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
search_admin_key = os.environ["AZURE_SEARCH_ADMIN_KEY"] # Example: <search-api-key>

tools = [
    {
        "type": "mcp",
        "server_label": "search_kb",
        "server_url": mcp_server_url,
        "allowed_tools": ["knowledge_base_retrieve"],
        "headers": {"api-key": search_admin_key},
        "require_approval": "never",
    }
]

Reference:Use the Azure OpenAI Responses API

// This code snippet is currently unavailable.

Revisión de la respuesta de MCP

Cuando un cliente MCP invoca knowledge_base_retrieve, recibe un resultado de la herramienta MCP en lugar de los sobres response, activity y references de la acción de recuperación. Muchos clientes MCP presentan el resultado de la herramienta en un objeto result de nivel superior, por lo que la carga útil que debería esperar es result.content[].

{
  "result": {
    "content": [
      {
        "type": "text",
        "text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
      }
    ]
  }
}

Puntos clave:

  • result.content[] contiene el resultado de la herramienta MCP devuelto por la base de conocimientos.

  • result.content[].type es text.

  • result.content[].text contiene los datos de puesta a tierra recuperados como una cadena codificada en JSON.

  • A diferencia de la acción de recuperación, la respuesta actual de MCP no devuelve arrays separados activity o references, y no rellena las entradas de resource para el contenido devuelto.