05. Pengambil Dokumen Induk (ParentDocumentRetriever)
Parent Document Retriever
Menyeimbangkan pengambilan dokumen dan segmentasi dokumen
Membagi dokumen menjadi beberapa bagian (potongan) dengan ukuran yang tepat selama pengambilan dokumen merupakan tindakan menyeimbangkan antara dua faktor penting yang sering kali saling bertentangan:
- Anda menginginkan dokumen yang kecil: Hal ini memastikan bahwa penyematan dokumen mencerminkan maknanya secara akurat. Jika dokumen terlalu panjang, penyematan dapat kehilangan maknanya.
- Anda menginginkan dokumen yang cukup panjang sehingga konteks setiap bagian tetap terjaga.
Peran ParentDocumentRetriever
Untuk menyeimbangkan kedua persyaratan ini, alat yang disebut ParentDocumentRetriever
digunakan. Alat ini memecah dokumen menjadi bagian-bagian yang lebih kecil dan mengelola bagian-bagian ini. Ketika mencari, alat ini pertama-tama menemukan potongan-potongan kecil ini, dan kemudian menggunakan pengenal (ID) dokumen asli (atau bagian yang lebih besar) yang menjadi bagian dari dokumen tersebut untuk mendapatkan konteks lengkapnya.
Ketika kami mengatakan “dokumen induk”, yang kami maksud adalah dokumen asli yang darinya potongan-potongan kecil tersebut dipisahkan. Ini bisa berupa keseluruhan dokumen, atau bisa juga bagian lain yang lebih besar. Dengan cara ini, Anda dapat menentukan dengan tepat apa yang dimaksud oleh dokumen tersebut, sambil tetap mempertahankan konteks keseluruhan.
Penganturan
- Memanfaatkan struktur hirarkis di antara dokumen:
ParentDocumentRetriever
memanfaatkan struktur hirarkis di antara dokumen untuk meningkatkan efisiensi pencarian dokumen. - Meningkatkan kinerja pencarian: Anda dapat dengan cepat menemukan dokumen yang relevan dan secara efektif menemukan dokumen yang memberikan jawaban terbaik untuk pertanyaan yang diberikan. Ada dua persyaratan yang saling bertentangan yang sering muncul saat mencari dokumen:
%pip install -qU deeplake
Buat objek TextLoader
untuk memuat beberapa file teks dan memuat data.
from langchain.storage import InMemoryStore
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.retrievers import ParentDocumentRetriever
Pada bagian ini, anda akan memerlukan file berikut: appendix-keywords.txt (opens in a new tab)
loaders = [
# Muat file.
TextLoader("./data/ai-story.txt"),
# Muat file.
TextLoader("./data/appendix-keywords.txt"),
]
docs = [] # Buat list kosong.
for loader in loaders: # Lakukan loop untuk setiap loader di dalam list.
docs.extend(
loader.load()
) # Gunakan loader untuk memuat dokumen dan tambahkan ke list docs.
Mencari seluruh dokumen
Dalam mode ini, kita ingin mencari seluruh dokumen, jadi kita hanya akan menentukan child_splitter
.
Kemudian, kita juga akan menentukan parent_splitter
untuk membandingkan hasilnya.
# Membuat splitter anak.
child_splitter = RecursiveCharacterTextSplitter(chunk_size=300)
# Membuat DB.
vectorstore = Chroma(
collection_name="full_documents", embedding_function=OpenAIEmbeddings()
)
store = InMemoryStore()
# Membuat Retriever.
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=store,
child_splitter=child_splitter,
)
Menambahkan daftar dokumen dengan fungsi retriever.add_documents(docs, ids = None)
.
- Jika
ids = None
, maka akan dibuat secara otomatis. Jikaadd_to_docstore = False
, dokumen tidak akan ditambahkan sebagai duplikat, namun nilai ids diperlukan untuk memeriksa duplikat.
# Menambahkan dokumen ke pencari, di mana docs adalah daftar dokumen dan ids adalah daftar pengenal unik untuk dokumen.
retriever.add_documents(docs, ids=None, add_to_docstore=True)
Kode ini seharusnya mengembalikan dua kunci, karena kita telah menambahkan dua dokumen.
- Panggil metode
yield_keys()
pada objekstore
untuk mengubah nilai kunci yang dikembalikan menjadi sebuah daftar.
list(store.yield_keys())
['a5bd9aba-b0d3-484e-a846-bf556302371d', '90b972b3-5a3a-4ab2-a9c2-285446f47f89']
Sekarang mari kita panggil fungsi pencarian Vector Store.
Karena kita menyimpan potongan-potongan kecil, kita akan melihat potongan-potongan kecil yang dikembalikan dalam hasil pencarian.
Kita menggunakan metode similarity_search
dari objek vectorstore
untuk melakukan pencarian kemiripan.
sub_docs = vectorstore.similarity_search("Word2Vec")
Keluaran sub_docs[0].page_content.
# Mencetak properti page_content dari elemen pertama dalam daftar sub_docs.
print(sub_docs[0].page_content)
Word2Vec
Sekarang mari kita cari di seluruh retriever, yang akan mengembalikan dokumen yang relatif besar karena retriever mengembalikan dokumen dengan potongan-potongan kecil di dalamnya.
Gunakan metode get_relevant_documents()
pada objek retriever
untuk mengambil dokumen yang relevan dengan kueri.
# Mengambil dokumen.
retrieved_docs = retriever.get_relevant_documents("Word2Vec")
Keluarkan beberapa isi dari dokumen yang diambil (retrieved_docs[0]
).
# Cetak panjang konten halaman dari dokumen yang ditemukan.
print(
f"Panjang dokumen: {len(retrieved_docs[0].page_content)}",
end="\n\n=====================\n\n",
)
# Cetak sebagian dari dokumen.
print(retrieved_docs[0].page_content[2000:2500])
Panjang dokumen: 4967
=====================
isipan, dan penghapusan data.
Contoh: SELECT * FROM users WHERE age > 18; akan menampilkan informasi pengguna yang berusia lebih dari 18 tahun.
Kata Kunci Terkait: Basis Data, Query, Manajemen Data
CSV
Definisi: CSV (Comma-Separated Values) adalah format file yang digunakan untuk menyimpan data, di mana setiap nilai data dipisahkan oleh koma. Ini sering digunakan untuk menyimpan dan menukar data dalam bentuk tabel.
Contoh: File CSV dengan header nama, usia, pekerjaan dapat berisi data seperti
Mencari dari potongan berukuran lebih besar
Seperti hasil sebelumnya, seluruh dokumen
mungkin terlalu besar untuk dicari sebagaimana adanya.
Dalam kasus ini, yang sebenarnya ingin kita lakukan adalah pertama-tama membagi dokumen mentah menjadi potongan-potongan yang lebih besar, lalu menjadi potongan-potongan yang lebih kecil.
Kita kemudian mengindeks bagian yang lebih kecil, tetapi saat mencari, kita mengambil bagian yang lebih besar (tetapi tetap tidak seluruh dokumen).
- Buat dokumen induk dan anak menggunakan
RecursiveCharacterTextSplitter
. - Dokumen induk memiliki
chunk_size
yang disetel ke 1200. - Dokumen anak memiliki
chunk_size
yang disetel ke 300, dan dibuat dengan ukuran yang lebih kecil dari dokumen induk.
# Ini adalah pembagi teks yang digunakan untuk membuat dokumen induk.
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=900)
# Ini adalah pembagi teks yang digunakan untuk membuat dokumen anak.
# Dokumen anak harus lebih kecil dari dokumen induk.
child_splitter = RecursiveCharacterTextSplitter(chunk_size=300)
# Ini adalah penyimpanan vektor yang akan digunakan untuk mengindeks chunk anak.
vectorstore = Chroma(
collection_name="split_parents", embedding_function=OpenAIEmbeddings()
)
# Ini adalah lapisan penyimpanan untuk dokumen induk.
store = InMemoryStore()
Ini adalah kode untuk menginisialisasi ParentDocumentRetriever
.
- Parameter
vectorstore
menentukan penyimpanan vektor yang menyimpan vektor dokumen. - Parameter
docstore
menentukan penyimpanan dokumen yang menyimpan data dokumen. - Parameter
child_splitter
menentukan pemisah dokumen yang digunakan untuk membagi dokumen anak. - Parameter
parent_splitter
menentukan pemisah dokumen yang digunakan untuk membagi dokumen induk.
ParentDocumentRetriever
menangani struktur dokumen hirarkis, memisahkan dan menyimpan dokumen induk dan anak secara terpisah. Hal ini memungkinkan Anda memanfaatkan dokumen induk dan anak secara efektif saat melakukan pencarian.
retriever = ParentDocumentRetriever(
# Tentukan penyimpanan vektor.
vectorstore=vectorstore,
# Tentukan penyimpanan dokumen.
docstore=store,
# Tentukan pemisah dokumentasi anak.
child_splitter=child_plitter,
# Tentukan pemisah dokumentasi induk.
parent_splitter=parent_plitter,
)
Menambahkan docs
ke objek retriever
, yang berfungsi untuk menambahkan dokumen baru ke kumpulan dokumen yang dapat diambil oleh retriever
.
retriever.add_documents(docs) # Tambahkan dokumen ke retriever.
Anda dapat melihat bahwa jumlah dokumen sekarang jauh lebih besar. Dokumen-dokumen ini merupakan potongan-potongan yang lebih besar.
# Menghasilkan keys dari penyimpanan, mengonversinya menjadi daftar, dan mengembalikan panjangnya.
len(list(store.yield_keys()))
11
Mari kita periksa apakah penyimpanan vektor default masih mengambil potongan-potongan kecil.
Lakukan pencarian kemiripan menggunakan metode similarity_search
pada objek vectorstore
.
# Melakukan pencarian berdasarkan kesamaan.
sub_docs = vectorstore.similarity_search("Word2Vec")
# Cetak konten halaman pada elemen pertama dalam daftar sub_docs.
print(sub_docs[0].page_content)
Word2Vec
Kali ini, kita menggunakan metode get_relevant_documents
dari objek retriever
untuk mengambil dokumen.
# Mengambil dokumen yang relevan.
retrieved_docs = retriever.get_relevant_documents("Word2Vec")
# Panjang konten halaman pada dokument pertama hasil pencarian.
print(retrieved_docs[0].page_content)
Digital Transformation
Definisi: Transformasi digital adalah proses inovasi layanan, budaya, dan operasi perusahaan dengan memanfaatkan teknologi. Fokusnya adalah meningkatkan model bisnis dan daya saing melalui teknologi digital.
Contoh: Penggunaan cloud computing untuk menyimpan dan memproses data oleh perusahaan adalah contoh transformasi digital.
Kata Kunci Terkait: Inovasi, Teknologi, Model Bisnis
Crawling
Definisi: Crawling adalah proses mengunjungi halaman web secara otomatis untuk mengumpulkan data. Ini sering digunakan dalam optimasi mesin pencari atau analisis data.
Contoh: Mesin pencari Google mengunjungi situs web di internet untuk mengumpulkan konten dan membuat indeks, yang dikenal sebagai crawling.
Kata Kunci Terkait: Pengumpulan Data, Web Scraping, Mesin Pencari
Word2Vec
# Cetak isi dokument pertama hasil pencarian.
print(retrieved_docs[0].page_content)
Digital Transformation
Definisi: Transformasi digital adalah proses inovasi layanan, budaya, dan operasi perusahaan dengan memanfaatkan teknologi. Fokusnya adalah meningkatkan model bisnis dan daya saing melalui teknologi digital.
Contoh: Penggunaan cloud computing untuk menyimpan dan memproses data oleh perusahaan adalah contoh transformasi digital.
Kata Kunci Terkait: Inovasi, Teknologi, Model Bisnis
Crawling
Definisi: Crawling adalah proses mengunjungi halaman web secara otomatis untuk mengumpulkan data. Ini sering digunakan dalam optimasi mesin pencari atau analisis data.
Contoh: Mesin pencari Google mengunjungi situs web di internet untuk mengumpulkan konten dan membuat indeks, yang dikenal sebagai crawling.
Kata Kunci Terkait: Pengumpulan Data, Web Scraping, Mesin Pencari
Word2Vec