Memecah dokumen besar untuk pencarian RAG dan vektor di Pencarian Azure AI

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.

Mempartisi dokumen besar menjadi potongan yang lebih kecil dapat membantu Anda tetap berada di bawah batas input token maksimum penyelesaian obrolan dan model penyematan. Misalnya, panjang maksimum teks input untuk model penyematan teks versi 3 kecil Azure OpenAI adalah 8,191 token. Mengingat bahwa setiap token sekitar empat karakter teks untuk model OpenAI umum, batas maksimum ini setara dengan sekitar 6.000 kata teks. Jika Anda menggunakan model ini untuk menghasilkan penyematan, sangat penting bahwa teks input tetap berada di bawah batas.

Model penyelesaian obrolan memiliki batasan token input yang sama, sehingga pembagian data juga berguna untuk retrieval augmented generation (RAG) atau pengambilan agenik. Mempartisi konten Anda menjadi potongan membantu Anda memenuhi persyaratan token input dan mencegah kehilangan data karena pemotongan.

Pencarian Azure AI memiliki solusi bawaan untuk memotong konten, dan juga untuk vektorisasi konten yang dipotong jika Anda menggunakan pencarian vektor. Pendekatan bawaan mengambil dependensi pada pengindeks dan set keterampilan bawaan yang memungkinkan pemisahan teks dan pembuatan penyematan. Jika Anda tidak dapat menggunakan vektorisasi terintegrasi, artikel ini menjelaskan beberapa pendekatan alternatif untuk memotong konten Anda.

Petunjuk / Saran

Jika Anda membagi konten menjadi potongan-potongan untuk retrieval agentik, beberapa sumber pengetahuan dapat menghasilkan pipeline pengindeksan lengkap yang membagi dan, jika diperlukan, melakukan vektorisasi pada konten Anda. Pengindeks, definisi sumber data, set keterampilan, dan indeks dibuat untuk Anda berdasarkan informasi dalam definisi sumber pengetahuan Anda. Sumber pengetahuan dengan kemampuan ini termasuk Azure Blob Storage atau Azure Data Lake Storage Gen2 dan OneLake.

Teknik potongan umum

Pemotongan hanya diperlukan jika dokumen sumber terlalu besar untuk batas ukuran input maksimum yang ditetapkan oleh model, tetapi juga bermanfaat jika konten tidak direpresentasikan dengan baik sebagai vektor tunggal. Pertimbangkan halaman wiki yang mencakup banyak sub-topik yang bervariasi. Seluruh halaman mungkin cukup kecil untuk memenuhi persyaratan input model, tetapi Anda mungkin mendapatkan hasil yang lebih baik jika Anda memotong dengan butir yang lebih halus.

Berikut adalah beberapa teknik pengelompokan umum, yang berhubungan dengan fitur bawaan jika Anda menggunakan pengindeks dan kemampuan.

Pendekatan Penggunaan Fungsionalitas bawaan
Potongan ukuran tetap Tentukan ukuran tetap yang cukup untuk paragraf yang bermakna secara semantik (misalnya, 200 kata atau 600 karakter) dan memungkinkan beberapa tumpang tindih (misalnya, 10-15% konten) dapat menghasilkan gugus yang baik sebagai input untuk menyematkan generator vektor. Keterampilan Pemisahan Teks, memisahkan menurut halaman (ditentukan oleh panjang karakter)
Potongan berukuran variabel berdasarkan karakteristik konten Mempartisi data Anda berdasarkan tanda baca akhir kalimat, penanda akhir baris, atau menggunakan fitur dalam pustaka Natural Language Processing (NLP) yang mendeteksi struktur dokumen. Markup yang disematkan, seperti HTML atau Markdown, memiliki sintaks judul yang dapat digunakan untuk memotong data menurut bagian. Azure Content Understanding skill atau keterampilan Pemisahan Teks (memisahkan berdasarkan kalimat).
Potongan semantik Pisahkan konten menjadi unit yang bermakna yang mempertahankan hubungan konteks dan semantik di seluruh kalimat dan paragraf. Pendekatan ini menghasilkan gugus yang lebih menjaga koherensi semantik dan dapat menjangkau batas halaman. Keterampilan Azure Content Understanding (pemotongan semantik dengan output markdown)
Kombinasi kustom Gunakan kombinasi potongan berukuran tetap dan variabel, atau perluas pendekatan. Misalnya, saat berhadapan dengan dokumen besar, Anda mungkin menggunakan gugus berukuran variabel, tetapi juga menambahkan judul dokumen ke potongan dari tengah dokumen untuk mencegah kehilangan konteks. Tidak ada
Penguraian dokumen Pengindeks dapat mengurai dokumen sumber yang lebih besar ke dalam dokumen pencarian yang lebih kecil untuk pengindeksan. Secara harfiah, pendekatan ini bukan pengelompokan, tetapi kadang-kadang dapat mencapai tujuan yang sama. Mengindeks blob dan file Markdown, pengindeksan satu ke banyak, atau Mengindeks blob dan file JSON

