Bagikan melalui


Pengambilan Augmented Generation (RAG) di Azure AI Search

Retrieval Augmented Generation (RAG) adalah arsitektur yang meningkatkan kemampuan Model Bahasa Besar (LLM) seperti ChatGPT dengan menambahkan sistem pengambilan informasi yang menyediakan data grounding. Menambahkan sistem pengambilan informasi memberi Anda kontrol atas data grounding yang digunakan oleh LLM saat merumuskan respons. Untuk solusi perusahaan, arsitektur RAG berarti Anda dapat membatasi AI generatif ke konten perusahaan Anda yang bersumber dari dokumen dan gambar yang di-vektorisasi, dan format data lainnya jika Anda memiliki model penyematan untuk konten tersebut.

Keputusan tentang sistem pengambilan informasi mana yang akan digunakan sangat penting karena menentukan input ke LLM. Sistem pengambilan informasi harus menyediakan:

  • Strategi pengindeksan yang memuat dan menyegarkan dalam skala besar, untuk semua konten Anda, pada frekuensi yang Anda butuhkan.

  • Kemampuan kueri dan penyetelan relevansi. Sistem harus mengembalikan hasil yang relevan , dalam format bentuk pendek yang diperlukan untuk memenuhi persyaratan panjang token input LLM.

  • Keamanan, jangkauan global, dan keandalan untuk data dan operasi.

  • Integrasi dengan model penyematan untuk pengindeksan, dan model obrolan atau model pemahaman bahasa untuk pengambilan.

Azure AI Search adalah solusi yang terbukti untuk pengambilan informasi dalam arsitektur RAG. Ini menyediakan kemampuan pengindeksan dan kueri, dengan infrastruktur dan keamanan cloud Azure. Melalui kode dan komponen lainnya, Anda dapat merancang solusi RAG komprehensif yang mencakup semua elemen untuk AI generatif atas konten milik Anda.

Catatan

Baru mengenal konsep copilot dan RAG? Tonton pencarian vektor dan status pengambilan seni untuk aplikasi AI Generatif.

Microsoft memiliki beberapa implementasi bawaan untuk menggunakan Azure AI Search dalam solusi RAG.

Pendekatan yang dikumpulkan memudahkan untuk memulai, tetapi untuk kontrol lebih besar atas arsitektur, Anda memerlukan solusi kustom. Templat ini membuat solusi end-to-end di:

Jika alat dan templat tidak memenuhi persyaratan aplikasi, Anda dapat membangun solusi RAG kustom menggunakan API Pencarian Azure AI. Sisa artikel ini mengeksplorasi bagaimana Azure AI Search cocok dengan solusi RAG kustom.

Ringkasan pola tingkat tinggi terlihat seperti ini:

  • Mulailah dengan pertanyaan atau permintaan pengguna (prompt).
  • Kirim ke Azure AI Search untuk menemukan informasi yang relevan.
  • Mengembalikan hasil pencarian peringkat teratas ke LLM.
  • Gunakan kemampuan pemahaman bahasa alami dan penalaran LLM untuk menghasilkan respons terhadap perintah awal.

Azure AI Search menyediakan input ke prompt LLM, tetapi tidak melatih model. Dalam arsitektur RAG, tidak ada pelatihan tambahan. LLM telah dilatih sebelumnya menggunakan data publik, tetapi menghasilkan respons yang ditambah oleh informasi dari retriever, dalam hal ini, Azure AI Search.

Pola RAG yang menyertakan Azure AI Search memiliki elemen yang ditunjukkan dalam ilustrasi berikut.

Diagram arsitektur pengambilan informasi dengan pencarian dan ChatGPT.

  • UX Aplikasi (aplikasi web) untuk pengalaman pengguna
  • Server aplikasi atau orkestrator (lapisan integrasi dan koordinasi)
  • Pencarian Azure AI (sistem pengambilan informasi)
  • Azure OpenAI (LLM untuk AI generatif)

