Pemecah teks untuk embedding dan RAG — pemisah token

Pecahkan teks panjang kepada bahagian bersaiz token dengan pertindihan untuk embedding dan RAG. Memotong pada sempadan ayat dan perenggan, tidak pernah di tengah perkataan.

Memecah teks untuk embedding: di mana potongan jatuh menentukan apa yang anda dapat semula

Sistem perolehan gagal secara senyap. Anda membenamkan satu korpus, memasang carian, bertanya soalan, dan mendapat balik sesuatu yang bersebelahan dari segi topik tetapi tidak menjawabnya. Naluri pertama ialah menyalahkan model embedding atau metrik keserupaan. Jauh lebih kerap, masalahnya berlaku sebelum kedua-duanya: teks itu dipotong menjadi kepingan yang setiap satunya tidak mengandungi satu idea yang lengkap, dan tiada pemeringkatan sepintar mana pun boleh memulihkan makna yang sudah dimusnahkan pada waktu pemotongan.

Alat ini memecah teks kepada segmen bersempadan token dengan pertindihan, memotong pada sempadan paling bermakna yang ada dan bukan pada ofset tetap. Ia menunjukkan setiap sempadan kepada anda, kerana pemotongan yang buruk hanya kelihatan apabila anda membaca tempat satu segmen berakhir dan yang berikutnya bermula. Semuanya berjalan dalam tab pelayar ini.

Pemecahan sempadan secara rekursif

Pendekatan naif ialah menghiris setiap N token. Ia pantas dan ia salah, kerana sempadan token tiada kaitan dengan sempadan semantik — anda akan memotong di tengah ayat, kadangkala di tengah perkataan, dan vektor yang terhasil menggambarkan serpihan yang tiada siapa pernah tulis.

Kaedah di sini menuruni satu tangga pemisah, menggunakan yang pertama yang menghasilkan kepingan cukup kecil untuk muat. Mengikut urutan: sebelum tajuk Markdown, kemudian baris kosong, kemudian sebarang pemecah baris, kemudian sempadan ayat, kemudian sempadan klausa pada koma dan koma bertitik, kemudian ruang putih antara perkataan. Hanya jika tiada satu pun daripadanya wujud — bundle yang diminifikasi, satu perkataan yang teramat panjang — barulah ia berundur kepada pemotongan mengikut indeks token.

Kesan praktikalnya ialah struktur dikekalkan selagi teks itu ada struktur. Dokumen bertajuk terpecah pada bahagian. Prosa terpecah pada perenggan, atau pada ayat apabila satu perenggan terlalu panjang. Dinding teks tanpa pemecahan terpecah pada perkataan. Setiap segmen berakhir di tempat manusia juga akan mengakhirinya, melainkan teks itu langsung tidak menawarkan peluang sebegitu.

Untuk apa sebenarnya pertindihan itu

Pertindihan mengulang ekor satu segmen di kepala segmen berikutnya. Ia wujud kerana sesuatu fakta dan perkara yang dirujuknya selalunya berada di dua belah sempadan. “Migrasi itu berjalan sepanjang malam. Ia gagal pada jadual ketiga.” Potong antara dua ayat itu dan segmen kedua mengandungi kegagalan tanpa subjek, manakala yang pertama mengandungi migrasi tanpa kesudahan. Kedua-duanya tidak berguna semasa perolehan. Dengan pertindihan, segmen kedua membawa rujukan awalnya.

Kosnya ialah pertindanan: token yang bertindih disimpan, dibenamkan dan dicari lebih daripada sekali. Sepuluh hingga lima belas peratus daripada saiz segmen ialah kompromi lazim, dan di situlah pratetapnya berada. Panel statistik melaporkan dengan tepat berapa banyak token yang ditambah oleh pertindihan, jadi pertimbangan itu menjadi angka dan bukan perasaan.

