Menentukan proyeksi indeks untuk pengindeksan induk-turunan

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.

Jika Anda memotong konten untuk pola RAG atau vektorisasi, Anda dapat menentukan proyeksi indeks untuk mengontrol pengindeksan satu-ke-banyak, di mana konten sumber (satu) diproyeksikan ke satu atau beberapa indeks (banyak). Niat proyeksi indeks adalah untuk mengontrol apakah elemen dokumen induk, seperti nama file atau tanggal pembuatan:

  • Ulangi untuk setiap anak (gugus) dalam satu indeks
  • Diindeks sebagai dokumen pencarian mandiri dalam indeks yang sama
  • Atau dimasukkan ke dalam indeks terpisah

Sebaiknya ulangi bidang induk dalam satu indeks karena memiliki bentuk dokumen yang berbeda atau memisahkan konten menjadi dua indeks bisa sulit dikueri, terutama dalam pencarian klasik di mana gabungan indeks tidak didukung.

Dalam Pencarian Azure AI, pemotongan dilakukan oleh kemampuan dan dengan demikian tergantung pada pengindeks. Untuk menentukan proyeksi indeks, tentukan dalam skillset.

Prasyarat

Set keterampilan berisi proyeksi pengindeks yang membentuk data untuk pengindeksan satu ke banyak. Kumpulan keterampilan juga dapat memiliki kemampuan lain, seperti penyematan AzureOpenAIEmbedding jika skenario Anda mencakup vektorisasi terintegrasi.

Pilih pendekatan

Proyeksi indeks menghasilkan dokumen "turunan" (gugus) untuk setiap dokumen "induk". Pilih cara menangani konten induk:

Pendekatan Deskripsi Konfigurasi
Indeks tunggal, bidang induk berulang (disarankan ) Bidang induk diulang untuk setiap potongan. Semua dokumen memiliki bentuk seragam. Atur pengindeks targetIndexName dan proyeksi pengindeksan targetIndexName ke indeks yang sama. Atur projectionMode ke skipIndexingParentDocuments.
Indeks tunggal, bentuk dokumen campuran Dokumen induk dan dokumen gugus berdampingan. Dokumen induk memiliki bidang gugus null. Atur kedua targetIndexName nilai ke indeks yang sama. Atur projectionMode ke includeIndexingParentDocuments (atau hilangkan, karena merupakan default).
Dua atau beberapa indeks terpisah Indeks induk untuk pencarian metadata, indeks turunan untuk pencarian. Tidak ada join pada waktu eksekusi kueri. Atur pengindeks targetIndexName ke indeks induk. Atur proyeksi indeks targetIndexName ke indeks anak. Array selectors menentukan kuantitas dan komposisi indeks anak.

Untuk sebagian besar skenario RAG, gunakan pendekatan pertama. Lihat contoh RAG klasik.

  1. Buat indeks yang dirancang untuk segmen, dengan mencakup bidang induk.
  2. Buat set keterampilan dengan keterampilan potongan dan indexProjections.
  3. Buat pengindeks yang menunjuk ke sumber data yang didukung.

Jika sumber data Anda mendukung pelacakan perubahan, pengindeks menyinkronkan perubahan secara otomatis.

Membuat indeks untuk pengindeksan satu ke banyak

Apakah Anda membuat satu indeks untuk potongan dengan nilai induk yang berulang, atau indeks terpisah untuk penempatan bidang induk dan anak, indeks utama yang digunakan untuk pencarian dirancang berdasarkan potongan data. Skema indeks harus memiliki bidang berikut:

  • Bidang kunci dokumen secara unik mengidentifikasi setiap dokumen. Ini harus didefinisikan sebagai jenis Edm.String dengan penganalisis keyword .

  • Kolom yang mengaitkan setiap segmen dengan induknya. Jenisnya harus berjenis Edm.String. Ini tidak boleh menjadi bidang kunci dokumen, dan nilai filterable harus disetel ke true. Ini disebut sebagai parent_id dalam contoh dan sebagai nilai kunci yang diproyeksikan dalam artikel ini.

  • Bidang lain untuk konten, seperti teks atau bidang gugus yang di-vektorisasi.

