Konverter Dokumen
Konverter dokumen LangChain utamanya berfungsi untuk membagi konten teks, memecah artikel besar menjadi beberapa fragmen konten yang lebih kecil. Hal ini dilakukan karena model besar biasanya memiliki batasan panjang prompt dan tidak dapat memberikan seluruh konten ke kecerdasan buatan (AI). Meskipun beberapa model besar memperbolehkan panjang prompt yang sangat besar, dari segi biaya, tidak praktis untuk memasukkan konten yang begitu panjang ke AI. Setelah semua, semakin panjang kontennya, semakin tinggi biaya panggilan API (bahkan untuk model open-source yang diimplementasikan secara lokal, konten yang lebih panjang memerlukan lebih banyak memori GPU dan inferensi yang lebih lambat). Pendekatan yang masuk akal adalah untuk menggabungkan fragmen konten yang relevan sebagai informasi latar belakang dan prompt saat meminta model AI.
LangChain memiliki banyak konverter dokumen bawaan yang dapat dengan mudah membagi, menggabungkan, dan menyaring konten dokumen.
Pemisah Teks
Ketika menghadapi blok teks yang besar, Anda harus membagi teks menjadi bagian-bagian kecil. Meskipun terdengar sederhana, ada banyak kompleksitas potensial di sini. Idealnya, Anda ingin menjaga segmen teks yang berhubungan secara semantik tetap bersama-sama. Istilah "berhubungan secara semantik" di sini mungkin bergantung pada jenis teks.
Secara umum, pemisah teks bekerja sebagai berikut:
- Membagi teks menjadi blok-blok kecil yang bermakna secara semantik (biasanya kalimat).
- Mulai menggabungkan blok-blok kecil ini ke dalam blok-blok yang lebih besar hingga mencapai ukuran tertentu (diukur oleh suatu fungsi).
- Begitu ukuran ini tercapai, memperlakukan blok sebagai segmen teksnya sendiri dan mulai membuat blok teks baru dengan beberapa tumpang tindih (untuk menjaga konteks antara blok-blok).
Ini berarti Anda dapat menyesuaikan pemisah teks secara berbeda melalui dua sumbu yang berbeda:
- Cara membagi teks
- Cara mengukur ukuran blok-blok
Contoh
Pemisah teks default yang direkomendasikan adalah RecursiveCharacterTextSplitter. Pemisah teks ini menerima daftar karakter. Ia mencoba membuat blok berdasarkan karakter pertama, tetapi jika blok manapun terlalu besar, ia akan terus bergerak ke karakter berikutnya, dan seterusnya. Secara default, karakter-karakter yang ia coba bagi adalah ["\\\\n\\\\n", "\\\\n", " ", ""]
.
Selain mengendalikan karakter-karakter mana yang dapat dipisahkan, Anda juga dapat mengendalikan beberapa masalah lain:
-
length_function
: Cara menghitung panjang blok. Secara default, hanya jumlah karakter yang dihitung, tetapi penghitung token seringkali dilewatkan di sini. -
chunk_size
: Ukuran maksimum blok Anda (diukur oleh fungsi panjang). -
chunk_overlap
: Tumpang tindih maksimum antara blok-blok. Menjaga beberapa tumpang tindih dapat membantu menjaga kelanjutan antara blok-blok (misalnya, melakukan jendela geser). -
add_start_index
: Apakah akan menyertakan posisi awal setiap blok dalam dokumen asli di metadata.
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..ignored text..' metadata={'start_index': 0}
page_content='..ignored text..' metadata={'start_index': 82}
Transformasi Lainnya:
Menyaring Dokumen yang Redundan, Menerjemahkan Dokumen, Mengekstrak Metadata, dan Lainnya
Selain membagi dokumen, kita juga dapat melakukan transformasi lainnya pada konten dokumen. Dengan menggunakan EmbeddingsRedundantFilter
, kita dapat mengidentifikasi dokumen-dokumen serupa dan menyaring konten yang redundan. Melalui integrasi seperti doctran, kita dapat melakukan operasi seperti menerjemahkan dokumen dari satu bahasa ke bahasa lain, mengekstrak properti yang diperlukan dan menambahkannya ke metadata, dan mengubah percakapan menjadi serangkaian dokumen berformat tanya/jawab.