Aplikasi web memberikan pengalaman pengguna, menyediakan presentasi, konteks, dan interaksi pengguna. Pertanyaan atau perintah dari pengguna dimulai di sini. Input melewati lapisan integrasi, pertama-tama masuk ke pengambilan informasi untuk mendapatkan hasil pencarian, tetapi juga buka LLM untuk mengatur konteks dan niat.

Server aplikasi atau orkestrator adalah kode integrasi yang mengoordinasikan handoff antara pengambilan informasi dan LLM. Solusi umum termasuk LangChain untuk mengoordinasikan alur kerja. LangChain terintegrasi dengan Azure AI Search, sehingga lebih mudah untuk menyertakan Azure AI Search sebagai pengawas dalam alur kerja Anda. LlamaIndex dan Kernel Semantik adalah opsi lain.

Sistem pengambilan informasi menyediakan indeks yang dapat dicari, logika kueri, dan payload (respons kueri). Indeks pencarian dapat berisi vektor atau konten nonvektor. Meskipun sebagian besar sampel dan demo termasuk bidang vektor, itu bukan persyaratan. Kueri dijalankan menggunakan mesin pencari yang ada di Azure AI Search, yang dapat menangani kueri kata kunci (atau istilah) dan vektor. Indeks dibuat terlebih dahulu, berdasarkan skema yang Anda tentukan, dan dimuat dengan konten Anda yang bersumber dari file, database, atau penyimpanan.

LLM menerima perintah asli, ditambah hasil dari Azure AI Search. LLM menganalisis hasil dan merumuskan respons. Jika LLM adalah ChatGPT, interaksi pengguna mungkin merupakan percakapan bolak-balik. Jika Anda menggunakan Davinci, perintahnya mungkin merupakan jawaban yang sepenuhnya disusur. Solusi Azure kemungkinan besar menggunakan Azure OpenAI, tetapi tidak ada dependensi keras pada layanan khusus ini.

Azure AI Search tidak menyediakan integrasi LLM asli untuk alur perintah atau pelestarian obrolan, jadi Anda perlu menulis kode yang menangani orkestrasi dan status. Anda dapat meninjau sumber demo (Azure-Samples/azure-search-openai-demo) untuk cetak biru tentang apa yang diperlukan solusi lengkap. Kami juga merekomendasikan Azure AI Studio untuk membuat solusi Azure AI Search berbasis RAG yang terintegrasi dengan LLM.

Di Pencarian Azure AI, semua konten yang dapat dicari disimpan dalam indeks pencarian yang dihosting di layanan pencarian Anda. Indeks pencarian dirancang untuk kueri cepat dengan waktu respons milidetik, sehingga struktur data internalnya ada untuk mendukung tujuan tersebut. Untuk itu, indeks pencarian menyimpan konten terindeks, dan bukan seluruh file konten seperti seluruh PDF atau gambar. Secara internal, struktur data mencakup indeks terbalik dari teks token, indeks vektor untuk penyematan, dan teks yang tidak diubah untuk kasus di mana pencocokan verbatim diperlukan (misalnya, dalam filter, pencarian fuzzy, kueri ekspresi reguler).

Saat menyiapkan data untuk solusi RAG, Anda menggunakan fitur yang membuat dan memuat indeks di Azure AI Search. Indeks menyertakan bidang yang menduplikasi atau mewakili konten sumber Anda. Bidang indeks mungkin transferensi sederhana (judul atau deskripsi dalam dokumen sumber menjadi judul atau deskripsi dalam indeks pencarian), atau bidang mungkin berisi output proses eksternal, seperti vektorisasi atau pemrosesan keterampilan yang menghasilkan representasi atau deskripsi teks gambar.

Karena Anda mungkin tahu jenis konten apa yang ingin Anda cari, pertimbangkan fitur pengindeksan yang berlaku untuk setiap jenis konten:

