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:

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.
  • Kirim 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 bertambah berdasarkan informasi dari retriever.

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. Salah satu opsinya adalah menggunakan 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. Kernel Semantik adalah pilihan 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 atau Azure OpenAI 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 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 secara eksternal untuk representasi matematika konten gambar lalu diindeks sebagai bidang vektor dalam indeks Anda. Anda dapat menggunakan model sumber terbuka seperti OpenAI CLIP untuk mem-vektorisasi teks dan gambar dalam ruang penyematan yang sama.

1 Fungsionalitas dukungan vektor yang tersedia secara umum mengharuskan Anda memanggil pustaka atau model lain untuk pemotongan dan vektorisasi data. Namun, vektorisasi terintegrasi (pratinjau) menyematkan langkah-langkah ini. Untuk sampel kode yang memperlihatkan kedua pendekatan, lihat repositori azure-search-vectors.

2Keterampilan adalah dukungan bawaan untuk pengayaan AI. 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.

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.
Peringkat 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.

Peringkat berdasarkan relevansi

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.

Relevansi berlaku untuk pencarian kata kunci (nonvector) dan untuk kueri hibrid (melalui bidang nonvektor). Di Azure AI Search, tidak ada penyetelan relevansi untuk pencarian kesamaan dan kueri vektor. Peringkat BM25 adalah algoritma peringkat untuk pencarian teks lengkap.

Penyetelan relevansi didukung melalui fitur yang meningkatkan peringkat BM25. Pendekatan ini meliputi:

  • Profil penilaian yang meningkatkan skor pencarian jika kecocokan ditemukan di bidang pencarian tertentu atau pada kriteria lain.
  • Peringkat semantik yang memberi peringkat ulang kumpulan hasil BM25, menggunakan model semantik dari Bing untuk menyusun ulang hasil agar lebih sesuai dengan kueri asli.

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

Contoh kode kueri Azure AI Search untuk skenario RAG

Kode berikut disalin dari file retrievethenread.py dari situs demo. Ini menghasilkan content untuk LLM dari hasil pencarian kueri hibrid. Anda dapat menulis kueri yang lebih sederhana, tetapi contoh ini termasuk pencarian vektor dan pencarian kata kunci dengan reranking semantik dan pemeriksaan ejaan. Dalam demo, kueri ini digunakan untuk mendapatkan konten awal.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Kode integrasi dan LLM

Solusi RAG yang menyertakan Azure AI Search memerlukan komponen dan kode lain untuk membuat solusi lengkap. Sedangkan bagian sebelumnya mencakup pengambilan informasi melalui Azure AI Search dan fitur mana yang digunakan untuk membuat dan mengkueri konten yang dapat dicari, bagian ini memperkenalkan integrasi dan interaksi LLM.

Notebook di repositori demo adalah titik awal yang bagus karena menampilkan pola untuk meneruskan hasil pencarian ke 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.

Blok sel berikut di buku catatan chat-read-retrieve-read.ipynb memperlihatkan panggilan pencarian dalam konteks sesi obrolan:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Cara memulai

  • Gunakan Azure AI Studio untuk membuat indeks pencarian.

  • Gunakan Azure OpenAI Studio dan "bawa data Anda sendiri" untuk bereksperimen dengan perintah pada indeks pencarian yang ada di taman bermain. Langkah ini membantu Anda memutuskan model apa yang akan digunakan, dan menunjukkan kepada Anda seberapa baik indeks yang ada bekerja dalam skenario RAG.

  • Akselerator solusi "Mengobrol dengan data Anda", yang dibangun oleh tim Azure AI Search, membantu Anda membuat solusi RAG kustom Anda sendiri.

  • Templat aplikasi obrolan perusahaan menyebarkan sumber daya Azure, kode, dan data grounding sampel menggunakan dokumen rencana kesehatan fiktif untuk Contoso dan Northwind. Solusi end-to-end ini memberi Anda aplikasi obrolan operasional dalam waktu hanya 15 menit. Kode untuk templat ini adalah azure-search-openai-demo yang ditampilkan dalam beberapa presentasi. Tautan berikut menyediakan versi khusus bahasa:

  • Tinjau konsep dan strategi pengindeksan untuk menentukan bagaimana Anda ingin menyerap dan me-refresh data. Tentukan apakah akan menggunakan pencarian vektor, pencarian kata kunci, atau pencarian hibrid. Jenis konten yang perlu Anda cari, dan jenis kueri yang ingin Anda jalankan, menentukan desain indeks.

  • Tinjau membuat kueri untuk mempelajari lebih lanjut sintaks dan persyaratan permintaan pencarian.

Catatan

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

Lihat juga