> For the complete documentation index, see [llms.txt](https://altero.gitbook.io/langchain-book-by-altero/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://altero.gitbook.io/langchain-book-by-altero/ch10-retriever/05.-pengambil-dokumen-induk-parentdocumentretriever.md).

# 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:

```notebook-python
%pip install -qU deeplake
```

Buat objek `TextLoader` untuk memuat beberapa file teks dan memuat data.

```python
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
```

```python
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.

```python
# 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.

```python
# 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.

```python
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.

```python
sub_docs = vectorstore.similarity_search("Word2Vec")
```

Keluaran sub\_docs\[0].page\_content.

```python
# 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 m**engembalikan dokumen** dengan potongan-potongan kecil di dalamnya.

Gunakan metode `get_relevant_documents()` pada objek `retriever` untuk mengambil dokumen yang relevan dengan kueri.

```python
# Mengambil dokumen.
retrieved_docs = retriever.get_relevant_documents("Word2Vec")
```

Keluarkan beberapa isi dari dokumen yang diambil (`retrieved_docs[0]`).

```python
# 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])
```

{% code overflow="wrap" %}

```
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
```

{% endcode %}

## 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.

```python
# 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.

```python
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`.

```python
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.

```python
# 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`.

```python
# 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.

```python
# 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)
```

{% code overflow="wrap" %}

```
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
```

{% endcode %}

```python
# Cetak isi dokument pertama hasil pencarian.
print(retrieved_docs[0].page_content)
```

{% code overflow="wrap" %}

```
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
```

{% endcode %}
