註
Azure AI 搜尋服務 可透過 Azure 入口網站、REST API 及 Azure SDK 取得。 它同時也是 Foundry IQ 的基礎,這是一個管理式知識層,能將企業內容轉化為可重複使用、權限感知的知識庫,供 Microsoft Foundry 入口網站中的代理使用。
重要
標記(預覽)的功能、能力或屬性不受服務等級協議涵蓋,也不建議用於生產工作負載,且在正式上架前可能會有所變動或受限。 Azure AI 搜尋服務 預覽條款適用於所有預覽功能,無論是獨立功能還是正式推出功能的一部分。
在代理檢索管線中, 檢索動作 會從知識庫中呼叫平行查詢處理。 你可以直接使用 Search Service REST API 或 Azure SDK 呼叫這個擷取動作。 每個知識庫也會暴露一個模型上下文協定(MCP)端點,供相容的代理使用。
本文說明如何呼叫兩種檢索方法,並可選擇性地強制執行權限。 它先涵蓋擷取動作,MCP 端點則是後處理,因為 MCP 工具的結果目前與 REST 和 SDK 的回應格式不同。
若要建立一條透過 MCP 連接 Azure AI 搜尋至代理服務的管線,請參閱 教程:建立從端到端的代理檢索解決方案。
使用支援
| Azure portal | Microsoft Foundry 入口網站 | .NET SDK | Python SDK | Java 開發套件 | JavaScript SDK | REST API |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
先決條件
一個Azure AI 搜尋服務服務,擁有知識庫。
關於共享模型存取與客戶端設定,請參閱 建立知識庫的先決條件。
請求查詢知識庫的權限。 建議設定無金鑰驗證,並將 Search Index Data Reader 角色指派給您的使用者帳戶,或使用 查詢 API 金鑰。
如果你透過 Azure OpenAI 回應 API 呼叫 MCP 端點,你需要:
已部署的 LLM,以及 Foundry 資源上的認知服務 OpenAI 使用者角色 (或 API 金鑰)。 如果適用,你可以重用知識庫中指定的 LLM 和資源。
Azure.AI.OpenAI套件:dotnet add package Azure.AI.OpenAI
必備的
Azure.Search.Documents套件:關於
2026-08-01-preview功能,最新預覽包:dotnet add package Azure.Search.Documents --prerelease若要使用
2026-04-01功能,請採用最新的穩定套件:dotnet add package Azure.Search.Documents
對於無鑰匙認證,套件如下
Azure.Identity:dotnet add package Azure.Identity
如果你透過 Azure OpenAI 回應 API 呼叫 MCP 端點,你需要:
已部署的 LLM,以及 Foundry 資源上的認知服務 OpenAI 使用者角色 (或 API 金鑰)。 如果適用,你可以重用知識庫中指定的 LLM 和資源。
openai套件:pip install openai
必備的
azure-search-documents套件:關於
2026-08-01-preview功能,最新預覽包:pip install --pre azure-search-documents若要使用
2026-04-01功能,請採用最新的穩定套件:pip install azure-search-documents
對於無鑰匙認證,套件如下
azure-identity:pip install azure-identity
必要的搜尋服務 REST API 版本:
預覽功能: 2026-08-01-preview
適用於正式運作的功能:2026-04-01
對於無金鑰認證,請在
Authorization每個 HTTP 請求的標頭中加入 Microsoft Entra ID 令牌。
Limitations
對於搜尋索引知識來源,啟用重新排序時,檢索會使用知識來源的語意配置。 它不會套用基礎索引的 評分設定檔,包括 defaultScoringProfile。 擷取回應也不會呈現 @search.rerankerBoostedScore。
呼叫取回動作
你在知識庫中指定擷取動作。 請求主體包含查詢輸入及可選的知識來源清單。
2026-04-01 API 版本僅支援intents輸入及最小化的擷取。 不支援僅限預覽的功能,包括 messages 輸入、查詢規劃、答案合成,以及可設定的推理強度。 使用 2026-08-01-preview 以獲得完整功能。
using Azure.Identity;
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
// Create knowledge base retrieval client
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: new DefaultAzureCredential()
);
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"You can answer questions about the Earth at night. "
+ "Sources have a JSON format with a ref_id that must be cited in the answer. "
+ "If you do not have the answer, respond with 'I do not know'."
)
}
) { Role = "assistant" }
);
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"Why is the Phoenix nighttime street grid so sharply visible from space, "
+ "whereas large stretches of the interstate between midwestern cities remain comparatively dim?"
)
}
) { Role = "user" }
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
參考資料: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)
參考資料: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"
}
]
}
參考資料:知識檢索 - 檢索
提供圖片用於答案彙整(預覽)
對於使用資產存放區設定的 blob、indexed OneLake 和 indexed SharePoint 知識來源,你可以將內嵌於文件中的影像連同文字一併提供給下游答案合成模型。 在匹配的條目enableImageServing上設定knowledgeSourceParams,以覆蓋知識庫定義中預設的設定。 擷取回應不包含專門欄位來顯示模型所提供的個別影像路徑或影像位元組。
影像服務僅會在 outputMode 為 ingestionPermissionOptions 時執行,且不支援已設定 answerSynthesis 的知識來源。 如需設定步驟、優先順序資料表,以及檢查影像服務統計資料的方法,請參閱在代理式擷取中呈現文件內嵌影像 (預覽版)。
關閉知識來源的重新排序(預覽)
從 2026-08-01-preview API 版本開始,在 knowledgeSourceParams 項目上設定 "resultsProcessing": "none",即可略過特定知識來源的重新排序,並保留其原始結果順序。 你也可以將 resultsProcessing 儲存在知識來源中,並設為其預設值。 所有知識來源類型都支持此特性。
以下範例會在單次擷取要求中略過 product-catalog-ks 的重新排序。
using System;
using System.Linq;
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var client = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"product-catalog-kb",
new DefaultAzureCredential());
var request = new KnowledgeBaseRetrievalRequest
{
IncludeActivity = true
};
request.Intents.Add(
new KnowledgeRetrievalSemanticIntent(
"Find the power adapter for SKU 88421."));
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("product-catalog-ks")
{
AlwaysQuerySource = true,
IncludeReferences = true,
ResultsProcessing = KnowledgeSourceResultsProcessing.None
});
var result = await client.RetrieveAsync(request);
Console.WriteLine(
$"References with a reranker score: "
+ $"{result.Value.References.Count(x => x.RerankerScore.HasValue)}");
參考資料: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)
參考資料: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"
}
]
}
參考資料:知識檢索 - 檢索
設定 "resultsProcessing": "rerank",或在沒有已儲存的預設值時省略它,以使用重排序管線。 Azure AI 搜尋服務 依以下順序解析每個來源的有效值:
- 擷取要求中
knowledgeSourceParams內的resultsProcessing。 -
resultsProcessing儲存於知識來源中。 -
rerank當兩者都不存在時。
對於 MCP 伺服器的知識來源, resultsProcessing 單一工具上的值設定優先於請求與儲存值。
Tip
resultsProcessing 改變的是結果的處理方式,而非查詢哪些來源。 若必須查詢知識來源,則設alwaysQuerySource為 。true
當有效值為 none時:
- 來自知識來源的參考資料不包含
rerankerScore,而結果會保留其在來源檢索活動中的原有順序。 - 當任何來源跳過重新排序時,Azure AI 搜尋服務 會依照知識來源宣告順序,依循環順序將最終結果分配到各活動。 重新排序的活動仍依分數排序。
- 重複刪除及按來源、文件和令牌限制仍然適用,因此並非所有檢索結果都會出現在回應中。
Azure AI 搜尋服務 會依照下列順序驗證 rerankerThreshold:
- 搜尋會根據擷取要求和儲存的知識來源值來解析
resultsProcessing。 - 若解析值為
none且請求包含rerankerThreshold,則搜尋返回400 Bad Request。 - 對於 MCP 伺服器工具,Search 會在驗證請求後套用工具層級
resultsProcessing的值。
因此,MCP 工具設定不會改變請求是否通過驗證。 工具層級none值不會造成閾值錯誤,且當請求或儲存值解析為 none時,工具層級rerank值也無法防止錯誤。
要確認執行的模式是哪一種,請檢查知識來源的參考文獻是否包含 rerankerScore。 不要依賴 semanticConfigurationName,因為它可能會是 null,而不是被省略。
搜尋索引行為
對於針對搜尋索引的知識來源,隱含查詢類型為 semantic,且沒有搜尋模式。 在重新排序執行時,查詢執行會使用 semanticConfigurationName。 其他來源設定,包括 searchFields 和 sourceDataFields,兩種模式皆適用。
代理式擷取不接受 scoringProfile 或 scoringParameters 輸入。 如果你需要對索引知識來源進行新近偏差,請使用 新鮮度感知檢索(預覽) 取代索引評分設定檔。
如果索引包含向量場,你需要一個有效的向量化器定義,讓代理檢索引擎能向量化查詢輸入。 否則,向量場會被忽略。
欲了解更多資訊,請參閱 建立代理檢索索引。
串流擷取結果(預覽)
從 API 版本開始 2026-08-01-preview ,你可以以伺服器發送事件(SSE)的串流形式接收擷取結果,而不必等待單一 JSON 回應。 透過串流,您的用戶端可在各部分陸續可用時,按照該順序顯示查詢規劃、來源活動,以及合成的答案或擷取的回應。
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var client = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"<knowledge-base-name>",
new DefaultAzureCredential());
var request = new KnowledgeBaseRetrievalRequest
{
OutputMode = KnowledgeRetrievalOutputMode.ExtractiveData,
RetrievalReasoningEffort =
new KnowledgeRetrievalMinimalReasoningEffort(),
IncludeActivity = true,
};
request.Intents.Add(
new KnowledgeRetrievalSemanticIntent("What is the return policy?"));
request.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"<knowledge-source-name>")
{
ResultsProcessing = KnowledgeSourceResultsProcessing.None,
IncludeReferences = true,
});
var eventCounts = new Dictionary<string, int>();
await foreach (var item in client.RetrieveStreamAsync(request))
{
eventCounts.TryGetValue(item.EventType, out var count);
eventCounts[item.EventType] = count + 1;
}
foreach (var (eventType, count) in eventCounts)
{
Console.WriteLine($"{eventType}: {count}");
}
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}")
若要啟用串流,請在擷取要求中包含 Accept: text/event-stream 標頭。 若無此標頭,擷取動作會回傳其標準的 JSON 回應。
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Accept: text/event-stream
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "What is the return policy?"
}
],
"outputMode": "extractiveData",
"retrievalReasoningEffort": {
"kind": "minimal"
},
"includeActivity": true,
"knowledgeSourceParams": [
{
"knowledgeSourceName": "{{knowledge-source-name}}",
"kind": "searchIndex",
"resultsProcessing": "none",
"includeReferences": true
}
]
}
參考資料:知識檢索 - 檢索
事件生命週期
服務不會回傳單一回應,而是保持一個 HTTP 連線(內容型別 text/event-stream; charset=utf-8)開啟,並在資料出現時發送一連串事件。 每個事件都有一 event: 行標示事件類型、一 data: 行 JSON 值,以及一行空白行標記事件結束。
成功的串流會遵循以下生命週期:
| Event | 傳送的時間 | 包含的内容 |
|---|---|---|
retrieval.started |
每個串流請求中的第一個事件。 | 服務解析要求和知識庫的預設值後所取得的要求識別碼、知識庫名稱、輸出模式和實際推理投入程度。 若有效 kind 值為 auto,事件報告 auto;它無法預測後續升級。 |
activity.started |
當服務開始進行查詢規劃、來源存取或模型相關活動時。 多個活動可以在先前活動完成前就開始。 | 活動、idtype、開始時間,以及可選的知識來源名稱。 |
activity.completed |
當該活動結束時。 透過匹配id來將其與事件activity.started相關聯。 |
已完成的 活動紀錄。 |
answer.completed |
僅當 answerSynthesis 為 outputMode 時,一次。 |
messageIndex 識別訊息在最終回應陣列中的位置,並 message 包含完整的綜合答案。 沒有逐個代幣的 delta 事件。 |
references.completed |
在所有參照都已解析完成後。 | 事件資料是完整的 參考陣列,沒有物件包裝器。 |
response.completed |
成功或部分成功串流的最終事件。 |
200 或 206 狀態碼及完整的擷取回應體,其形狀與非串流的 JSON 呼叫相同。 如需了解每個狀態碼的意義,請參閱擷取動作的疑難排解。 |
error |
在資料流開啟後擷取失敗時,取代 references.completed 和 response.completed。 |
錯誤以及故障前完成的任何活動紀錄。 |
事件依序展開。 每個 activity.started 事件都先於具有相同 id 的 activity.completed 事件發生,但各項活動可以交錯發生。 已完成的活動紀錄也包含 startedAt 和 completedAt 時間戳記。 當串流閒置時,伺服器大約每 15 秒發送 : heartbeat 一次留言以保持連線暢通。 SSE 用戶端可以忽略這些評論。
以下範例展示了串流式回應,且有效載荷被縮短以提升可讀性。
event: retrieval.started
data: {"requestId":"<request-id>","outputMode":"answerSynthesis"}
event: activity.started
data: {"id":0,"type":"searchIndex","startedAt":"<timestamp>"}
: heartbeat
event: activity.completed
data: {"id":0,"startedAt":"<start>","completedAt":"<end>"}
event: answer.completed
data: {"messageIndex":0,"message":{"content":[{"type":"text","text":"..."}]}}
event: references.completed
data: [{"type":"searchIndex","id":"0","activitySource":0}]
event: response.completed
data: {"statusCode":200,"response":{}}
處理錯誤、取消與備用
預檢失敗:若請求驗證在串流開啟前失敗,例如請求主體形狀異常,擷取動作會回傳標準的 JSON 錯誤回應,且永遠不會開啟串流。
中流失敗:若串流開啟後擷取失敗,終端事件為
error,而非references.completedresponse.completed。 事件可包含在失敗發生前完成的任何活動紀錄。 當串流開始後,HTTP 狀態碼會保留200,因此請檢查終端機事件,而非 HTTP 狀態碼,以判斷成功。取消或斷線:若客戶端在串流結束前取消請求或斷線,服務會取消擷取並終止串流,且不會發生終端事件。 將取消或斷線前收到的任何事件視為不完整。
JSON 備援:當使用
2026-08-01-preview時,若缺少Accept標頭,或其值為*/*、text/*、text/event-stream;q=0或application/json,則會傳回 檢閱回應 中所述的標準 JSON 回應。 從較早的 API 版本請求text/event-stream會回傳406 Not Acceptable。
查詢時篩選搜尋索引知識來源
在從搜尋索引知識來源檢索時,您可以在查詢時套用 OData 篩選 器,將結果縮小到特定文件或欄位。 濾波器表達式使用 OData 語法,並透過參數 filterAddOn 傳遞。
濾波器語法與範例
參數 filterAddOn 接受 OData 濾波器表達式。 範例模式包括:
-
元資料欄位:
city eq 'Phoenix',status eq 'active' -
日期範圍:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
數值範圍:
price ge 100 and price le 5000 -
文字匹配:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
邏輯運算子:
(category eq 'News' or category eq 'Analysis') and status eq 'published'
using Azure;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: new DefaultAzureCredential()
);
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"You are a support agent. Answer questions based on published documentation. "
+ "If you don't know the answer, say so."
)
}
) { Role = "assistant" }
);
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"What is the process for submitting an expense report?"
)
}
) { Role = "user" }
);
// Apply a filter to search only published documents
var searchIndexParams = new SearchIndexKnowledgeSourceParams(
knowledgeSourceName: "internal-documentation-ks"
);
searchIndexParams.FilterAddOn = "status eq 'published'";
retrievalRequest.KnowledgeSourceParams.Add(searchIndexParams);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
from azure.identity import DefaultAzureCredential
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage,
KnowledgeBaseMessageTextContent,
KnowledgeBaseRetrievalRequest,
SearchIndexKnowledgeSourceParams,
)
kb_client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="<knowledge-base-name>",
credential=DefaultAzureCredential(),
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="assistant",
content=[
KnowledgeBaseMessageTextContent(
text="You are a support agent. Answer questions based on published documentation. "
"If you don't know the answer, say so."
)
],
),
KnowledgeBaseMessage(
role="user",
content=[
KnowledgeBaseMessageTextContent(
text="What is the process for submitting an expense report?"
)
],
),
],
knowledge_source_params=[
SearchIndexKnowledgeSourceParams(
knowledge_source_name="internal-documentation-ks",
# Apply a filter to search only published documents
filter_add_on="status eq 'published'",
)
],
)
result = kb_client.retrieve(request)
print(result.response[0].content[0].text)
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"messages": [
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "You are a support agent. Answer questions based on published documentation. If you don't know the answer, say so."
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is the process for submitting an expense report?"
}
]
}
],
"knowledgeSourceParams": [
{
"knowledgeSourceName": "internal-documentation-ks",
"kind": "searchIndex",
"filterAddOn": "status eq 'published'"
}
]
}
多重濾波器範例
你可以結合多個篩選器來進一步精煉結果。
searchIndexParams.FilterAddOn = "(status eq 'published' or status eq 'internal') and created ge 2025-01-01";
filter_add_on="(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
{
"knowledgeSourceName": "internal-documentation-ks",
"kind": "searchIndex",
"filterAddOn": "(status eq 'published' or status eq 'internal') and created ge 2025-01-01"
}
在查詢時覆寫已儲存的查詢提示(預覽)
從 2026-08-01-preview API 版本開始,您可以在單一次擷取要求中,於其 knowledgeSourceParams 項目上設定 queryHintOverrides,以覆寫儲存在搜尋索引知識來源上的查詢提示。
覆寫會取代整個已儲存的 queryHints 物件,而不是逐項合併,因此請加入所有你想套用的提示。 省略 queryHintOverrides 以使用已儲存的提示。
當擷取推理投入程度不是 minimal 時,是否傳回 HTTP 400 回應取決於儲存的篩選提示,而不是覆寫內容或提升類型。 該服務在應用 queryHintOverrides前,會先驗證儲存的過濾提示與知識庫模型的關聯。 因此,即使覆寫為空白或僅包含提升項,GPT-4o 或 GPT-4.1 系列模型仍會拒絕該請求。 單靠已儲存的增益本身不會觸發此驗證。 使用相容的模型,或先移除儲存的過濾提示。
以下範例會將所有已儲存的提示,替換為一個用於日文內容的 fieldValue boost。 服務不會將任何已儲存的篩選條件或其他已儲存的加權套用至此要求。
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);
參考資料: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)
參考資料: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
}
參考資料:知識檢索 - 檢索
為了確認服務已套用你的覆寫,請在要求中設定 includeActivity,並檢查傳回的 searchIndex 活動。 其 queryHintProcessing 物件報告模型所產生的內容。 在這個例子中,它包含一個用於語言提升的 generatedBoost,但沒有 generatedFilter,因為覆寫已取代原先儲存的過濾提示。 因為查詢提示僅供盡力比對,請將這項操作視為確認,而不是檢查是否為完全相同的表述。
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
關於儲存的定義、支援的提示類型,以及帶有確定性過濾器的組合,請參見 「配置查詢提示(預覽)」。
於查詢時強制套用權限(預覽)
你在外部 2026-08-01-preview 設定的存取權限變更,可能需要時間才會出現在 2026-08-01-preview 檢索結果中。
如果你的知識來源包含權限保護的內容,請在擷取請求中傳遞最終使用者的身份,讓每位使用者只看到他們被授權存取的內容。 對於索引來源,檢索引擎會使用此身份來篩選結果,若遺漏則回傳未過濾結果。 遠端來源也會使用擷取請求的授權,但會強制執行來源權限,並可能需要特定來源的令牌與標頭。
權限執行分為兩部分:
匯入時間:僅針對已索引的知識來源,設定
ingestionPermissionOptions以同時匯入內容與權限的元資料。查詢時:透過知識來源要求的標頭傳遞使用者的授權資訊。 大多數來源使用
x-ms-query-source-authorization。 例外情況是 Work IQ,其使用x-ms-query-work-iq-source-authorization。
吞入時間配置
下表顯示哪些知識來源需要資料擷取時間設定,以及每個來源如何強制執行權限。
| 知識來源 | 需求 ingestionPermissionOptions |
權限的執行方式 |
|---|---|---|
| Blob 或 ADLS Gen2 | ✅ | 匯入的 RBAC 範圍、ACL 或 Microsoft Purview 會與使用者身分進行比對。 |
| 一湖 | ✅ | 已擷取文件的 Microsoft Purview 敏感度標籤,會比對使用者身分識別。 |
| 已索引的 SharePoint | ✅ | 已擷取並匯入的 SharePoint ACL 或 Microsoft Purview 敏感度標籤,會根據使用者身分進行比對。 |
| 遠端SharePoint | ❌ | Copilot Retrieval API 直接使用使用者的憑證查詢 SharePoint。 |
| Fabric 資料代理程式 | ❌ | 擷取引擎會將使用者的權杖交換為 Microsoft Fabric 範圍的權杖,並代表使用者查詢 Data Agent。 |
| Fabric Ontology | ❌ | 擷取引擎會將使用者的權杖交換為 Microsoft Fabric 範圍的權杖,並代表使用者查詢 Ontology 項目。 |
| 工作智商 | ❌ | 擷取引擎會將 x-ms-query-work-iq-source-authorization 中以應用程式為對象的使用者判斷提示,交換成範圍限定為 Work IQ 的權杖。 |
如果你在建立索引知識來源時沒有設定 ingestionPermissionOptions ,索引就不會包含權限的元資料。 系統會不論標頭為何,都未過濾回傳結果。 為了解決這個問題,請用適當的 ingestionPermissionOptions 值重新建立知識來源。
查詢時授權
對於非 Work IQ 的知識來源,請在 retrieve 要求中附上範圍限定為 https://search.azure.com/.default 的存取權杖,以傳遞終端使用者的身分。 此憑證與用於存取搜尋服務的服務憑證是分開的。 它不需要搜尋服務權限,只代表被評估內容存取權的使用者。 如需詳細資訊,請參閱查詢時間 ACL 和 RBAC 強制執行。
對於工作智商(Work IQ)的知識來源,此部分不適用。 使用 在查詢時強制執行權限 中所述的 Work IQ 專用使用者聲明流程。
在 .NET SDK 中,將 token 作為 querySourceAuthorization 的參數傳入 RetrieveAsync:
using Azure;
using Azure.Identity;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
// Service credential: Authenticates to the search service
var serviceCredential = new DefaultAzureCredential();
// User identity token: Represents the end user for document-level permissions filtering
var userTokenContext = new Azure.Core.TokenRequestContext(
new[] { "https://search.azure.com/.default" }
);
string userToken = (await serviceCredential.GetTokenAsync(userTokenContext)).Token;
// Create the retrieval client with the service credential
var kbClient = new KnowledgeBaseRetrievalClient(
endpoint: new Uri("<search-endpoint>"),
knowledgeBaseName: "<knowledge-base-name>",
credential: serviceCredential
);
var request = new KnowledgeBaseRetrievalRequest();
request.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"What companies are in the financial sector?")
}
) { Role = "user" }
);
// Pass the user identity token for permissions filtering
var result = await kbClient.RetrieveAsync(
request, querySourceAuthorization: userToken);
var text = (result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text;
Console.WriteLine(text);
參考資料:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
在 Python SDK 中,以 query_source_authorization 上的 retrieve 參數傳遞該標記:
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from azure.search.documents.knowledgebases import KnowledgeBaseRetrievalClient
from azure.search.documents.knowledgebases.models import (
KnowledgeBaseMessage, KnowledgeBaseMessageTextContent,
KnowledgeBaseRetrievalRequest,
)
# Service credential: Authenticates to the search service
service_credential = DefaultAzureCredential()
# User identity token: Represents the end user for document-level permissions filtering
user_token_provider = get_bearer_token_provider(
service_credential, "https://search.azure.com/.default")
user_token = user_token_provider()
# Create the retrieval client with the service credential
kb_client = KnowledgeBaseRetrievalClient(
endpoint="<search-endpoint>",
knowledge_base_name="<knowledge-base-name>",
credential=service_credential,
)
request = KnowledgeBaseRetrievalRequest(
messages=[
KnowledgeBaseMessage(
role="user",
content=[KnowledgeBaseMessageTextContent(
text="What companies are in the financial sector?")],
)
]
)
# Pass the user identity token for permissions filtering
result = kb_client.retrieve(
retrieval_request=request, query_source_authorization=user_token)
print(result.response[0].content[0].text)
參考資料:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
在 REST API 中,請包含使用者的存取權杖的 x-ms-query-source-authorization 標頭:
@search-endpoint = <search-endpoint>
@search-access-token = <search-access-token> // Service credential
@user-access-token = <user-access-token> // User identity token
POST {{search-endpoint}}/knowledgebases/{{knowledge-base-name}}/retrieve?api-version=2026-08-01-preview
Authorization: Bearer {{search-access-token}}
Content-Type: application/json
x-ms-query-source-authorization: {{user-access-token}}
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What companies are in the financial sector?"
}
]
}
]
}
參考資料:知識檢索 - 檢索
檢視回應
擷取操作回傳三個主要組件:
擷取的回應
擷取的回應是整合的字串,通常會傳給大型語言模型(LLM,Large Language Model)。 LLM 將字串作為基礎資料,並用來生成回應。 您對 LLM 的 API 呼叫包含統一字串以及提供給模型的指示,例如是否僅使用基礎資料或將其當作補充使用。
回應的主體採用聊天訊息格式,內容則是序列化的 JSON。
"response": [
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
}
]
}
]
重點:
content.type有一個有效值:text。content.text是一個以 JSON 編碼的字串,包含搜尋索引中根據查詢與聊天歷史輸入找到的最相關文件(或區塊)。 這串字串是你的基礎資料,LLM 用來對使用者問題做出回應。回應的此部分由 200 個或更少的區塊組成,不包含任何未達到最低 2.5 重新排序器分數門檻的結果。
字串以區塊的參考 ID(用於引用目的)及目標索引語意配置中指定的欄位開始。 在此範例中,假設目標索引的語意配置有「標題」欄位、「術語」欄位和「內容」欄位。
擷取回應不會包含
@search.rerankerBoostedScore。maxOutputSizeInTokens檢索請求中的屬性(maxOutputSize在 及2026-05-01-preview之後)決定了字串的長度。- 超出
maxOutputSizeInTokens產出預算的文件可從回應中省略。 當最相關的文件超過最大輸出大小時,activity 陣列會包含警告。 要保留更多內容,請增加maxOutputSizeInTokens。 更多資訊請參見 空回答。
- 超出
活動陣列
活動陣列輸出查詢計畫,提供操作透明度,以追蹤作業、計費影響及資源調用。 它也包含發送到檢索管線的子查詢。 對於 206 Partial Content 回應,陣列會包含知識來源失敗時的錯誤。
502 Bad Gateway回應可能只在頂層錯誤中提供故障細節。
活動陣列包含以下組件:
| 章節 | 描述 |
|---|---|
| 特定來源的活動 | 對於查詢中包含的每個知識來源,本節報告經過時間及查詢中使用的參數,包括語意排序器。 知識來源類型包括 searchIndex、 azureBlob、 以及其他支援的 知識來源。 |
agenticReasoning |
本節報告檢索過程中代理推理的代幣消耗,依據指定的 檢索推理努力(預覽)而定。 |
modelQueryPlanning |
對於使用 LLM 進行查詢規劃的知識庫,本節說明輸入所用的權杖數量以及子查詢的權杖數量。 它包含一個 model 欄位,該 modelName 欄位包含執行該活動的模型的公開模型名稱,而非部署名稱。 |
modelAnswerSynthesis |
對於使用 答案綜合(預覽)的知識庫,本節報告用於表述答案的標記數及答案輸出的標記數量。 它包含一個 model 欄位,該 modelName 欄位包含執行該活動的模型的公開模型名稱,而非部署名稱。 |
modelWebSummarization |
對於使用網頁摘要的知識庫,本節報告用於摘要網頁結果的代幣消耗情況。 它包含一個 model 欄位,該 modelName 欄位包含執行該活動的模型的公開模型名稱,而非部署名稱。 |
model |
對於模型支持的活動記錄,本節會標示用於執行該活動的模型。 這個區塊只有在你設定 includeActivity 為 true時才會出現。 |
imageServing |
對於已啟用 影像服務(預覽) 的知識來源,本節會顯示 imagesRetrieved、imagesSentToModel、totalImageSizeBytes,以及建立索引時是否啟用 verbalizationUsed。 分別檢查 verbalizationUsed 和 imagesSentToModel。 回應可以回報 verbalizationUsed 為 true ,同時仍將影像傳送到下游模型。 要計算掉落影像的數量,請從imagesSentToModel中減去imagesRetrieved。 |
以下範例展示了活動陣列。
"activity": [
{
"type": "modelQueryPlanning",
"id": 0,
"inputTokens": 2302,
"outputTokens": 109,
"elapsedMs": 2396
},
{
"type": "searchIndex",
"id": 1,
"knowledgeSourceName": "demo-financials-ks",
"queryTime": "2025-11-04T19:25:23.683Z",
"count": 26,
"elapsedMs": 1137,
"searchIndexArguments": {
"search": "List of companies in the financial sector according to SEC GICS classification",
"filter": null,
"sourceDataFields": [ ],
"searchFields": [ ],
"semanticConfigurationName": "en-semantic-config"
}
},
{
"type": "searchIndex",
"id": 2,
"knowledgeSourceName": "demo-healthcare-ks",
"queryTime": "2025-11-04T19:25:24.186Z",
"count": 17,
"elapsedMs": 494,
"searchIndexArguments": {
"search": "List of companies in the financial sector according to SEC GICS classification",
"filter": null,
"sourceDataFields": [ ],
"searchFields": [ ],
"semanticConfigurationName": "en-semantic-config"
}
},
{
"type": "agenticReasoning",
"id": 3,
"retrievalReasoningEffort": {
"kind": "low"
},
"reasoningTokens": 103368
},
{
"type": "modelAnswerSynthesis",
"id": 4,
"inputTokens": 5821,
"outputTokens": 344,
"elapsedMs": 3837
}
]
參考陣列
參考陣列直接來自底層的接地資料。 它包含用於產生回應的 文件 sourceData ,並包含代理檢索引擎找到並語意排序的每一份文件。
參考陣列包含以下組件:
| Field | 描述 |
|---|---|
type |
產生參考的知識來源類型,例如 searchIndex。 |
id |
回應中項目的參考 ID。 它不是搜尋索引中的文件鍵。 用它來提供引用。 |
activitySource |
交互參照產生該參照之活動項目的 id,這有助於連結引用。 |
docKey |
對於已編製索引的參照,此為後端搜尋索引中的文件索引鍵。 |
sourceData |
用於生成回應的依據資料。 對於索引參考,欄位可以包含 id 和 語意欄位,例如 title、 terms、 content和 。 形狀依參考類型而異。 |
citationUrl (預告) |
由服務產生的唯讀 URL,會解析為支援索引中該參考所對應的文件。 僅針對 已索引的知識來源回傳。 要追蹤網址,請參閱 「查找引用網址的文件(預覽)」。 |
以下範例展示了參考陣列。
"references": [
{
"type": "searchIndex",
"id": "0",
"activitySource": 2,
"docKey": "policy=aug-2026",
"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/policy%3Daug-2026?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
"sourceData": null
},
{
"type": "searchIndex",
"id": "1",
"activitySource": 2,
"docKey": "2",
"citationUrl": "https://my-search-service.search.windows.net/indexes/my-index/docs/2?$select=title%2Ccontent%2Ccategory%2Cid%2Clanguage&api-version=2026-08-01-preview",
"sourceData": null
}
]
查找有引用網址的文件(預覽)
從 2026-08-01-preview API 版本開始,來自已建立索引的知識來源之參考可以在擷取回應中包含 citationUrl。 使用此網址取得該參考的索引欄位,例如 title 和 content,這樣你就能在不打開原始原始文件的情況下,呈現出答案來源的引用預覽。 這是 citationUrl 對支持索引的認證查詢,與來源 docUrl 和 blobUrl分開。
以下範例展示了經過消毒的引用網址。
"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"
所選欄位及其順序取決於索引來源與檢索配置。
重要
照著回應的完整網址,然後在你的應用程式中渲染回傳的 JSON 欄位。 不要建構、解析或正規化 URL。
給定引文 URL 時,下列範例會取得搜尋服務的存取權杖。 他們會在 Authorization 標頭中附帶該權杖來呼叫該 URL。 已登入的身分識別需要具備 Search Index Data Reader 角色。
Azure AI 搜尋服務 SDK 的文件查詢方法需要端點、索引名稱、文件鍵、選取欄位和 API 版本作為獨立輸入。 他們不接受絕對引用網址。 這些範例使用經過認證的 HTTP GET 來保留完整的服務產生 URL。
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;
// citationUrl comes from a retrieve response
string citationUrl = "<citation-url>";
var credential = new DefaultAzureCredential();
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext(
new[] { "https://search.azure.com/.default" }));
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.Token);
string document = await httpClient.GetStringAsync(citationUrl);
Console.WriteLine(document);
Reference:DefaultAzureCredential
import json
from urllib.request import Request, urlopen
from azure.identity import DefaultAzureCredential
# citation_url comes from a retrieve response
citation_url = "<citation-url>"
credential = DefaultAzureCredential()
token = credential.get_token("https://search.azure.com/.default")
document_request = Request(
citation_url,
headers={"Authorization": f"Bearer {token.token}"},
)
with urlopen(document_request) as response:
document = json.load(response)
print(json.dumps(document, indent=2))
Reference:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
參考資料:文件 - 取得
文件查詢會以 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"
}
當你使用引用網址時,請記得以下幾點:
在顯示引用之前,請先檢查是否有
citationUrl。 如果回應遺漏參考,或服務無法解析後盾索引或文件鍵,則可能不存在。如果取回要求包含用於文件層級存取控制的
x-ms-query-source-authorization,則在依照該 URL 存取時,請使用相同的使用者權杖。網址只有在後備索引和文件金鑰保持不變時才會有效。
檢查回應中的敏感性標籤元資料(預覽)
此處也適用 Enforce permissions at query time 中所述的相同時間行為:在 2026-08-01-preview 之外設定的存取權限變更,可能需要一些時間才會顯示在 2026-08-01-preview 擷取回應中。
當你查詢一個匯入Microsoft Purview敏感度標籤的知識庫時,檢索回應會在兩個層級包含標籤元資料:
| 地點 | Field | 描述 |
|---|---|---|
| 根據參考資料 | sensitivityLabelInfo |
在 references 陣列中傳回的每份文件所套用的敏感度標籤。 |
| 回應 | metadata.responseSensitivityLabelInfo |
彙總標籤,代表回應中所有參考文件的最高優先順序敏感度標籤。 對用戶端顯示橫幅和政策執行很有用。 |
Microsoft Graph 利用 Microsoft Purview標籤繼承規則,從每個參考標籤計算反應層級標籤。 通常,最嚴格的標籤會勝出。
以下範例展示了一個包含兩份參考文件(一 Confidential、一 Internal)及所得回應層級標籤的檢索回應。
{
"response": [
{
"role": "assistant",
"content": [
{ "type": "text", "text": "[ ... grounding data ... ]" }
]
}
],
"references": [
{
"type": "azureBlob",
"id": "0",
"activitySource": 1,
"docKey": "contract-2026.pdf",
"sensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Confidential",
"color": "#FF0000",
"tooltip": "Confidential — Recipients can read but not forward.",
"isEncrypted": true,
"priority": 3
},
"sourceData": null
},
{
"type": "azureBlob",
"id": "1",
"activitySource": 1,
"docKey": "policy-overview.pdf",
"sensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Internal",
"color": "#FFA500",
"tooltip": "For internal use only.",
"isEncrypted": false,
"priority": 1
},
"sourceData": null
}
],
"metadata": {
"responseSensitivityLabelInfo": {
"labelId": "<label-guid>",
"labelName": "Confidential",
"color": "#FF0000",
"tooltip": "Confidential — Recipients can read but not forward.",
"isEncrypted": true,
"priority": 3
}
}
}
呈現敏感度標籤的參考類型
欄位名稱及標籤元資料的可用性取決於產生每個參考的知識來源類型。
參考資料 type |
標籤欄位 | 何時可用...... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
Blob 知識來源會在 sensitivityLabel 中包含 ingestionPermissionOptions。 |
indexedOneLake |
sensitivityLabelInfo |
OneLake 知識來源包含 sensitivityLabel 於 ingestionPermissionOptions。 |
indexedSharePoint |
sensitivityLabelInfo |
經 SharePoint 編製索引的知識來源在 sensitivityLabel 中包含 ingestionPermissionOptions。 |
searchIndex |
sensitivityLabelInfo |
底層索引將 purviewEnabled 設為 true,並且有一個標記為 sensitivityLabel: true 的欄位。 |
顯示和稽核建議
當你需要額外屬性(例如政策控制或權限)時,使用
sensitivityLabelInfo.labelId透過 Microsoft Graph敏感性標籤 API 查詢完整標籤定義。用於
metadata.responseSensitivityLabelInfo呈現回應等級的敏感度橫幅,或在回答中套用政策控制,例如關閉複製與分享。如果您的知識來源指向已分塊的索引,例如透過整合式向量化或自訂 Text Split 技能填入的索引,請確保技能集將敏感度標籤投影至每個區塊資料列。 沒有這種映射,區塊層級的參考在查詢時無法被正確過濾。
如需對已加上標籤的內容進行可稽核的系統管理存取,請參閱 用於系統管理調查的提升讀取權限。
MCP 伺服器行為
每個知識庫所暴露的 MCP 端點會顯示與 REST API 相同的敏感性標籤欄位。 當與 MCP 相容的用戶端叫用 knowledge_base_retrieve 工具時,工具結果會包含本節前文所述、相同的各參考項目 sensitivityLabelInfo 與回應層級 metadata.responseSensitivityLabelInfo 。 MCP 用戶端會根據這些欄位,強制執行具標籤感知能力的顯示方式與政策控管。
擷取動作範例(預覽)
以下範例展示了使用 2026-08-01-preview API 版本呼叫擷取動作的不同方式。 此版本支援完整的功能集,包括答案合成和可設定的推理投入程度。 關於 2026-04-01 用法,請參見前述章節。
- 檢查活動日誌中的模型名稱
- 需要知識來源才能成功
- 從請求中排除知識來源
- 依知識來源調整候選文件
- 限制最終的接地文件
- 驗證知識庫擷取預設值
- 覆蓋預設推理計算並設定請求限制
- 由服務決定推理強度
- 為每個知識來源設定參考資料
- 將推理過程的努力降到最低
檢視活動記錄中的模型名稱
設 includeActivity 為 true 以回傳模型支援活動記錄中的模型身份欄位。 利用這些欄位確認在檢索請求時,哪個已設定的模型負責查詢規劃、答案綜合或網頁摘要。 以下範例覆蓋了請求中所選來源的儲存結果處理。
using Azure.Identity;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
var kbClient = new KnowledgeBaseRetrievalClient(
new Uri("<search-endpoint>"),
"<knowledge-base-name>",
new DefaultAzureCredential()
);
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[]
{
new KnowledgeBaseMessageTextContent(
"Which policy applies to returns?"
)
}
) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams(
"<knowledge-source-name>"
)
{
ResultsProcessing = KnowledgeSourceResultsProcessing.None
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
foreach (var activity in result.Value.Activity)
{
KnowledgeBaseActivityRecordModel? model = activity switch
{
KnowledgeBaseModelQueryPlanningActivityRecord queryPlanning =>
queryPlanning.Model,
KnowledgeBaseModelAnswerSynthesisActivityRecord answerSynthesis =>
answerSynthesis.Model,
KnowledgeBaseModelWebSummarizationActivityRecord webSummarization =>
webSummarization.Model,
_ => null
};
if (model is not null)
{
Console.WriteLine(
$"modelName={model.ModelName}, deploymentId={model.DeploymentId}");
}
}
參考資料: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,
)
參考資料: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"
}
]
}
參考資料:知識檢索 - 檢索
以下回應摘錄顯示了巢狀模型識別資訊:
{
"activity": [
{
"type": "modelQueryPlanning",
"id": 0,
"model": {
"modelName": "gpt-5-mini",
"deploymentId": "gpt-5-mini-deployment"
},
"inputTokens": 1842,
"outputTokens": 87,
"elapsedMs": 1923
},
{
"type": "searchIndex",
"id": 1,
"knowledgeSourceName": "operations-ks",
"count": 12,
"elapsedMs": 234
},
{
"type": "modelAnswerSynthesis",
"id": 2,
"model": {
"modelName": "gpt-5-mini",
"deploymentId": "gpt-5-mini-deployment"
},
"inputTokens": 2418,
"outputTokens": 179,
"elapsedMs": 931
}
]
}
需要知識來源才能成功
在 failOnError 中設定 knowledgeSourceParams,將知識來源標示為必要。 當該來源無法取得,而提供部分答案可能造成誤導或不符規範時,請使用此參數。 如果某個來源失敗,請求會回傳 502 Bad Gateway ,即使其他來源成功。 如需處理指引,請參閱針對擷取動作進行疑難排解。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("Which HR policy applies?")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("hr-policy-ks")
{
FailOnError = true,
AlwaysQuerySource = true
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("hr-faq-ks")
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
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)
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"
}
]
}
參考資料:知識檢索 - 檢索
從請求中排除知識來源
從 2026-08-01-preview API 版本開始,針對每個你想從擷取要求中排除的知識來源,將 neverQuerySource 設為 true。 在請求時,neverQuerySource 會覆寫該請求中已儲存的 alwaysQuerySource 值,但不會變更已儲存的值。
以下範例會查詢包含 product-docs-ks 和 troubleshooting-ks 的知識庫,並將 troubleshooting-ks 排除在請求之外。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent(
"Explain the official SSO provisioning steps.")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("product-docs-ks")
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("troubleshooting-ks")
{
NeverQuerySource = true
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
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)
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
}
]
}
參考資料:知識檢索 - 檢索
調整每個知識來源的候選文件
在 maxOutputDocuments 中設定 knowledgeSourceParams,以限制特定知識來源在最終結果選取之前可提供的候選文件數量上限。 當你想將一個來源的輸入綁定到管線而不影響其他來源時,可以使用這個參數。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What safety procedures apply?")
}
) { Role = "user" }
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("operations-ks")
{
MaxOutputDocuments = 50
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
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)
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
}
]
}
參考資料:知識檢索 - 檢索
限制最終依據文件
頂層 maxOutputDocuments 參數限制最終檢索回應中回傳的接地文件數量。 當您的應用程式需要可預測的引用或參考數量時,請使用此參數。
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);
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)
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
}
參考資料:知識檢索 - 檢索
下表展示了這四種組合之間的maxOutputDocumentsmaxOutputSizeInTokens互動方式。
maxOutputDocuments |
maxOutputSizeInTokens |
行為 |
|---|---|---|
| 未指定 | 未指定 | 使用預設 maxOutputSizeInTokens 的響應限制行為。 |
| 未指定 | 指定 | 當文件達到有效載荷大小限制後,立即丟棄。 |
| 指定 | 未指定 | 最多傳回指定數量的依據文件,且不套用 maxOutputSizeInTokens 限制。 |
| 指定 | 指定 | 傳回最多 maxOutputDocuments 份文件,或傳回 maxOutputSizeInTokens 之下可容納的文件數量,以先適用的限制為準。 |
驗證知識庫擷取預設值
知識庫可將請求範圍的預設值儲存在 retrieveDefaults。 傳送兩個擷取要求,以驗證繼承和要求專屬的覆寫。
在開始之前,請先完成設定預設取用限制(預覽)。 第一個請求省略了三個請求範圍的限制,因此儲存的值為 45 秒、八份文件和 12,000 個代幣。 第二個請求則以 20 秒、一份文件和 5,000 個代幣覆蓋它們。
using System;
using Azure.Identity;
using Azure.Search.Documents;
using Azure.Search.Documents.KnowledgeBases;
using Azure.Search.Documents.KnowledgeBases.Models;
string searchEndpoint = "<search-endpoint>";
var options = new SearchClientOptions(
SearchClientOptions.ServiceVersion.V2026_08_01_Preview);
var kbClient = new KnowledgeBaseRetrievalClient(
new Uri(searchEndpoint),
"your-knowledge-base",
new DefaultAzureCredential(),
options);
KnowledgeBaseRetrievalRequest CreateRequest()
{
var request = new KnowledgeBaseRetrievalRequest();
request.Intents.Add(new KnowledgeRetrievalSemanticIntent(
"Summarize the latest support guidance."));
return request;
}
var inherited = await kbClient.RetrieveAsync(CreateRequest());
Console.WriteLine(
$"Stored defaults: {inherited.Value.References.Count} references");
KnowledgeBaseRetrievalRequest overriddenRequest = CreateRequest();
overriddenRequest.MaxRuntimeInSeconds = 20;
overriddenRequest.MaxOutputDocuments = 1;
overriddenRequest.MaxOutputSize = 5000;
var overridden = await kbClient.RetrieveAsync(overriddenRequest);
Console.WriteLine(
$"Request overrides: {overridden.Value.References.Count} references");
參考資料: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")
參考資料:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
首先,發送一個請求,省略三個請求範圍的限制欄位。
POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Summarize the latest support guidance."
}
]
}
接著,針對一個請求覆蓋這三個值。
POST {{search-endpoint}}/knowledgebases/your-knowledge-base/retrieve?api-version=2026-08-01-preview
Content-Type: application/json
Authorization: Bearer {{search-access-token}}
{
"intents": [
{
"type": "semantic",
"search": "Summarize the latest support guidance."
}
],
"maxRuntimeInSeconds": 20,
"maxOutputDocuments": 1,
"maxOutputSize": 5000
}
參考資料:知識檢索 - 檢索
參照數目會顯示套用的是已儲存還是要求層級的 maxOutputDocuments 值:第一個回應最多包含八個參照,第二個回應最多包含一個。 當匹配的文件較少時,回應可能包含較少的參考文獻。 回應不會報告有效執行時或輸出令牌預算,但這些值仍控制請求處理。 請求覆寫不會改變儲存的預設值。
覆寫預設推理強度並設定要求限制
以下範例指定答案整合,因此檢索推理強度必須為low或medium。 同時也設定 maxRuntimeInSeconds 限制檢索執行時間及 maxOutputSizeInTokens 回應有效載荷大小。
maxRuntimeInSeconds 接受 10 到 600 秒的數值,預設為 90 秒。 600 秒(10 分鐘)的最長時間僅適用於 Azure AI 搜尋服務 檢索請求。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
}
) { Role = "user" }
);
retrievalRequest.RetrievalReasoningEffort = new KnowledgeRetrievalLowReasoningEffort();
retrievalRequest.OutputMode = "answerSynthesis";
retrievalRequest.MaxRuntimeInSeconds = 30;
retrievalRequest.MaxOutputSizeInTokens = 6000;
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
參考資料: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)
參考資料: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
}
參考資料:知識檢索 - 檢索
讓服務決定推理強度
在擷取請求中設定 retrievalReasoningEffort.kind 為 , auto 以覆蓋知識庫預設值。 欲了解更多自動推理的資訊,請參閱 設定檢索推理努力(預覽)。
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
參考資料:知識檢索 - 檢索
為每個知識來源設定參考資料
使用 includeReferences 和 includeReferenceSourceData in knowledgeSourceParams 控制參考資料陣列中出現的來源,以及每個條目包含多少原始資料。 以下範例使用知識庫預設的推理努力。
var retrievalRequest = new KnowledgeBaseRetrievalRequest();
retrievalRequest.Messages.Add(
new KnowledgeBaseMessage(
content: new[] {
new KnowledgeBaseMessageTextContent("What companies are in the financial sector?")
}
) { Role = "user" }
);
retrievalRequest.IncludeActivity = true;
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-financials-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = true
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-communicationservices-ks")
{
IncludeReferences = false,
IncludeReferenceSourceData = false
}
);
retrievalRequest.KnowledgeSourceParams.Add(
new SearchIndexKnowledgeSourceParams("demo-healthcare-ks")
{
IncludeReferences = true,
IncludeReferenceSourceData = false,
AlwaysQuerySource = true
}
);
var result = await kbClient.RetrieveAsync(retrievalRequest);
Console.WriteLine(
(result.Value.Response[0].Content[0] as KnowledgeBaseMessageTextContent)!.Text
);
參考資料: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)
參考資料: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
}
]
}
參考資料:知識檢索 - 檢索
使用最少的推理強度
在下列範例中,沒有使用大型語言模型來進行智慧查詢規劃或答案生成。 查詢字串會傳送到代理檢索引擎,用於關鍵字搜尋或混合搜尋。
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
);
參考資料: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)
參考資料: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"
}
]
}
參考資料:知識檢索 - 檢索
針對擷取動作進行疑難排解
在 2026-08-01-preview中,回應狀態表示檢索是否成功、部分成功或失敗,以及接下來該做什麼。 請參考下表將每個狀態對應其意義,然後參考相應的故障排除指引章節。
| 狀態 | Meaning |
|---|---|
200 OK |
回收成功了。 如果文件內容超過輸出預算,仍可被省略。 更多資訊請參見 空回答。 |
400 Bad Request |
檢索請求在檢索開始前驗證失敗。 |
206 Partial Content |
至少有一個來源成功,且沒有標記 failOnError為失敗來源。 回應包含成功來源的結果。 |
502 Bad Gateway |
每個選定的來源都失敗,或有標示 failOnError: true 失敗的來源。 |
對於任何非200 回應,記錄 API 版本、時間戳、經過消毒的請求主體、回應標頭,以及請求或關聯 ID。 這些細節有助於你診斷故障原因,並在必要時與客服分享問題。
400 Bad Request
利用頂層錯誤來識別無效請求屬性。 常見的原因包括:
-
knowledgeSourceName中的knowledgeSourceParams未連結至知識庫,或其kind與已連結的來源不相符。 - 請求值超出其支援範圍,或某個選項需要另一個未啟用的選項。 例如,
includeReferenceSourceData需要includeReferences。 -
retrievalReasoningEffort.kind是auto,但該請求使用的 API 版本早於2026-08-01-preview。 - 請求使用
auto、low、或medium,但知識庫並未定義模型。 - 對於要求時間來源排除(預覽),同一個項目會同時將
neverQuerySource和alwaysQuerySource設為true,否則所有已附加的知識來源都會遭到排除。
在你重新嘗試請求之前,先修正由頂層錯誤所識別的屬性。
206 Partial Content
檢查每個包含 activity 的 error 條目。 來源檢索活動識別失敗的知識來源,模型活動識別失敗的處理階段。 回應本文仍包含成功的結果。
對於來源檢索活動錯誤,常見原因包括:
- 查詢時輸入無效,例如表達式格式錯誤
filterAddOn。 - 知識來源或索引配置漂移,例如欄位被重新命名、語 意配置缺失,或無效 的向量器。
- 相依性授權遺失或無效,或用於查詢來源的身分識別權限不足。
- 相依性發生節流、逾時或暫時性可用性失敗。
對於模型活動錯誤,利用該活動 type 來識別失敗的處理階段。 例如,錯誤 modelWebSummarization 表示 網頁結果摘要 失敗。
若您的應用程式允許部分結果,請處理成功結果並記錄每個失敗的來源或模型階段。 在重試之前,請先修正設定、授權及權限錯誤。 若發生節流、逾時或暫時性可用性失敗,請使用搭配退避機制的有限次數重試。
如果在沒有特定來源,且其來源類型支援 alwaysQuerySource 時,結果會不安全,請將 alwaysQuerySource 和 failOnError 都設為。 第一個選項確保來源被選取,第二個選項若查詢失敗則會回傳硬性錯誤。
MCP 伺服器的知識來源(預覽版) 不支援 alwaysQuerySource;對於這些來源, failOnError 僅在選擇原始碼時才適用。
failOnError 不適用於模型活動失敗情況。
502 Bad Gateway
頂層錯誤描述兩種硬故障路徑之一:
- 所有選定的來源都失敗了: 每個選擇的來源都會回傳錯誤。 成功完成但沒有任何符合條件文件的來源,不算是失敗的來源。 檢查每一次來源故障是否有共用設定、授權、相依性或可用性問題。
-
failOnError來源失敗:無法查詢所需的來源。 其他來源可能成功了,但服務無法回傳部分結果,因為所需的來源失敗了。
基礎來源失敗通常與 206 Partial Content 所述的類型相同:來源特定輸入無效、來源或索引設定漂移、相依性授權或權限問題、節流、逾時,或相依性暫時無法使用。
硬性 502 回應可能會省略 activity 陣列,並僅在頂層錯誤訊息中提供來源名稱及根本失敗原因。 在重試之前,請先修正設定、授權及權限錯誤。 只有在發生節流、逾時或暫時性可用性失敗時,才使用搭配退避機制的有限次數重試。 不要在未先檢查底層來源失敗的情況下,就將 502 Bad Gateway 回應解讀為 Azure AI 搜尋服務 服務中斷。
空洞回應
搜尋步驟可能會找到某份文件,但如果其有依據的內容超過 maxOutputSizeInTokens 輸出預算(在 2026-05-01-preview 中為 maxOutputSize,以及後續版本),服務仍可能在最終回應中省略該文件。 當此情況發生時,活動陣列顯示已找到匹配,活動記錄中會顯示最相關文件超過最大輸出大小的警告。 該文件的參考陣列和有根據的回應內容皆為空。 要保留更多內容,請增加 maxOutputSizeInTokens。
為避免此行為,請將大型原始文件索引為較小的區塊,並使用穩定的識別碼與來源元資料。 這尤其適用於冗長的手冊、政策或知識庫文章。
呼叫 MCP 端點
Warning
MCP 實作容易受到攻擊、連鎖故障及人力監督喪失等風險。 您可以透過審核 MCP 伺服器的安全性與可靠性,遵循 Microsoft 推薦的實務 及 產業最佳實務,並實施核准機制及監控連鎖行為來降低這些風險。
MCP 是一個開放協議,標準化 AI 應用如何連接外部資料來源和工具。
在Azure AI 搜尋服務中,每個知識庫都是獨立的 MCP 伺服器,負責揭露 knowledge_base_retrieve 工具。 任何相容 MCP 的用戶端,包括
認證至 MCP 端點
每個知識庫在以下網址都有一個 MCP 端點:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
你指定的 API 版本決定連線回傳什麼。 使用 2026-08-01-preview 時,如果基礎知識庫已設定 LLM 和相容的推理投入程度,知識庫便會傳回答案合成結果。 使用 2026-04-01時,檢索總是最小且具有擷取性,連線僅回傳接地資料。
你如何認證這個端點取決於你的 MCP 客戶端。 當你使用搭配 knowledge_base_retrieve MCP 工具的 Azure OpenAI Responses API 時,你會同時驗證對 Azure OpenAI 的 Responses API 呼叫,以及對 Azure AI 搜尋服務 的 MCP 要求。 如果你的 MCP 用戶端直接呼叫這個端點,你只會認證到 Azure AI 搜尋服務。
對於 Azure AI 搜尋服務 的認證,請使用以下其中一種方法:
註
MCP 用戶端會以不同的方式配置自訂標頭。 例如,Foundry Agent Service 透過專案連線注入標頭,而像 GitHub Copilot 這類客戶端則需要 MCP 伺服器 JSON 標頭。
使用持有憑證來進行 MCP 認證
推薦的 MCP 認證方法是持有憑證,以避免在配置檔中儲存敏感金鑰。 權杖背後的身分必須在搜尋服務上指派 Search Index Data Reader 角色。 欲了解更多資訊,請參閱 使用 identities 將您的應用程式連結至 Azure AI 搜尋服務。
#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());
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)
// This code snippet is currently unavailable.
使用管理金鑰進行 MCP 認證
管理員金鑰會授與搜尋服務完整的讀寫存取權限,因此請僅在開發環境中,或無法使用 Bearer 權杖時才使用。 欲了解更多資訊,請參閱 Connect to Azure AI 搜尋服務 using API keys。
Tip
以下範例僅顯示與承載標記範例不同的標頭。 完整設定請參見 使用 持有憑證進行 MCP 認證。
#pragma warning disable OPENAI001
using OpenAI.Responses;
using System;
using System.Collections.Generic;
string mcpServerUrl = Environment.GetEnvironmentVariable("AZURE_SEARCH_MCP_ENDPOINT")!; // Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
string searchAdminKey = Environment.GetEnvironmentVariable("AZURE_SEARCH_ADMIN_KEY")!; // Example: <search-api-key>
McpTool mcpTool = ResponseTool.CreateMcpTool(
serverLabel: "search_kb",
serverUri: new Uri(mcpServerUrl),
headers: new Dictionary<string, string> { ["api-key"] = searchAdminKey },
allowedTools: new McpToolFilter { ToolNames = { "knowledge_base_retrieve" } },
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval)
);
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",
}
]
// This code snippet is currently unavailable.
審查MCP的回應
當 MCP 用戶端呼叫 knowledge_base_retrieve 時,收到的是 MCP 工具結果,而不是擷取作業的 response、activity 和 references 封裝。 許多 MCP 用戶端會將該工具結果呈現在頂層 result 物件之下,因此你應該預期的有效載荷是 result.content[]。
{
"result": {
"content": [
{
"type": "text",
"text": "[{\"ref_id\":\"0\",\"title\":\"Urban Structure\",\"terms\":\"Location of Phoenix, Grid of City Blocks, Phoenix Metropolitan Area at Night\",\"content\":\"<content chunk redacted>\"}]"
}
]
}
}
重點:
result.content[]包含知識庫回傳的 MCP 工具輸出。result.content[].type是text。result.content[].text包含檢索的接地資料,以 JSON 編碼的字串形式呈現。與擷取動作不同,目前的 MCP 回應不會回傳分開
activity或references陣列,也不會為回傳的內容填入resource條目。