Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Catatan
Pencarian Azure AI tersedia melalui portal Azure, REST API, dan Azure SDK. Ini juga mendukung Foundry IQ, lapisan pengetahuan terkelola yang mengubah konten perusahaan menjadi pangkalan pengetahuan yang dapat digunakan kembali dan sadar izin untuk agen di portal Microsoft Foundry.
Penting
Fitur, kemampuan, atau properti yang ditandai (pratinjau) tidak tercakup dalam perjanjian tingkat layanan, tidak disarankan untuk beban kerja produksi, dan mungkin berubah atau dibatasi sebelum tersedia secara umum. Ketentuan pratinjau Pencarian Azure AI berlaku untuk semua fungsionalitas pratinjau, baik itu mandiri atau bagian dari fitur yang tersedia secara umum.
Dalam alur pengambilan yang bersifat agensi, aksi pengambilan memanggil pemrosesan kueri paralel dari basis pengetahuan. Anda dapat memanggil tindakan ambil secara langsung menggunakan REST API Layanan Pencarian atau Azure SDK. Setiap pangkalan pengetahuan juga mengekspos titik akhir Protokol Konteks Model (MCP) untuk dikonsumsi oleh agen yang kompatibel dengan MCP.
Artikel ini menjelaskan cara memanggil kedua metode pengambilan dengan opsi penerapan izin akses. Ini membahas aksi pengambilan terlebih dahulu dan endpoint MCP kemudian karena hasil dari alat MCP saat ini berbeda dari format respons REST dan SDK.
Untuk menyiapkan pipeline yang menghubungkan Pencarian Azure AI ke Foundry Agent Service melalui MCP, lihat Tutorial: Membangun solusi pengambilan berbasis agen end-to-end.
Dukungan penggunaan
| Portal Azure | Microsoft Foundry portal | .NET SDK | Python SDK | Java SDK | JavaScript SDK | REST API |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Prasyarat
Layanan Pencarian Azure AI dengan dasar pengetahuan.
Untuk akses model bersama dan penyiapan klien, lihat Prasyarat untuk membuat pangkalan pengetahuan.
Izin untuk mengkueri pangkalan pengetahuan. Konfigurasikan autentikasi tanpa kunci dengan peran Pembaca Data Indeks Pencarian yang ditetapkan ke akun pengguna Anda (disarankan) atau gunakan kunci API kueri.
Jika Anda memanggil titik akhir MCP melalui AZURE OpenAI Responses API, Anda memerlukan:
LLM yang disebarkan dan peran Pengguna OpenAI Cognitive Services (atau kunci API) pada sumber daya Foundry. Anda dapat menggunakan kembali LLM dan sumber daya yang ditentukan di pangkalan pengetahuan Anda, jika berlaku.
Paket
Azure.AI.OpenAI:dotnet add package Azure.AI.OpenAI
Paket
Azure.Search.Documentsyang diperlukan:Untuk fitur
2026-08-01-preview, paket pratinjau terbaru:dotnet add package Azure.Search.Documents --prereleaseUntuk fitur
2026-04-01, paket stabil terbaru:dotnet add package Azure.Search.Documents
Untuk autentikasi tanpa kunci,
Azure.Identitypaket:dotnet add package Azure.Identity
Jika Anda memanggil titik akhir MCP melalui AZURE OpenAI Responses API, Anda memerlukan:
LLM yang disebarkan dan peran Pengguna OpenAI Cognitive Services (atau kunci API) pada sumber daya Foundry. Anda dapat menggunakan kembali LLM dan sumber daya yang ditentukan di pangkalan pengetahuan Anda, jika berlaku.
Paket
openai:pip install openai
Paket
azure-search-documentsyang diperlukan:Untuk fitur
2026-08-01-preview, paket pratinjau terbaru:pip install --pre azure-search-documentsUntuk fitur
2026-04-01, paket stabil terbaru:pip install azure-search-documents
Untuk autentikasi tanpa kunci,
azure-identitypaket:pip install azure-identity
Versi REST API Layanan Pencarian yang Diperlukan:
Untuk fitur pratinjau: 2026-08-01-preview
Untuk fitur yang tersedia secara umum: 2026-04-01
Untuk autentikasi tanpa kunci, sertakan token Microsoft Entra ID di
Authorizationheader setiap permintaan HTTP.
Limitations
Untuk sumber pengetahuan indeks pencarian, saat Anda mengaktifkan pemeringkatan ulang, proses pengambilan menggunakan konfigurasi semantik sumber pengetahuan. Ini tidak menerapkan profil penilaian dari indeks yang mendasarinya, termasuk defaultScoringProfile. Respons pengambilan juga tidak menampilkan @search.rerankerBoostedScore.
Jalankan tindakan ambil
Anda menentukan aksi ambil pada basis pengetahuan. Isi permintaan mencakup input kueri dan daftar opsional sumber pengetahuan untuk ditargetkan.
Versi API 2026-04-01 hanya mendukung input intents dan pengambilan data ekstraktif minimal. Kemampuan khusus pratinjau, termasuk messages input, perencanaan kueri, sintesis jawaban, dan upaya penalaran yang dapat dikonfigurasi, tidak didukung. Gunakan 2026-08-01-preview untuk fungsionalitas penuh.
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
);
Referensi: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)
Referensi: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"
}
]
}
Referensi:Pengambilan Informasi - Ambil
Sediakan gambar untuk sintesis jawaban (pratinjau)
Untuk sumber pengetahuan blob, OneLake terindeks, dan SharePoint terindeks yang Anda konfigurasi dengan penyimpanan aset, Anda dapat memasok gambar yang disematkan dalam dokumen bersama teks ke model sintesis jawaban downstream. Atur enableImageServing pada entri yang cocok di knowledgeSourceParams untuk mengambil alih default yang diatur pada definisi pangkalan pengetahuan. Respons pengambilan tidak menyertakan bidang khusus untuk jalur gambar secara individual atau data byte gambar yang diberikan ke model.
Penyajian gambar hanya berjalan jika outputMode adalah answerSynthesis dan tidak didukung untuk sumber pengetahuan yang mengonfigurasi ingestionPermissionOptions. Untuk langkah-langkah penyiapan, tabel prioritas, dan cara memeriksa statistik penayangan gambar, lihat Menampilkan gambar yang disematkan dalam dokumen dalam pengambilan berbasis agen (pratinjau).
Nonaktifkan pemeringkatan ulang untuk sumber pengetahuan (pratinjau)
Mulai versi API 2026-08-01-preview, atur "resultsProcessing": "none" pada entri knowledgeSourceParams untuk melewati pemeringkatan ulang untuk sumber pengetahuan tertentu dan mempertahankan urutan hasil aslinya. Anda juga dapat menyimpan resultsProcessing pada sumber pengetahuan sebagai defaultnya. Semua jenis sumber pengetahuan mendukung properti ini.
Contoh berikut melewati proses reranking untuk product-catalog-ks pada satu permintaan pengambilan.
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)}");
Referensi: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)
Referensi: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"
}
]
}
Referensi:Pengambilan Informasi - Ambil
Atur "resultsProcessing": "rerank", atau hilangkan ketika tidak ada default tersimpan, untuk menggunakan alur reranking. Pencarian Azure AI menyelesaikan nilai efektif untuk setiap sumber dalam urutan ini:
-
resultsProcessingdiknowledgeSourceParamspada permintaan pengambilan. -
resultsProcessingdisimpan pada sumber pengetahuan. -
rerankketika kedua properti tidak ada.
Untuk sumber pengetahuan server MCP, nilai yang resultsProcessing ditetapkan pada alat individual lebih diutamakan daripada permintaan dan nilai yang disimpan.
Tip
resultsProcessing mengubah cara hasil diproses, bukan sumber mana yang dikueri. Atur alwaysQuerySource ke true jika sumber pengetahuan harus dikueri.
Ketika nilai efektif adalah none:
- Referensi dari sumber pengetahuan tidak menyertakan
rerankerScore, dan hasil tetap mengikuti urutan dasarnya dalam aktivitas pengambilan sumber tersebut. - Ketika salah satu sumber melewati proses pemeringkatan ulang, Pencarian Azure AI mendistribusikan hasil akhir ke seluruh aktivitas secara round-robin, sesuai dengan urutan deklarasi sumber pengetahuan. Aktivitas yang direrankasi tetap diurutkan berdasarkan skor.
- Deduplikasi dan batas per sumber, per dokumen, dan per token tetap berlaku, sehingga tidak setiap hasil yang diambil kembali ditampilkan dalam respons.
Pencarian Azure AI memvalidasi rerankerThreshold dalam urutan ini:
- Pencarian menentukan
resultsProcessingdari permintaan pengambilan dan nilai sumber pengetahuan yang tersimpan. - Jika nilai yang diselesaikan adalah
nonedan permintaan menyertakanrerankerThreshold, Pencarian mengembalikan400 Bad Request. - Untuk alat pada server MCP, Search menerapkan nilai
resultsProcessingtingkat alat setelah memvalidasi permintaan.
Akibatnya, pengaturan alat MCP tidak mengubah apakah permintaan melewati validasi. Nilai pada level alat none tidak menyebabkan error ambang batas, dan nilai pada level alat rerank tidak mencegah terjadinya error ketika permintaan atau nilai yang tersimpan ditetapkan menjadi none.
Untuk mengonfirmasi mode mana yang dijalankan, periksa apakah referensi sumber pengetahuan menyertakan rerankerScore. Jangan bergantung pada semanticConfigurationName, yang bisa null alih-alih dihilangkan.
Perilaku indeks pencarian
Untuk sumber pengetahuan yang menargetkan indeks pencarian, jenis kueri tersirat adalah semantic, dan tidak ada mode pencarian. Saat reranking berjalan, eksekusi kueri menggunakan semanticConfigurationName. Pengaturan sumber lainnya, termasuk searchFields dan sourceDataFields, berlaku di kedua mode.
Pengambilan agentik tidak menerima masukan scoringProfile atau scoringParameters. Jika Anda memerlukan bias keterkinian untuk sumber pengetahuan terindeks, gunakan pengambilan berbasis kesegaran (pratinjau) alih-alih profil penilaian pada indeks.
Jika indeks menyertakan bidang vektor, Anda memerlukan definisi vektorizer yang valid sehingga mesin pengambilan agenik dapat mem-vektorisasi input kueri. Jika tidak, bidang vektor diabaikan.
Untuk informasi selengkapnya, lihat Membuat indeks untuk pengambilan agentik.
Pengambilan hasil streaming (pratinjau)
Mulai dari versi API 2026-08-01-preview, Anda dapat menerima hasil pengambilan sebagai stream server-sent events (SSE) alih-alih menunggu satu respons JSON. Dengan menggunakan streaming, klien Anda dapat menampilkan perencanaan kueri, aktivitas sumber, dan jawaban yang disintesis atau respons yang diekstrak dalam urutan tersebut saat setiap bagian tersedia.
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}");
}
Referensi: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}")
Referensi:KnowledgeBaseRetrievalClient
Untuk mengaktifkan streaming, sertakan header Accept: text/event-stream dalam permintaan pengambilan. Tanpa header ini, aksi pengambilan mengembalikan respons JSON standar.
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
}
]
}
Referensi:Pengambilan Informasi - Ambil
Siklus hidup peristiwa
Alih-alih mengembalikan satu respons, layanan menjaga satu koneksi HTTP tetap terbuka (tipe konten text/event-stream; charset=utf-8) dan mengirim serangkaian event saat data tersedia. Setiap peristiwa memiliki event: baris yang menamai jenis peristiwa, data: baris dengan nilai JSON, dan baris kosong yang menandai akhir peristiwa.
Aliran yang berhasil menggunakan siklus hidup berikut:
| Event | Saat dikirim | Isinya |
|---|---|---|
retrieval.started |
Kejadian pertama pada setiap permintaan streaming. | ID permintaan, nama pangkalan pengetahuan, mode output, dan upaya penalaran yang efektif setelah layanan menyelesaikan permintaan dan default pangkalan pengetahuan. Jika kind yang berlaku adalah auto, peristiwa tersebut melaporkan auto; ini tidak memprediksi eskalasi selanjutnya. |
activity.started |
Saat layanan memulai aktivitas perencanaan kueri, sumber, atau model. Beberapa aktivitas dapat dimulai sebelum aktivitas sebelumnya selesai. | Aktivitas id, type, waktu mulai, dan nama sumber pengetahuan opsional. |
activity.completed |
Ketika aktivitas itu selesai. Kaitkan dengan event terkaitnya activity.started dengan mencocokkan id. |
Rekaman aktivitas yang telah selesai. |
answer.completed |
Satu kali, hanya jika outputMode bernilai answerSynthesis. |
messageIndex mengidentifikasi posisi pesan dalam array respons akhir, dan message berisi jawaban lengkap yang disintesis. Tidak ada kejadian delta per token. |
references.completed |
Setelah semua referensi diselesaikan. | Data peristiwa adalah array referensi lengkap, tanpa pembungkus objek. |
response.completed |
Peristiwa akhir untuk stream yang berhasil atau sebagian berhasil. |
200 atau 206, kode status, dan isi lengkap respons pengambilan, yang memiliki struktur yang sama dengan panggilan JSON non-streaming. Untuk informasi tentang apa arti masing-masing kode status, lihat Memecahkan masalah tindakan pengambilan. |
error |
Sebagai ganti references.completed dan response.completed saat pengambilan data gagal setelah aliran dibuka. |
Kesalahan dan catatan aktivitas apa pun yang selesai sebelum kegagalan. |
Peristiwa tiba secara berurutan. Setiap peristiwa activity.started mendahului peristiwa activity.completed dengan id yang sama, tetapi aktivitas dapat saling berselang-seling. Rekaman aktivitas yang selesai juga menyertakan startedAt dan completedAt tanda waktu. Saat aliran diam, server mengirim : heartbeat komentar sekitar setiap 15 detik untuk menjaga koneksi tetap terbuka. Klien SSE dapat mengabaikan komentar ini.
Contoh berikut menunjukkan respons streaming, dengan muatan data disingkat agar mudah dibaca.
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":{}}
Tangani kesalahan, pembatalan, dan cadangan
Kegagalan preflight: Jika validasi permintaan gagal sebelum stream dibuka, misalnya karena badan permintaan tidak valid, aksi pengambilan akan mengembalikan respons galat JSON standar dan tidak pernah membuka stream.
Kegagalan di tengah aliran: Jika pengambilan gagal setelah aliran dimulai, peristiwa terminalnya adalah
erroralih-alihreferences.completeddanresponse.completed. Peristiwa ini dapat mencakup catatan aktivitas apa pun yang telah selesai sebelum kegagalan terjadi. Kode status HTTP tetap200ada setelah streaming dimulai, jadi periksa peristiwa terminal, bukan kode status HTTP, untuk menentukan keberhasilan.Pembatalan atau pemutusan sambungan: Jika klien Anda membatalkan permintaan atau memutuskan sambungan sebelum streaming selesai, layanan membatalkan pengambilan dan mengakhiri streaming tanpa peristiwa terminal. Perlakukan peristiwa apa pun yang diterima sebelum pembatalan atau pemutusan sambungan sebagai tidak lengkap.
Fallback JSON: Dengan
2026-08-01-preview, header yang hilangAcceptatau nilai sepertiapplication/json, ,*/*text/*, atautext/event-stream;q=0mengembalikan respons JSON standar yang dijelaskan dalam Meninjau respons. Memintatext/event-streamdari versi API yang lebih lama mengembalikan406 Not Acceptable.
Menyaring sumber pengetahuan indeks pencarian saat kueri
Saat mengambil dari sumber pengetahuan indeks pencarian, Anda bisa menerapkan filter OData pada waktu kueri untuk mempersempit hasil ke dokumen atau bidang tertentu. Ekspresi filter menggunakan sintaks OData dan diteruskan melalui filterAddOn parameter .
Filter sintaksis dan contoh
Parameter filterAddOn menerima ekspresi filter OData. Contoh pola meliputi:
-
Bidang metadata:
city eq 'Phoenix',status eq 'active' -
Rentang tanggal:
publishDate ge 2024-01-01 and publishDate le 2024-12-31 -
Rentang numerik:
price ge 100 and price le 5000 -
Pencocokan teks:
substringof('climate', description),indexof(title, 'urgent') ge 0 -
Operator logika:
(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'"
}
]
}
Contoh multi-filter
Anda dapat menggabungkan beberapa filter untuk menyempurnakan hasil lebih lanjut.
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"
}
Mengesampingkan petunjuk kueri yang disimpan saat kueri dijalankan (pratinjau)
Mulai dari versi API 2026-08-01-preview, Anda dapat mengesampingkan hint kueri yang disimpan pada sumber pengetahuan indeks pencarian untuk satu permintaan retrieve dengan menetapkan queryHintOverrides pada entri knowledgeSourceParams.
Penimpaan menggantikan seluruh objek queryHints yang disimpan alih-alih menggabungkannya per entri, jadi sertakan setiap petunjuk yang ingin Anda terapkan. Hilangkan queryHintOverrides untuk menggunakan petunjuk tersimpan.
Ketika upaya penalaran retrieval bukan minimal, respons HTTP 400 ditentukan oleh petunjuk filter yang disimpan, bukan oleh konten override atau jenis boost. Layanan memvalidasi petunjuk filter tersimpan terhadap model pangkalan pengetahuan sebelum menerapkan queryHintOverrides. Oleh karena itu, model keluarga GPT-4o atau GPT-4.1 menolak permintaan tersebut meskipun override kosong atau hanya berisi boost. Boost yang tersimpan dengan sendirinya tidak memicu validasi ini. Gunakan model yang kompatibel atau hapus petunjuk filter tersimpan terlebih dahulu.
Contoh berikut mengganti semua hint yang tersimpan dengan satu boost fieldValue untuk konten berbahasa Jepang. Layanan ini tidak menerapkan filter tersimpan atau peningkatan tersimpan lainnya untuk permintaan ini.
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);
Referensi: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)
Referensi: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
}
Referensi:Pengambilan Informasi - Ambil
Untuk memastikan bahwa layanan menerapkan penggantian yang Anda tetapkan, atur includeActivity dalam permintaan dan periksa aktivitas searchIndex yang dikembalikan. Objeknya queryHintProcessing melaporkan apa yang dihasilkan model. Dalam contoh ini, terdapat generatedBoost untuk penguat bahasa, tetapi tidak berisi generatedFilter karena penggantian tersebut menggantikan petunjuk filter tersimpan. Karena petunjuk kueri adalah upaya terbaik, perlakukan aktivitas ini sebagai konfirmasi daripada memeriksa ekspresi yang tepat.
{
"type": "searchIndex",
"queryHintProcessing": {
"generatedBoost": "language:(ja\\-JP)^2"
},
"searchIndexArguments": {
"queryType": "full"
}
}
Untuk definisi tersimpan, jenis petunjuk yang didukung, dan komposisi dengan filter deterministik, lihat Mengonfigurasi petunjuk kueri (pratinjau).
Terapkan izin saat kueri (pratinjau)
Perubahan pada izin akses yang Anda atur di luar 2026-08-01-preview dapat memerlukan waktu sebelum muncul dalam hasil penelusuran 2026-08-01-preview.
Jika sumber pengetahuan Anda berisi konten yang dilindungi izin, berikan identitas pengguna akhir pada permintaan pengambilan sehingga setiap pengguna hanya melihat konten yang diizinkan untuk mereka akses. Untuk sumber yang diindeks, mesin penelusuran menggunakan identitas ini untuk memfilter hasil dan mengembalikan hasil tanpa filter jika identitas ini dihilangkan. Sumber jarak jauh juga menggunakan otorisasi dari permintaan pengambilan tetapi menerapkan izin di sumber dan mungkin memerlukan token dan header khusus sumber.
Penegakan izin memiliki dua bagian:
Waktu penyerapan: Hanya untuk sumber pengetahuan terindeks, atur
ingestionPermissionOptionsuntuk menyerap metadata izin bersama konten.Waktu kueri: Berikan otorisasi pengguna di header yang diperlukan oleh sumber pengetahuan. Sebagian besar sumber menggunakan
x-ms-query-source-authorization. Pengecualiannya adalah Work IQ, yang menggunakanx-ms-query-work-iq-source-authorization.
Konfigurasi waktu penyerapan
Tabel berikut menunjukkan sumber pengetahuan mana yang memerlukan konfigurasi waktu penyerapan dan bagaimana setiap sumber memberlakukan izin.
| Sumber pengetahuan | Memerlukan ingestionPermissionOptions |
Bagaimana izin diberlakukan |
|---|---|---|
| Blob atau ADLS Gen2 | ✅ | Cakupan RBAC yang diserap, ACL, atau Microsoft Purview yang cocok dengan identitas pengguna. |
| OneLake | ✅ | Dokumen yang diserap dengan label sensitivitas Microsoft Purview dicocokkan dengan identitas pengguna. |
| SharePoint yang Diindeks | ✅ | ACL SharePoint yang diserap atau label sensitivitas Microsoft Purview yang dicocokkan dengan identitas pengguna. |
| SharePoint Remote | ❌ | Copilot melakukan kueri API Pengambilan Data ke SharePoint dengan langsung menggunakan token pengguna. |
| Fabric Data Agent | ❌ | Mesin pengambilan data menukar token pengguna dengan token dengan cakupan Microsoft Fabric dan membuat kueri ke agen data atas nama pengguna tersebut. |
| Fabric Ontologi | ❌ | Mesin pengambilan data menukar token pengguna dengan token dengan cakupan Microsoft Fabric dan membuat kueri terhadap item ontologi atas nama pengguna. |
| IQ Kerja | ❌ | Mesin pengambilan bertukar pernyataan pengguna audiens aplikasi dari x-ms-query-work-iq-source-authorization untuk token yang dicakup Work IQ. |
Jika Anda tidak mengonfigurasi ingestionPermissionOptions saat membuat sumber pengetahuan terindeks, indeks tidak berisi metadata izin. Sistem mengembalikan hasil yang tidak difilter, terlepas dari header. Untuk memperbaiki masalah ini, buat ulang sumber pengetahuan dengan nilai yang sesuai ingestionPermissionOptions .
Otorisasi saat kueri
Untuk sumber pengetahuan non-Work IQ, teruskan identitas pengguna akhir dengan menyertakan token akses yang dicakup ke https://search.azure.com/.default dalam permintaan pengambilan. Token ini terpisah dari kredensial layanan yang digunakan untuk mengakses layanan pencarian. Ini tidak memerlukan izin layanan pencarian dan hanya mewakili pengguna yang akses kontennya dievaluasi. Untuk informasi lebih lanjut, lihat Penerapan ACL dan RBAC saat kueri.
Untuk sumber pengetahuan Work IQ, bagian ini tidak berlaku. Gunakan alur pernyataan pengguna spesifik Work IQ yang dijelaskan dalam Terapkan izin pada saat kueri.
Di SDK .NET, teruskan token sebagai parameter querySourceAuthorization pada 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);
Referensi:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Di SDK Python, teruskan token sebagai parameter query_source_authorization pada 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)
Referensi:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Di REST API, sertakan x-ms-query-source-authorization header dengan token akses pengguna:
@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?"
}
]
}
]
}
Referensi:Pengambilan Informasi - Ambil
Meninjau respons
Tindakan pengambilan menghasilkan tiga komponen utama:
- Respons yang diekstrak atau jawaban yang disintesis (pratinjau) (tergantung pada mode output)
- Array aktivitas
- Array referensi
Respons yang diekstrak
Respons yang diekstrak adalah suatu string tunggal yang biasanya dikirimkan ke LLM. LLM menggunakan string sebagai data penghubung serta memanfaatkannya untuk merumuskan respons. Panggilan API Anda ke LLM menyertakan string terpadu dan instruksi untuk model, seperti apakah akan menggunakan grounding secara eksklusif atau sebagai suplemen.
Isi respons disusun dalam format gaya pesan obrolan, dan kontennya diserialisasikan 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>\"}]"
}
]
}
]
Poin-poin penting:
content.typememiliki satu nilai yang valid:text.content.textadalah string yang dikodekan JSON yang berisi dokumen (atau gugus) yang paling relevan yang ditemukan dalam indeks pencarian, mengingat input riwayat kueri dan obrolan. String ini adalah data grounding Anda yang digunakan LLM untuk merumuskan respons terhadap pertanyaan pengguna.Bagian respons ini terdiri dari gugus yang jumlahnya 200 atau lebih sedikit, tidak termasuk hasil apa pun yang gagal memenuhi ambang batas minimum skor reranker 2,5.
String dimulai dengan ID referensi dari gugus (digunakan untuk tujuan kutipan), dan bidang apa pun yang ditentukan dalam konfigurasi semantik indeks target. Dalam contoh ini, asumsikan konfigurasi semantik dalam indeks target memiliki bidang "judul", bidang "istilah", dan bidang "konten".
Ambil respons tidak menyertakan
@search.rerankerBoostedScore.Properti
maxOutputSizeInTokens(maxOutputSizedi2026-05-01-previewdan versi yang lebih baru) pada permintaan retrieve menentukan panjang string.- Dokumen yang melebihi
maxOutputSizeInTokensanggaran output dapat dihilangkan dari respons. Array aktivitas menyertakan peringatan ketika dokumen yang paling relevan melebihi ukuran output maksimum. Untuk mempertahankan lebih banyak konten, tingkatkanmaxOutputSizeInTokens. Untuk informasi selengkapnya, lihat Respons kosong.
- Dokumen yang melebihi
Array aktivitas
Array aktivitas menghasilkan rencana kueri, yang menyediakan transparansi operasional untuk operasi pelacakan, implikasi penagihan, dan pemanggilan sumber daya. Ini juga mencakup subkueri yang dikirim ke alur pengambilan. Untuk respons 206 Partial Content, array berisi error untuk sumber pengetahuan yang gagal. Respons 502 Bad Gateway mungkin memberikan detail kegagalan hanya dalam kesalahan tingkat atas.
Larik aktivitas mencakup komponen berikut:
| Bagian | Deskripsi |
|---|---|
| Aktivitas khusus sumber | Untuk setiap sumber pengetahuan yang disertakan dalam kueri, bagian ini melaporkan waktu yang berlalu dan argumen mana yang digunakan dalam kueri, termasuk peringkat semantik. Jenis sumber pengetahuan termasuk searchIndex, azureBlob, dan sumber pengetahuan lain yang didukung. |
agenticReasoning |
Bagian ini menampilkan konsumsi token untuk penalaran agentik selama proses pengambilan, yang bergantung pada upaya penalaran pengambilan (pratinjau) yang ditentukan. |
modelQueryPlanning |
Untuk pangkalan pengetahuan yang menggunakan LLM untuk perencanaan kueri, bagian ini melaporkan jumlah token yang digunakan untuk input dan jumlah token untuk subkueri. Ini mencakup bidang model dengan bidang modelName yang berisi nama model publik, bukan nama deployment, dari model yang menjalankan aktivitas tersebut. |
modelAnswerSynthesis |
Untuk pangkalan pengetahuan yang menggunakan sintesis jawaban (pratinjau), bagian ini melaporkan jumlah token untuk merumuskan jawaban dan jumlah token output jawaban. Ini mencakup bidang model dengan bidang modelName yang berisi nama model publik, bukan nama deployment, dari model yang menjalankan aktivitas tersebut. |
modelWebSummarization |
Untuk pangkalan pengetahuan yang menggunakan ringkasan web, bagian ini melaporkan konsumsi token untuk meringkas hasil web. Ini mencakup bidang model dengan bidang modelName yang berisi nama model publik, bukan nama deployment, dari model yang menjalankan aktivitas tersebut. |
model |
Untuk rekaman aktivitas yang didukung model, bagian ini mengidentifikasi model yang digunakan untuk melakukan aktivitas. Bagian ini hanya muncul saat Anda mengatur includeActivity ke true. |
imageServing |
Untuk sumber pengetahuan yang telah mengaktifkan penyajian gambar (pratinjau), bagian ini menampilkan imagesRetrieved, imagesSentToModel, totalImageSizeBytes, dan apakah verbalizationUsed pada waktu pengindeksan diaktifkan. Periksa verbalizationUsed dan imagesSentToModel secara terpisah. Respons dapat melaporkan verbalizationUsed sebagai true dan masih mengirim gambar ke model hilir. Untuk mengetahui jumlah gambar yang terhapus, kurangi imagesSentToModel dari imagesRetrieved. |
Contoh berikut menunjukkan array aktivitas.
"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
}
]
Array referensi
Array referensi berasal langsung dari data grounding yang mendasar. Ini termasuk yang sourceData digunakan untuk menghasilkan respons dan terdiri dari setiap dokumen yang ditemukan dan diberi peringkat semantik oleh mesin pengambilan bertindak.
Array referensi mencakup komponen berikut:
| Ladang | Deskripsi |
|---|---|
type |
Jenis sumber pengetahuan yang menghasilkan referensi, seperti searchIndex. |
id |
ID referensi untuk item dalam respons. Ini bukan kunci dokumen dalam indeks pencarian. Gunakan untuk memberikan kutipan. |
activitySource |
Merujuk silang ke id milik entri aktivitas yang menghasilkan referensi, yang berguna untuk penautan sitasi. |
docKey |
Untuk referensi terindeks, kunci dokumen di indeks pencarian cadangan. |
sourceData |
Data pendukung yang digunakan untuk menghasilkan respons. Untuk referensi terindeks, bidang dapat mencakup id dan bidang semantik, seperti title, terms, dan content. Bentuk bervariasi menurut jenis referensi. |
citationUrl (pratinjau) |
URL hanya-baca yang dibuat oleh layanan dan mengarah ke dokumen referensi tersebut dalam indeks pendukung. Dikembalikan hanya untuk sumber pengetahuan terindeks. Untuk mengikuti URL, lihat Mencari dokumen dengan URL kutipan (pratinjau). |
Contoh berikut menunjukkan larik referensi.
"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
}
]
Mencari dokumen dengan URL kutipan (pratinjau)
Mulai dari versi API 2026-08-01-preview, referensi dari sumber pengetahuan yang diindeks dapat menyertakan citationUrl dalam respons retrieve. Gunakan URL ini untuk mengambil bidang terindeks untuk referensi tersebut, seperti title dan content, sehingga Anda dapat merender pratinjau kutipan yang menunjukkan dari mana jawaban berasal tanpa membuka dokumen sumber asli.
citationUrl adalah pencarian terautentikasi ke dalam indeks cadangan, terpisah dari sumber docUrl dan blobUrl.
Contoh berikut menunjukkan URL kutipan yang disanitasi.
"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"
Bidang yang dipilih dan urutannya bergantung pada konfigurasi sumber dan pengambilan yang diindeks.
Penting
Ikuti URL lengkap persis seperti yang tercantum dalam respons dan tampilkan field JSON yang dikembalikan dalam aplikasi Anda. Jangan membuat, mengurai, atau menormalkan URL.
Mengingat URL kutipan, contoh berikut mendapatkan token akses untuk layanan pencarian. Mereka memanggil URL dengan token tersebut di Authorization header. Identitas yang digunakan untuk masuk memerlukan peran Pembaca Data Indeks Pencarian.
Pencarian Azure AI metode pencarian dokumen SDK memerlukan titik akhir, nama indeks, kunci dokumen, bidang yang dipilih, dan versi API sebagai input terpisah. Mereka tidak menerima URL kutipan absolut. Contoh-contoh ini menggunakan HTTP GET terautentikasi untuk mempertahankan URL lengkap yang dihasilkan layanan.
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);
Referensi: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))
Referensi:DefaultAzureCredential
GET {{citation-url}}
Authorization: Bearer {{search-access-token}}
Referensi:Dokumen - Dapatkan
Pencarian dokumen mengembalikan bidang indeks yang dipilih sebagai 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"
}
Saat Anda menggunakan URL kutipan, ingatlah hal berikut:
Periksa
citationUrlsebelum Anda merender kutipan. Ini dapat tidak ada jika respons menghilangkan referensi atau layanan tidak dapat menyelesaikan indeks dukungan atau kunci dokumen.Jika permintaan pengambilan mencakup
x-ms-query-source-authorizationuntuk kontrol akses pada tingkat dokumen, gunakan token pengguna yang sama saat mengakses URL tersebut.URL tetap valid hanya sementara indeks cadangan dan kunci dokumen tetap tidak berubah.
Periksa metadata label sensitivitas pada respons (pratinjau)
Perilaku waktu tunda yang sama yang dijelaskan dalam Terapkan izin pada waktu kueri berlaku di sini: perubahan pada izin akses yang Anda tetapkan di luar 2026-08-01-preview mungkin memerlukan waktu sebelum terlihat dalam 2026-08-01-preview respons pengambilan.
Saat Anda mengkueri pangkalan pengetahuan yang menyerap label sensitivitas Microsoft Purview, respons pengambilan menyertakan metadata label pada dua tingkat:
| Lokasi | Ladang | Deskripsi |
|---|---|---|
| Berdasarkan referensi | sensitivityLabelInfo |
Label sensitivitas yang diterapkan pada setiap dokumen yang dikembalikan dalam larik references. |
| Jawaban | metadata.responseSensitivityLabelInfo |
Label agregat yang mewakili label sensitivitas prioritas tertinggi di semua dokumen yang direferensikan dalam respons. Berguna untuk banner tampilan di sisi klien dan penegakan kebijakan. |
Microsoft Graph menghitung label tingkat respons dari label tiap referensi menggunakan aturan pewarisan label Microsoft Purview. Biasanya, label yang paling ketat menang.
Contoh berikut menunjukkan respons pengambilan data dengan dua dokumen referensi (satu Confidential, satu Internal) dan label pada tingkat respons yang dihasilkan.
{
"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
}
}
}
Jenis referensi yang menampilkan label sensitivitas
Nama bidang dan ketersediaan metadata label bergantung pada jenis sumber pengetahuan yang menghasilkan setiap referensi.
Referensi type |
Bidang label | Tersedia ketika... |
|---|---|---|
azureBlob |
sensitivityLabelInfo |
Sumber pengetahuan blob termasuk sensitivityLabel dalam ingestionPermissionOptions. |
indexedOneLake |
sensitivityLabelInfo |
Sumber pengetahuan OneLake mencakup sensitivityLabel dalam ingestionPermissionOptions. |
indexedSharePoint |
sensitivityLabelInfo |
Sumber pengetahuan yang diindeks SharePoint mencakup sensitivityLabel di ingestionPermissionOptions. |
searchIndex |
sensitivityLabelInfo |
Indeks dasar memiliki purviewEnabled yang disetel ke true dan kolom yang ditandai dengan sensitivityLabel: true. |
Rekomendasi tampilan dan rekomendasi audit
Gunakan
sensitivityLabelInfo.labelIduntuk mencari definisi label lengkap melalui API label sensitivitas Microsoft Graph saat Anda memerlukan properti tambahan, seperti kontrol kebijakan atau izin.Gunakan
metadata.responseSensitivityLabelInfountuk menampilkan banner sensitivitas pada tingkat respons atau menerapkan kontrol kebijakan, seperti menonaktifkan penyalinan dan berbagi, pada seluruh jawaban.Jika sumber pengetahuan Anda menunjuk ke indeks yang dibagi menjadi potongan-potongan, seperti yang diisi datanya melalui vektorisasi terintegrasi atau keahlian Text Split kustom, pastikan kumpulan keahlian memetakan label sensitivitas ke setiap baris potongan. Tanpa pemetaan ini, referensi tingkat gugus tidak difilter dengan benar pada waktu kueri.
Untuk akses administratif yang dapat diaudit ke konten berlabel, lihat Akses baca yang ditingkatkan untuk penyelidikan administratif.
Perilaku server MCP
Titik akhir MCP yang diekspos oleh setiap pangkalan pengetahuan menampilkan bidang label sensitivitas yang sama dengan REST API. Ketika klien yang kompatibel dengan MCP memanggil alat knowledge_base_retrieve, hasil alat tersebut berisi metadata per referensi sensitivityLabelInfo dan metadata tingkat respons metadata.responseSensitivityLabelInfo yang sama seperti yang didokumentasikan sebelumnya di bagian ini. Klien MCP menerapkan kontrol tampilan dan kebijakan berdasarkan label berdasarkan bidang-bidang ini.
Mengambil contoh tindakan (pratinjau)
Contoh berikut menunjukkan berbagai cara untuk memanggil aksi retrieve menggunakan API versi 2026-08-01-preview. Versi ini mendukung set fitur lengkap, termasuk sintesis jawaban dan upaya penalaran yang dapat dikonfigurasi. Untuk penggunaan 2026-04-01, lihat bagian sebelumnya.
- Memeriksa nama model dalam log aktivitas
- Memerlukan sumber pengetahuan agar berhasil
- Mengecualikan sumber pengetahuan dari permintaan
- Menyetel dokumen kandidat per sumber pengetahuan
- Membatasi dokumen dasar akhir
- Memverifikasi pengambilan default pangkalan pengetahuan
- Mengambil alih upaya penalaran default dan menetapkan batas permintaan
- Biarkan layanan memilih upaya penalaran
- Mengatur referensi untuk setiap sumber pengetahuan
- Gunakan usaha berpikir seminimal mungkin
Memeriksa nama model dalam log aktivitas
Atur includeActivity ke true untuk mengembalikan bidang identitas model dalam rekaman aktivitas yang didukung model. Gunakan bidang ini untuk mengonfirmasi model yang telah dikonfigurasi untuk menangani perencanaan kueri, sintesis jawaban, atau peringkasan web saat permintaan pengambilan dilakukan. Contoh berikut mengambil alih pemrosesan hasil tersimpan untuk sumber yang dipilih pada permintaan.
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}");
}
}
Referensi: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,
)
Referensi: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"
}
]
}
Referensi:Pengambilan Informasi - Ambil
Kutipan respons berikut menunjukkan identitas model berlapis:
{
"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
}
]
}
Memerlukan sumber pengetahuan agar berhasil
Atur failOnError di knowledgeSourceParams untuk menandai sumber pengetahuan sebagai wajib. Gunakan parameter ini ketika jawaban parsial akan menyesatkan atau tidak patuh jika sumber tersebut tidak tersedia. Permintaan mengembalikan 502 Bad Gateway jika sumber yang diperlukan gagal, bahkan jika sumber lain berhasil. Untuk panduan penanganan, lihat Memecahkan masalah pada tindakan pengambilan.
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);
Referensi: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)
Referensi: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"
}
]
}
Referensi:Pengambilan Informasi - Ambil
Mengecualikan sumber pengetahuan dari permintaan
Dimulai dengan 2026-08-01-preview versi API, atur neverQuerySource ke true untuk setiap sumber pengetahuan yang ingin Anda kecualikan dari permintaan pengambilan. Request-time neverQuerySource mengambil alih nilai tersimpan alwaysQuerySource untuk permintaan tersebut tanpa mengubah nilai yang disimpan.
Contoh berikut meminta pangkalan pengetahuan yang berisi product-docs-ks dan troubleshooting-ks, tidak termasuk troubleshooting-ks dari permintaan.
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);
Referensi: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)
Referensi: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
}
]
}
Referensi:Pengambilan Informasi - Ambil
Menyesuaikan dokumen kandidat per sumber pengetahuan
maxOutputDocuments Atur knowledgeSourceParams untuk membatasi berapa banyak dokumen kandidat yang dikontribusikan sumber pengetahuan tertentu sebelum pemilihan hasil akhir. Gunakan parameter ini saat Anda ingin mengikat input satu sumber ke alur tanpa memengaruhi yang lain.
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);
Referensi: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)
Referensi: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
}
]
}
Referensi:Pengambilan Informasi - Ambil
Membatasi dokumen dasar akhir
Parameter maxOutputDocuments tingkat atas membatasi jumlah dokumen landasan yang dikembalikan dalam respons final pengambilan. Gunakan parameter ini saat aplikasi Anda memerlukan kutipan atau jumlah referensi yang dapat diprediksi.
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);
Referensi: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)
Referensi: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
}
Referensi:Pengambilan Informasi - Ambil
Tabel berikut ini memperlihatkan cara maxOutputDocuments dan maxOutputSizeInTokens berinteraksi di keempat kombinasi.
maxOutputDocuments |
maxOutputSizeInTokens |
Behavior |
|---|---|---|
| Tidak disebutkan | Tidak disebutkan | Menggunakan perilaku batas respons default maxOutputSizeInTokens . |
| Tidak disebutkan | Ditentukan | Mengabaikan dokumen setelah batas ukuran payload tercapai. |
| Ditentukan | Tidak disebutkan | Mengembalikan hingga jumlah dokumen grounding yang ditentukan dan tidak menerapkan batas maxOutputSizeInTokens. |
| Ditentukan | Ditentukan | Mengembalikan hingga maxOutputDocuments dokumen atau sebanyak dokumen yang dapat dimuat dalam maxOutputSizeInTokens, bergantung pada batas mana yang tercapai lebih dahulu. |
Memastikan pengaturan bawaan pengambilan basis pengetahuan
Basis pengetahuan dapat menyimpan nilai bawaan untuk seluruh permintaan di retrieveDefaults. Kirim dua permintaan pengambilan data untuk memverifikasi pewarisan dan penimpaan khusus permintaan.
Sebelum memulai, selesaikan Konfigurasikan batas pengambilan default (pratinjau). Permintaan pertama menghilangkan ketiga batas seluruh permintaan, sehingga nilai tersimpan 45 detik, delapan dokumen, dan 12.000 token berlaku. Permintaan kedua mengambil alihnya dengan 20 detik, satu dokumen, dan 5.000 token.
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");
Referensi: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")
Referensi:KnowledgeBaseRetrievalClient, KnowledgeBaseRetrievalRequest
Pertama, kirim permintaan yang tidak menyertakan tiga kolom batas yang berlaku untuk seluruh permintaan.
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."
}
]
}
Selanjutnya, ganti ketiga nilai tersebut dalam satu permintaan.
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
}
Referensi:Pengambilan Informasi - Ambil
Jumlah referensi menunjukkan apakah nilai tingkat maxOutputDocuments permintaan atau tersimpan berlaku: respons pertama berisi paling banyak delapan referensi, dan yang kedua berisi paling banyak satu. Respons dapat berisi lebih sedikit referensi ketika lebih sedikit dokumen yang cocok. Respons tidak melaporkan anggaran runtime atau token output yang efektif, tetapi nilai-nilai tersebut masih mengatur pemrosesan permintaan. Penggantian pada permintaan tidak mengubah setelan bawaan yang tersimpan.
Mengambil alih upaya penalaran default dan menetapkan batas permintaan
Contoh berikut menentukan sintesis jawaban, sehingga upaya penalaran pengambilan harus low atau medium. Ini juga menetapkan maxRuntimeInSeconds untuk membatasi waktu proses pengambilan dan maxOutputSizeInTokens untuk membatasi ukuran payload respons.
maxRuntimeInSeconds menerima nilai dari 10 hingga 600 detik dan default menjadi 90 detik. Batas maksimum 600 detik (10 menit) hanya berlaku untuk permintaan pengambilan Pencarian 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
);
Referensi: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)
Referensi: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
}
Referensi:Pengambilan Informasi - Ambil
Biarkan layanan memilih upaya penalaran
Atur retrievalReasoningEffort.kind ke auto dalam permintaan pengambilan untuk mengambil alih default pangkalan pengetahuan. Untuk informasi selengkapnya tentang penalaran otomatis, lihat Atur tingkat upaya penalaran pengambilan (pratinjau).
{
"retrievalReasoningEffort": {
"kind": "auto"
}
}
Referensi:Pengambilan Informasi - Ambil
Mengatur referensi untuk setiap sumber pengetahuan
Gunakan includeReferences dan includeReferenceSourceData dalam knowledgeSourceParams untuk mengontrol sumber mana yang muncul dalam array referensi dan berapa banyak data sumber yang disertakan setiap entri. Contoh berikut menggunakan upaya penalaran default pangkalan pengetahuan.
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
);
Referensi: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)
Referensi: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
}
]
}
Referensi:Pengambilan Informasi - Ambil
Gunakan usaha penalaran seminimal mungkin
Dalam contoh berikut, tidak ada LLM untuk perencanaan kueri cerdas atau sintesis jawaban. String kueri masuk ke mesin pencarian agen untuk pencarian kata kunci atau pencarian hibrida.
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
);
Referensi: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)
Referensi: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"
}
]
}
Referensi:Pengambilan Informasi - Ambil
Memecahkan masalah pada tindakan pengambilan
Dalam 2026-08-01-preview, status respons menunjukkan apakah pengambilan berhasil, sebagian berhasil, atau gagal, dan apa yang harus dilakukan selanjutnya. Gunakan tabel berikut untuk memetakan setiap status ke artinya, lalu lihat bagian terkait untuk panduan pemecahan masalah.
| Status | Meaning |
|---|---|
200 OK |
Pengambilan data berhasil. Dokumen masih dapat dihilangkan jika kontennya melebihi anggaran output. Untuk informasi selengkapnya, lihat Respons kosong. |
400 Bad Request |
Permintaan pengambilan tidak lolos validasi sebelum pengambilan dimulai. |
206 Partial Content |
Setidaknya satu sumber berhasil, dan tidak ada sumber yang gagal ditandai failOnError. Respons berisi hasil yang berasal dari sumber yang berhasil. |
502 Bad Gateway |
Setiap sumber yang dipilih gagal, atau sumber yang ditandai failOnError: true gagal. |
Untuk respons apa pun selain 200, catat versi API, stempel waktu, bodi permintaan yang telah disanitasi, header respons, dan ID permintaan atau ID korelasi. Detail ini membantu Anda mendiagnosis kegagalan dan berbagi masalah dengan dukungan, jika perlu.
400 Bad Request
Gunakan kesalahan tingkat atas untuk mengidentifikasi properti permintaan yang tidak valid. Penyebab umumnya meliputi:
-
knowledgeSourceNamediknowledgeSourceParamstidak terlampir ke basis pengetahuan, ataukindtidak cocok dengan sumber yang dilampirkan. - Nilai permintaan berada di luar rentang yang didukung, atau satu opsi memerlukan opsi lain yang tidak diaktifkan. Misalnya,
includeReferenceSourceDatamemerlukanincludeReferences. -
retrievalReasoningEffort.kindadalahauto, tetapi permintaan menggunakan versi API yang lebih lama dari2026-08-01-preview. - Permintaan menggunakan
auto, ,lowataumedium, tetapi pangkalan pengetahuan tidak menentukan model. - Untuk pengecualian sumber pada waktu permintaan (pratinjau), entri yang sama menetapkan
alwaysQuerySourcedanneverQuerySourceketrue, atau semua sumber pengetahuan yang terlampir dikecualikan.
Sebelum Anda mencoba kembali permintaan, perbaiki properti yang diidentifikasi oleh kesalahan tingkat atas.
206 Partial Content
Periksa setiap activity entri yang berisi error. Aktivitas pengambilan sumber mengidentifikasi sumber pengetahuan yang gagal, dan aktivitas model mengidentifikasi tahap pemrosesan yang gagal. Isi respons masih berisi hasil yang berhasil.
Untuk kesalahan aktivitas pengambilan sumber, penyebab umumnya meliputi:
- Input pada waktu kueri tidak valid, seperti ekspresi
filterAddOnyang salah format. - Sumber pengetahuan atau penyimpangan konfigurasi indeks, seperti bidang yang diganti namanya, konfigurasi semantik yang hilang, atau vektorizer yang tidak valid.
- Otorisasi dependensi yang hilang atau tidak valid, atau izin yang tidak memadai untuk identitas yang digunakan untuk mengkueri sumber.
- Pelambatan dependensi , waktu tunggu habis, atau kegagalan ketersediaan sementara.
Untuk kesalahan aktivitas model, gunakan aktivitas type untuk mengidentifikasi tahap pemrosesan yang gagal. Misalnya, kesalahan modelWebSummarization menunjukkan bahwa ringkasan hasil web gagal.
Jika aplikasi Anda mengizinkan hasil parsial, proses hasil yang berhasil dan rekam setiap sumber atau tahap model yang gagal. Perbaiki kesalahan konfigurasi, otorisasi, dan perizinan sebelum Anda mencoba lagi. Untuk kondisi throttling, timeout, atau gangguan ketersediaan sementara, gunakan percobaan ulang terbatas dengan backoff.
Jika hasil tidak aman tanpa sumber tertentu dan jenis sumber tersebut mendukung alwaysQuerySource, atur alwaysQuerySource dan failOnError. Opsi pertama memastikan sumber dipilih, dan opsi kedua mengembalikan error fatal jika kueri terhadap sumber tersebut gagal.
Sumber pengetahuan server MCP (pratinjau) tidak mendukung alwaysQuerySource; untuk sumber tersebut, failOnError hanya berlaku saat sumber dipilih.
failOnError tidak berlaku untuk kegagalan aktivitas model.
502 Bad Gateway
Kesalahan tingkat atas menjelaskan salah satu dari dua jalur kegagalan keras:
- Setiap sumber yang dipilih gagal: Setiap sumber yang dipilih mengembalikan kesalahan. Sumber yang berhasil diselesaikan dengan nol dokumen yang cocok bukanlah sumber yang gagal. Periksa setiap kegagalan sumber untuk konfigurasi bersama, otorisasi, dependensi, atau masalah ketersediaan.
-
Sumber
failOnErrorgagal: Sumber yang diperlukan tidak dapat dikueri. Sumber lain mungkin telah berhasil, tetapi layanan tidak mengembalikan hasil parsial karena sumber yang diperlukan gagal.
Kegagalan sumber yang mendasar umumnya adalah jenis yang sama dengan yang dijelaskan untuk 206 Partial Content: input khusus sumber, penyimpangan konfigurasi sumber atau indeks yang tidak valid, otorisasi atau izin dependensi, pembatasan, batas waktu, atau ketersediaan dependensi sementara.
Respons hard 502 mungkin tidak menyertakan array activity dan hanya mencantumkan nama sumber serta kegagalan yang mendasarinya dalam pesan kesalahan level teratas. Perbaiki kesalahan konfigurasi, otorisasi, dan perizinan sebelum Anda mencoba lagi. Gunakan percobaan ulang terbatas dengan backoff hanya untuk pelambatan, batas waktu terlampaui, atau kegagalan ketersediaan sementara. Jangan menafsirkan 502 Bad Gateway respons sebagai pemadaman Pencarian Azure AI tanpa memeriksa kegagalan sumber yang mendasar.
Respons kosong
Langkah pencarian mungkin menemukan sebuah dokumen, tetapi layanan tetap dapat tidak menyertakannya dalam respons akhir jika konten yang menjadi dasarnya melebihi maxOutputSizeInTokens batas output (maxOutputSize di 2026-05-01-preview dan yang lebih baru). Ketika kondisi ini terjadi, array aktivitas menunjukkan bahwa ditemukan kecocokan, dan catatan aktivitas menyertakan peringatan bahwa dokumen yang paling relevan melebihi ukuran keluaran maksimum. Array referensi tersebut dan konten respons yang didasarkan pada sumber kosong untuk dokumen itu. Untuk mempertahankan lebih banyak konten, tingkatkan maxOutputSizeInTokens.
Untuk menghindari perilaku ini, indeks dokumen sumber besar sebagai potongan yang lebih kecil dengan pengidentifikasi stabil dan metadata sumber. Ini berlaku terutama untuk artikel manual, kebijakan, atau pangkalan pengetahuan yang panjang.
Memanggil titik akhir MCP
Warning
Implementasi MCP rentan terhadap risiko, seperti serangan, kegagalan kaskading, dan hilangnya pengawasan manusia. Anda dapat mengurangi risiko ini dengan memverifikasi server MCP dari segi keamanan dan keandalan, mengikuti praktik yang direkomendasikan Microsoft dan praktik terbaik industri, serta menerapkan mekanisme persetujuan dan memantau perilaku berantai.
MCP adalah protokol terbuka yang menstandarkan cara aplikasi AI terhubung ke sumber dan alat data eksternal.
Dalam Pencarian Azure AI, setiap pangkalan pengetahuan adalah server MCP mandiri yang mengekspos alat knowledge_base_retrieve. Setiap klien yang kompatibel dengan MCP, termasuk Foundry Agent Service, GitHub Copilot, Claude, dan Cursor, dapat memanggil alat ini untuk meminta pangkalan pengetahuan.
Mengautentikasi ke titik akhir MCP
Setiap pangkalan pengetahuan memiliki titik akhir MCP di URL berikut:
https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
Versi API yang Anda tentukan menentukan apa yang dikembalikan koneksi. Dengan menggunakan 2026-08-01-preview, pangkalan pengetahuan mengembalikan jawaban yang disintesis ketika pangkalan pengetahuan yang mendasar dikonfigurasi dengan LLM dan upaya penalaran yang kompatibel. Dengan menggunakan 2026-04-01, proses pengambilan selalu bersifat minimal dan ekstraktif, dan koneksi hanya mengembalikan data landasan.
Cara Anda mengautentikasi ke titik akhir ini tergantung pada klien MCP Anda. Saat Anda menggunakan Azure OpenAI Responses API dengan alat MCP knowledge_base_retrieve, Anda melakukan autentikasi baik untuk panggilan Responses API ke Azure OpenAI maupun untuk permintaan MCP ke Pencarian Azure AI. Jika klien MCP Anda memanggil titik akhir ini secara langsung, Anda hanya melakukan autentikasi ke Pencarian Azure AI.
Untuk autentikasi Pencarian Azure AI, gunakan salah satu metode berikut:
-
Meneruskan token pembawa di
Authorizationheader (disarankan) -
Meneruskan kunci admin di
api-keyheader
Catatan
Klien MCP mengonfigurasi header kustom secara berbeda. Misalnya, Foundry Agent Service menyuntikkan header melalui koneksi proyek, sementara klien seperti GitHub Copilot memerlukan header di JSON server MCP.
Menggunakan token pembawa untuk autentikasi MCP
Metode yang direkomendasikan untuk autentikasi MCP adalah token pembawa, yang menghindari penyimpanan kunci sensitif dalam file konfigurasi. Identitas di balik token harus memiliki peran Pembaca Data Indeks Pencarian yang ditetapkan pada layanan pencarian. Untuk informasi selengkapnya, lihat Hubungkan aplikasi Anda ke Pencarian Azure AI menggunakan identitas.
#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());
Referensi:Gunakan AZURE OpenAI Responses API
import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
openai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"] # Example: https://<resource-name>.openai.azure.com
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
credential = DefaultAzureCredential()
# Create token providers for Azure OpenAI and Azure AI Search
openai_token_provider = get_bearer_token_provider(
credential, "https://cognitiveservices.azure.com/.default"
)
search_token_provider = get_bearer_token_provider(
credential, "https://search.azure.com/.default"
)
# Create the Azure OpenAI client
client = AzureOpenAI(
azure_endpoint=openai_endpoint,
azure_ad_token_provider=openai_token_provider,
api_version=os.environ["OPENAI_API_VERSION"], # Example: 2025-04-01-preview
)
# Create a response using the MCP tool configuration
response = client.responses.create(
model="MODEL_NAME",
input="What causes the strongest nighttime brightness patterns in this dataset?",
tools=[
{
"type": "mcp",
"server_label": "search_kb",
"server_url": mcp_server_url,
"allowed_tools": ["knowledge_base_retrieve"],
"headers": {
"Authorization": f"Bearer {search_token_provider()}"
},
"require_approval": "never",
}
],
)
print(response.output_text)
Referensi:Gunakan AZURE OpenAI Responses API
// This code snippet is currently unavailable.
Menggunakan kunci admin untuk autentikasi MCP
Kunci admin memberikan akses baca-tulis penuh ke layanan pencarian, jadi gunakan hanya di lingkungan pengembangan atau ketika token pembawa tidak tersedia. Untuk informasi selengkapnya, lihat Hubungkan ke Pencarian Azure AI menggunakan kunci API.
Tip
Contoh berikut hanya memperlihatkan header yang berbeda dari contoh token pembawa. Untuk penyiapan lengkap, lihat Menggunakan token pembawa untuk autentikasi 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)
);
Referensi:Gunakan AZURE OpenAI Responses API
import os
mcp_server_url = os.environ["AZURE_SEARCH_MCP_ENDPOINT"] # Example: https://<search-service-name>.search.windows.net/knowledgebases/<knowledge-base-name>/mcp?api-version=<api-version>
search_admin_key = os.environ["AZURE_SEARCH_ADMIN_KEY"] # Example: <search-api-key>
tools = [
{
"type": "mcp",
"server_label": "search_kb",
"server_url": mcp_server_url,
"allowed_tools": ["knowledge_base_retrieve"],
"headers": {"api-key": search_admin_key},
"require_approval": "never",
}
]
Referensi:Gunakan AZURE OpenAI Responses API
// This code snippet is currently unavailable.
Meninjau respons MCP
Ketika klien MCP memanggil knowledge_base_retrieve, klien tersebut menerima hasil tool MCP alih-alih envelope response, activity, dan references dari tindakan retrieve. Banyak klien MCP menampilkan hasil dari tool tersebut di bawah objek result tingkat atas, sehingga payload yang perlu Anda harapkan adalah 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>\"}]"
}
]
}
}
Poin-poin penting:
result.content[]berisi output alat MCP yang dikembalikan oleh pangkalan pengetahuan.result.content[].typeadalahtext.result.content[].textberisi data grounding yang diambil sebagai string yang dikodekan JSON.Tidak seperti tindakan pengambilan, respons MCP saat ini tidak mengembalikan array
activityataureferencessecara terpisah, dan tidak mengisi entriresourceuntuk konten yang dikembalikan.
Konten terkait
- Pengambilan informasi berbasis Agentic dalam Pencarian Azure AI
- Penegakan ACL dan RBAC saat kueri (pratinjau)
- Gunakan pengindeks blob atau sumber pengetahuan untuk mengimpor metadata cakupan RBAC (pratinjau)
- Agentic RAG: Bangun mesin pengambilan penalaran dengan Pencarian Azure AI (video YouTube)
- Demo Azure OpenAI yang menampilkan pengambilan informasi berbasis agen