Jenis konten Diindeks sebagai Fitur
text token, teks yang tidak diubah Pengindeks dapat menarik teks biasa dari sumber daya Azure lainnya seperti Azure Storage dan Cosmos DB. Anda juga dapat mendorong konten JSON apa pun ke indeks. Untuk memodifikasi teks dalam penerbangan, gunakan penganalisis dan normalizer untuk menambahkan pemrosesan leksikal selama pengindeksan. Peta sinonim berguna jika dokumen sumber kehilangan terminologi yang mungkin digunakan dalam kueri.
text vektor 1 Teks dapat dipotong dan di-vektorisasi dalam alur pengindeks, atau ditangani secara eksternal lalu diindeks sebagai bidang vektor dalam indeks Anda.
gambar token, teks yang tidak diubah 2 Keterampilan untuk OCR dan Analisis Gambar dapat memproses gambar untuk pengenalan teks atau karakteristik gambar. Informasi gambar dikonversi ke teks yang dapat dicari dan ditambahkan ke indeks. Keterampilan memiliki persyaratan pengindeks.
gambar vektor 1 Gambar dapat di-vektorisasi dalam alur pengindeks, atau ditangani secara eksternal untuk representasi matematika konten gambar lalu diindeks sebagai bidang vektor dalam indeks Anda. Anda dapat menggunakan multimodal Azure AI Vision atau model sumber terbuka seperti OpenAI CLIP untuk mem-vektorisasi teks dan gambar dalam ruang penyematan yang sama.

1 Azure AI Search menyediakan pemotongan dan vektorisasi data terintegrasi, tetapi Anda harus mengambil dependensi pada pengindeks dan set keterampilan. Jika Anda tidak dapat menggunakan pengindeks, Kernel Semantik Microsoft atau penawaran komunitas lainnya dapat membantu Anda dengan solusi tumpukan penuh. Untuk sampel kode yang memperlihatkan kedua pendekatan, lihat repositori azure-search-vectors.

2 Keterampilan adalah dukungan bawaan untuk AI yang diterapkan. Untuk Analisis OCR dan Gambar, alur pengindeksan melakukan panggilan internal ke API Azure AI Vision. Keterampilan ini meneruskan gambar yang diekstrak ke Azure AI untuk diproses, dan menerima output sebagai teks yang diindeks oleh Azure AI Search. Keterampilan juga digunakan untuk penggugusan data terintegrasi (keterampilan Pemisahan Teks) dan penyematan terintegrasi (keterampilan yang memanggil multimodal Azure AI Vision, Azure OpenAI, dan model dalam katalog model Azure AI Studio.)

Vektor menyediakan akomodasi terbaik untuk konten yang berbeda (beberapa format file dan bahasa) karena konten dinyatakan secara universal dalam representasi matematika. Vektor juga mendukung pencarian kesamaan: pencocokan pada koordinat yang paling mirip dengan kueri vektor. Dibandingkan dengan pencarian kata kunci (atau pencarian istilah) yang cocok dengan istilah yang ditokenisasi, pencarian kesamaan lebih bernuansa. Ini adalah pilihan yang lebih baik jika ada persyaratan ambiguitas atau interpretasi dalam konten atau dalam kueri.

Setelah data Anda berada dalam indeks pencarian, Anda menggunakan kemampuan kueri Pencarian Azure AI untuk mengambil konten.

Dalam pola non-RAG, kueri melakukan perjalanan pulang pergi dari klien pencarian. Kueri dikirimkan, dijalankan pada mesin pencari, dan respons dikembalikan ke aplikasi klien. Respons, atau hasil pencarian, terdiri secara eksklusif dari konten verbatim yang ditemukan dalam indeks Anda.

Dalam pola RAG, kueri dan respons dikoordinasikan antara mesin pencari dan LLM. Pertanyaan atau kueri pengguna diteruskan ke mesin pencari dan ke LLM sebagai perintah. Hasil pencarian kembali dari mesin pencari dan dialihkan ke LLM. Respons yang membuatnya kembali ke pengguna adalah AI generatif, baik penjumlahan atau jawaban dari LLM.