Indeks harus ada di layanan pencarian sebelum Anda membuat set keterampilan atau menjalankan pengindeks. Skillset selectors yang Anda tentukan harus menyertakan bidang-bidang ini.

Skema indeks tunggal termasuk bidang induk dan anak

Indeks tunggal yang dirancang di sekitar gugus dengan konten induk yang diulang untuk setiap gugus adalah pola yang dominan untuk skenario pencarian RAG dan vektor. Kemampuan untuk mengaitkan konten induk yang benar dengan setiap gugus diaktifkan melalui proyeksi indeks.

Skema berikut adalah contoh yang memenuhi persyaratan untuk proyeksi indeks. Dalam contoh ini:

  • Bidang induk adalah parent_id dan judul, dan bidang tersebut diulang untuk setiap gugus
  • Bidang anak adalah gugus vektor dan vektor nonvektor. chunk_id adalah ID dokumen indeks ini.

Anda dapat menggunakan portal Azure, REST API, atau Azure SDK untuk buat indeks.

Gunakan klien REST atau portal Azure Tambahkan indeks dan opsi JSON untuk membuat indeks.

{
    "name": "my_consolidated_index",
    "fields": [
        {"name": "chunk_id", "type": "Edm.String", "key": true, "filterable": true, "analyzer": "keyword"},
        {"name": "parent_id", "type": "Edm.String", "filterable": true},
        {"name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "retrievable": true},
        {"name": "chunk", "type": "Edm.String","searchable": true,"retrievable": true},
        {"name": "chunk_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": false, "stored": false, "dimensions": 1536, "vectorSearchProfile": "hnsw"}
    ],
    "vectorSearch": {
        "algorithms": [{"name": "hnsw", "kind": "hnsw", "hnswParameters": {}}],
        "profiles": [{"name": "hnsw", "algorithm": "hnsw"}]
    }
}

Menambahkan proyeksi indeks ke set keterampilan

Proyeksi indeks didefinisikan di dalam definisi skillset dan terutama didefinisikan sebagai arrayselectors, di mana setiap pemilih sesuai dengan indeks target yang berbeda pada layanan pencarian. Bagian ini dimulai dengan sintaksis dan contoh untuk konteks, diikuti dengan referensi parameter.

Proyeksi indeks umumnya tersedia. Kami merekomendasikan API stabil terbaru:

Berikut adalah contoh payload untuk definisi proyeksi indeks yang mungkin Anda gunakan untuk memproyeksikan keluaran halaman individual oleh fungsi Pemisahan Teks sebagai dokumen tersendiri dalam indeks pencarian.

Jika dokumen induk membawa metadata izin untuk akses tingkat dokumen, seperti metadata_user_ids, , metadata_group_idsatau metadata_spo_site_url, sertakan bidang tersebut di mappings. Setiap gugus harus mewarisinya agar filter izin waktu kueri diterapkan. Untuk informasi selengkapnya, lihat Memilih tempat untuk mengisi bidang ACL.

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "my_consolidated_index",
            "parentKeyFieldName": "parent_id",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "chunk_vector",
                    "source": "/document/pages/*/chunk_vector",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "title",
                    "source": "/document/title",
                    "sourceContext": null,
                    "inputs": []
                }
            ]
        }
    ],
    "parameters": {
        "projectionMode": "skipIndexingParentDocuments"
    }
}

Referensi parameter

Parameter proyeksi dari indeks Definisi
selectors Array dengan parameter untuk korpus pencarian utama, biasanya indeks yang dirancang di sekitar gugus. Anda dapat mengirim konten ke beberapa indeks anak dengan menentukan beberapa pemilih. Skema indeks harus ada di layanan pencarian sebelum Anda menjalankan pengindeks.
parameters Parameter kamus dari properti konfigurasi yang khusus untuk proyeksi indeks.

Parameter memiliki elemen berikut sebagai bagian dari definisinya.

Parameter Definisi
parameters.projectionMode Parameter opsional yang memberikan instruksi kepada pengindeks. Nilai yang valid meliputi includeIndexingParentDocuments dan skipIndexingParentDocuments.

