Memetakan output yang diperkaya ke bidang dalam indeks pencarian (pemetaan bidang output)

Note

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.

Diagram Tahapan Pengindeks dengan Pemetaan Bidang Output disorot.

Artikel ini menjelaskan cara menyiapkan pemetaan bidang output, yang menentukan jalur data antara data dalam memori yang dihasilkan selama pemrosesan set keterampilan dan bidang target dalam indeks pencarian. Selama eksekusi indexer, informasi yang dihasilkan oleh skill hanya ada di memori. Untuk mempertahankan informasi ini dalam indeks pencarian, Anda harus memberi tahu pengindeks tempat mengirim data.

Pemetaan bidang output ditentukan dalam pengindeks dan memiliki elemen berikut:

"outputFieldMappings": [
  {
    "sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],

Berbeda dengan fieldMappings definisi yang memetakan jalur antara bidang sumber verbatim dan bidang indeks, definisi outputFieldMappings memetakan pengayaan dalam memori ke bidang dalam indeks pencarian.

Prasyarat

  • Pengindeks, indeks, sumber data, dan kumpulan keterampilan.

  • Bidang indeks harus berupa bidang yang sederhana atau merupakan bidang tingkat atas. Anda tidak dapat mengeluarkan ke jenis kompleks. Namun, jika Anda memiliki jenis kompleks, Anda dapat menggunakan definisi bidang output untuk meratakan bagian dari jenis kompleks dan mengirimkannya ke koleksi dalam indeks pencarian.

Kapan menggunakan pemetaan bidang output

Pemetaan bidang output diperlukan jika pengindeks Anda memiliki set keterampilan terlampir yang membuat informasi baru yang Anda inginkan dalam indeks Anda. Contohnya meliputi:

  • Vektor dari keterampilan penyematan.
  • Kemampuan pengenalan karakter optik (OCR) untuk mengekstrak teks dari gambar.
  • Lokasi, organisasi, atau orang yang dihasilkan oleh keterampilan pengenalan entitas.

Pemetaan bidang output juga dapat digunakan untuk:

  • Buat beberapa salinan konten yang Anda hasilkan (pemetaan bidang output satu-ke-banyak).

  • Meratakan tipe kompleks dari dokumen sumber. Misalnya, asumsikan dokumen sumber memiliki jenis kompleks, seperti alamat multibagian, dan Anda hanya menginginkan kota. Anda dapat menggunakan pemetaan bidang output untuk meratakan struktur data berlapis, lalu menggunakan pemetaan bidang output untuk mengirim output ke kumpulan string dalam indeks pencarian Anda.

Pemetaan bidang output hanya diterapkan untuk indeks pencarian. Jika Anda mengisi penyimpanan pengetahuan, gunakan proyeksi untuk konfigurasi jalur data.

Tentukan pemetaan bidang output

Pemetaan bidang output ditambahkan ke outputFieldMappings array dalam definisi pengindeks, biasanya ditempatkan setelah fieldMappings array. Pemetaan bidang output terdiri dari tiga bagian.

Anda dapat menggunakan REST API atau Azure SDK untuk menentukan pemetaan bidang output.

Petunjuk

Pengindeks yang dibuat oleh panduan Impor data menyertakan pemetaan bidang output yang dihasilkan oleh panduan. Jika Anda memerlukan contoh, jalankan wizard di atas sumber data Anda untuk melihat pemetaan bidang output di pengindeks.

  1. Gunakan Buat Pengindeks atau Buat atau Perbarui Pengindeks atau metode yang setara dalam Azure SDK. Berikut adalah contoh definisi pengindeks.

    {
       "name": "myindexer",
       "description": null,
       "dataSourceName": "mydatasource",
       "targetIndexName": "myindex",
       "schedule": { },
       "parameters": { },
       "fieldMappings": [],
       "outputFieldMappings": [],
       "disabled": false,
       "encryptionKey": { }
     }
    
  2. Isi outputFieldMappings array untuk menentukan pemetaan. Pemetaan bidang terdiri dari tiga bagian.

    "outputFieldMappings": [
      {
        "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
        "targetFieldName": "some-search-field-in-an-index",
        "mappingFunction": null
      }
    ]
    
Properti Deskripsi
sourceFieldName Harus diisi. Menentukan jalur ke konten yang diperkaya. Contohnya mungkin /document/content. Lihat Pengayaan referensi dalam kumpulan keterampilan Pencarian Azure AI untuk sintaks dan contoh jalur.
targetFieldName Opsional. Menentukan bidang pencarian yang menerima konten yang diperkaya. Bidang target harus bidang atau koleksi sederhana tingkat atas. Ini tidak bisa menjadi jalur ke subbidang dalam jenis kompleks. Jika Anda ingin mengambil simpul tertentu dalam struktur yang kompleks, Anda dapat meratakan simpul individual dalam memori, lalu mengirim output ke koleksi string dalam indeks Anda.
fungsi pemetaan Opsional. Menambahkan pemrosesan tambahan yang disediakan oleh fungsi pemetaan yang didukung oleh pengindeks. Untuk simpul pengayaan, pengodean dan pendekodean adalah fungsi yang paling umum digunakan.
  1. targetFieldName selalu nama bidang dalam indeks pencarian.

  2. sourceFieldName adalah jalur ke simpul dalam dokumen yang diperkaya. Ini adalah hasil dari keahlian. Jalur selalu dimulai dengan /document, dan jika Anda mengindeks dari blob, elemen kedua dari jalur adalah /content. Elemen ketiga adalah nilai yang dihasilkan oleh keterampilan. Untuk informasi dan contoh selengkapnya, lihat Pengayaan referensi dalam kumpulan keterampilan Pencarian Azure AI.

    Contoh ini menambahkan entitas dan label sentimen yang diekstrak dari properti konten blob ke bidang dalam indeks pencarian.

    {
        "name": "myIndexer",
        "dataSourceName": "myDataSource",
        "targetIndexName": "myIndex",
        "skillsetName": "myFirstSkillSet",
        "fieldMappings": [],
        "outputFieldMappings": [
            {
                "sourceFieldName": "/document/content/organizations/*/description",
                "targetFieldName": "descriptions",
                "mappingFunction": {
                    "name": "base64Decode"
                }
            },
            {
                "sourceFieldName": "/document/content/organizations",
                "targetFieldName": "orgNames"
            },
            {
                "sourceFieldName": "/document/content/sentiment",
                "targetFieldName": "sentiment"
            }
        ]
    }
    
  3. Tetapkan fungsi pemetaan apa pun yang diperlukan untuk mengubah konten bidang sebelum disimpan dalam indeks. Untuk simpul pengayaan, pengodean dan pendekodean adalah fungsi yang paling umum digunakan.

Pemetaan bidang output satu ke banyak

Anda dapat menggunakan pemetaan bidang output untuk merutekan satu bidang sumber ke beberapa bidang dalam indeks pencarian. Anda mungkin melakukan ini untuk pengujian perbandingan atau jika Anda menginginkan bidang dengan atribut yang berbeda.

Asumsikan set keterampilan yang menghasilkan penyematan untuk bidang vektor, dan indeks yang memiliki beberapa bidang vektor yang bervariasi menurut pengaturan algoritma dan kompresi. Dalam pengindeks, petakan output keterampilan penyematan ke masing-masing dari beberapa bidang vektor dalam indeks pencarian.

"outputFieldMappings": [
    { "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_hnsw" },
    { "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_eknn" },
    { "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_narrow" },
    { "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_no_stored" },
    { "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_scalar" }
  ]

Jalur bidang sumber adalah output keterampilan. Dalam contoh ini, outputnya text_vector. Nama target adalah properti opsional. Jika Anda tidak memberikan nama target pada pemetaan output, jalurnya akan menjadi embedding atau lebih tepatnya, /document/content/embedding.

{
  "name": "test-vector-size-ss",
  "description": "Generate embeddings using Azure OpenAI in Foundry Models",
  "skills": [
    {
      "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
      "name": "#1",
      "description": null,
      "context": "/document/content",
      "resourceUri": "https://my-demo-eastus.openai.azure.com",
      "apiKey": null,
      "deploymentId": "text-embedding-ada-002",
      "dimensions": 1536,
      "modelName": "text-embedding-ada-002",
      "inputs": [
        {
          "name": "text",
          "source": "/document/content"
        }
      ],
      "outputs": [
        {
          "name": "embedding",
          "targetName": "text_vector"
        }
      ],
      "authIdentity": null
    }
  ]
}

Meratakan struktur kompleks menjadi kumpulan string

Jika data sumber Anda terdiri dari JSON berlapis atau hierarkis, Anda tidak dapat menggunakan pemetaan bidang untuk menyiapkan jalur data. Sebagai gantinya, indeks pencarian Anda harus mencerminkan struktur data sumber di setiap tingkat untuk proses impor yang lengkap.

Bagian ini memandu Anda melalui proses impor yang menghasilkan cerminan satu-ke-satu dari dokumen yang kompleks di sisi sumber dan target. Selanjutnya, ia menggunakan dokumen sumber yang sama untuk mengilustrasikan pengambilan dan meratakan simpul individual ke dalam koleksi string.

Berikut adalah contoh dokumen di Azure Cosmos DB dengan JSON berlapis:

{
   "palette":"primary colors",
   "colors":[
      {
         "name":"blue",
         "medium":[
            "acrylic",
            "oil",
            "pastel"
         ]
      },
      {
         "name":"red",
         "medium":[
            "acrylic",
            "pastel",
            "watercolor"
         ]
      },
      {
         "name":"yellow",
         "medium":[
            "acrylic",
            "watercolor"
         ]
      }
   ]
}

Jika Anda ingin mengindeks dokumen sumber ini sepenuhnya, Anda akan membuat definisi indeks tempat nama bidang, tingkat, dan jenis tercermin sebagai jenis kompleks. Karena pemetaan bidang tidak didukung untuk jenis kompleks dalam indeks pencarian, definisi indeks Anda harus mencerminkan dokumen sumber.

{
  "name": "my-test-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "colors", "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "name",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "medium",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "retrievable": true,
        }
      ]
    }
  ]
}

