Запрос базы знаний с помощью действия извлечения или конечной точки MCP

Примечание

Поиск с использованием ИИ Azure доступна через портал Azure, REST API и Azure SDKs. Он также лежит в основе Foundry IQ — управляемого слоя знаний, который преобразует корпоративный контент в многократно используемые базы знаний с учетом разрешений доступа для агентов на портале Microsoft Foundry.

Важно

Функции, возможности или свойства, помеченные (предварительная версия), не охватываются соглашением об уровне обслуживания, не рекомендуются для рабочих нагрузок и могут изменяться или ограничиваться до того, как они становятся общедоступными. Условия предварительной версии Поиск с использованием ИИ Azure применяются ко всем функциям предварительной версии, независимо от того, является ли он автономным или частью общедоступной функции.

В канале агентной выборки действие выборки инициирует параллельную обработку запросов из базы знаний. Вы можете вызвать действие извлечения непосредственно с помощью REST API службы поиска или Azure SDK. Каждая база знаний также предоставляет конечную точку протокола MCP для использования агентами, совместимыми с MCP.

В этой статье объясняется, как вызывать оба метода извлечения данных с необязательной принудительной проверкой разрешений. Сначала рассматривается операция получения, а затем — конечная точка MCP, поскольку результат инструмента MCP в настоящее время отличается от структуры ответа REST API и SDK.

Чтобы настроить конвейер, который подключает Поиск с использованием ИИ Azure к службе агента Foundry через MCP, см. руководство Учебник: создание комплексного решения для извлечения с использованием агентов.

Поддержка использования

Портал Azure Портал Microsoft Foundry Пакет SDK для .NET Пакет SDK для Python SDK для Java Пакет SDK для JavaScript REST API
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Необходимые условия

  • Если вызываете конечную точку MCP через API ответов Azure OpenAI, вам потребуется:

    • Развернутая LLM-модель и роль Cognitive Services OpenAI User (или ключ API) для ресурса Foundry. При необходимости можно повторно использовать LLM и ресурс, указанный в базе знаний.

    • Пакет Azure.AI.OpenAI : dotnet add package Azure.AI.OpenAI

  • Обязательный пакет Azure.Search.Documents:

    • Для функций 2026-08-01-preview: последний предварительный пакет dotnet add package Azure.Search.Documents --prerelease

    • Последний стабильный пакет для функций 2026-04-01: dotnet add package Azure.Search.Documents

  • Для аутентификации без использования ключа пакет Azure.Identity: dotnet add package Azure.Identity

  • Если вызываете конечную точку MCP через API ответов Azure OpenAI, вам потребуется:

    • Развернутая LLM-модель и роль Cognitive Services OpenAI User (или ключ API) для ресурса Foundry. При необходимости можно повторно использовать LLM и ресурс, указанный в базе знаний.

    • Пакет openai : pip install openai

  • Обязательный пакет azure-search-documents:

    • Для функций 2026-08-01-preview: последний предварительный пакет pip install --pre azure-search-documents

    • Последний стабильный пакет для функций 2026-04-01: pip install azure-search-documents

  • Для аутентификации без использования ключа пакет azure-identity: pip install azure-identity

  • Требуемая версия REST API службы поиска:

    • Для функций предварительной версии: 2026-08-01-preview

    • Для общедоступных функций: 2026-04-01

  • Для проверки подлинности без ключа добавьте маркер Microsoft Entra ID в Authorization заголовок каждого HTTP-запроса.

Limitations

Для источников знаний поискового индекса при включении переранжирования при извлечении используется семантическая конфигурация источника знаний. Он не применяет профили оценки базового индекса, в том числе defaultScoringProfile. Ответы Retrieve также не отображают @search.rerankerBoostedScore.

Вызовите действие извлечения

Вы указываете действие извлечения в базе знаний. Текст запроса включает входные данные запроса и необязательный список источников знаний для целевого объекта.

Версия API 2026-04-01 поддерживает только ввод intents и минимальный извлекающий поиск. Возможности, доступные только в предварительной версии, включая messages ввод данных, планирование запросов, синтез ответов, а также настраиваемые усилия по обработке причинно-следственных связей, не поддерживаются. Используйте 2026-08-01-preview для полной функциональности.

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:Knowledge Retrieval — восстановление

Предоставление изображений для синтеза ответов (предварительная версия)

Для источников знаний BLOB, indexed OneLake и indexed SharePoint, которые вы настраиваете с использованием хранилища ресурсов, можно передавать модели синтеза ответов на последующем этапе изображения, встроенные в документы, наряду с текстом. Задайте enableImageServing в соответствующей записи в knowledgeSourceParams, чтобы переопределить значение по умолчанию, установленное в определении базы знаний. Ответ на получение не включает выделенные поля для отдельных путей изображения или байтов изображений, предоставленных модели.

Выдача изображений выполняется только тогда, когда outputMode имеет значение answerSynthesis, и не поддерживается для источников знаний, в которых настроен параметр ingestionPermissionOptions. Сведения о шагах настройки, таблице приоритетов и о том, как проверять статистику обслуживания изображений, см. в разделе Вывод изображений, встроенных в документы, в агентном поиске (предварительная версия).

Отключить переранжирование для источника знаний (предварительная версия)

Начиная с версии API 2026-08-01-preview, установите "resultsProcessing": "none" для записи knowledgeSourceParams, чтобы обойти повторное ранжирование для определённого источника знаний и сохранить исходный порядок результатов. Вы также можете хранить resultsProcessing в источнике знаний как по умолчанию. Все типы источников знаний поддерживают это свойство.

В следующем примере для product-catalog-ks пропускается переранжирование при одном запросе на извлечение.

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:Knowledge Retrieval — восстановление