Nilai terbaik untuk parameter ini adalah skipIndexingParentDocuments. Anda harus menggunakannya ketika dokumen yang dipotong adalah target pencarian utama.

Jika Anda tidak mengatur skipIndexingParentDocuments untuk projectionMode, Anda mendapatkan includeIndexingParentDocuments secara otomatis karena ini adalah default. Ini menambahkan dokumen pencarian tambahan dalam indeks Anda yang null untuk gugus, tetapi diisi dengan konten khusus induk. Misalnya, jika lima PDF berkontribusi 100 gugus ke indeks, maka jumlah dokumen dalam indeks adalah 105. Lima dokumen yang dibuat untuk bidang induk memiliki null untuk bidang gugus (turunan), membuatnya sangat berbeda dari sebagian besar dokumen dalam indeks. Untuk alasan ini, sebaiknya projectionMode atur ke skipIndexingParentDocuments.

Pemilih memiliki elemen berikut sebagai bagian dari definisinya.

Penyeleksi Definisi
selectors.targetIndexName Nama indeks tempat data indeks diproyeksikan. Ini adalah indeks terpotong tunggal dengan bidang induk berulang, atau indeks turunan jika Anda menggunakan indeks terpisah untuk konten induk-turunan.
selectors.parentKeyFieldName Nama bidang yang menyediakan kunci untuk dokumen induk.
selectors.sourceContext Anotasi pengayaan yang menentukan granularitas untuk memetakan data ke dalam dokumen pencarian individual. Untuk informasi selengkapnya, lihat Konteks keterampilan dan bahasa anotasi input.
selectors.mappings Array pemetaan data yang telah diperkaya ke kolom dalam indeks pencarian. Setiap pemetaan terdiri dari:
name: Nama bidang dalam indeks pencarian tempat data harus diindeks.
source: Jalur anotasi pengayaan dari mana data harus diambil.

Masing-masing mapping juga dapat menentukan data secara rekursif dengan bidang sourceContext dan inputs yang opsional, mirip dengan penyimpanan pengetahuan atau Keterampilan Pembentuk. Bergantung pada aplikasi Anda, parameter ini memungkinkan Anda membentuk data ke dalam bidang jenis Edm.ComplexType dalam indeks pencarian. Beberapa LLM tidak menerima jenis kompleks dalam hasil pencarian, sehingga LLM yang Anda gunakan menentukan apakah pemetaan jenis kompleks berguna atau tidak.

Parameter mappings ini penting. Anda harus secara eksplisit memetakan setiap bidang dalam indeks anak, kecuali untuk bidang ID seperti kunci dokumen dan ID induk.

Persyaratan ini berbeda dengan konvensi pemetaan bidang lainnya dalam Pencarian Azure AI. Untuk beberapa jenis sumber data, pengindeks dapat secara implisit memetakan bidang berdasarkan nama serupa, atau karakteristik yang diketahui (misalnya, pengindeks blob menggunakan jalur penyimpanan metadata unik sebagai kunci dokumen default). Namun, untuk proyeksi pengindeksan, Anda harus secara eksplisit menentukan setiap pemetaan bidang di sisi "banyak" dari hubungan.

Penting

Jangan membuat pemetaan bidang untuk bidang kunci induk. Melakukannya mengganggu pelacakan perubahan dan refresh data yang disinkronkan.

Meninjau pemetaan bidang

Pengindeks berafiliasi dengan tiga jenis pemetaan bidang yang berbeda. Sebelum Anda menjalankan pengindeks, periksa pemetaan bidang Anda dan ketahui kapan harus menggunakan setiap jenis.

Pemetaan bidang ditentukan dalam pengindeks dan digunakan untuk memetakan bidang sumber ke bidang indeks. Pemetaan bidang digunakan untuk jalur data yang mengangkat data dari sumber dan meneruskannya untuk pengindeksan, tanpa langkah pemrosesan keterampilan menengah. Biasanya, pengindeks dapat secara otomatis memetakan bidang yang memiliki nama dan jenis yang sama. Pemetaan bidang eksplisit hanya diperlukan ketika ada perbedaan. Dalam pengindeksan satu-ke-banyak serta pola-pola yang telah dibahas sejauh ini, Anda mungkin tidak memerlukan pemetaan bidang.

