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:

  1. Anda menginginkan dokumen yang kecil: Hal ini memastikan bahwa penyematan dokumen mencerminkan maknanya secara akurat. Jika dokumen terlalu panjang, penyematan dapat kehilangan maknanya.

  2. 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
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. Jika add_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 objek store 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

Last updated