Berikut adalah contoh definisi pengindeks yang menjalankan impor. Perhatikan bahwa tidak ada pemetaan bidang dan tidak ada set keterampilan.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-test-index",

  "fieldMappings": [],
  "outputFieldMappings": []
}

Hasilnya adalah contoh dokumen pencarian berikut, mirip dengan yang asli di Azure Cosmos DB.

{
  "value": [
    {
      "@search.score": 1,
      "id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
      "palette": "primary colors",
      "colors": [
        {
          "name": "blue",
          "medium": [
            "acrylic",
            "oil",
            "pastel"
          ]
        },
        {
          "name": "red",
          "medium": [
            "acrylic",
            "pastel",
            "watercolor"
          ]
        },
        {
          "name": "yellow",
          "medium": [
            "acrylic",
            "watercolor"
          ]
        }
      ]
    }
  ]
}

Penyajian alternatif dalam indeks pencarian adalah meratakan simpul individual dalam struktur berlapis sumber ke dalam kumpulan string dalam indeks pencarian.

Untuk menyelesaikan tugas ini, Anda memerlukan outputFieldMappings yang memetakan simpul dalam memori ke koleksi string dalam indeks. Meskipun pemetaan bidang output terutama berlaku untuk output keterampilan, Anda juga dapat menggunakannya untuk mengatasi simpul setelah pemecahan dokumen di mana pengindeks membuka dokumen sumber dan membacanya ke dalam memori.

