Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga
Wyszukiwanie AI platformy Azure jest dostępna za pośrednictwem portalu Azure, interfejsów API REST i Azure SDKs. Jest także podstawą Foundry IQ — zarządzanej warstwy wiedzy, która przekształca treści przedsiębiorstwa w bazy wiedzy wielokrotnego użytku z uwzględnieniem uprawnień dla agentów w portalu Microsoft Foundry.
Ważne
Funkcje, możliwości lub właściwości oznaczone (wersja zapoznawcza) nie są objęte umową dotyczącą poziomu usług, nie są zalecane w przypadku obciążeń produkcyjnych i mogą ulec zmianie lub ograniczeniu, zanim staną się one ogólnie dostępne. Warunki Wyszukiwanie AI platformy Azure wersji zapoznawczej mają zastosowanie do wszystkich funkcji w wersji zapoznawczej, niezależnie od tego, czy jest ona autonomiczna, czy częścią ogólnie dostępnej funkcji.
W agentycznym potoku pobierania akcja pobierania wywołuje równoległe przetwarzanie zapytań z bazy wiedzy. Akcję pobierania można wywołać bezpośrednio przy użyciu interfejsów API REST usługi wyszukiwania lub Azure SDK. Każda baza wiedzy udostępnia również punkt końcowy protokołu MCP (Model Context Protocol) do użycia przez agentów zgodnych z mcP.
W tym artykule wyjaśniono, jak wywołać obie metody pobierania z opcjonalnym egzekwowaniem uprawnień. Najpierw omawia operację pobierania, a dopiero później punkt końcowy MCP, ponieważ wynik narzędzia MCP obecnie różni się od formatu odpowiedzi REST i SDK.
Aby skonfigurować potok, który łączy Wyszukiwanie AI platformy Azure z usługą agenta Foundry za pośrednictwem MCP, zobacz Samouczek: Tworzenie kompleksowego rozwiązania do kompleksowego pobierania agenta.
Wsparcie użytkowania
| Portal Azure | Portal Microsoft Foundry | .NET SDK | SDK języka Python | SDK Java | JavaScript SDK | API REST |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Wymagania wstępne
Usługa Wyszukiwanie AI platformy Azure z bazą wiedzy.
Aby uzyskać dostęp do modelu udostępnionego i konfigurację klienta, zobacz Wymagania wstępne dotyczące tworzenia bazy wiedzy.
Uprawnienie do wykonywania zapytań dotyczących baz wiedzy. Skonfiguruj uwierzytelnianie bez klucza przy użyciu roli Czytelnik danych indeksu wyszukiwania przypisanej do konta użytkownika (zalecane) lub użyj klucza interfejsu API zapytania.
Jeśli wywołujesz punkt końcowy MCP za pomocą interfejsu API odpowiedzi usługi Azure OpenAI, potrzebujesz:
Wdrożony model LLM i rola Cognitive Services OpenAI User (lub klucz API) w zasobie Foundry. Możesz ponownie użyć usługi LLM i zasobu określonego w bazie wiedzy, jeśli ma to zastosowanie.
Pakiet
Azure.AI.OpenAI:dotnet add package Azure.AI.OpenAI
Wymagany pakiet
Azure.Search.Documents:Dla funkcji
2026-08-01-previewnajnowszy pakiet w wersji zapoznawczej:dotnet add package Azure.Search.Documents --prereleaseDla funkcji
2026-04-01, najnowszy stabilny pakiet:dotnet add package Azure.Search.Documents
W przypadku uwierzytelniania bezkluczowego pakiet
Azure.Identity:dotnet add package Azure.Identity
Jeśli wywołujesz punkt końcowy MCP za pomocą interfejsu API odpowiedzi usługi Azure OpenAI, potrzebujesz:
Wdrożony model LLM i rola Cognitive Services OpenAI User (lub klucz API) w zasobie Foundry. Możesz ponownie użyć usługi LLM i zasobu określonego w bazie wiedzy, jeśli ma to zastosowanie.
Pakiet
openai:pip install openai
Wymagany pakiet
azure-search-documents:Dla funkcji
2026-08-01-previewnajnowszy pakiet w wersji zapoznawczej:pip install --pre azure-search-documentsDla funkcji
2026-04-01, najnowszy stabilny pakiet:pip install azure-search-documents
W przypadku uwierzytelniania bezkluczowego pakiet
azure-identity:pip install azure-identity
Wymagana wersja interfejsu API REST usługi wyszukiwania:
W przypadku funkcji w wersji zapoznawczej: 2026-08-01-preview
Funkcje ogólnie dostępne: 2026-04-01
W przypadku uwierzytelniania bez klucza dołącz token Microsoft Entra ID w nagłówku
Authorizationkażdego żądania HTTP.
Limitations
W przypadku źródeł wiedzy dla indeksu wyszukiwania, po włączeniu ponownego rankingowania funkcja retrieve używa konfiguracji semantycznej źródła wiedzy. Nie stosuje profilów oceniania indeksu bazowego, w tym defaultScoringProfile. Pobierz odpowiedzi nie są również wyświetlane @search.rerankerBoostedScore.
Wywołaj akcję pobierania
Należy określić akcję pobierania w bazie wiedzy. Treść żądania zawiera wejście zapytania oraz opcjonalną listę docelowych źródeł wiedzy.
Wersja interfejsu API 2026-04-01 obsługuje tylko dane wejściowe intents oraz minimalne wyszukiwanie ekstrakcyjne. Możliwości tylko w wersji zapoznawczej, w tym messages dane wejściowe, planowanie zapytań, synteza odpowiedzi i konfigurowalny poziom wysiłku rozumowania, nie są obsługiwane. Użyj 2026-08-01-preview, aby uzyskać pełną funkcjonalność.
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
);
Dokumentacja: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)
Dokumentacja: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"
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Dostarczanie obrazów w celu odpowiedzi na syntezę (wersja zapoznawcza)
W przypadku źródeł wiedzy blob, indeksowanego OneLake i indeksowanego programu SharePoint, które skonfigurujesz z magazynem zasobów, możesz przekazywać do modelu syntezy odpowiedzi w dalszym etapie obrazy osadzone w dokumentach razem z tekstem. Ustaw wartość enableImageServing dla odpowiedniego wpisu w knowledgeSourceParams, aby zastąpić ustawioną domyślnie wartość w definicji bazy wiedzy. Odpowiedź pobierania nie zawiera dedykowanych pól dla poszczególnych ścieżek obrazów ani bajtów obrazów dostarczonych do modelu.
Udostępnianie obrazów działa tylko wtedy, gdy outputMode ma wartość answerSynthesis, i nie jest obsługiwane w przypadku źródeł wiedzy, które konfigurują ingestionPermissionOptions. Aby uzyskać informacje o krokach konfiguracji, tabeli priorytetów i o tym, jak sprawdzać statystyki udostępniania obrazów, zobacz Udostępnianie obrazów osadzonych w dokumentach w wyszukiwaniu agentowym (wersja zapoznawcza).
Wyłącz ponowne rankingowanie dla źródła wiedzy (wersja zapoznawcza)
Począwszy od wersji interfejsu API 2026-08-01-preview, ustaw "resultsProcessing": "none" we wpisie knowledgeSourceParams, aby pominąć ponowne rankingowanie dla określonego źródła wiedzy i zachować jego oryginalną kolejność wyników. Możesz również przechowywać resultsProcessing w źródle wiedzy jako domyślne. Wszystkie rodzaje źródeł wiedzy obsługują tę właściwość.
Poniższy przykład pomija ponowne rangowanie dla product-catalog-ks w przypadku jednego żądania pobierania.
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)}");
Dokumentacja: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)
Dokumentacja: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"
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Ustaw "resultsProcessing": "rerank" lub pomiń go, jeśli nie ma zapisanej wartości domyślnej, aby użyć potoku ponownego rankingowania. Wyszukiwanie AI platformy Azure rozpoznaje obowiązującą wartość dla każdego źródła w następującej kolejności:
-
resultsProcessingwknowledgeSourceParamsw żądaniu pobrania. -
resultsProcessingprzechowywane w źródle wiedzy. -
rerankgdy żadna właściwość nie jest obecna.
W przypadku źródła resultsProcessingwiedzy serwera MCP wartość ustawiona na pojedynczym narzędziu ma pierwszeństwo przed żądaniem i przechowywanymi wartościami.
Wskazówka
resultsProcessing zmienia sposób przetwarzania wyników, a nie tego, które źródła są odpytywane. Ustaw alwaysQuerySource wartość na true , jeśli źródło wiedzy musi być odpytywane.
Gdy obowiązująca wartość to none:
- Odwołania ze źródła wiedzy pomijają
rerankerScore, a wyniki zachowują swoją pierwotną kolejność w ramach działania pobierania źródła. - Gdy dowolne źródło pomija ponowne rankingowanie, usługa Wyszukiwanie AI platformy Azure rozdziela końcowe wyniki pomiędzy działania w kolejności rotacyjnej, zgodnie z kolejnością deklarowania źródeł wiedzy. Ponownie sklasyfikowane działania pozostają uporządkowane według wyniku.
- Deduplikacja i limity poszczególnych źródeł, dokumentów i tokenów są nadal stosowane, więc nie każdy pobrany wynik pojawia się w odpowiedzi.
Wyszukiwanie AI platformy Azure weryfikuje rerankerThreshold w następującej kolejności:
- Wyszukiwanie ustala
resultsProcessingna podstawie żądania pobrania i zapisanej wartości źródła wiedzy. - Jeśli rozpoznana wartość to
none, a żądanie zawierarerankerThresholdelement , funkcja Search zwraca wartość400 Bad Request. - W narzędziu serwera MCP Search stosuje wartość
resultsProcessingna poziomie narzędzia po zweryfikowaniu żądania.
W związku z tym ustawienie narzędzia MCP nie zmienia tego, czy żądanie przechodzi walidację. Wartość none na poziomie narzędzia nie powoduje błędu związanego z progiem, a wartość rerank na poziomie narzędzia nie zapobiega wystąpieniu błędu, gdy żądanie lub przechowywana wartość przyjmują wartość none.
Aby potwierdzić, który tryb został uruchomiony, sprawdź, czy odniesienia źródła wiedzy obejmują rerankerScore. Nie należy polegać na semanticConfigurationName, ponieważ może być null, a nie pominięty.
Zachowanie indeksu wyszukiwania
W przypadku źródeł wiedzy, które są przeznaczone dla indeksu wyszukiwania, typ zapytania implikowane to semantic, i nie ma trybu wyszukiwania. Podczas przebiegów rerankingu wykonywanie zapytań używa semanticConfigurationName. Inne ustawienia źródła, w tym searchFields i sourceDataFields, mają zastosowanie w obu trybach.
Wyszukiwanie agentowe nie akceptuje danych wejściowych scoringProfile ani scoringParameters. Jeśli potrzebujesz priorytetyzowania nowszych danych dla indeksowanych źródeł wiedzy, użyj pobierania uwzględniającego świeżość (wersja zapoznawcza) zamiast profilu oceniania dla indeksu.
Jeśli indeks zawiera pola wektorowe, potrzebna jest prawidłowa definicja wektoryzatora, aby silnik wektoryzacyjny mógł wektoryzować zapytania. W przeciwnym razie pola wektorów są ignorowane.
Aby uzyskać więcej informacji, zobacz Tworzenie indeksu na potrzeby odwoływania agentowego.
Pobieranie wyników usługi Stream (wersja zapoznawcza)
Począwszy od wersji interfejsu 2026-08-01-preview API, możesz odbierać wyniki jako strumień zdarzeń wysyłanych przez serwer (SSE) zamiast czekać na jedną odpowiedź JSON. Za pomocą przesyłania strumieniowego klient może wyświetlać planowanie zapytań, aktywność źródłową i syntetyzowaną odpowiedź lub wyodrębniać odpowiedź w tej kolejności, gdy każda część stanie się dostępna.
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}");
}
Dokumentacja: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}")
Dokumentacja:KnowledgeBaseRetrievalClient
Aby włączyć tryb strumieniowy, dołącz nagłówek Accept: text/event-stream do żądania pobrania. Bez tego nagłówka akcja pobierania zwraca standardową odpowiedź 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
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Cykl życia zdarzenia
Zamiast zwracać jedną odpowiedź, usługa przechowuje jedno otwarte połączenie HTTP (typ text/event-stream; charset=utf-8zawartości ) i wysyła sekwencję zdarzeń, gdy dane staną się dostępne. Każde zdarzenie ma event: wiersz, który nazywa typ zdarzenia, data: wiersz z wartością JSON i pusty wiersz, który oznacza koniec zdarzenia.
Strumień, który zakończył się powodzeniem, przechodzi przez następujący cykl życia:
| Event | Moment wysłania | Co zawiera |
|---|---|---|
retrieval.started |
Pierwsze zdarzenie dla każdego przesyłanego strumieniowo żądania. | Identyfikator żądania, nazwa bazy wiedzy, tryb wyjścia oraz efektywny nakład na rozumowanie po uwzględnieniu przez usługę wartości domyślnych żądania i bazy wiedzy. Jeśli wartość efektywna kind to auto, zdarzenie zgłasza auto; nie przewiduje późniejszej eskalacji. |
activity.started |
Gdy usługa rozpoczyna planowanie zapytań, źródło lub działanie modelu. Przed ukończeniem wcześniejszego działania można rozpocząć wiele działań. | Działanie id, typegodzina rozpoczęcia i opcjonalna nazwa źródła wiedzy. |
activity.completed |
Gdy to działanie się zakończy. Powiąż je z odpowiednim activity.started zdarzeniem, dopasowując id. |
Ukończony rejestr aktywności. |
answer.completed |
Raz, tylko wtedy, gdy outputMode ma wartość answerSynthesis. |
messageIndex identyfikuje pozycję komunikatu w końcowej tablicy odpowiedzi i message zawiera pełną zsyntetyzowana odpowiedź. Nie ma zdarzenia różnicowego tokenu po tokenie. |
references.completed |
Po rozwiązaniu wszystkich odniesień. | Dane zdarzenia są pełną tablicą odwołań bez otoki obiektów. |
response.completed |
Końcowe zdarzenie pomyślnego lub częściowo pomyślnego strumienia. |
200 lub kod statusu 206 oraz pełna treść odpowiedzi żądania pobrania, która ma taką samą strukturę jak wywołanie JSON bez strumieniowania. Aby uzyskać informacje o tym, co oznacza każdy kod stanu, zobacz Rozwiązywanie problemów z akcją pobierania. |
error |
Zamiast references.completed i response.completed, gdy pobieranie nie powiedzie się po otwarciu strumienia. |
Błąd i wszystkie rekordy działań, które zostały ukończone przed awarią. |
Zdarzenia docierają we właściwej kolejności. Każde zdarzenie activity.started poprzedza zdarzenie activity.completed z tym samym id, ale działania mogą się przeplatać. Ukończone rekordy aktywności zawierają również znaczniki czasu startedAt i completedAt. Gdy strumień jest bezczynny, serwer wysyła : heartbeat komentarz co około 15 sekund, aby zachować otwarte połączenie. Klienci SSE mogą ignorować te komentarze.
W poniższym przykładzie przedstawiono odpowiedź strumieniową z ładunkami skróconymi do czytelności.
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":{}}
Obsługa błędów, anulowania i powrotu
Niepowodzenia wstępne: jeśli weryfikacja żądania nie powiedzie się przed otwarciem strumienia, na przykład w przypadku źle sformułowanej treści żądania, akcja pobierania zwraca standardową odpowiedź o błędzie JSON i nigdy nie otwiera strumienia.
Błędy strumienia środkowego: jeśli pobieranie nie powiedzie się po otworzeniu strumienia, zdarzenie terminalu jest
errorzamiastreferences.completediresponse.completed. Zdarzenie może zawierać wszystkie rekordy aktywności, które zostały ukończone przed awarią. Kod stanu HTTP pozostaje200po rozpoczęciu strumienia, więc aby ustalić, czy operacja się powiodła, sprawdź zdarzenie końcowe, a nie kod stanu HTTP.Anulowanie lub rozłączenie: jeśli klient anuluje żądanie lub rozłącza się przed zakończeniem strumienia, usługa anuluje pobieranie i kończy strumień bez zdarzenia terminalu. Traktuj wszystkie zdarzenia odebrane przed anulowaniem lub rozłączeniem jako niekompletne.
Awaryjna odpowiedź JSON: W przypadku
2026-08-01-preview, brakujący nagłówekAcceptlub wartość taka jakapplication/json,*/*,text/*lubtext/event-stream;q=0powoduje zwrócenie standardowej odpowiedzi JSON opisanej w sekcji Sprawdzanie odpowiedzi. Żądanietext/event-streamprzy użyciu wcześniejszej wersji interfejsu API zwraca wartość406 Not Acceptable.
Filtrowanie źródeł wiedzy indeksu wyszukiwania w czasie wykonywania zapytań
Podczas pobierania ze źródła wiedzy indeksu wyszukiwania można zastosować filtr OData w czasie zapytania, aby zawęzić wyniki do określonych dokumentów lub pól. Wyrażenie filtru używa składni OData i jest przekazywane za pośrednictwem parametru filterAddOn .
Składnia filtru i przykłady
Parametr filterAddOn akceptuje wyrażenia filtru OData. Przykładowe wzorce obejmują:
-
Pola metadanych:
city eq 'Phoenix',status eq 'active' -
Zakresy dat:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
Zakresy liczbowe:
price ge 100 and price le 5000 -
Dopasowywanie tekstu:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
Operatory logiczne:
(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'"
}
]
}
Przykład filtra wielokrotnego
Możesz połączyć wiele filtrów, aby bardziej uściślić wyniki.
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"
}
Nadpisywanie wskazówek przechowywanego zapytania w czasie wykonywania zapytania (wersja zapoznawcza)
Od wersji interfejsu API 2026-08-01-preview można nadpisać wskazówki zapytania przechowywane w źródle wiedzy indeksu wyszukiwania na potrzeby pojedynczego żądania pobrania, ustawiając queryHintOverrides w jego wpisie knowledgeSourceParams.
Nadpisanie zastępuje cały przechowywany obiekt queryHints, zamiast scalać go wpis po wpisie, dlatego uwzględnij wszystkie wskazówki, które chcesz zastosować. Pomiń queryHintOverrides, aby użyć zapisanych wskazówek.
Gdy wysiłek wnioskowania przy pobieraniu nie jest minimal, odpowiedź HTTP 400 zależy od zapisanych wskazówek filtru, a nie od zawartości zastąpienia ani typu wzmocnienia. Usługa weryfikuje przechowywane wskazówki filtru względem modelu bazy wiedzy przed zastosowaniem queryHintOverrides. W związku z tym model z rodziny GPT-4o lub GPT-4.1 odrzuca żądanie nawet wtedy, gdy nadpisanie jest puste lub zawiera tylko boosty. Same przechowywane wzmocnienia nie uruchamiają tej walidacji. Najpierw użyj zgodnego modelu lub usuń zapisane wskazówki filtru.
Poniższy przykład zastępuje wszystkie zapisane podpowiedzi jednym wzmocnieniem fieldValue dla treści w języku japońskim. Usługa nie stosuje do tego żądania żadnego zapisanego filtru ani innego zapisanego wzmocnienia.
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);
Dokumentacja: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)
Dokumentacja: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
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Aby potwierdzić, że usługa uwzględniła Twoje nadpisanie, ustaw includeActivity w żądaniu i sprawdź zwróconą aktywność searchIndex. Jego obiekt queryHintProcessing informuje o tym, co wygenerował model. W tym przykładzie występuje generatedBoost dla wzmocnienia języka, ale nie generatedFilter, ponieważ nadpisanie zastąpiło zapisaną wskazówkę filtra. Ponieważ wskazówki dotyczące zapytań są najlepszym rozwiązaniem, należy traktować to działanie jako potwierdzenie, a nie sprawdzać dokładnego wyrażenia.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Aby uzyskać informacje o przechowywanej definicji, obsługiwanych typach wskazówek i kompozycji z filtrami deterministycznymi, zobacz Konfigurowanie wskazówek dotyczących zapytań (wersja zapoznawcza) .
Wymuszanie uprawnień podczas wykonywania zapytania (wersja zapoznawcza)
Zmiany uprawnień dostępu ustawionych poza 2026-08-01-preview mogą pojawić się z opóźnieniem w wynikach pobierania w 2026-08-01-preview.
Jeśli źródła wiedzy zawierają zawartość chronioną uprawnieniami, przekaż tożsamość użytkownika końcowego w żądaniu pobierania, aby każdy użytkownik widział tylko zawartość, do której ma dostęp. W przypadku indeksowanych źródeł mechanizm pobierania używa tego identyfikatora do filtrowania wyników, a jeśli zostanie on pominięty, zwraca wyniki bez filtrowania. Źródła zdalne używają również autoryzacji z żądania pobierania, ale wymuszają uprawnienia w źródle i mogą wymagać tokenu i nagłówka specyficznego dla źródła.
Wymuszanie uprawnień ma dwie części:
Czas pozyskiwania: w przypadku tylko indeksowanych źródeł wiedzy ustaw opcję
ingestionPermissionOptionspozyskiwania metadanych uprawnień obok zawartości.Czas zapytania: przekaż autoryzację użytkownika w nagłówku wymaganym przez źródło wiedzy. Większość źródeł używa metody
x-ms-query-source-authorization. Wyjątkiem jest Work IQ, które używax-ms-query-work-iq-source-authorization.
Konfiguracja czasu pozyskiwania
W poniższej tabeli przedstawiono, które źródła wiedzy wymagają konfiguracji w czasie pozyskiwania i w jaki sposób każde źródło egzekwuje uprawnienia.
| Źródło wiedzy | Wymaga ingestionPermissionOptions |
Jak są egzekwowane uprawnienia |
|---|---|---|
| Blob lub ADLS Gen2 | ✅ | Zaimportowane zakresy RBAC, listy ACL lub elementy Microsoft Purview dopasowane do tożsamości użytkownika. |
| OneLake | ✅ | Pozyskany dokument dopasowany do etykiet poufności Microsoft Purview na podstawie tożsamości użytkownika. |
| Zindeksowany SharePoint | ✅ | Zaimportowane listy ACL programu SharePoint lub etykiety poufności Microsoft Purview porównane z tożsamością użytkownika. |
| Zdalny program SharePoint | ❌ | Copilot wysyła zapytania do interfejsu API pobierania bezpośrednio przy użyciu tokenu użytkownika SharePoint. |
| Agent danych Fabric | ❌ | Mechanizm pobierania wymienia token użytkownika na token o zakresie Microsoft Fabric i odpytuje agenta danych w jego imieniu. |
| Fabric Ontology | ❌ | Silnik pobierania wymienia token użytkownika na token z zakresem Microsoft Fabric i wysyła zapytanie dotyczące elementu ontologii w imieniu użytkownika. |
| Inteligencja Pracy | ❌ | Mechanizm pobierania wymienia asercję użytkownika dla odbiorcy aplikacji z x-ms-query-work-iq-source-authorization na token o zakresie Work IQ. |
Jeśli nie skonfigurujesz ingestionPermissionOptions podczas tworzenia indeksowanego źródła wiedzy, indeks nie zawiera metadanych uprawnień. System zwraca wyniki niefiltrowane, niezależnie od nagłówka. Aby rozwiązać ten problem, utwórz ponownie źródło wiedzy przy użyciu odpowiednich ingestionPermissionOptions wartości.
Autoryzacja w czasie wykonywania zapytań
W przypadku źródeł wiedzy innych niż Work IQ przekaż tożsamość użytkownika końcowego, dołączając do żądania retrieve token dostępu ograniczony do zakresu https://search.azure.com/.default. Ten token jest oddzielony od poświadczeń usługi używanych do uzyskiwania dostępu do usługi wyszukiwania. Nie wymaga uprawnień usługi wyszukiwania i reprezentuje tylko użytkownika, którego dostęp do zawartości jest oceniany. Aby uzyskać więcej informacji, zobacz Egzekwowanie ACL czasu zapytań i RBAC.
W przypadku źródeł wiedzy Work IQ ta sekcja nie dotyczy. Użyj przepływu asercji użytkownika specyficznego dla Work IQ, opisanego w sekcji Wymuszanie uprawnień podczas wykonywania zapytania.
W zestawie SDK .NET przekaż token jako parametr querySourceAuthorization na 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);
Dokumentacja:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
W zestawie SDK Python przekaż token jako parametr query_source_authorization na 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)
Dokumentacja:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
W interfejsie API REST dołącz nagłówek x-ms-query-source-authorization z tokenem dostępu użytkownika;
@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?"
}
]
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Przejrzyj odpowiedź
Akcja pobierania zwraca trzy główne składniki:
- Wyodrębniona odpowiedź lub syntezowana odpowiedź (wersja zapoznawcza) ( w zależności od trybu danych wyjściowych)
- Tablica działań
- Tablica odwołań
Wyodrębniona odpowiedź
Wyodrębniona odpowiedź to pojedynczy, ujednolicony ciąg znaków, który zazwyczaj jest przekazywany do modelu LLM. Model LLM przetwarza ciąg jako dane referencyjne i wykorzystuje go do sformułowania odpowiedzi. Twoje wywołanie API do LLM zawiera ujednolicony ciąg znaków oraz instrukcje dla modelu, na przykład dotyczące użycia źródła informacji wyłącznie lub jako uzupełnienie.
Treść odpowiedzi jest ustrukturyzowana w formacie stylu wiadomości czatu, a zawartość jest serializowana w formacie 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>\"}]"
}
]
}
]
Kluczowe punkty:
content.typema jedną prawidłową wartość:text.content.textjest ciągiem zakodowanym w formacie JSON zawierającym najbardziej odpowiednie dokumenty (lub fragmenty) znalezione w indeksie wyszukiwania, biorąc pod uwagę dane wejściowe historii zapytań i czatów. Ten ciąg to dane bazowe, które model LLM wykorzystuje do sformułowania odpowiedzi na pytanie użytkownika.Ta część odpowiedzi składa się z 200 fragmentów lub mniej, z wyłączeniem wszystkich wyników, które nie spełniają minimalnego progu wyniku 2,5 rankingu.
Ciąg rozpoczyna się od identyfikatora odwołania fragmentu (używanego do celów cytowania) oraz dowolnych pól określonych w semantycznej konfiguracji indeksu docelowego. W tym przykładzie przyjęto założenie, że konfiguracja semantyczna w indeksie docelowym ma pole "title", pole "terms" i pole "content".
Pobieranie odpowiedzi nie obejmuje
@search.rerankerBoostedScore.Właściwość
maxOutputSizeInTokens(maxOutputSizew2026-05-01-previewi nowszej) w żądaniu pobierania określa długość ciągu.- Dokument, który przekracza
maxOutputSizeInTokensbudżet wyjściowy, można pominąć z odpowiedzi. Tablica działań zawiera ostrzeżenie, gdy najbardziej odpowiedni dokument przekracza maksymalny rozmiar danych wyjściowych. Aby zachować więcej zawartości, zwiększ wartośćmaxOutputSizeInTokens. Aby uzyskać więcej informacji, zobacz Puste odpowiedzi.
- Dokument, który przekracza
Tablica działań
Tablica działań generuje plan zapytania, który zapewnia przejrzystość operacyjną na potrzeby śledzenia operacji, implikacji rozliczeń i wywołań zasobów. Zawiera również podzapytania wysyłane do potoku wyszukiwania. W przypadku odpowiedzi 206 Partial Content tablica zawiera błędy dotyczące źródeł wiedzy, dla których wystąpiło niepowodzenie. Odpowiedź 502 Bad Gateway może zawierać szczegóły niepowodzenia tylko w błędzie najwyższego poziomu.
Tablica działań zawiera następujące składniki:
| Sekcja | Opis |
|---|---|
| Działanie specyficzne dla źródła | Dla każdego źródła wiedzy zawartego w zapytaniu w tej sekcji raportuje się czas upływu oraz jakie argumenty zostały użyte w zapytaniu, w tym rangera semantycznego. Typy źródeł wiedzy obejmują searchIndex, azureBlobi inne obsługiwane źródła wiedzy. |
agenticReasoning |
W tej sekcji przedstawiono zużycie tokenów na potrzeby rozumowania agentowego podczas pobierania, które zależy od określonego wysiłku wnioskowania na potrzeby pobierania (wersja zapoznawcza). |
modelQueryPlanning |
W przypadku baz wiedzy korzystających z usługi LLM do planowania zapytań ta sekcja raportuje liczbę tokenów używaną do wprowadzania danych wejściowych i liczbę tokenów dla podzapytania. Zawiera pole model, które obejmuje pole modelName zawierające publiczną nazwę modelu, a nie nazwę wdrożenia, modelu, który uruchomił to działanie. |
modelAnswerSynthesis |
W przypadku baz wiedzy korzystających z syntezy odpowiedzi (wersja zapoznawcza) ta sekcja raportuje liczbę tokenów na potrzeby formułowania odpowiedzi i liczby tokenów danych wyjściowych odpowiedzi. Zawiera pole model, które obejmuje pole modelName zawierające publiczną nazwę modelu, a nie nazwę wdrożenia, modelu, który uruchomił to działanie. |
modelWebSummarization |
W przypadku baz wiedzy korzystających z funkcji podsumowywania treści z internetu w tej sekcji podano informacje o zużyciu tokenów na potrzeby podsumowywania wyników z internetu. Zawiera pole model, które obejmuje pole modelName zawierające publiczną nazwę modelu, a nie nazwę wdrożenia, modelu, który uruchomił to działanie. |
model |
W przypadku rekordów działań opartych na modelu ta sekcja identyfikuje model używany do wykonywania działania. Ta sekcja jest wyświetlana tylko wtedy, gdy ustawiono wartość includeActivitytrue. |
imageServing |
W przypadku źródeł wiedzy z włączoną obsługą obrazów (wersja zapoznawcza) w tej sekcji są raportowane imagesRetrieved, imagesSentToModel, totalImageSizeBytes oraz to, czy podczas indeksowania włączono verbalizationUsed. Sprawdź verbalizationUsed i imagesSentToModel niezależnie. Odpowiedź może raportować verbalizationUsed jako true i nadal wysyłać obrazy do modelu niższego szczebla. Aby znaleźć liczbę pominiętych obrazów, odejmij imagesSentToModel od imagesRetrieved. |
W poniższym przykładzie przedstawiono tablicę działań.
"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
}
]
Tablica odwołań
Tablica odwołań pochodzi bezpośrednio z podstawowych danych bazowych. Zawiera sourceData, który jest używany do generowania odpowiedzi i składa się z każdego dokumentu, który silnik pobierania agenta znajduje i ocenia semantycznie.
Tablica odwołań zawiera następujące składniki:
| Pole | Opis |
|---|---|
type |
Typ źródła wiedzy, który wygenerował odwołanie, na przykład searchIndex. |
id |
Identyfikator referencyjny elementu w obrębie odpowiedzi. Nie jest to klucz dokumentu w indeksie wyszukiwania. Użyj go, aby podać cytaty. |
activitySource |
Odwołuje się krzyżowo do id wpisu działania, który wygenerował odwołanie, co jest przydatne w przypadku łączenia cytatów. |
docKey |
Dla odniesienia indeksowanego — klucz dokumentu w bazowym indeksie wyszukiwania. |
sourceData |
Dane uziemienia używane do generowania odpowiedzi. W przypadku odwołania indeksowanego pola mogą zawierać element id oraz pola semantyczne, takie jak title, terms i content. Kształt różni się w zależności od typu odwołania. |
citationUrl (wersja zapoznawcza) |
Wygenerowany przez usługę adres URL tylko do odczytu, który prowadzi do dokumentu referencji w indeksie źródłowym. Zwracane tylko dla indeksowanych źródeł wiedzy. Aby postępować zgodnie z adresem URL, zobacz Wyszukiwanie dokumentów przy użyciu adresów URL cytatów (wersja zapoznawcza). |
W poniższym przykładzie przedstawiono tablicę odwołań.
"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
}
]
Wyszukiwanie dokumentów przy użyciu adresów URL cytatów (wersja zapoznawcza)
Począwszy od wersji interfejsu 2026-08-01-preview API, odwołanie ze indeksowanego źródła wiedzy może zawierać element citationUrl w odpowiedzi pobierania. Użyj tego adresu URL, aby pobrać indeksowane pola dla tego odwołania, takie jak title i content, aby można było renderować podgląd cytatów pokazujący, skąd pochodzi odpowiedź bez otwierania oryginalnego dokumentu źródłowego.
citationUrl to uwierzytelnione wyszukiwanie w indeksie bazowym, oddzielne od źródłowych docUrl i blobUrl.
W poniższym przykładzie przedstawiono adres URL oczyszczonej cytatu.
"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"
Wybrane pola i ich kolejność zależą od konfiguracji indeksowanego źródła i pobierania.
Ważne
Użyj pełnego adresu URL z odpowiedzi dokładnie w takiej postaci, w jakiej został zwrócony, i wyświetl w aplikacji zwrócone pola JSON. Nie konstruuj, analizuj ani nie normalizuj adresu URL.
Biorąc pod uwagę adres URL cytatu, w poniższych przykładach uzyskasz token dostępu dla usługi wyszukiwania. Wywołują adres URL z tym tokenem w nagłówku Authorization. Tożsamość zalogowana wymaga roli Czytelnik danych indeksu wyszukiwania .
Wyszukiwanie AI platformy Azure metody wyszukiwania dokumentów zestawu SDK wymagają punktu końcowego, nazwy indeksu, klucza dokumentu, wybranych pól i wersji interfejsu API jako oddzielnych danych wejściowych. Nie akceptują bezwzględnego adresu URL cytatu. W tych przykładach użyto uwierzytelnionego żądania HTTP GET, aby zachować pełny adres URL wygenerowany przez usługę.
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);
Odwołanie: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))
Odwołanie:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Dokumentacja:Dokumenty — Pobierz
Wyszukiwanie dokumentu zwraca wybrane pola indeksu jako dane 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"
}
Podczas korzystania z adresu URL cytatu należy pamiętać o następujących kwestiach:
Sprawdź, czy istnieje
citationUrl, zanim wyrenderujesz cytat. Może nie występować, jeśli odpowiedź pomija referencje lub usługa nie może ustalić indeksu bazowego albo klucza dokumentu.Jeśli żądanie pobrania zawiera
x-ms-query-source-authorizationdla kontroli dostępu na poziomie dokumentu, użyj tego samego tokenu użytkownika podczas otwierania tego adresu URL.Adres URL pozostaje prawidłowy tylko wtedy, gdy indeks kopii zapasowej i klucz dokumentu pozostają niezmienione.
Sprawdź metadane etykiety poufności w odpowiedzi (wersja zapoznawcza)
Obowiązuje tu to samo opóźnienie opisane w temacie Wymuszanie uprawnień podczas wykonywania zapytania: zmiany uprawnień dostępu ustawione poza 2026-08-01-preview mogą pojawić się w odpowiedziach pobierania 2026-08-01-preview dopiero po pewnym czasie.
Gdy wysyłasz zapytanie do bazy wiedzy, która importuje etykiety poufności Microsoft Purview, odpowiedź pobierania zawiera metadane etykiet na dwóch poziomach:
| Lokalizacja | Pole | Opis |
|---|---|---|
| Zgodnie z odniesieniem | sensitivityLabelInfo |
Etykieta poufności przypisana do każdego dokumentu zwróconego w tablicy references. |
| Odpowiedź | metadata.responseSensitivityLabelInfo |
Zbiorcza etykieta reprezentująca etykietę poufności o najwyższym priorytecie spośród wszystkich dokumentów, do których odwołano się w odpowiedzi. Przydatne w przypadku banerów wyświetlanych po stronie klienta i egzekwowania zasad. |
Microsoft Graph oblicza etykietę dla poziomu odpowiedzi na podstawie etykiet poszczególnych odwołań, używając reguł dziedziczenia etykiet platformy Microsoft Purview. Zazwyczaj najbardziej restrykcyjna etykieta wygrywa.
Poniższy przykład przedstawia odpowiedź operacji pobierania z dwoma dokumentami, do których się odwołano (jeden Confidential, jeden Internal), oraz wynikową etykietę na poziomie odpowiedzi.
{
"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
}
}
}
Typy referencyjne, które wyświetlają etykiety poufności
Nazwa pola i dostępność metadanych etykiety zależą od typu źródła wiedzy, który wygenerował każde odwołanie.
Odwołanie type |
Pole etykiety | Dostępne, gdy... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
Źródło wiedzy obiektu blob zawiera element sensitivityLabel .ingestionPermissionOptions |
indexedOneLake |
sensitivityLabelInfo |
Źródło wiedzy OneLake obejmuje sensitivityLabel w ingestionPermissionOptions. |
indexedSharePoint |
sensitivityLabelInfo |
Źródło wiedzy indeksowane przez SharePoint zawiera sensitivityLabel w ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
Indeks bazowy ma dla purviewEnabled ustawioną wartość true oraz pole oznaczone jako sensitivityLabel: true. |
Wyświetlanie i kontrolowanie zaleceń
Użyj
sensitivityLabelInfo.labelId, aby wyszukać pełną definicję etykiety za pośrednictwem interfejsu API etykiet poufności Microsoft Graph gdy potrzebujesz dodatkowych właściwości, takich jak kontrolki zasad lub uprawnienia.Użyj
metadata.responseSensitivityLabelInfo, aby wyświetlić baner poufności na poziomie odpowiedzi lub zastosować mechanizmy zasad, takie jak wyłączenie kopiowania i udostępniania dla całej odpowiedzi.Jeśli źródło wiedzy wskazuje na indeks podzielony na fragmenty, na przykład indeks wypełniony za pomocą zintegrowanej wektoryzacji lub niestandardowej umiejętności Text Split, upewnij się, że zestaw umiejętności rzutuje etykietę poufności na każdy wiersz fragmentu. Bez tego mapowania odwołania na poziomie fragmentu nie są poprawnie filtrowane w czasie zapytania.
Aby uzyskać podlegający inspekcji administracyjny dostęp do odczytu zawartości oznaczonej etykietami, zobacz Podwyższony dostęp do odczytu na potrzeby dochodzeń administracyjnych.
Zachowanie serwera MCP
Punkt końcowy MCP uwidoczniony przez każdą bazę wiedzy zawiera te same pola etykiet poufności co interfejs API REST. Gdy klient zgodny z MCP wywołuje narzędzie knowledge_base_retrieve, wynik narzędzia zawiera te same elementy sensitivityLabelInfo dla każdego odwołania oraz elementy metadata.responseSensitivityLabelInfo na poziomie odpowiedzi, opisane wcześniej w tej sekcji. Klienci MCP wymuszają mechanizmy sterowania wyświetlaniem i zasadami uwzględniające etykiety na podstawie tych pól.
Pobieranie przykładów akcji (wersja zapoznawcza)
W poniższych przykładach pokazano różne sposoby wywoływania akcji pobierania przy użyciu wersji interfejsu 2026-08-01-preview API. Ta wersja obsługuje pełny zestaw funkcji, w tym syntezę odpowiedzi i konfigurowalny wysiłek rozumowania. Aby uzyskać informacje o 2026-04-01 użyciu, zobacz poprzednie sekcje.
- Inspekcja nazw modeli w dziennikach aktywności
- Wymagaj, aby źródło wiedzy powiodło się
- Wykluczanie źródła wiedzy z żądania
- Dostosuj dokumenty kandydackie dla każdego źródła wiedzy
- Ogranicz końcowe dokumenty źródłowe
- Sprawdź, czy baza wiedzy pobiera wartości domyślne
- Zastąpij domyślne wysiłki dotyczące rozumowania i ustaw limity żądań
- Pozwól usłudze wybrać nakład pracy rozumowania
- Ustawianie odwołań dla każdego źródła wiedzy
- Korzystanie z minimalnego nakładu pracy rozumowania
Sprawdź nazwy modeli w dziennikach aktywności
Ustaw includeActivity na true, aby zwracać pola identyfikacyjne modelu w rekordach aktywności opartych na modelach. Użyj tych pól, aby potwierdzić, który skonfigurowany model obsłużył planowanie zapytań, syntezę odpowiedzi lub podsumowanie internetowe podczas żądania pobierania. Poniższy przykład zastępuje przetwarzanie zapisanych wyników dla wybranego źródła w żądaniu.
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}");
}
}
Dokumentacja: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,
)
Dokumentacja: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"
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Poniższy fragment odpowiedzi przedstawia tożsamość zagnieżdżonego modelu:
{
"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
}
]
}
Wymagaj, aby źródło wiedzy powiodło się
Ustaw failOnError w knowledgeSourceParams, aby oznaczyć źródło wiedzy jako wymagane. Użyj tego parametru, gdy częściowa odpowiedź byłaby myląca lub niezgodna, jeśli źródło jest niedostępne. Żądanie zwraca 502 Bad Gateway wartość, jeśli wymagane źródło zakończy się niepowodzeniem, nawet jeśli inne źródło powiedzie się. Aby uzyskać wskazówki dotyczące obsługi, zobacz Rozwiązywanie problemów z akcją pobierania.
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);
Reference: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)
Reference: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"
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Wyklucz źródło wiedzy z żądania
Począwszy od wersji interfejsu 2026-08-01-preview API, ustaw wartość neverQuerySource na true dla każdego źródła wiedzy, które chcesz wykluczyć z żądania pobierania. W czasie żądania wartość neverQuerySource zastępuje zapisaną wartość alwaysQuerySource dla tego żądania bez zmiany zapisanej wartości.
Poniższy przykład wysyła zapytanie do bazy wiedzy zawierającej product-docs-ks i troubleshooting-ks, z wyłączeniem elementu troubleshooting-ks z żądania.
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);
Reference: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)
Reference: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
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Dostosuj dokumenty kandydujące dla każdego źródła wiedzy
Ustaw wartość maxOutputDocuments w knowledgeSourceParams, aby ograniczyć liczbę kandydujących dokumentów pochodzących z określonego źródła wiedzy przed ostatecznym wyborem wyników. Użyj tego parametru, jeśli chcesz powiązać dane wejściowe jednego źródła z potokiem bez wpływu na inne.
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);
Reference: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)
Reference: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
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Ogranicz końcowe dokumenty źródłowe
Parametr najwyższego poziomu maxOutputDocuments ogranicza liczbę dokumentów źródłowych zwracanych w końcowej odpowiedzi operacji pobierania. Użyj tego parametru, gdy aplikacja potrzebuje przewidywalnej cytatu lub liczby odwołań.
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);
Dokumentacja: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)
Dokumentacja: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
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Poniższa tabela przedstawia, jak maxOutputDocuments i maxOutputSizeInTokens oddziałują we wszystkich czterech kombinacjach.
maxOutputDocuments |
maxOutputSizeInTokens |
Behavior |
|---|---|---|
| Nieokreślony | Nieokreślony | Używa domyślnego maxOutputSizeInTokens zachowania limitu odpowiedzi. |
| Nieokreślony | Określone | Odrzuca dokumenty po osiągnięciu limitu rozmiaru ładunku. |
| Określone | Nieokreślony | Zwraca maksymalnie określoną liczbę dokumentów źródłowych i nie stosuje ograniczenia maxOutputSizeInTokens. |
| Określone | Określone | Zwraca maksymalnie maxOutputDocuments dokumentów lub tyle dokumentów, ile mieści się w limicie maxOutputSizeInTokens, w zależności od tego, który z tych limitów zostanie osiągnięty jako pierwszy. |
Sprawdź, czy baza wiedzy pobiera wartości domyślne
Baza wiedzy może przechowywać domyślne wartości dla całego żądania w retrieveDefaults. Wyślij dwa żądania pobrania, aby sprawdzić dziedziczenie oraz przesłonięcia specyficzne dla żądania.
Przed rozpoczęciem ukończ konfigurowanie domyślnych limitów pobierania (wersja zapoznawcza). Pierwsze żądanie pomija wszystkie trzy limity obowiązujące dla całego żądania, więc obowiązują zapisane wartości: 45 sekund, osiem dokumentów i 12 000 tokenów. Drugie żądanie zastępuje je 20 sekund, jeden dokument i 5000 tokenów.
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");
Dokumentacja: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")
Dokumentacja:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Najpierw wyślij żądanie, które pomija trzy pola limitu dla całego żądania.
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."
}
]
}
Następnie zastąp wszystkie trzy wartości w jednym żądaniu.
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
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Liczba odwołań pokazuje, czy ma zastosowanie przechowywana wartość lub wartość na poziomie maxOutputDocuments żądania: pierwsza odpowiedź zawiera co najwyżej osiem odwołań, a druga zawiera co najwyżej jedną. Odpowiedź może zawierać mniej referencji, gdy pasuje mniej dokumentów. Odpowiedź nie zgłasza efektywnego środowiska uruchomieniowego ani budżetu tokenu wyjściowego, ale te wartości nadal zarządzają przetwarzaniem żądań. Nadpisania żądań nie zmieniają zapisanych ustawień domyślnych.
Zastąpij domyślne wysiłki dotyczące rozumowania i ustaw limity żądań
Poniższy przykład określa parametr syntezy odpowiedzi, więc nakład rozumowania dla wyszukiwania musi być ustawiony na low lub medium. Ustawia również maxRuntimeInSeconds, aby ograniczyć czas trwania pobierania, oraz maxOutputSizeInTokens, aby ograniczyć rozmiar danych odpowiedzi.
maxRuntimeInSeconds akceptuje wartości z zakresu od 10 do 600 sekund i domyślnie do 90 sekund. Maksymalny czas 600 sekund (10 minut) ma zastosowanie wyłącznie do żądania pobierania w usłudze Wyszukiwanie AI platformy 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
);
Dokumentacja: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)
Dokumentacja: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
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Pozwól usłudze wybrać nakład pracy rozumowania
Ustaw wartość retrievalReasoningEffort.kind na auto w żądaniu pobrania, aby zastąpić wartość domyślną bazy wiedzy. Aby uzyskać więcej informacji na temat automatycznego wnioskowania, zobacz temat Ustaw poziom wysiłku wnioskowania dla pobierania (wersja zapoznawcza).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Ustawianie odwołań dla każdego źródła wiedzy
Użyj includeReferences i includeReferenceSourceData w knowledgeSourceParams, aby kontrolować, które źródła pojawiają się w tablicy referencji i ile danych źródłowych zawiera każdy wpis. W poniższym przykładzie użyto domyślnego wysiłku rozumowania bazy wiedzy.
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
);
Dokumentacja: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)
Dokumentacja: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
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Korzystanie z minimalnego nakładu pracy rozumowania
W poniższym przykładzie nie ma funkcji LLM do inteligentnego planowania zapytań ani syntezy odpowiedzi. Ciąg zapytania jest przekazywany do silnika wyszukiwania agentycznego w celu wyszukiwania słów kluczowych lub wyszukiwania hybrydowego.
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
);
Dokumentacja: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)
Dokumentacja: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"
}
]
}
Referencja:Odzyskiwanie wiedzy - Pobieranie
Rozwiąż problemy z akcją pobierania
W 2026-08-01-preview stan odpowiedzi określa, czy pobieranie zakończyło się powodzeniem, częściowym powodzeniem czy niepowodzeniem, oraz co należy zrobić dalej. Poniższa tabela zawiera mapowanie każdego stanu na jego znaczenie, a następnie zapoznaj się z odpowiednią sekcją, aby uzyskać wskazówki dotyczące rozwiązywania problemów.
| Status | Meaning |
|---|---|
200 OK |
Pobieranie powiodło się. Nadal można pominąć dokument, jeśli jego zawartość przekracza budżet wyjściowy. Aby uzyskać więcej informacji, zobacz Puste odpowiedzi. |
400 Bad Request |
Żądanie pobrania nie przeszło walidacji przed rozpoczęciem pobierania. |
206 Partial Content |
Co najmniej jedno źródło powiodło się i nie oznaczono źródła zakończonego niepowodzeniem failOnError. Odpowiedź zawiera wyniki ze źródeł, które powiodły się. |
502 Bad Gateway |
Każde wybrane źródło nie powiodło się lub źródło oznaczone failOnError: true nie powiodło się. |
W przypadku każdej odpowiedzi innej niż 200 zarejestruj wersję interfejsu API, znacznik czasu, oczyszczoną treść żądania, nagłówki odpowiedzi oraz identyfikator żądania lub identyfikator korelacji. Te szczegóły ułatwiają diagnozowanie awarii i udostępnianie problemu pomocy technicznej w razie potrzeby.
400 Bad Request
Użyj błędu najwyższego poziomu, aby zidentyfikować nieprawidłową właściwość żądania. Typowe przyczyny:
- Element
knowledgeSourceNameinknowledgeSourceParamsnie jest dołączony do bazy wiedzy lubkindnie jest zgodny z dołączonym źródłem. - Wartość żądania znajduje się poza obsługiwanym zakresem lub jedna opcja wymaga innej opcji, która nie jest włączona. Na przykład
includeReferenceSourceDatawymagaincludeReferences. -
retrievalReasoningEffort.kindtoauto, ale żądanie używa wersji interfejsu API starszej niż2026-08-01-preview. - Żądanie używa wartości
auto,lowlubmedium, ale baza wiedzy nie definiuje modelu. - W przypadku wykluczania źródeł w czasie żądania (wersja zapoznawcza) ten sam wpis ustawia zarówno
alwaysQuerySource, jak ineverQuerySourcenatrue, albo wszystkie dołączone źródła wiedzy zostają wykluczone.
Przed ponowieniu próby żądania popraw właściwość zidentyfikowaną przez błąd najwyższego poziomu.
206 Partial Content
Sprawdź każdy activity wpis zawierający element error. Działanie pobierania źródła identyfikuje nieudane źródło wiedzy, a działanie modelu identyfikuje etap przetwarzania, który zakończył się niepowodzeniem. Treść odpowiedzi nadal zawiera wyniki, które zakończyły się pomyślnie.
W przypadku błędów działań pobierania źródła typowe przyczyny to:
- Nieprawidłowe dane wejściowe podawane w czasie wykonywania zapytania, takie jak nieprawidłowo sformułowane wyrażenie
filterAddOn. - Dryf konfiguracji źródła wiedzy lub indeksu, taki jak pole o zmienionej nazwie, brak konfiguracji semantycznej lub nieprawidłowy wektoryzator.
- Brakuje autoryzacji zależności albo jest ona nieprawidłowa lub tożsamość używana do odpytywania źródła ma niewystarczające uprawnienia.
- Ograniczanie zależności, przekroczenie limitu czasu lub przejściowe błędy dostępności.
W przypadku błędu działania modelu użyj działania type , aby zidentyfikować etap przetwarzania, który zakończył się niepowodzeniem. Na przykład błąd wskazuje, modelWebSummarization że podsumowanie wyników internetowych nie powiodło się.
Jeśli aplikacja zezwala na częściowe wyniki, przetwórz pomyślne wyniki i zarejestruj poszczególne zakończone niepowodzeniem źródło lub etap modelu. Popraw konfigurację, autoryzację i błędy uprawnień przed ponowieniem próby. W przypadku dławienia, przekroczenia limitu czasu lub przejściowych problemów z dostępnością stosuj ograniczoną liczbę ponowień z narastającym opóźnieniem.
Jeśli wyniki są niebezpieczne bez określonego źródła, a typ tego źródła obsługuje alwaysQuerySource, ustaw zarówno alwaysQuerySource, jak i failOnError. Pierwsza opcja gwarantuje, że źródło zostanie wybrane, a druga zwraca twardy błąd, jeśli wykonanie zapytania do niego się nie powiedzie.
Źródła wiedzy serwera MCP (wersja zapoznawcza) nie obsługują alwaysQuerySource; w przypadku tych źródeł failOnError ma zastosowanie tylko wtedy, gdy źródło jest wybrane.
failOnError nie ma zastosowania do błędów działań modelu.
502 Bad Gateway
Błąd na najwyższym poziomie opisuje jedną z dwóch ścieżek krytycznej awarii:
- Każde wybrane źródło nie powiodło się: Każde wybrane źródło zwróciło błąd. Źródło, które zakończyło się pomyślnie, mimo że nie znaleziono żadnych pasujących dokumentów, nie jest źródłem, które zakończyło się niepowodzeniem. Sprawdź każdą awarię źródła pod kątem problemu z konfiguracją udostępnioną, autoryzacją, zależnością lub dostępnością.
-
Źródło
failOnErrornie powiodło się: nie można wykonać zapytania o wymagane źródło. Inne źródła mogły zadziałać poprawnie, ale usługa nie zwraca wyniku częściowego, ponieważ operacja na wymaganym źródle zakończyła się niepowodzeniem.
Podstawowe awarie źródła są zazwyczaj tego samego rodzaju, co opisane dla 206 Partial Content: nieprawidłowe dane wejściowe specyficzne dla źródła, rozbieżność konfiguracji źródła lub indeksu, autoryzacja zależności albo problemy z uprawnieniami, dławienie, przekroczenie limitu czasu lub przejściowa niedostępność zależności.
Odpowiedź typu hard 502 może pomijać tablicę activity i podawać nazwę źródła oraz przyczynę bazową błędu wyłącznie w komunikacie błędu najwyższego poziomu. Popraw konfigurację, autoryzację i błędy uprawnień przed ponowieniem próby. Użyj ograniczonych ponownych prób z wycofywaniem tylko w przypadku ograniczania przepustowości, przekroczenia limitu czasu lub przejściowych błędów dostępności. Nie traktuj odpowiedzi 502 Bad Gateway jako awarii usługi Wyszukiwanie AI platformy Azure bez zbadania źródłowej przyczyny awarii.
Puste odpowiedzi
Krok wyszukiwania może znaleźć dokument, ale usługa nadal może pominąć go w odpowiedzi końcowej, jeśli oparta na danych źródłowych treść tego dokumentu przekracza budżet wyjściowy maxOutputSizeInTokens (maxOutputSize w wersji 2026-05-01-preview i nowszych). W przypadku wystąpienia tego warunku tablica działań pokazuje, że znaleziono dopasowania, a rekord działania zawiera ostrzeżenie, że najbardziej odpowiedni dokument przekroczył maksymalny rozmiar danych wyjściowych. Tablica referencji i treść odpowiedzi opartej na źródłach są puste dla tego dokumentu. Aby zachować więcej zawartości, zwiększ wartość maxOutputSizeInTokens.
Aby uniknąć tego zachowania, indeksuj duże dokumenty źródłowe jako mniejsze fragmenty ze stabilnymi identyfikatorami i metadanymi źródłowymi. Dotyczy to szczególnie długich podręczników, zasad lub artykułów bazy wiedzy.
Wywoływanie punktu końcowego MCP
Warning
Implementacje MCP są podatne na zagrożenia, takie jak ataki, kaskadowe awarie i utrata nadzoru ludzkiego. Te zagrożenia można ograniczyć, sprawdzając serwery MCP pod kątem bezpieczeństwa i niezawodności, postępując zgodnie z zalecanymi praktykami firmy Microsoft i najlepszymi praktykami branżowymi, a także wdrażając mechanizmy akceptacji i monitorując zachowania kaskadowe.
MCP to otwarty protokół, który standandaryzuje sposób łączenia aplikacji sztucznej inteligencji z zewnętrznymi źródłami danych i narzędziami.
W Wyszukiwanie AI platformy Azure każda baza wiedzy jest autonomicznym serwerem MCP, który uwidacznia narzędzie knowledge_base_retrieve. Każdy klient zgodny z mcP, w tym Foundry Agent Service, GitHub Copilot, Claude i Cursor może wywołać to narzędzie do wykonywania zapytań względem bazy wiedzy.
Uwierzytelnij się w punkcie końcowym MCP
Każda baza wiedzy ma punkt końcowy MCP pod następującym adresem URL:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
Określona wersja interfejsu API określa, co zwraca połączenie. Korzystając z 2026-08-01-preview, baza wiedzy zwraca odpowiedzi syntetyczne, gdy bazowa baza wiedzy jest skonfigurowana z modelem LLM i zgodnym poziomem wnioskowania. Korzystając z 2026-04-01, pobieranie jest zawsze minimalne i oparte na wyodrębnianiu, a połączenie zwraca wyłącznie dane ugruntowujące.
Sposób uwierzytelniania w tym punkcie końcowym zależy od klienta MCP. Jeśli używasz interfejsu API Responses usługi Azure OpenAI z narzędziem MCP knowledge_base_retrieve, uwierzytelniasz zarówno wywołanie interfejsu API Responses do usługi Azure OpenAI, jak i żądanie MCP do usługi Wyszukiwanie AI platformy Azure. Jeśli klient MCP bezpośrednio wywołuje ten punkt końcowy, uwierzytelniasz się tylko w Wyszukiwanie AI platformy Azure.
W przypadku uwierzytelniania Wyszukiwanie AI platformy Azure użyj jednej z następujących metod:
-
Przekazywanie tokenu elementu nośnego w nagłówku
Authorization(zalecane) -
Przekaż klucz administratora w nagłówku
api-key
Uwaga
Klienci MCP konfigurują nagłówki niestandardowe inaczej. Na przykład usługa Foundry Agent Service wstrzykuje nagłówki za pośrednictwem połączeń projektu, podczas gdy klienci tacy jak GitHub Copilot wymagają nagłówków w kodzie JSON serwera MCP.
Używanie tokenu elementu nośnego do uwierzytelniania MCP
Zalecaną metodą uwierzytelniania MCP jest token elementu nośnego, który pozwala uniknąć przechowywania poufnych kluczy w plikach konfiguracji. Tożsamość za tokenem musi mieć przypisaną rolę Search Index Data Reader w usłudze wyszukiwania. Aby uzyskać więcej informacji, zobacz Łączenie aplikacji z Wyszukiwanie AI platformy Azure przy użyciu tożsamości.
#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());
Dokumentacja:korzystanie z interfejsu API odpowiedzi platformy OpenAI Azure
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)
Dokumentacja:korzystanie z interfejsu API odpowiedzi platformy OpenAI Azure
// This code snippet is currently unavailable.
Używanie klucza administracyjnego do uwierzytelniania MCP
Klucz administracyjny udziela pełnego dostępu do odczytu i zapisu w usłudze wyszukiwania, dlatego używaj go tylko w środowiskach deweloperskich lub gdy token elementu nośnego jest niedostępny. Aby uzyskać więcej informacji, zobacz Łączenie z Wyszukiwanie AI platformy Azure przy użyciu kluczy interfejsu API.
Wskazówka
W poniższym przykładzie pokazano tylko nagłówek, który różni się od przykładu tokenu elementu nośnego. Pełną konfigurację znajdziesz w sekcji Używanie tokenu Bearer do uwierzytelniania w 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)
);
Dokumentacja:korzystanie z interfejsu API odpowiedzi platformy OpenAI Azure
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",
}
]
Dokumentacja:korzystanie z interfejsu API odpowiedzi platformy OpenAI Azure
// This code snippet is currently unavailable.
Przejrzyj odpowiedź MCP
Gdy klient MCP wywołuje knowledge_base_retrieve, otrzymuje wynik narzędzia MCP zamiast otoczki akcji pobierania response, activity i references. Wielu klientów MCP udostępnia wynik działania tego narzędzia w obiekcie najwyższego poziomu result, więc należy oczekiwać ładunku danych 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>\"}]"
}
]
}
}
Kluczowe punkty:
result.content[]zawiera zwrócone przez bazę wiedzy dane wyjściowe narzędzia MCP.Parametr
result.content[].typema wartośćtext.result.content[].textzawiera pobrane dane źródłowe jako ciąg znaków zakodowany w formacie JSON.W przeciwieństwie do akcji pobierania, bieżąca odpowiedź MCP nie zwraca oddzielnych tablic
activityanireferencesi nie wypełnia wpisówresourcedotyczących zwróconej zawartości.
Powiązana zawartość
- Pobieranie przy użyciu agentów w Wyszukiwanie AI platformy Azure
- Wymuszanie mechanizmów ACL i RBAC w czasie wykonywania kwerend (wersja zapoznawcza)
- Użyj indeksatora obiektów blob lub źródła wiedzy do pozyskiwania metadanych zakresów RBAC (wersja zapoznawcza)
- Agentic RAG: Tworzenie silnika pobierania rozumowania za pomocą Wyszukiwanie AI platformy Azure (wideo z YouTube)
- Demonstracja Azure OpenAI z funkcją agentowego pobierania