Установите "resultsProcessing": "rerank" или, если сохранённое значение по умолчанию отсутствует, не указывайте его, чтобы использовать конвейер повторного ранжирования. Поиск с использованием ИИ Azure определяет фактическое значение для каждого источника в следующем порядке:

  1. resultsProcessing в knowledgeSourceParams в запросе на получение.
  2. resultsProcessing хранится в источнике знаний.
  3. rerank если отсутствуют оба свойства.

Для источника знаний сервера MCP значение, заданное для отдельного средства, resultsProcessing имеет приоритет над запросом и сохраненными значениями.

Tip

resultsProcessing изменяет способ обработки результатов, а не то, какие источники запрашиваются. Задайте значение alwaysQuerySourcetrue , если источник знаний должен запрашиваться.

Если действующее значение равно none:

  • Ссылки из источника знаний не включают rerankerScore, а результаты сохраняют свой исходный порядок в ходе извлечения из источника.
  • Когда любой источник обходит повторное ранжирование, Поиск с использованием ИИ Azure распределяет окончательные результаты по действиям по принципу циклического перебора в порядке объявления источников знаний. Повторно ранжированные действия остаются упорядоченными по оценке.
  • Дедупликация и ограничения для каждого источника, документа и маркера по-прежнему применяются, поэтому в ответе не все полученные результаты отображаются.

Поиск с использованием ИИ Azure проверяет rerankerThreshold в следующем порядке:

  1. Поиск определяет resultsProcessing на основе запроса retrieve и сохраненного значения источника знаний.
  2. Если разрешённое значение — none и запрос включает rerankerThreshold, Search возвращает 400 Bad Request.
  3. Для инструмента сервера MCP Search применяет значение resultsProcessing на уровне инструмента после проверки запроса.

В результате параметр средства MCP не изменяет, проходит ли запрос проверку. Значение none на уровне инструмента не вызывает ошибку порогового значения, а значение rerank на уровне инструмента не предотвращает ошибку, когда значение запроса или сохранённое значение принимает значение none.

Чтобы проверить, какой режим использовался, проверьте, содержат ли ссылки источника знаний rerankerScore. Не полагайтесь на semanticConfigurationName, так как он может быть null, а не опущен.

Поведение индекса поиска

Для источников знаний, предназначенных для индекса поиска, подразумевается semanticтип запроса и режим поиска отсутствует. При повторном ранжировании прогонов для выполнения запросов используется semanticConfigurationName. Другие параметры источника, включая searchFields и sourceDataFields, применяются в обоих режимах.

Агентное извлечение не принимает входные данные scoringProfile или scoringParameters. Если вам нужна приоритизация по свежести для индексированных источников знаний, используйте поиск с учетом свежести (предварительная версия) вместо профиля оценки для индекса.

Если индекс содержит векторные поля, необходимо допустимое определение векторизатора, чтобы агентный механизм извлечения мог векторизовать входные данные запроса. В противном случае поля векторов игнорируются.

Дополнительные сведения см. Создание индекса для агентивного извлечения.

Потоковое получение результатов (предварительная версия)

Начиная с 2026-08-01-preview версии API, вы можете получить результаты в виде потока событий, отправленных сервером (SSE), а не ожидать одного ответа JSON. С помощью потоковой передачи клиент может отображать планирование запросов, действие источника и синтезированный ответ или извлеченный ответ в этом порядке, так как каждая часть становится доступной.

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

Чтобы включить потоковую передачу, добавьте заголовок Accept: text/event-stream в запрос на извлечение. Без этого заголовка действие извлечения возвращает стандартный ответ JSON.

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:Knowledge Retrieval — восстановление

Жизненный цикл событий

Вместо возврата одного ответа служба сохраняет одно http-подключение открыто (тип text/event-stream; charset=utf-8контента) и отправляет последовательность событий по мере того, как данные становятся доступными. Каждое event: событие имеет строку, которая data: называет тип события, строку со значением JSON и пустой строкой, которая помечает конец события.

Успешный поток использует следующий жизненный цикл:

Событие Время отправки То, что он содержит
retrieval.started Первое событие при каждом потоковом запросе. Идентификатор запроса, имя базы знаний, режим вывода и фактически применяемый уровень усилий рассуждения после того, как служба определит значения по умолчанию для запроса и базы знаний. Если эффективный kind — auto, событие сообщает о auto; оно не прогнозирует последующую эскалацию.
activity.started Когда служба начинает выполнение действия по планированию запросов, источнику или модели. Несколько действий могут начинаться до завершения предыдущего действия. Действие id, typeвремя начала и необязательное имя источника знаний.
activity.completed Когда это действие завершится. Сопоставьте это с событием activity.started, сопоставив id. Запись завершенного действия.
answer.completed Только один раз, когда answerSynthesisoutputMode. messageIndex определяет позицию сообщения в окончательном массиве ответов и message содержит полный синтезированный ответ. Нет дельта-события для каждого токена.
references.completed После обработки всех ссылок. Данные события — это полный массив ссылок без оболочки объекта.
response.completed Завершающее событие для успешной или частично успешной потоковой передачи. код состояния 200 или 206 и полное тело ответа при запросе retrieve, которое имеет ту же структуру, что и непотоковый JSON-вызов. Сведения о значении каждого кода состояния см. в разделе Устранение неполадок операции извлечения.
error Вместо references.completed и response.completed при сбое получения данных после открытия потока. Ошибка и все записи действий, выполненные до сбоя.

События поступают по порядку. Каждое событие activity.started предшествует событию activity.completed с тем же id, но действия могут чередоваться. Записи о завершённых действиях также включают метки времени startedAt и completedAt. Пока поток неактивен, сервер отправляет : heartbeat комментарий примерно каждые 15 секунд, чтобы сохранить подключение открытым. Клиенты SSE могут игнорировать эти комментарии.

В следующем примере показан потоковый ответ; фрагменты данных сокращены для удобства чтения.

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