Pertimbangan tumpang tindih konten

Saat Anda memotong data berdasarkan ukuran tetap, tumpang tindih sejumlah kecil teks antar gugus dapat membantu menjaga kelangsungan dan konteks. Sebaiknya mulai dengan ukuran gugus 512 token (sekitar 2.000 karakter) dan tumpang tindih awal 25%, yang sama dengan 128 token. Tumpang tindih ini memastikan transisi yang lebih lancar antar gugus tanpa duplikasi yang berlebihan.

Tumpang tindih optimal mungkin bervariasi tergantung pada jenis konten dan kasus penggunaan Anda. Misalnya, data yang sangat terstruktur mungkin memerlukan lebih sedikit tumpang tindih, sementara teks percakapan atau narasi mungkin mendapat manfaat dari lebih banyak.

Faktor-faktor untuk pengelompokan data

Dalam hal pengelompokan data, pikirkan tentang faktor-faktor ini:

  • Bentuk dan kepadatan dokumen Anda. Jika Anda memerlukan teks atau bagian yang utuh, potongan dan potongan variabel yang lebih besar yang mempertahankan struktur kalimat dapat menghasilkan hasil yang lebih baik.

  • Kueri pengguna: Potongan yang lebih besar dan strategi yang tumpang tindih membantu mempertahankan konteks dan kekayaan semantik untuk kueri yang menargetkan informasi tertentu.

  • Model Bahasa Skala Besar (LLM) memiliki pedoman kinerja untuk ukuran potongan. Temukan ukuran potongan yang paling sesuai untuk semua model yang Anda gunakan. Misalnya, jika Anda menggunakan model untuk ringkasan dan penyematan, pilih ukuran gugus optimal yang berfungsi untuk keduanya.

Cara sekumpulan masuk ke dalam alur kerja

Jika Anda memiliki dokumen besar, sisipkan langkah pemotongan ke dalam alur kerja pengindeksan dan kueri yang memecah teks besar. Saat menggunakan vektorisasi terintegrasi, strategi pemotongan default menggunakan keterampilan Pemisahan Teks adalah umum. Anda juga dapat menerapkan strategi chunking kustom menggunakan keahlian kustom. Lihat referensi kode ini untuk contoh segmentasi semantik menggunakan kemampuan kustom. Beberapa pustaka eksternal yang menyediakan chunking meliputi:

Sebagian besar pustaka menyediakan teknik pemecahan data umum untuk ukuran tetap, ukuran variabel, atau kombinasi. Anda juga dapat menentukan tumpang tindih yang menduplikasi sejumlah kecil konten di setiap gugus untuk pelestarian konteks.

Contoh pengelompokan

Contoh berikut menunjukkan bagaimana strategi pemotongan diterapkan pada file PDF e-book Bumi di Malam Hari NASA:

Contoh keterampilan Pemisahan Teks

Pemotongan data terintegrasi melalui fitur Pemisahan Teks sekarang tersedia secara umum.

Bagian ini menjelaskan pengelompokan data bawaan menggunakan pendekatan yang digerakkan oleh keterampilan dan parameter keterampilan Pemisahan Teks.

Contoh notebook untuk contoh ini dapat ditemukan di repositori azure-search-vector-samples . Atur textSplitMode untuk memecah konten menjadi potongan yang lebih kecil:

  • pages (bawaan). Potongan terdiri dari beberapa kalimat.
  • sentences. Setiap potongan terdiri dari satu kalimat. Apa yang merupakan "kalimat" bergantung pada bahasa. Dalam bahasa Inggris, tanda baca akhir kalimat standar seperti . atau ! digunakan. Bahasa dikontrol oleh defaultLanguageCode parameter .

Parameter pages menambahkan parameter tambahan:

  • maximumPageLength menentukan jumlah maksimum karakter 1 atau token 2 di setiap gugus. Pemisah teks menghindari kalimat putus, sehingga jumlah karakter aktual tergantung pada konten.
  • pageOverlapLength menentukan berapa banyak karakter dari akhir halaman sebelumnya yang disertakan di awal halaman berikutnya. Jika diatur, ini harus kurang dari setengah panjang halaman maksimum.
  • maximumPagesToTake menentukan berapa banyak halaman/potongan yang akan diambil dari dokumen. Nilai defaultnya adalah 0, yang berarti mengambil semua halaman atau potongan dari dokumen.

1 Karakter tidak selaras dengan definisi token. Jumlah token yang diukur oleh LLM mungkin berbeda dari ukuran karakter yang diukur oleh keterampilan Pemisahan Teks dengan ukuran tetap karakter.

2 Pemotongan token tersedia di versi pratinjau terbaru dari Skillsets - Create or Update (REST API) dan menyertakan parameter tambahan untuk menentukan tokenizer serta token apa pun yang tidak boleh dipisahkan selama proses pemotongan.

Tabel berikut menunjukkan bagaimana pilihan parameter memengaruhi jumlah bagian total dari e-book Bumi di Malam Hari:

textSplitMode maximumPageLength pageOverlapLength Jumlah Gugus
pages 1000 0 172
pages 1000 200 216
pages 2000 0 85
pages 2000 500 113
pages 5.000 0 34
pages 5.000 500 38
sentences Tidak Berlaku Tidak Berlaku 13361

Menggunakan textSplitMode dari pages menghasilkan sebagian besar potongan memiliki jumlah karakter total yang mendekati maximumPageLength. Jumlah karakter gugus bervariasi karena perbedaan di mana batas kalimat berada di dalam gugus. Panjang token gugus bervariasi karena perbedaan isi gugus.

Pilihan parameter yang optimal tergantung pada bagaimana gugus digunakan. Untuk sebagian besar aplikasi, disarankan untuk memulai dengan parameter default berikut, saat menggunakan jumlah karakter:

textSplitMode maximumPageLength pageOverlapLength
pages 2000 500

Contoh pemotongan data LangChain

LangChain menyediakan pemuat dokumen dan pemisah teks. Contoh ini menunjukkan kepada Anda cara memuat PDF, mendapatkan jumlah token, dan menyiapkan pemisah teks. Mendapatkan jumlah token membantu Anda membuat keputusan yang tepat tentang ukuran bagian.

Contoh notebook untuk contoh ini dapat ditemukan di repositori azure-search-vector-samples .

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("./data/earth_at_night_508.pdf")
pages = loader.load()

print(len(pages))

Output menunjukkan 200 dokumen atau halaman dalam PDF.

Untuk mendapatkan perkiraan jumlah token untuk halaman ini, gunakan TikToken.

import tiktoken

tokenizer = tiktoken.get_encoding('cl100k_base')
def tiktoken_len(text):
    tokens = tokenizer.encode(
    text,
    disallowed_special=()
)
    return len(tokens)
tiktoken.encoding_for_model('gpt-4.1-mini')

# create the length function
token_counts = []
for page in pages:
    token_counts.append(tiktoken_len(page.page_content))
min_token_count = min(token_counts)
avg_token_count = int(sum(token_counts) / len(token_counts))
max_token_count = max(token_counts)

# print token counts
print(f"Min: {min_token_count}")
print(f"Avg: {avg_token_count}")
print(f"Max: {max_token_count}")

Output menunjukkan bahwa tidak ada halaman yang memiliki token nol, panjang token rata-rata per halaman adalah 189 token, dan jumlah token maksimum halaman apa pun adalah 1.583.

Mengetahui ukuran token rata-rata dan maksimum memberi Anda wawasan tentang pengaturan ukuran gugus. Meskipun Anda dapat menggunakan rekomendasi standar 2.000 karakter dengan tumpang tindih 500 karakter, dalam hal ini masuk akal untuk lebih rendah mengingat jumlah token dari dokumen sampel. Bahkan, mengatur nilai tumpang tindih yang terlalu besar dapat mengakibatkan tidak ada tumpang tindih yang muncul sama sekali.

from langchain.text_splitter import RecursiveCharacterTextSplitter
# split documents into text and embeddings

text_splitter = RecursiveCharacterTextSplitter(
   chunk_size=1000,
   chunk_overlap=200,
   length_function=len,
   is_separator_regex=False
)

chunks = text_splitter.split_documents(pages)

print(chunks[20])
print(chunks[21])

Output untuk dua potongan berturut-turut menunjukkan teks dari potongan pertama yang tumpang tindih dengan potongan kedua. Output diedit secara ringan agar lebih mudah dibaca.

'x Earth at NightForeword\nNASA's Earth at Night explores the brilliance of our planet when it is in darkness. \n It is a compilation of stories depicting the interactions between science and \nwonder, and I am pleased to share this visually stunning and captivating exploration of \nour home planet.\nFrom space, our Earth looks tranquil. The blue ethereal vastness of the oceans \nharmoniously shares the space with verdant green land-an undercurrent of gentle-ness and solitude. But spending time gazing at the images presented in this book, our home planet at night instantly reveals a different reality. Beautiful, filled with glow-ing communities, natural wonders, and striking illumination, our world is bustling with activity and life.**\nDarkness is not void of illumination. It is the contrast, the area between light and'** metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}

'**Darkness is not void of illumination. It is the contrast, the area between light and **\ndark, that is often the most illustrative. Darkness reminds me of where I came from and where I am now-from a small town in the mountains, to the unique vantage point of the Nation's capital. Darkness is where dreamers and learners of all ages peer into the universe and think of questions about themselves and their space in the cosmos. Light is where they work, where they gather, and take time together.\nNASA's spacefaring satellites have compiled an unprecedented record of our \nEarth, and its luminescence in darkness, to captivate and spark curiosity. These missions see the contrast between dark and light through the lenses of scientific instruments. Our home planet is full of complex and dynamic cycles and processes. These soaring observers show us new ways to discern the nuances of light created by natural and human-made sources, such as auroras, wildfires, cities, phytoplankton, and volcanoes.' metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}