Pemetaan bidang output didefinisikan dalam pengindeks dan digunakan untuk memetakan konten yang diperkaya yang dihasilkan oleh sekumpulan keterampilan ke sebuah bidang di indeks utama. Potongan dianggap sebagai konten yang diperkaya karena pembuatan oleh keterampilan (Pemecahan Teks), tetapi Anda tidak memerlukan pemetaan bidang output untuk potongan, atau untuk proyeksi indeks yang ditentukan oleh pemetaan pengatur.

Selectors.mappings didefinisikan dalam set keterampilan dan dipetakan ke bidang dalam indeks anak. Dalam kasus di mana indeks anak juga menyertakan bidang induk (seperti dalam solusi indeks terkonsolidasi), Anda harus menyiapkan pemetaan bidang untuk setiap bidang yang memiliki konten, termasuk bidang judul tingkat induk, dengan asumsi Anda ingin judul muncul di setiap dokumen yang dipotong. Jika Anda menggunakan indeks induk dan anak yang terpisah, selector harus memiliki pemetaan untuk hanya bidang-bidang pada tingkat anak.

Catatan

Pemetaan bidang output dan pemetaan selektor menerima simpul pohon dokumen yang diperkaya sebagai input sumber. Mengetahui cara menentukan jalur ke setiap simpul sangat penting untuk menyiapkan jalur data. Untuk mempelajari selengkapnya tentang sintaks jalur, lihat Mereferensikan jalur ke simpul yang diperkaya dan definisi set keterampilan misalnya.

Menjalankan pengindeks

Setelah Anda membuat sumber data, indeks, dan set keterampilan, Anda siap untuk membuat dan menjalankan pengindeks. Langkah ini menempatkan alur ke dalam eksekusi.

Anda dapat mengkueri indeks pencarian setelah pemrosesan menyimpulkan untuk menguji solusi Anda.

Siklus hidup konten

Bergantung pada sumber data yang mendasar, pengindeks biasanya dapat memberikan pelacakan perubahan yang sedang berlangsung dan deteksi penghapusan. Bagian ini menjelaskan siklus hidup konten dalam konteks pengindeksan satu-ke-banyak yang terkait dengan pembaruan data.

Untuk sumber data yang menyediakan pelacakan perubahan dan deteksi penghapusan, proses pengindeks dapat mengambil perubahan dalam data sumber Anda. Setiap kali Anda menjalankan pengindeks dan set keterampilan, proyeksi indeks diperbarui jika set keterampilan atau data sumber yang mendasarinya telah berubah. Setiap perubahan yang diambil oleh pengindeks disebarluaskan melalui proses pengayaan ke proyeksi dalam indeks, memastikan bahwa data yang Diproyeksikan adalah representasi konten saat ini di sumber data asal. Aktivitas refresh data ditangkap dalam nilai kunci yang diproyeksikan untuk setiap potongan. Nilai ini akan diperbarui saat data yang mendasar berubah.

Catatan

Meskipun Anda dapat mengedit data secara manual dalam dokumen yang diproyeksikan menggunakan API pendorongan indeks, Anda harus menghindarinya. Pembaruan manual untuk indeks ditimpa pada pemanggilan alur berikutnya, dengan asumsi dokumen dalam data sumber diperbarui dan sumber data mengaktifkan pelacakan perubahan atau deteksi penghapusan.

Konten yang diperbarui

Jika Anda menambahkan konten baru ke sumber data Anda, potongan baru atau dokumen anak ditambahkan ke indeks ketika pengindeks berikutnya dijalankan.

Jika Anda memodifikasi konten yang ada di sumber data, potongan diperbarui secara bertahap dalam indeks pencarian jika sumber data yang Anda gunakan mendukung pelacakan perubahan dan deteksi penghapusan. Misalnya, jika kata atau kalimat berubah dalam dokumen, potongan dalam indeks target yang berisi kata atau kalimat tersebut diperbarui pada pengindeks berikutnya yang dijalankan. Jenis pembaruan lainnya, seperti mengubah jenis bidang dan beberapa atribusi, tidak didukung untuk bidang yang ada. Untuk informasi selengkapnya tentang pembaruan yang diizinkan, lihat Memperbarui skema indeks.