Tidak ada jenis kueri di Azure AI Search - bahkan pencarian semantik atau vektor - yang menyusun jawaban baru. Hanya LLM yang menyediakan AI generatif. Berikut adalah kemampuan dalam Azure AI Search yang digunakan untuk merumuskan kueri:

Fitur kueri Tujuan Mengapa menggunakannya
SintaksIs Lucene sederhana atau penuh Eksekusi kueri melalui teks dan konten numerik nonvector Pencarian teks lengkap adalah yang terbaik untuk kecocokan yang tepat, daripada kecocokan serupa. Kueri pencarian teks lengkap diberi peringkat menggunakan algoritma BM25 dan mendukung penyetelan relevansi melalui profil penilaian. Ini juga mendukung filter dan faset.
Filter dan faset Hanya berlaku untuk bidang teks atau numerik (nonvector). Mengurangi area permukaan pencarian berdasarkan kriteria penyertaan atau pengecualian. Menambahkan presisi ke kueri Anda.
Pemeringkat semantik Memberi peringkat ulang kumpulan hasil BM25 menggunakan model semantik. Menghasilkan keterangan dan jawaban bentuk pendek yang berguna sebagai input LLM. Lebih mudah daripada menilai profil, dan tergantung pada konten Anda, teknik yang lebih andal untuk penyetelan relevansi.
Pencarian vektor Eksekusi kueri atas bidang vektor untuk pencarian kesamaan, di mana string kueri adalah satu atau beberapa vektor. Vektor dapat mewakili semua jenis konten, dalam bahasa apa pun.
Pencarian hibrid Menggabungkan salah satu atau semua teknik kueri di atas. Kueri vektor dan nonvector dijalankan secara paralel dan dikembalikan dalam tataan hasil terpadu. Keuntungan paling signifikan dalam presisi dan pengenalan adalah melalui kueri hibrid.

Menyusun respons kueri

Respons kueri memberikan input ke LLM, sehingga kualitas hasil pencarian Anda sangat penting untuk keberhasilan. Hasilnya adalah kumpulan baris tabular. Komposisi atau struktur hasil tergantung pada:

  • Bidang yang menentukan bagian indeks mana yang disertakan dalam respons.
  • Baris yang mewakili kecocokan dari indeks.

Bidang muncul di hasil pencarian saat atribut "dapat diambil". Definisi bidang dalam skema indeks memiliki atribut, dan yang menentukan apakah bidang digunakan dalam respons. Hanya bidang "dapat diambil" yang dikembalikan dalam teks lengkap atau hasil kueri vektor. Secara default semua bidang "dapat diambil" dikembalikan, tetapi Anda dapat menggunakan "pilih" untuk menentukan subset. Selain "dapat diambil", tidak ada batasan di lapangan. Bidang dapat memiliki panjang atau jenis apa pun. Mengenai panjang, tidak ada batas panjang bidang maksimum di Azure AI Search, tetapi ada batasan ukuran permintaan API.

Baris cocok dengan kueri, diberi peringkat berdasarkan relevansi, kesamaan, atau keduanya. Secara default, hasil dibatasi di 50 kecocokan teratas untuk pencarian teks lengkap atau kecocokan k-tetangga terdekat untuk pencarian vektor. Anda dapat mengubah default untuk menambah atau mengurangi batas hingga maksimum 1.000 dokumen. Anda juga dapat menggunakan parameter atas dan melewati halaman untuk mengambil hasil sebagai serangkaian hasil halaman.

Memaksimalkan relevansi dan pengenalan