Satu pengadang yang berbaloi diketahui: pertindihan yang sama atau lebih besar daripada saiz segmen bermakna setiap segmen bermula dengan segala yang diakhiri oleh segmen sebelumnya, dan prosesnya tidak pernah bergerak ke hadapan. Itu diapit dan bukan dibiarkan tergantung.

Memilih saiz

Saiz segmen ialah pertimbangan antara ketepatan dan konteks, dan tiada jawapan yang betul secara sejagat:

  • Segmen kecil, sekitar 256 token, memberi padanan yang tajam. Vektor yang meliputi dua atau tiga ayat dikuasai oleh apa yang ayat itu katakan. Sesuai untuk menjawab soalan atas bahan rujukan yang padat. Risikonya ialah segmen yang memadan dengan baik tetapi kekurangan konteks sekeliling untuk benar-benar menjawab.
  • Segmen sederhana, sekitar 512, ialah lalai yang lazim dan tempat kebanyakan model embedding paling selesa. Lebih kurang satu perenggan yang berisi.
  • Segmen besar, 1024 ke atas, membawa lebih banyak konteks bagi setiap padanan tetapi mencairkan vektor. Segmen yang meliputi empat topik duduk pada purata keempat-empatnya dan tidak memadan kuat dengan mana-mana.
  • Segmen sangat besar, beberapa ribu token, berhenti menjadi unit perolehan dan menjadi unit penghalaman — untuk menyuap dokumen panjang melalui model secara berturutan dan bukan untuk mencarinya.

Empat strategi memecah teks

Pecahan pintar ialah tangga rekursif yang diterangkan di atas, dan sesuai untuk kebanyakan prosa. Perenggan mengemas perenggan penuh dan tidak pernah membelahnya, sesuai untuk teks yang perenggannya memang sudah unit fikiran dan anda lebih rela saiz segmen tidak sekata daripada perenggan yang tercarik. Tajuk Markdown memberi satu segmen bagi setiap bahagian, pilihan semula jadi untuk dokumentasi yang tajuknya menamakan dengan tepat apa yang ada di bawahnya. Baris mengemas baris penuh, untuk log, petikan CSV dan senarai yang setiap barisnya berdiri sendiri.

Dalam setiap mod, mana-mana unit yang masih melebihi had dikecilkan oleh pemecah rekursif sebelum dikemas, jadi pilihan strategi tidak pernah menghasilkan segmen yang terlebih saiz.

Mengira token, dan apa maksud angka itu

Token dikira dengan tokenizer yang sama yang digunakan laman ini untuk mengukur saiz repositori, daripada keluarga yang digunakan model OpenAI. Kiraan untuk Claude dan Gemini berbeza sedikit — perbendaharaan yang berlainan memenggal teks yang sama secara berlainan — tetapi cukup rapat untuk mengukur satu segmen terhadap satu had. Kalau bajet anda ketat, tinggalkan ruang lebih dan jangan anggap angka itu tepat mutlak.

Perhatikan juga bahawa had yang dinyatakan model embedding ialah titik pemenggalan keras, bukan sasaran. Lebihinya dan ekornya digugurkan secara senyap — satu mod kegagalan yang tidak menghasilkan ralat dan merosotkan perolehan dengan cara yang benar-benar sukar didiagnosis.

Output yang boleh anda suapkan ke tempat lain

Tiga muat turun. Teks biasa dengan pengepala --- Chunk n/N --- pilihan, untuk dibaca dan disemak. JSON sebagai tatasusunan objek dengan indeks, kiraan token dan teks, untuk skrip yang menelan kesemuanya. JSONL dengan satu objek setiap baris, iaitu apa yang diharapkan oleh penyerapan strim dan kebanyakan hujung embedding berkelompok, dan apa yang anda mahukan apabila korpus terlalu besar untuk dimuatkan dalam memori sebagai satu tatasusunan terhurai.

Ini berpasangan secara semula jadi dengan selebihnya laman ini: tukar repositori, PDF, halaman web atau transkrip kepada teks dahulu, kemudian pecahkan hasilnya di sini. Tiada apa yang dimuat naik pada mana-mana langkah.