Beberapa sumber data seperti Azure Storage mendukung pelacakan perubahan dan penghapusan secara default, berdasarkan tanda waktu. Sumber data lain seperti Microsoft OneLake, Azure SQL, atau Azure Cosmos DB harus dikonfigurasi untuk pelacakan perubahan.

Konten yang dihapus

Jika konten sumber tidak ada lagi (misalnya, jika teks disingkat agar memiliki lebih sedikit gugus), dokumen anak yang sesuai dalam indeks pencarian akan dihapus. Dokumen anak yang tersisa juga mendapatkan kuncinya diperbarui untuk menyertakan nilai hash baru, meskipun kontennya tidak berubah.

Jika dokumen induk dihapus sepenuhnya dari sumber data, dokumen anak yang sesuai hanya dihapus jika penghapusan terdeteksi oleh dataDeletionDetectionPolicy pada definisi sumber data. Jika Anda tidak memiliki dokumen induk yang dataDeletionDetectionPolicy dikonfigurasi dan perlu dihapus dari sumber data, maka Anda harus menghapus dokumen turunan secara manual jika dokumen tersebut tidak lagi diinginkan.

Nilai kunci yang diproyeksikan

Untuk memastikan integritas data untuk konten yang diperbarui dan dihapus, penyegaran data dalam pengindeksan satu-ke-banyak bergantung pada nilai kunci yang diproyeksikan di sisi "banyak". Jika Anda menggunakan vektorisasi terintegrasi atau wizard Impor data, nilai kunci yang diproyeksikan adalah parent_id bidang di sisi indeks yang terpartisi atau "banyak".

Nilai kunci yang diproyeksikan adalah pengidentifikasi unik yang dihasilkan pengindeks untuk setiap dokumen. Ini memastikan keunikan dan memungkinkan pelacakan perubahan dan penghapusan berfungsi dengan benar. Kunci ini berisi segmen berikut:

  • Hash acak untuk menjamin keunikan. Hash ini berubah jika dokumen induk diperbarui pada saat pengindeks berjalan berikutnya.
  • Kunci dokumen induk.
  • Jalur anotasi pengayaan yang mengidentifikasi konteks untuk dokumen yang dihasilkan.

Misalnya, jika Anda membagi dokumen induk dengan nilai kunci "aa1b22c33" menjadi empat halaman, dan kemudian masing-masing halaman tersebut diproyeksikan sebagai dokumennya sendiri melalui proyeksi indeks:

  • aa1b22c33
  • aa1b22c33_pages_0
  • aa1b22c33_pages_1
  • aa1b22c33_pages_2

Jika dokumen induk diperbarui dalam data sumber, mungkin menghasilkan lebih banyak halaman yang dipotong, perubahan hash acak, lebih banyak halaman ditambahkan, dan konten setiap gugus diperbarui agar sesuai dengan apa pun yang ada di dokumen sumber.

Contoh indeks data induk-anak terpisah