Saat Anda bekerja dengan proses yang kompleks, sejumlah besar data, dan harapan untuk respons milidetik, sangat penting bahwa setiap langkah menambahkan nilai dan meningkatkan kualitas hasil akhir. Di sisi pengambilan informasi, penyetelan relevansi adalah aktivitas yang meningkatkan kualitas hasil yang dikirim ke LLM. Hanya dokumen yang paling relevan atau yang paling mirip yang harus disertakan dalam hasil.

Berikut adalah beberapa tips untuk memaksimalkan relevansi dan pengenalan:

  • Kueri hibrid yang menggabungkan pencarian kata kunci (nonvector) dan pencarian vektor memberi Anda pengenalan maksimum ketika inputnya sama. Dalam kueri hibrid, jika Anda menggandakan input yang sama, string teks dan setara vektornya menghasilkan kueri paralel untuk kata kunci dan pencarian kesamaan, mengembalikan kecocokan yang paling relevan dari setiap jenis kueri dalam kumpulan hasil terpadu.

  • Kueri hibrid juga bisa ekspansif. Anda dapat menjalankan pencarian kesamaan melalui konten yang dipotong verbose, dan pencarian kata kunci atas nama, semuanya dalam permintaan yang sama.

  • Penyetelan relevansi didukung melalui:

Dalam pengujian perbandingan dan tolok ukur, kueri hibrid dengan bidang teks dan vektor, dilengkapi dengan peringkat semantik, menghasilkan hasil yang paling relevan.

Contoh kode untuk alur kerja RAG

Kode Python berikut menunjukkan komponen penting dari alur kerja RAG di Azure AI Search. Anda perlu menyiapkan klien, menentukan permintaan sistem, dan memberikan kueri. Perintah memberi tahu LLM untuk hanya menggunakan hasil dari kueri, dan cara mengembalikan hasilnya. Untuk langkah-langkah selengkapnya berdasarkan contoh ini, lihat mulai cepat RAG ini.

# Set up the query for generating responses
from azure.identity import DefaultAzureCredential
from azure.identity import get_bearer_token_provider
from azure.search.documents import SearchClient
from openai import AzureOpenAI

credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
    api_version="2024-06-01",
    azure_endpoint=AZURE_OPENAI_ACCOUNT,
    azure_ad_token_provider=token_provider
)

search_client = SearchClient(
    endpoint=AZURE_SEARCH_SERVICE,
    index_name="hotels-sample-index",
    credential=credential
)

# This prompt provides instructions to the model. 
# The prompt includes the query and the source, which are specified further down in the code.
GROUNDED_PROMPT="""
You are a friendly assistant that recommends hotels based on activities and amenities.
Answer the query using only the sources provided below in a friendly and concise bulleted manner.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# The query is sent to the search engine, but it's also passed in the prompt
query="Can you recommend a few hotels near the ocean with beach access and good views"

# Retrieve the selected fields from the search index related to the question
search_results = search_client.search(
    search_text=query,
    top=5,
    select="Description,HotelName,Tags"
)
sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model="gpt-35"
)

print(response.choices[0].message.content)

Kode integrasi dan LLM

Solusi RAG yang menyertakan Azure AI Search dapat memanfaatkan kemampuan pemotongan dan vektorisasi data bawaan, atau Anda dapat membangun sendiri menggunakan platform seperti Semantic Kernel, LangChain, atau LlamaIndex.

Notebook di repositori demo adalah titik awal yang bagus karena menampilkan pola untuk integrasi LLM. Sebagian besar kode dalam solusi RAG terdiri dari panggilan ke LLM sehingga Anda perlu mengembangkan pemahaman tentang cara kerja API tersebut, yang berada di luar cakupan artikel ini.

Cara memulai

Catatan

Beberapa fitur Azure AI Search ditujukan untuk interaksi manusia dan tidak berguna dalam pola RAG. Secara khusus, Anda dapat melewati fitur seperti lengkapi otomatis dan saran. Fitur lain seperti faset dan orderby mungkin berguna, tetapi tidak jarang dalam skenario RAG.

Lihat juga