Definisi contoh indeks berikut ini memanfaatkan kumpulan string untuk mendapatkan output yang sudah diratakan.

{
  "name": "my-new-flattened-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
    { "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
  ]
}

Berikut adalah contoh definisi pengindeks, menggunakan outputFieldMappings untuk mengaitkan JSON berlapis dengan bidang koleksi string. Bidang sumber menggunakan sintaks jalur untuk simpul pengayaan, meskipun tidak ada set keterampilan. Dokumen yang diperkaya dibuat dalam sistem selama pemecahan dokumen, yang berarti Anda dapat mengakses simpul di setiap pohon dokumen selama simpul tersebut ada ketika dokumen retak.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-new-flattened-index",
  "parameters": {  },
  "fieldMappings": [   ],
  "outputFieldMappings": [
    {
       "sourceFieldName": "/document/colors/*/name",
       "targetFieldName": "color_names"
    },
    {
       "sourceFieldName": "/document/colors/*/medium",
       "targetFieldName": "color_mediums"
    }
  ]
}

Hasil dari definisi adalah sebagai berikut. Menyederhanakan struktur kehilangan konteks dalam kasus ini. Tidak ada lagi asosiasi antara warna tertentu dan media yang tersedia di dalamnya. Namun, tergantung pada skenario Anda, hasil yang mirip dengan contoh berikut mungkin persis apa yang Anda butuhkan.

{
  "value": [
    {
      "@search.score": 1,
      "id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}