Bagian ini memperlihatkan contoh untuk indeks induk dan turunan terpisah. Ini adalah pola yang jarang terjadi, tetapi ada kemungkinan Anda mungkin memiliki persyaratan aplikasi yang paling baik terpenuhi menggunakan pendekatan ini. Dalam skenario ini, Anda memproyeikan konten induk-turunan ke dalam dua indeks terpisah.

  1. Buat dua skema indeks.

    Setiap skema memiliki bidang untuk tingkat kedetailan tertentu, dengan bidang ID induk yang umum untuk kedua indeks yang digunakan dalam kueri pencarian. Korpus pencarian utama adalah indeks anak, tetapi Anda dapat mengeluarkan kueri pencarian untuk mengambil bidang induk untuk setiap kecocokan dalam hasilnya. Pencarian Azure AI tidak mendukung gabungan pada waktu kueri, sehingga kode aplikasi atau lapisan orkestrasi Anda perlu menggabungkan atau menyusun hasil yang dapat diteruskan ke aplikasi atau proses.

    Indeks induk memiliki bidang parent_id dan judul. parent_id adalah kunci dokumen. Anda tidak memerlukan konfigurasi pencarian vektor kecuali Anda ingin mem-vektorisasi bidang di tingkat dokumen induk.

    {
        "name": "my-parent-index",
        "fields": [
    
            {"name": "parent_id", "type": "Edm.String", "key":true, "filterable": true},
            {"name": "title", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "retrievable": true}
        ]
    }
    

    Indeks anak memiliki kolom yang dikelompokkan, ditambah kolom parent_id. Jika Anda menggunakan vektorisasi terintegrasi, profil penilaian, peringkat semantik, atau penganalisis, Anda akan mengaturnya dalam indeks anak.

    {
        "name": "my-child-index",
        "fields": [
            {"name": "chunk_id", "type": "Edm.String", "key": true, "filterable": true, "analyzer": "keyword"},
            {"name": "parent_id", "type": "Edm.String", "filterable": true},
             {"name": "chunk", "type": "Edm.String","searchable": true,"retrievable": true},
            {"name": "chunk_vector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": false, "stored": false, "dimensions": 1536, "vectorSearchProfile": "hnsw"}
        ],
        "vectorSearch": {
            "algorithms": [{"name": "hsnw", "kind": "hnsw", "hnswParameters": {}}],
            "profiles": [{"name": "hsnw", "algorithm": "hnsw"}]
        },
        "scoringProfiles": [],
        "semanticConfiguration": [],
        "analyzers": []
    }
    
  2. Perbarui pengindeks untuk menentukan indeks induk sebagai target.

    Definisi pengindeks menentukan komponen alur. Dalam definisi pengindeks, nama indeks yang akan disediakan adalah indeks induk. Jika Anda memerlukan pemetaan bidang untuk bidang tingkat induk, tentukan di outputFieldMappings. Untuk pengindeksan satu-ke-banyak yang menggunakan indeks terpisah, definisi pengindeks mungkin terlihat seperti contoh berikut.

    {
      "name": "my-indexer",
      "dataSourceName": "my-ds",
      "targetIndexName": "my-parent-index",
      "skillsetName" : "my-skillset",
      "parameters": { },
      "fieldMappings": (optional) Maps fields in the underlying data source to fields in an index,
      "outputFieldMappings" : (required) Maps skill outputs to fields in an index,
    }
    
  3. Tambahkan indexProjections ke set keterampilan.

    Berikut adalah contoh definisi proyeksi indeks yang menentukan jalur data yang harus digunakan pengindeks untuk mengindeks konten. Ini menentukan nama indeks turunan dalam definisi proyeksi indeks dan menentukan pemetaan setiap bidang pada level turunan atau tingkat chunk. Ini adalah satu-satunya tempat nama indeks anak ditentukan.

    Perhatikan bahwa parameters null dan menggunakan default includeIndexingParentDocuments. Pengindeks mengisi indeks induk. Array selectors digunakan untuk memproyeksikan dokumen gugus ke indeks anak.

    "indexProjections": {
        "selectors": [
            {
                "targetIndexName": "my-child-index",
                "parentKeyFieldName": "parent_id",
                "sourceContext": "/document/pages/*",
                "mappings": [
                    {
                        "name": "chunk",
                        "source": "/document/pages/*",
                        "sourceContext": null,
                        "inputs": []
                    },
                    {
                        "name": "chunk_vector",
                        "source": "/document/pages/*/chunk_vector",
                        "sourceContext": null,
                        "inputs": []
                    }
                ]
            }
        ],
        "parameters": {}
    }
    
  4. Jalankan pengindeks. Jika sebelumnya Anda menjalankan pengindeks, ingatlah untuk mengatur ulang terlebih dahulu.

    Anda harus memiliki dua indeks yang diisi dengan konten yang sesuai. Kueri indeks di Search Explorer untuk memverifikasi masing-masing memiliki konten yang benar.

Langkah berikutnya

Pemotongan data dan pengindeksan satu ke banyak adalah bagian dari pola RAG klasik dalam Pencarian Azure AI. Lanjutkan ke tutorial dan sampel kode berikut untuk mempelajari selengkapnya tentang hal itu.