Pengambilan Induk-Anak dan Kecil-ke-Besar
Simpan bahagian anak yang kecil untuk pengambilan tepat, tetapi kembalikan bahagian induknya yang lebih besar kepada LLM untuk konteks yang lebih kaya, sambil mengimbangi ketepatan pengambilan dengan kualiti penjanaan.
Pengambilan Induk-Anak dan Kecil-ke-Besar ialah pelajaran AI Engineering Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran AI Engineering Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Dilema Ketepatan Berbanding Konteks
Sistem RAG berdepan dengan pertentangan: segmen kecil diambil dengan ketepatan tinggi kerana setiap segmen tertumpu pada satu idea, tetapi tidak mempunyai konteks sekeliling yang diperlukan oleh LLM untuk menjana jawapan lengkap. Segmen besar memberikan konteks yang kaya tetapi mengurangkan ketepatan pengambilan semula kerana sepadan secara lemah dengan banyak pertanyaan, bukannya sepadan dengan kukuh dengan satu pertanyaan. Pembahagian induk-anak menyelesaikan dilema ini.
Seni Bina Induk-Anak
Dalam pembahagian induk-anak, anda mencipta dua lapisan segmen daripada dokumen yang sama. Segmen anak adalah kecil (contohnya, 1-3 ayat) dan dibenamkan serta diindeks untuk pengambilan semula. Segmen induk ialah bahagian yang lebih besar (contohnya, perenggan atau halaman penuh) yang disimpan secara berasingan. Apabila anak diambil, anda mengembalikan induknya kepada LLM.
Membina Hierarki Segmen
Langkah pertama ialah membahagikan dokumen kepada segmen induk yang besar, kemudian membahagikan setiap induk kepada segmen anak yang lebih kecil. Setiap segmen anak menyimpan rujukan — biasanya medan metadata parent_id — yang menunjuk kembali kepada induknya. Pemetaan ini membolehkan anda mencari petikan induk lengkap berdasarkan mana-mana anak yang diambil.
from langchain.text_splitter import RecursiveCharacterTextSplitter
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=0)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=30)
parent_chunks = parent_splitter.split_documents(docs)
child_chunks = []
for i, parent in enumerate(parent_chunks):
children = child_splitter.split_documents([parent])
for child in children:
child.metadata['parent_id'] = i
child_chunks.extend(children)Mengindeks Segmen Anak Sahaja
Hanya segmen anak yang dibenamkan dan disimpan dalam pangkalan data vektor. Segmen induk disimpan dalam stor nilai-kunci yang berasingan (kamus dalam memori, Redis atau pangkalan data dokumen). Ini memastikan indeks vektor kekal padat dan tepat, sementara konteks yang kaya berada di luarnya.
# Store parents in a docstore
parent_store = {i: chunk.page_content for i, chunk in enumerate(parent_chunks)}
# Embed and index only children
vectorstore = Chroma.from_documents(
child_chunks,
embedding=OpenAIEmbeddings()
)Pengambilan Semula: Anak Masuk, Induk Keluar
Semasa pengambilan semula, pertanyaan pengguna dibenamkan dan dipadankan dengan segmen anak. Segmen anak teratas-k dikenal pasti, dan rujukan parent_idnya diselesaikan dengan mencari dalam stor induk. Petikan induk — bukannya anak — kemudian dimasukkan ke dalam gesaan LLM. LLM menerima konteks yang luas; pengambilan semula adalah tepat.
def retrieve_with_parents(query, vectorstore, parent_store, k=5):
child_results = vectorstore.similarity_search(query, k=k)
seen_parent_ids = set()
parent_contexts = []
for child in child_results:
pid = child.metadata['parent_id']
if pid not in seen_parent_ids:
parent_contexts.append(parent_store[pid])
seen_parent_ids.add(pid)
return parent_contextsParentDocumentRetriever LangChain
LangChain menyediakan kelas ParentDocumentRetriever yang melaksanakan corak ini secara terbina dalam. Anda menyediakan pemisah induk, pemisah anak, stor vektor untuk pembenaman anak dan stor dokumen untuk dokumen induk. Ia menyusun hierarki dan mengendalikan proses mendapatkan semula secara telus.
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=store,
child_splitter=child_splitter,
parent_splitter=parent_splitter
)
retriever.add_documents(docs)
results = retriever.invoke('What is the refund policy?')Penerangan tentang Mendapatkan Semula daripada Kecil kepada Besar
Mendapatkan semula daripada kecil kepada besar ialah nama lain bagi konsep yang sama: anda mendapatkan semula bahagian kecil yang tepat, kemudian mengembangkannya kepada konteks sekeliling sebelum menghantarnya kepada LLM. Sesetengah pelaksanaan mengembangkan bahagian tersebut bukan kepada induk yang tetap, tetapi kepada tingkap ayat bersebelahan — iaitu memberikan model ayat sebelum dan selepas bahagian yang sepadan untuk kesinambungan konteks.
def retrieve_with_window(query, vectorstore, sentences, window=2, k=5):
results = vectorstore.similarity_search(query, k=k)
expanded = []
for r in results:
idx = r.metadata['sentence_index']
start = max(0, idx - window)
end = min(len(sentences), idx + window + 1)
expanded.append(' '.join(sentences[start:end]))
return expandedMembuang Pendua Bahagian Induk
Beberapa bahagian anak daripada induk yang sama mungkin semuanya diperoleh untuk satu pertanyaan. Tanpa pembuangan pendua, petikan induk yang sama akan muncul beberapa kali dalam gesaan, sekali gus membazirkan token. Sentiasa buang pendua berdasarkan ID induk sebelum menyusun konteks. Contoh kod dalam fungsi mendapatkan semula di atas mengendalikan perkara ini menggunakan set seen_parent_ids.
Bila Perlu Menggunakan Pembahagian Bahagian Induk-Anak
Mendapatkan semula induk-anak paling sesuai apabila dokumen anda mempunyai struktur hierarki yang jelas: bab dengan seksyen, artikel dengan perenggan atau wiki dengan subseksyen. Pendekatan ini amat berkesan untuk dokumentasi teknikal yang panjang, apabila soalan yang tepat memerlukan jawapan setempat tetapi jawapan tersebut hanya bermakna dalam konteks seksyen yang lebih luas.
Memilih Saiz Anak dan Induk
Konfigurasi biasa ialah: bahagian anak sebanyak 200-400 token (idea tunggal yang tertumpu) dan bahagian induk sebanyak 1000-2000 token (seksyen lengkap). Jika bahagian anak terlalu kecil, bahagian tersebut menjadi ayat individu yang tidak mempunyai makna tersendiri. Jika bahagian induk terlalu besar, anda mula mengembalikan masalah pencairan konteks yang cuba dielakkan.
Membandingkan Pendekatan: Ringkasan
Ringkasnya, bagi strategi pembahagian setakat ini: saiz tetap adalah pantas tetapi memutuskan konteks; pembahagian semantik mengekalkan kesepaduan topik; induk-anak mengoptimumkan ketepatan mendapatkan semula serta kekayaan konteks LLM. Bagi kebanyakan sistem RAG pengeluaran yang mengendalikan dokumen panjang, pembahagian induk-anak memberikan kualiti mendapatkan semula yang terbaik dengan kerumitan yang masih terkawal.
Semakan Pantas
Uji pemahaman anda tentang pembahagian induk-anak daripada pelajaran ini.
Ulang Kaji Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa: bahagian anak memberikan mendapatkan semula yang tepat manakala bahagian induk memberikan konteks yang kaya, ParentDocumentRetriever LangChain melaksanakan proses ini secara automatik, dan pembuangan pendua berdasarkan ID induk menghalang pengulangan konteks. Seterusnya, kita akan meneroka strategi pembahagian khusus dokumen untuk fail kod dan dokumen HTML.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Pengambilan Induk-Anak dan Kecil-ke-Besar” percuma?
Ya — teks penuh “Pengambilan Induk-Anak dan Kecil-ke-Besar” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus AI Engineering Academy, tingkat taraf kepada CoddyKit PRO. Kursus AI Engineering Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengambilan Induk-Anak dan Kecil-ke-Besar”?
Simpan bahagian anak yang kecil untuk pengambilan tepat, tetapi kembalikan bahagian induknya yang lebih besar kepada LLM untuk konteks yang lebih kaya, sambil mengimbangi ketepatan pengambilan dengan… Anda berlatih AI Engineering Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan AI Engineering Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran AI Engineering Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Pengambilan Induk-Anak dan Kecil-ke-Besar” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengapa Pembahagian Naif Menjejaskan Pengambilan
- Pembahagian Semantik dengan Persamaan Embedding
- Pengambilan Induk-Anak dan Kecil-ke-Besar
- Strategi Khusus Dokumen untuk Kod dan HTML