Обработка ошибок, отмена и резервный сценарий

  • Сбои предварительной проверки: если проверка запроса завершается ошибкой до открытия потока, например для неправильно сформированного текста запроса, действие извлечения возвращает стандартный ответ на ошибку JSON и никогда не открывает поток.

  • Сбои после открытия потока: если после открытия потока извлечение завершается сбоем, терминальным событием будет error, а не references.completed и response.completed. Событие может включать любые записи действий, которые были завершены до сбоя. Код состояния HTTP остается 200 после запуска потока, поэтому проверьте событие терминала, а не код состояния HTTP, чтобы определить успешность.

  • Отмена или отключение. Если клиент отменяет запрос или отключается до завершения потока, служба отменяет извлечение и завершает поток без события терминала. Обрабатывать все события, полученные до отмены или отключения, как неполные.

  • Резервный JSON-ответ: при 2026-08-01-preview, отсутствии заголовка Accept или значении, таком как application/json, */*, text/* или text/event-stream;q=0, возвращается стандартный ответ в формате JSON, описанный в разделе Просмотрите ответ. Запрос text/event-stream в более ранней версии API возвращает 406 Not Acceptable.

Фильтрация источников знаний индекса поиска во время запроса

При получении из источника знаний индекса поиска можно применить фильтр OData во время запроса, чтобы сузить результаты к определенным документам или полям. Выражение фильтра использует синтаксис OData и передается через filterAddOn параметр.

Синтаксис фильтра и примеры

Параметр filterAddOn принимает выражения фильтра OData. Примеры шаблонов:

  • Поля метаданных: city eq 'Phoenix', status eq 'active'
  • Диапазоны дат: publishDate ge 2024-01-01 and publishDate le 2024-12-31
  • Числовые диапазоны: price ge 100 and price le 5000
  • Сопоставление текста: substringof('climate', description), indexof(title, 'urgent') ge 0
  • Логические операторы: (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'"
        }
    ]
}

Пример с несколькими фильтрами

Можно объединить несколько фильтров для дальнейшего уточнения результатов.

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

Переопределение сохраненных подсказок запроса во время запроса (предварительная версия)

Начиная с версии API 2026-08-01-preview вы можете переопределить подсказки запроса, хранящиеся в источнике знаний поискового индекса, для одного запроса retrieve, задав значение queryHintOverrides в записи knowledgeSourceParams.

Переопределение заменяет весь сохранённый объект queryHints, а не объединяет его запись за записью, поэтому включите все подсказки, которые вы хотите применить. Опустите queryHintOverrides, чтобы использовать сохранённые подсказки.

Если уровень логического анализа при извлечении не равен minimal, возврат ответа HTTP 400 зависит от сохранённых подсказок фильтрации, а не от содержимого переопределения или типа усиления. Служба проверяет сохранённые подсказки фильтра на соответствие модели базы знаний перед применением queryHintOverrides. Поэтому модель семейства GPT-4o или GPT-4.1 отклонит запрос, даже если параметр override пуст или содержит только усиления. Сами по себе сохранённые усиления не запускают эту проверку. Сначала используйте совместимую модель или удалите сохраненные подсказки фильтра.

В следующем примере все сохранённые подсказки заменяются одним усилением fieldValue для японского контента. Служба не применяет какой-либо сохраненный фильтр или другой сохраненный импульс к этому запросу.

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:Knowledge Retrieval — восстановление

Чтобы убедиться, что служба применила ваше переопределение, установите includeActivity в запросе и проверьте возвращённую searchIndex операцию. Его queryHintProcessing объект сообщает о созданной модели. В этом примере есть generatedBoost для усиления языка, но нет generatedFilter, поскольку переопределение заменило сохранённую подсказку фильтра. Так как подсказки запросов являются лучшими усилиями, обработайте это действие как подтверждение, а не проверку точного выражения.

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

Сведения о хранимом определении, поддерживаемых типах подсказок и композиции с детерминированными фильтрами см. в разделе "Настройка подсказок запросов (предварительная версия)".

Принудительное применение разрешений во время запроса (предварительная версия)

Изменения прав доступа, которые вы настроили вне 2026-08-01-preview, могут появиться в результатах извлечения 2026-08-01-preview не сразу.

Если источники знаний содержат содержимое, защищенное разрешениями, передайте удостоверение конечного пользователя в запросе на получение, чтобы каждый пользователь видел только содержимое, к которому они авторизованы для доступа. Для индексированных источников механизм извлечения использует эти идентификационные данные для фильтрации результатов и возвращает результаты без фильтрации, если они не указаны. Удалённые источники также используют данные авторизации из запроса на извлечение, но проверяют права доступа на стороне источника и могут потребовать специфичные для источника токен и заголовок.

Обеспечение соблюдения разрешений состоит из двух частей:

  • Время приема: только для индексированных источников знаний задайте ingestionPermissionOptions для приема метаданных разрешений вместе с содержимым.

  • Время запроса: Передайте данные авторизации пользователя в заголовке, который требуется источнику знаний. Большинство источников используют x-ms-query-source-authorization. Исключение — Work IQ, который использует x-ms-query-work-iq-source-authorization.

Настройка времени приема

В следующей таблице показано, какие источники знаний требуют настройки во время поглощения и как для каждого источника применяются разрешения.

Источник знаний Требует ingestionPermissionOptions Как обеспечивается соблюдение разрешений
Blob или ADLS Gen2 ✅ Импортированные области действия RBAC, списки управления доступом (ACL) или данные Microsoft Purview, сопоставленные с удостоверением пользователя.
OneLake ✅ Загруженный документ с метками конфиденциальности Microsoft Purview, сопоставленными с идентификатором пользователя.
Индексированный SharePoint ✅ Принятые ACL SharePoint или метки конфиденциальности Microsoft Purview, сопоставленные с идентификатором пользователя.
Удаленный SharePoint ❌ API Copilot Retrieval запрашивает SharePoint напрямую, используя токен пользователя.
Агент данных Fabric ❌ Модуль извлечения обменивает токен пользователя на токен с областью действия Microsoft Fabric и обращается к агенту данных от его имени.
Fabric Ontology ❌ Модуль извлечения обменивает токен пользователя на токен Microsoft Fabric с соответствующей областью действия и запрашивает элемент онтологии от его имени.
IQ работы ❌ Механизм извлечения обменивает утверждение пользователя для аудитории приложения от x-ms-query-work-iq-source-authorization на токен с областью действия Work IQ.

Если при создании индексированного источника знаний не настроено ingestionPermissionOptions , индекс не содержит метаданные разрешений. Система возвращает результаты, нефильтрованные независимо от заголовка. Чтобы устранить эту проблему, создайте источник знаний с соответствующими ingestionPermissionOptions значениями.

Авторизация во время запроса

Для источников знаний, не относящихся к Work IQ, передавайте идентификационные данные конечного пользователя, включая в запрос на извлечение токен доступа с областью действия https://search.azure.com/.default. Этот маркер отличается от учетных данных службы, используемых для доступа к службе поиска. Он не нуждается в разрешениях службы поиска и представляет только пользователя, доступ к содержимому которого оценивается. Дополнительные сведения см. в статье ACL во время запроса и принудительное применение RBAC.

Для источников знаний Work IQ этот раздел не применим. Используйте специфичный для Work IQ процесс утверждения пользователя, описанный в разделе «Применение разрешений во время выполнения запроса».

В пакете SDK .NET передайте маркер в качестве параметра querySourceAuthorization в 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

В пакете SDK Python передайте маркер в качестве параметра query_source_authorization в 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

В REST API добавьте x-ms-query-source-authorization заголовок с токеном доступа пользователя.

@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:Knowledge Retrieval — восстановление

Просмотр ответа

Действие извлечения возвращает три основных компонента:

Извлеченный ответ

Извлеченный ответ представляет собой единую строку, которую вы обычно передаёте в LLM. LLM использует строку в качестве опорных данных и на их основе формирует ответ. Вызов API для LLM включает унифицированную строку и инструкции для модели, например, использовать основу исключительно или в качестве дополнения.

Текст ответа структурирован в формате стиля сообщения чата, а содержимое сериализуется в формате 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>\"}]"
            }
        ]
    }
]

Ключевые моменты:

  • content.typeимеет одно допустимое значение: text

  • content.text — это строка, закодированная в формате JSON, содержащая наиболее релевантные документы (или блоки), найденные в индексе поиска, учитывая входные данные журнала запросов и чата. Эта строка — это основные данные, которые LLM использует для формирования ответа на вопрос пользователя.

    • Эта часть ответа состоит из 200 блоков или меньше, исключая любые результаты, которые не соответствуют минимальному значению оценки повторного оценщика, равной 2,5.

    • Строка начинается с идентификатора ссылки блока (используемого для ссылок) и любых полей, указанных в семантической конфигурации целевого индекса. В этом примере предполагается, что семантическая конфигурация в целевом индексе имеет поле "title", поле "термины" и поле "content".

  • Ответы на запрос извлечения не включают @search.rerankerBoostedScore.

  • Свойство maxOutputSizeInTokens (maxOutputSize в 2026-05-01-preview и более поздних версиях) в запросе на получение определяет длину строки.

    • Документ, превышающий выходной maxOutputSizeInTokens бюджет, может быть опущен из ответа. Массив действий содержит предупреждение, если наиболее релевантный документ превышает максимальный размер выходных данных. Чтобы сохранить больше контента, увеличьте maxOutputSizeInTokens. Дополнительные сведения см. в разделе "Пустые ответы".

Массив действий

Массив действий выводит план запроса, который обеспечивает операционную прозрачность для отслеживания операций, аспектов выставления счетов и вызовов на ресурсы. Это также включает подзапросы, отправленные в конвейер извлечения. В случае ответа 206 Partial Content массив содержит ошибки для источников знаний, обработка которых завершилась ошибкой. Ответ 502 Bad Gateway может содержать сведения о сбое только в ошибке верхнего уровня.

Массив действий включает следующие компоненты:

Раздел Описание
Действие, зависящее от источника Для каждого источника знаний, включенного в запрос, этот раздел сообщает об истечении времени и о том, какие аргументы использовались в запросе, включая семантический рангировщик. Типы источников знаний включают searchIndexи azureBlobдругие поддерживаемые источники знаний.
agenticReasoning В этом разделе приводятся сведения о потреблении токенов при агентном рассуждении во время извлечения, которое зависит от указанного параметра уровень усилий рассуждения при извлечении (предварительная версия).
modelQueryPlanning Для баз знаний, использующих LLM для планирования запросов, в этом разделе приводятся сведения о количестве токенов, использованных во входных данных, и о количестве токенов в подзапросах. Он включает поле model с полем modelName, содержащим общедоступное имя модели, а не имя развертывания модели, которая выполнила это действие.
modelAnswerSynthesis Для баз знаний, использующих синтез ответов (предварительная версия), этот раздел сообщает о количестве маркеров для определения ответа и количества маркеров выходных данных ответа. Он включает поле model с полем modelName, содержащим общедоступное имя модели, а не имя развертывания модели, которая выполнила это действие.
modelWebSummarization Для баз знаний, использующих суммаризацию веб-результатов, в этом разделе приводятся сведения о расходе токенов на суммаризацию веб-результатов. Он включает поле model с полем modelName, содержащим общедоступное имя модели, а не имя развертывания модели, которая выполнила это действие.
model Для записей действий, поддерживаемых моделью, этот раздел определяет модель, используемую для выполнения действия. Этот раздел отображается только в том случае, если для includeActivity задано значение true.
imageServing Для источников знаний, для которых включена функция обработки изображений (предварительная версия), в этом разделе приводятся imagesRetrieved, imagesSentToModel, totalImageSizeBytes и сведения о том, был ли включен параметр verbalizationUsed во время индексирования. Проверьте verbalizationUsed и imagesSentToModel по отдельности. Ответ может указывать verbalizationUsed как true и при этом по-прежнему отправлять изображения в последующую модель. Чтобы найти количество отброшенных изображений, вычтите imagesSentToModel из imagesRetrieved.

В следующем примере показан массив действий.

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

Массив ссылок

Массив ссылок поступает непосредственно из исходных базовых данных. Он включает в себя sourceData, используемые для генерации ответа, и содержит каждый документ, который поисковая система находит и семантически ранжирует.

Массив ссылок включает следующие компоненты:

Поле Описание
type Тип источника знаний, создающий ссылку, например searchIndex.
id Ссылочный идентификатор элемента в ответе. Это не ключ документа в индексе поиска. Используйте его для предоставления ссылок.
activitySource Сопоставляет id записи активности, в которой была создана ссылка, что полезно для связывания цитат.
docKey Для индексированной ссылки — ключ документа в базовом поисковом индексе.
sourceData Исходные данные, использованные для формирования ответа. Для индексированной ссылки поля могут включать id и семантические поля, такие как title, terms и content. Форма зависит от типа ссылки.
citationUrl (предварительная версия) URL-адрес только для чтения, созданный службой и ведущий к документу, на который указывает ссылка, в базовом индексе. Возвращается только для индексированных источников знаний. Чтобы следовать URL-адресу, см. статью "Поиск документов с URL-адресами ссылок (предварительная версия)".

В следующем примере показан массив ссылок.

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

Поиск документов с URL-адресами ссылки (предварительная версия)

Начиная с версии API 2026-08-01-preview, ссылка на индексированный источник знаний может включать citationUrl в ответе на запрос retrieve. Используйте этот URL-адрес, чтобы получить индексированные поля для этой ссылки, например title и content, чтобы можно было отобразить предварительную версию ссылки, показывающую, откуда пришел ответ, не открывая исходный исходный документ. Это citationUrl — аутентифицированный запрос к базовому индексу, отдельный от источника docUrl и blobUrl.

В следующем примере показан URL-адрес с санизированной ссылкой.

"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"

Выбранные поля и их порядок зависят от индексированного источника и конфигурации извлечения.

Важно

Следуйте полному URL-адресу из ответа подробно и отрисуйте возвращенные поля JSON в приложении. Не создавайте, не анализируйте или нормализуйте URL-адрес.

При указании URL-адреса цитирования в следующих примерах получается маркер доступа для службы поиска. Они вызывают URL-адрес с этим маркером в заголовке Authorization . Для учетной записи, под которой выполнен вход, требуется роль Search Index Data Reader.

Поиск с использованием ИИ Azure методы поиска документов SDK требуют конечной точки, имени индекса, ключа документа, выбранных полей и версии API в качестве отдельных входных данных. Они не принимают абсолютный URL-адрес цитирования. В этих примерах используется прошедший проверку подлинности HTTP GET для сохранения полного URL-адреса, созданного службой.

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

Справочник: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))

Справочник:DefaultAzureCredential

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

Справочник:Документы — получение

Поиск документа возвращает выбранные поля из индекса в виде 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"
}

При использовании URL-адреса цитирования учитывайте следующее:

  • Проверьте наличие citationUrl перед отображением цитаты. Он может отсутствовать, если ответ не содержит ссылок или служба не может определить базовый индекс или ключ документа.

  • Если запрос на извлечение включает элемент x-ms-query-source-authorization для управления доступом на уровне документа, используйте тот же токен пользователя при переходе по этому URL-адресу.

  • URL-адрес остается допустимым только в то время как резервный индекс и ключ документа остаются неизменными.

Проверка метаданных метки конфиденциальности в ответе (предварительная версия)

Те же особенности задержки, описанные в разделе «Проверка разрешений во время запроса», применимы и здесь: изменения разрешений доступа, которые вы задаёте вне 2026-08-01-preview, могут появляться в ответах 2026-08-01-preview retrieve с задержкой.

При запросе к базе знаний, которая обрабатывает метки конфиденциальности Microsoft Purview, ответ на запрос включает метаданные меток на двух уровнях:

Местоположение Поле Описание
Согласно ссылке sensitivityLabelInfo Метка конфиденциальности, применённая к каждому документу, возвращённому в массиве references.
Response metadata.responseSensitivityLabelInfo Сводная метка, которая представляет метку конфиденциальности с наивысшим приоритетом среди всех документов, на которые есть ссылки в ответе. Полезно для отображения баннеров на стороне клиента и применения политик.

Microsoft Graph вычисляет метку на уровне ответа на основе меток отдельных ссылок в соответствии с правилами наследования меток Microsoft Purview. Обычно приоритет имеет самая строгая метка.

В следующем примере показан ответ на запрос извлечения с двумя документами, на которые есть ссылки (один Confidential, один Internal), и результирующей меткой на уровне ответа.

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

Типы ссылок, которые отображают метки конфиденциальности

Имя поля и доступность метаданных меток зависят от типа источника знаний, создающего каждую ссылку.

Ссылка type Поле для метки Доступно, когда...
azureBlob sensitivityLabelInfo Источник знаний о BLOB-объектах включает sensitivityLabel в ingestionPermissionOptions.
indexedOneLake sensitivityLabelInfo Источник знаний OneLake включает sensitivityLabel в ingestionPermissionOptions.
indexedSharePoint sensitivityLabelInfo Источник знаний, проиндексированный в SharePoint, включает sensitivityLabel в ingestionPermissionOptions.
searchIndex sensitivityLabelInfo Базовый индекс имеет значение purviewEnabled, равное true, и поле, помеченное как sensitivityLabel: true.

Отображение рекомендаций и их аудит

  • Используйте sensitivityLabelInfo.labelId, чтобы найти полное определение метки с помощью API Microsoft Graph для меток конфиденциальности, если вам нужны дополнительные свойства, такие как элементы управления политикой или разрешения.

  • Используйте metadata.responseSensitivityLabelInfo для отображения баннера чувствительности на уровне ответа или применения средств управления политикой, таких как отключение копирования и общего доступа, ко всему ответу.

  • Если источник знаний указывает на индекс, разбитый на фрагменты, например индекс, заполненный с помощью интегрированной векторизации или пользовательского навыка Text Split, убедитесь, что набор навыков проецирует метку конфиденциальности в каждую строку фрагмента. Без этого сопоставления ссылки на уровне фрагментов не фильтруются корректно при выполнении запроса.

  • Сведения об административном доступе с возможностью аудита к содержимому с метками см. в разделе Расширенный доступ на чтение для административных расследований.

Поведение сервера MCP

Конечная точка MCP, предоставленная каждой базой знаний, предоставляет те же поля меток конфиденциальности, что и REST API. Когда клиент, совместимый с MCP, вызывает инструмент knowledge_base_retrieve, результат работы инструмента содержит те же sensitivityLabelInfo для каждой ссылки и metadata.responseSensitivityLabelInfo на уровне ответа, которые были описаны ранее в этом разделе. Клиенты MCP обеспечивают отображение с учетом меток и средства управления политиками на основе этих полей.

Получение примеров действий (предварительная версия)

В следующих примерах показаны различные способы вызова операции retrieve с использованием версии API 2026-08-01-preview. Эта версия поддерживает полный набор функций, включая синтез ответов и настраиваемый уровень рассуждений. Сведения об использовании 2026-04-01 см. в предыдущих разделах.

Проверка имен моделей в журналах действий

Установите для includeActivity значение true, чтобы возвращать поля идентификации модели в записях действий, связанных с моделью. Используйте эти поля, чтобы подтвердить, какие настроенные модели обрабатывали планирование запросов, синтез ответа или веб-сводку во время запроса на получение. В следующем примере переопределяется обработка сохранённых результатов для выбранного источника в запросе.

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:Knowledge Retrieval — восстановление

В следующем фрагменте ответа показан идентификатор вложенной модели:

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

Требовать источник знаний для успешного выполнения

Установите failOnError в knowledgeSourceParams, чтобы отметить источник знаний как обязательный. Используйте этот параметр, если частичный ответ вводит в заблуждение или не соответствует требованиям, если этот источник недоступен. Запрос возвращает 502 Bad Gateway, если обязательный источник завершается с ошибкой, даже если другой источник завершается успешно. Инструкции по обработке см. в разделе "Устранение неполадок действия извлечения".

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

Справочник: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)

Справочник: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:Knowledge Retrieval — восстановление

Исключение источника знаний из запроса

Начиная с 2026-08-01-preview версии API, задайте neverQuerySourcetrue для каждого источника знаний, который требуется исключить из запроса на получение. Значение neverQuerySource, заданное во время запроса, переопределяет сохранённое значение alwaysQuerySource для этого запроса, не изменяя само сохранённое значение.

В следующем примере выполняется запрос к базе знаний, содержащей product-docs-ks и troubleshooting-ks, исключая troubleshooting-ks из запроса.

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

Справочник: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)

Справочник: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:Knowledge Retrieval — восстановление

Настройка документов кандидатов на источник знаний

Задайте maxOutputDocuments в knowledgeSourceParams, чтобы ограничить количество документов-кандидатов, которые предоставляет определённый источник знаний перед окончательным отбором результатов. Используйте этот параметр, если требуется привязать входные данные одного источника к конвейеру, не влияя на другие.

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

Справочник: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)

Справочник: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:Knowledge Retrieval — восстановление

Ограничить итоговые документы для обоснования

Параметр верхнего уровня maxOutputDocuments ограничивает количество документов-обоснований, возвращаемых в итоговом ответе retrieve. Используйте этот параметр, если вашему приложению необходимо предсказуемое количество цитирований или ссылок.

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:Knowledge Retrieval — восстановление

Следующая таблица показывает, как maxOutputDocuments и maxOutputSizeInTokens взаимодействуют во всех четырёх комбинациях.

maxOutputDocuments maxOutputSizeInTokens Behavior
Не определено Не определено Использует поведение ограничения ответа по умолчанию maxOutputSizeInTokens .
Не определено Задано Отбрасывает документы при достижении предельного размера полезной нагрузки.
Задано Не определено Возвращает не более указанного количества документов-источников и не применяет ограничение maxOutputSizeInTokens.
Задано Задано Возвращает до maxOutputDocuments документов или столько документов, сколько помещается в пределах maxOutputSizeInTokens, в зависимости от того, какое ограничение будет достигнуто первым.

Проверка получения значений по умолчанию из базы знаний

База знаний может хранить значения retrieveDefaultsпо умолчанию на уровне запросов. Отправьте два запроса на получение данных, чтобы проверить наследование и переопределения, заданные для конкретного запроса.

Прежде чем начать, выполните настройку ограничений получения по умолчанию (предварительная версия). Первый запрос не указывает все три общих для всего запроса ограничения, поэтому применяются сохранённые значения: 45 секунд, восемь документов и 12 000 токенов. Второй запрос переопределяет эти значения: 20 секунд, один документ и 5 000 токенов.

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

Во-первых, отправьте запрос, который пропускает три поля ограничения на уровне запроса.

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

Затем переопределите все три значения для одного запроса.

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:Knowledge Retrieval — восстановление

Счетчик ссылок показывает, используется ли хранимое значение или значение maxOutputDocuments на уровне запроса: первый ответ содержит не более восьми ссылок, а второй — не более одной ссылки. Ответ может содержать меньше ссылок, если меньше документов совпадает. Ответ не указывает фактическое время выполнения или бюджет выходных токенов, но эти значения по-прежнему определяют обработку запроса. Переопределения запросов не изменяют хранимые значения по умолчанию.

Переопределите усилия по умолчанию и установите ограничения запросов

В следующем примере указывается синтез ответа, поэтому уровень рассуждений при извлечении должен быть medium или low. Он также задаёт maxRuntimeInSeconds для ограничения времени выполнения извлечения и maxOutputSizeInTokens для ограничения размера полезной нагрузки ответа.

maxRuntimeInSeconds принимает значения от 10 до 600 секунд и по умолчанию — 90 секунд. Максимальное ограничение в 600 секунд (10 минут) применяется только к запросу извлечения Поиск с использованием ИИ Azure.

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:Knowledge Retrieval — восстановление

Позвольте сервису выбрать уровень рассуждений

Задайте для retrievalReasoningEffort.kind значение auto в запросе извлечения, чтобы переопределить значение по умолчанию для базы знаний. Дополнительные сведения об автоматическом рассуждении см. в разделе Настройка интенсивности рассуждения при извлечении (предварительная версия).

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

Reference:Knowledge Retrieval — восстановление

Установка ссылок для каждого источника знаний

Используйте includeReferences и includeReferenceSourceData в knowledgeSourceParams, чтобы управлять тем, какие источники отображаются в массиве ссылок и какой объём исходных данных содержит каждая запись. В следующем примере используется уровень рассуждения по умолчанию для базы знаний.

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:Knowledge Retrieval — восстановление

Используйте минимальные усилия на размышление

В следующем примере нет LLM для интеллектуального планирования запросов или синтеза ответов. Строка запроса передается в агентский механизм поиска для выполнения запроса либо при использовании ключевых слов, либо в гибридном режиме.

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:Knowledge Retrieval — восстановление

Устранение неполадок с действием извлечения

В ответе 2026-08-01-preview статус ответа указывает, было ли извлечение успешным, частично успешным или завершилось ошибкой, и что делать дальше. Используйте следующую таблицу, чтобы сопоставить каждое состояние с его значением, а затем см. соответствующий раздел для устранения неполадок.

Status Значение
200 OK Извлечение выполнено успешно. Документ по-прежнему может быть опущен, если его содержимое превышает выходной бюджет. Дополнительные сведения см. в разделе "Пустые ответы".
400 Bad Request Запрос на извлечение не прошёл проверку до начала извлечения.
206 Partial Content По крайней мере один источник завершился успешно, и ни один источник с ошибкой не помечен failOnError. Ответ содержит результаты, полученные из источников, которые были успешно обработаны.
502 Bad Gateway Все выбранные источники завершились сбоем, или произошёл сбой источника, помеченного failOnError: true.

Для любого ответа, отличного от 200, запишите версию API, метку времени, очищенное тело запроса, заголовки ответа и идентификатор запроса или корреляции. Эти сведения помогут диагностировать сбой и при необходимости сообщить о проблеме в службу поддержки.

400 Bad Request

Используйте ошибку верхнего уровня, чтобы определить недопустимое свойство запроса. Распространенные причины:

  • Элемент knowledgeSourceName в knowledgeSourceParams не подключен к базе знаний, или его kind не соответствует подключенному источнику.
  • Значение запроса находится за пределами поддерживаемого диапазона, или для одного из вариантов требуется другой параметр, который не включен. Например, для includeReferenceSourceData требуется includeReferences.
  • retrievalReasoningEffort.kind имеет значение auto, но запрос использует версию API ранее 2026-08-01-preview.
  • Запрос использует autoилиlowmedium, но база знаний не определяет модель.
  • Для исключения источников во время запроса (предварительная версия) одна и та же запись устанавливает и alwaysQuerySource, и neverQuerySource в значение true, либо исключается каждый подключенный источник знаний.

Прежде чем повторить запрос, исправьте свойство, определенное ошибкой верхнего уровня.

206 Partial Content

Проверьте каждую activity запись, содержащую объект error. Операция извлечения источника выявляет отказавший источник знаний, а операция модели выявляет этап обработки, на котором произошёл сбой. Текст ответа по-прежнему содержит результаты, успешно выполненные.

Для ошибок при извлечении источника к распространённым причинам относятся:

  • Недопустимые входные данные во время запроса, например неправильно сформированное filterAddOn выражение.
  • Смещение конфигурации источника знаний или индекса, например переименованное поле, отсутствие семантической конфигурации или недопустимый векторизатор.
  • Отсутствует или недействительна авторизация зависимости либо недостаточно разрешений для учётной записи, используемой для запроса к источнику.
  • Регулирование зависимостей, время ожидания или временные сбои доступности.

Для ошибки действия модели используйте действие type для идентификации этапа неудачной обработки. Например, ошибка modelWebSummarization указывает на то, что суммирование веб-результатов завершилось сбоем.

Если приложение разрешает частичные результаты, обработайте успешные результаты и запишите каждый сбой исходного или модельного этапа. Перед повторным повтором исправьте конфигурацию, авторизацию и ошибки разрешений. При ограничении запросов, тайм-ауте или кратковременных сбоях доступности используйте ограниченное число повторных попыток с увеличением интервала.

Если результаты небезопасны при отсутствии конкретного источника и тип этого источника поддерживает alwaysQuerySource, задайте и alwaysQuerySource, и failOnError. Первый параметр гарантирует, что источник выбран, а второй возвращает жесткую ошибку при сбое запроса. Источники знаний сервера MCP (предварительная версия) не поддерживаются alwaysQuerySource; для этих источников failOnError применяется только при выборе источника. failOnError не применяется к сбоям действия модели.

502 Bad Gateway

Ошибка верхнего уровня описывает один из двух путей к жесткому сбою:

  • Сбой каждого выбранного источника: Каждый выбранный источник вернул ошибку. Источник, который успешно завершился, не найдя ни одного совпадающего документа, не считается сбойным. Проверьте каждый сбой источника на наличие общей проблемы с конфигурацией, авторизацией, зависимостями или доступностью.
  • Сбой источника: не удалось запросить обязательный failOnError источник. Другие источники могли завершиться успешно, но служба не возвращает частичный результат, так как необходимый источник завершился ошибкой.

Основные сбои источника обычно относятся к тем же типам, что и описанные для 206 Partial Content: недопустимые входные данные, специфичные для источника, рассинхронизация конфигурации источника или индекса, авторизация зависимостей или права доступа, троттлинг, тайм-ауты или временные проблемы с доступностью зависимостей.

Строгий ответ 502 может не включать массив activity и указывать имя источника и первопричину сбоя только в сообщении об ошибке верхнего уровня. Перед повторным повтором исправьте конфигурацию, авторизацию и ошибки разрешений. Используйте ограниченное число повторных попыток с увеличением интервала только в случаях ограничения скорости, превышения времени ожидания или временных сбоев доступности. Не интерпретируйте ответ 502 Bad Gateway как сбой в Поиск с использованием ИИ Azure, не изучив сначала первопричину сбоя в источнике.

Пустые ответы

Шаг поиска может найти документ, но служба по-прежнему может опустить его из окончательного ответа, если его заземленное содержимое превышает выходной maxOutputSizeInTokens бюджет (maxOutputSize в 2026-05-01-preview и более поздних версиях). При возникновении этого условия массив действий показывает, что найдены совпадения, а запись действия содержит предупреждение о том, что наиболее релевантный документ превысил максимальный размер выходных данных. Для данного документа массив ссылок и содержимое обоснованного ответа пусты. Чтобы сохранить больше контента, увеличьте maxOutputSizeInTokens.

Чтобы избежать этого, индексировать большие исходные документы как небольшие блоки с стабильными идентификаторами и метаданными источника. Это особенно относится к длинным руководствам, политикам или статьям базы знаний.

Вызов конечной точки MCP

Предупреждение

Реализации MCP подвержены рискам, таким как атаки, каскадные неудачи и потеря человеческого надзора. Эти риски можно снизить, проверяя серверы MCP на предмет безопасности и надёжности, следуя рекомендованным Microsoft практикам и лучшим отраслевым практикам, а также внедряя механизмы утверждения действий и отслеживая каскадное поведение.

MCP — это открытый протокол, который стандартизирует подключение приложений ИИ к внешним источникам данных и средствам.

В Поиск с использованием ИИ Azure каждая база знаний является автономным сервером MCP, предоставляющим средство knowledge_base_retrieve. Любой клиент, совместимый с MCP, включая Foundry Agent Service, GitHub Copilot, Claude и Cursor, может вызвать этот инструмент для запроса базы знаний.

Аутентификация на конечной точке MCP

Каждая база знаний имеет конечную точку MCP по следующему URL-адресу:

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

Указанная версия API определяет, что возвращает подключение. При использовании 2026-08-01-preview база знаний возвращает сгенерированные ответы, если исходная база знаний настроена с использованием LLM и совместимого уровня рассуждений. При использовании 2026-04-01 поиск всегда минимален и основан только на извлечении, а соединение возвращает только данные grounding.

Проверка подлинности в этой конечной точке зависит от клиента MCP. При использовании API Azure OpenAI Responses с knowledge_base_retrieve средством MCP выполняется проверка подлинности вызова API ответов для Azure OpenAI и запроса MCP для Поиск с использованием ИИ Azure. Если клиент MCP вызывает эту конечную точку напрямую, проверка подлинности выполняется только в Поиск с использованием ИИ Azure.

Для проверки подлинности Поиск с использованием ИИ Azure используйте один из следующих методов:

Примечание

Клиенты MCP настраивают пользовательские заголовки по-разному. Например, служба агента Foundry внедряет заголовки через подключения к проекту, а клиенты, такие как GitHub Copilot требуют заголовков в ФОРМАТЕ JSON сервера MCP.

Использование маркера носителя для проверки подлинности MCP

Рекомендуемый метод проверки подлинности MCP — это маркер носителя, который позволяет избежать хранения конфиденциальных ключей в файлах конфигурации. Удостоверение, лежащее в основе маркера, должно иметь роль средства чтения данных индекса поиска , назначенную службе поиска. Дополнительные сведения см. в разделе Connect your app to Поиск с использованием ИИ Azure, используя учетные записи.

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

Справочные материалы:Использование API Responses в Azure OpenAI

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)

Справочные материалы:Использование API Responses в Azure OpenAI

// This code snippet is currently unavailable.

Использование ключа администратора для проверки подлинности MCP

Ключ администратора предоставляет полный доступ на чтение и запись в службу поиска, поэтому используйте его только в средах разработки или когда маркер носителя недоступен. Дополнительные сведения см. в разделе Connect to Поиск с использованием ИИ Azure using API key.

Tip

В следующем примере показан только заголовок, который отличается от примера маркера носителя. Сведения о полной настройке см. в разделе "Использование маркера носителя для проверки подлинности 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)
);

Справочные материалы:Использование API Responses в Azure OpenAI

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

Справочные материалы:Использование API Responses в Azure OpenAI

// This code snippet is currently unavailable.

Просмотреть ответ MCP

Когда клиент MCP вызывает knowledge_base_retrieve, он получает результат инструмента MCP вместо оболочки response, activity и references действия retrieve. Многие клиенты MCP представляют результат этого инструмента в объекте верхнего уровня result, поэтому следует ожидать полезную нагрузку вида 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>\"}]"
      }
    ]
  }
}

Ключевые моменты:

  • result.content[] содержит выходные данные средства MCP, возвращаемые базой знаний.

  • result.content[].type равно text.

  • result.content[].text содержит извлеченные данные заземления в виде строки в кодировке JSON.

  • В отличие от операции retrieve, текущий ответ MCP не возвращает отдельные массивы activity или references и не заполняет элементы resource для возвращаемого содержимого.