Untuk RAG, ubah PDF menjadi Markdown jika Anda menginginkan potongan yang mengikuti bagian dokumen: setiap judul menjadi titik pemisah, dan judul di atas sebuah potongan ikut terbawa sebagai metadata. Periksa judul, tabel, dan teks OCR sebelum mengindeks, lalu uji pengambilan pada pertanyaan yang jawabannya sudah Anda ketahui.
Panduan ini untuk pengembang yang membangun pengambilan atas dokumen pribadi: kebijakan, manual, kontrak, riset. Panduan ini mengasumsikan Anda sudah punya model embedding dan penyimpanan vektor.
Mengapa judul menghasilkan potongan yang lebih baik
Pemecah berukuran tetap memotong teks menjadi bagian dengan panjang tertentu, di mana pun potongannya jatuh. Sebuah potongan bisa dimulai di tengah bagian dan kehilangan judul yang menjelaskan topiknya. “Permintaan dibatasi 100 per menit” berarti satu hal di bawah “Sandbox” dan hal lain di bawah “Production”. Tanpa judulnya, baik pengambil maupun model tidak bisa membedakan yang mana.
Markdown menyimpan kerangka dokumen sebagai baris yang diawali #, ##, dan ###. Pemecah berbasis judul memotong pada baris-baris itu, sehingga setiap potongan mencakup satu bagian, dan mencatat judul di atas potongan tersebut: jalur bagiannya. Panduan LangChain tentang memecah Markdown menjelaskan gagasan yang sama: simpan teks bersama judul yang menaunginya.
Panjang bagian bervariasi, jadi bagian yang panjang masih perlu dipecah lagi menurut ukuran. Jalur bagian berlaku untuk setiap potongannya.
Konversikan PDF dan periksa judulnya
Di MD Factory, tambahkan folder berisi PDF Anda. Setiap file Markdown disimpan di samping PDF-nya dengan nama yang sama, dengan gambar di folder di sebelahnya. PDF hasil pindai melewati OCR di PC Anda. File Word dan format lain di folder itu dikonversi dengan cara yang sama.
Buka beberapa hasil sebelum Anda menulis kode pemecah apa pun:
- Pastikan bab, bagian, dan subbagian muncul sebagai #, ##, dan ###. PDF sering menandai judul hanya dengan font yang lebih besar atau tebal, jadi konverter apa pun harus menebak di mana bagian dimulai dan bagaimana susunannya. Perbaiki tingkat yang salah.
- Di file Word, judul ikut terbawa jika penulis memakai gaya Heading Word. Teks yang hanya tebal atau besar tetap menjadi paragraf biasa.
- Cari header, footer, dan nomor halaman yang berulang di tengah teks.
- Klik Perlu diperiksa di samping file untuk melihat apa yang perlu diperiksa. Untuk PDF, daftarnya bisa mencakup halaman yang sebagian teksnya tidak bisa dibaca OCR atau tidak ada teksnya sama sekali.
Perbaiki masalah di file Markdown sebelum mengindeksnya. Setiap potongan mewarisinya.
Pecah menurut judul di kode
MarkdownHeaderTextSplitter dari LangChain memecah pada tingkat judul yang Anda daftarkan dan menaruh setiap judul ke metadata potongan. Pemecah kedua membatasi ukuran di dalam setiap bagian:
from pathlib import Path
from langchain_text_splitters import (
MarkdownHeaderTextSplitter,
RecursiveCharacterTextSplitter,
)
corpus = Path("corpus")
by_heading = MarkdownHeaderTextSplitter(
[("#", "h1"), ("##", "h2"), ("###", "h3")], strip_headers=False
)
by_size = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=150)
chunks = []
for path in sorted(corpus.rglob("*.md")):
sections = by_heading.split_text(path.read_text(encoding="utf-8"))
for chunk in by_size.split_documents(sections):
chunk.metadata["source"] = path.relative_to(corpus).as_posix()
chunk.metadata["section"] = " > ".join(
chunk.metadata[h] for h in ("h1", "h2", "h3") if h in chunk.metadata
)
chunks.append(chunk)
Ukuran potongan dan tumpang tindih di sini hanyalah titik awal; sesuaikan dengan model embedding Anda. Agar baris judul tetap ada di teks potongan, sehingga teks yang Anda embed juga menyebut bagiannya, contoh ini mengatur strip_headers=False.
MarkdownNodeParser dari LlamaIndex melakukan pemecahan judul yang sama. Saat Anda memuat file dengan SimpleDirectoryReader, setiap node juga membawa nama file:
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import MarkdownNodeParser
documents = SimpleDirectoryReader(
"corpus", recursive=True, required_exts=[".md"]
).load_data()
nodes = MarkdownNodeParser().get_nodes_from_documents(documents)
print(nodes[0].metadata["file_name"], nodes[0].metadata["header_path"])
header_path mencantumkan judul di atas sebuah node, misalnya /Employee handbook/Expenses/; judul node itu sendiri adalah baris pertama teksnya.
Sertakan sumber pada setiap potongan
Simpan setidaknya tiga hal pada setiap potongan:
- File-nya. File Markdown punya nama yang sama dengan PDF-nya, jadi potongan dari handbook.md mengarah kembali ke handbook.pdf. Simpan jalur relatif terhadap folder korpus, karena dua file bernama terms.md di folder berbeda adalah dokumen berbeda.
- Jalur bagian, agar jawaban bisa menyebut bagian yang dipakai dan pembaca bisa langsung menuju kutipannya.
- Edisi atau tanggal. Saat kebijakan berubah, Anda menghapus potongan dari file lama dan mengindeks yang baru, alih-alih menyajikan kedua versi.
Jika orang dengan hak akses berbeda akan menanyakan indeks yang sama, simpan juga siapa yang boleh membaca setiap dokumen, dan filter berdasarkan itu saat kueri. Pengambil mengembalikan potongan mana pun yang cocok dengan pertanyaan.
Markdown yang dihasilkan MD Factory tidak memiliki nomor halaman. Jika jawaban harus mengutip halaman, cari kutipannya di PDF asli.
Tangani tabel dan teks OCR dengan hati-hati
Tabel Markdown memiliki baris judul sekali, di bagian atas. Jika tabel lebih panjang dari ukuran potongan, pemecah ukuran memotongnya, dan potongan berikutnya datang tanpa nama kolom. Dalam pengujian kami dengan LangChain (langchain-text-splitters 1.1.3), tabel 40 baris yang dipecah menjadi potongan 300 karakter menghasilkan empat bagian, dan hanya yang pertama berisi baris judul.
Dua cara memperbaikinya: simpan setiap tabel dalam satu potongan meskipun lebih panjang dari yang lain, atau ulangi baris judul di awal setiap bagian.
Untuk file Word dan Excel, MD Factory menandai dokumen Perlu diperiksa saat sel gabungan atau kompleks disederhanakan. Tabel PDF tidak mendapat tanda seperti itu, jadi bandingkan beberapa di antaranya dengan aslinya, terutama tabel dengan judul gabungan.
Teks OCR perlu diperiksa tersendiri. Angka, nama, dan kode yang salah baca masuk ke jawaban tanpa berubah, dan tidak ada yang tampak salah pada potongannya. Bandingkan angka di beberapa potongan dengan hasil pindaian, dan jangan masukkan halaman yang ditandai ke indeks sampai Anda memperbaikinya. Hal yang perlu dicari dibahas di panduan kami untuk memeriksa OCR pada PDF hasil pindai.
Uji pengambilan pada pertanyaan nyata
Tuliskan pertanyaan yang benar-benar akan diajukan orang, dan untuk masing-masing, file serta bagian yang memuat jawabannya. Mulailah dengan selusin atau dua lusin.
- Jalankan setiap pertanyaan melalui pengambil Anda dan lihat hasil teratasnya.
- Catat apakah bagian yang benar ada di antaranya.
- Untuk setiap yang meleset, bandingkan potongan yang kembali dengan yang seharusnya. Penyebab umum: tingkat judul yang salah, tabel terpisah dari judulnya, kesalahan OCR pada istilah kunci, atau bagian yang begitu panjang sehingga jawabannya terkubur.
- Ubah satu hal, seperti ukuran potongan, tingkat judul, atau cara tabel dipecah, lalu jalankan pertanyaan yang sama lagi.
Simpan pertanyaan dalam satu file di samping korpus dan jalankan ulang setiap kali dokumen atau kode pemecahan berubah.
Kapan memakai MD Factory dan kapan memakai pustaka
MD Factory adalah aplikasi desktop untuk Windows. Aplikasi ini cocok untuk koleksi pribadi yang ingin Anda konversi di PC sendiri dan periksa dengan mata: tambahkan folder, lihat statusnya, buka file yang perlu diperiksa, perbaiki, lalu arahkan skrip pengindeksan Anda ke folder itu.
MD Factory menjaga dokumen tetap di PC Anda saat mengonversinya. Jika Anda kemudian meng-embed potongan dengan API embedding yang di-hosting atau mengirimkannya ke model yang di-hosting, teksnya dikirim ke penyedia itu. Gunakan model lokal jika dokumen tidak boleh keluar dari jaringan Anda.
Jika dokumen datang terus-menerus, berada di server, atau harus dikonversi tanpa ada orang yang mengawasi, gunakan pustaka konversi di kode Anda. Untuk pilihannya, lihat perbandingan konverter PDF ke Markdown kami.