Strategi Khusus Dokumen untuk Kode dan HTML
Terapkan pemotongan khusus untuk kode Python menggunakan pemisah fungsi berbasis AST, untuk HTML menggunakan pengurai yang memahami tag, dan untuk Markdown menggunakan hierarki tajuk.
Strategi Khusus Dokumen untuk Kode dan HTML adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Mengapa Pemotongan Umum Gagal pada Dokumen Khusus
Pemotongan berbasis teks dirancang untuk prosa, tetapi data dunia nyata mencakup kode sumber, halaman HTML, dan dokumentasi Markdown. Memisahkan kode pada batas karakter yang tetap dapat memotong fungsi di tengah badannya sehingga potongan tersebut tidak berguna untuk pengambilan. Dokumen khusus memerlukan pemotong yang memahami struktur internalnya, bukan hanya panjangnya.
Pemotongan Kode Python Berbasis AST
Pohon Sintaks Abstrak (AST) dari file Python menangkap setiap fungsi, kelas, dan modul sebagai simpul terstruktur. Dengan menelusuri AST, Anda dapat mengekstrak setiap fungsi atau metode sebagai potongan tersendiri, dengan tanda tangan, docstring, dan badan fungsi tetap bersatu. PythonCodeTextSplitter milik LangChain menggunakan pendekatan ini secara internal.
import ast
import textwrap
def extract_functions(source_code: str) -> list[dict]:
tree = ast.parse(source_code)
chunks = []
for node in ast.walk(tree):
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
start = node.lineno - 1
end = node.end_lineno
lines = source_code.splitlines()[start:end]
chunks.append({
'name': node.name,
'code': '\n'.join(lines),
'start_line': node.lineno,
})
return chunksPemotongan Berdasarkan Batas Kelas
Untuk basis kode berorientasi objek, pemotongan pada tingkat kelas sering kali lebih baik daripada pada tingkat fungsi. Potongan kelas mempertahankan hubungan antara metode dan keadaan bersama yang dioperasikannya. Anda dapat menyertakan docstring kelas dan semua badan metode sebagai satu potongan, lalu membuat potongan yang lebih terperinci secara terpisah hanya untuk metode yang panjang.
from langchain_text_splitters import Language, RecursiveCharacterTextSplitter
python_splitter = RecursiveCharacterTextSplitter.from_language(
language=Language.PYTHON,
chunk_size=1000,
chunk_overlap=100,
)
with open('my_module.py', 'r') as f:
source = f.read()
chunks = python_splitter.create_documents([source])
print(f'Created {len(chunks)} code chunks')Menambahkan Metadata Kode ke Potongan
Potongan kode mentah hanya akan berguna sesuai dengan metadata-nya. Saat menyimpan potongan kode dalam basis data vektor, sertakan jalur file, nama fungsi, bahasa pemrograman, dan rentang baris. Metadata ini memungkinkan pengambil menyaring berdasarkan bahasa atau file, serta memungkinkan LLM mencantumkan lokasi sumber yang tepat dalam jawabannya.
from langchain_core.documents import Document
def chunk_python_file(filepath: str) -> list[Document]:
with open(filepath) as f:
source = f.read()
functions = extract_functions(source) # from previous example
docs = []
for fn in functions:
docs.append(Document(
page_content=fn['code'],
metadata={
'source': filepath,
'function': fn['name'],
'language': 'python',
'start_line': fn['start_line'],
}
))
return docsHTML: Struktur Lebih Penting daripada Karakter
Dokumen HTML memiliki struktur hierarkis yang terdiri dari judul, bagian, paragraf, dan daftar. Memisahkan HTML berdasarkan jumlah karakter sering kali memotong tag sehingga menghasilkan fragmen yang tidak valid. Pendekatan yang tepat adalah mengurai HTML dengan pengurai yang sesuai seperti BeautifulSoup dan mengekstrak elemen yang bermakna secara semantik, seperti tag <article>, <section>, dan <p>.
from bs4 import BeautifulSoup
def chunk_html_by_section(html: str) -> list[dict]:
soup = BeautifulSoup(html, 'html.parser')
chunks = []
for tag in soup.find_all(['h1', 'h2', 'h3', 'p', 'li']):
text = tag.get_text(separator=' ', strip=True)
if len(text) > 40: # skip trivial fragments
chunks.append({
'tag': tag.name,
'text': text,
})
return chunksPemotongan HTML Berdasarkan Hierarki Header
Strategi HTML yang lebih canggih mengelompokkan konten di bawah judul terdekatnya. Setiap paragraf dan daftar yang mengikuti header <h2> menjadi bagian dari bagian tersebut. Dengan mengelompokkan teks bersama judul induknya, Anda mempertahankan konteks topik yang akan hilang jika paragraf berdiri sendiri. HTMLHeaderTextSplitter milik LangChain mengimplementasikan proses ini secara otomatis.
from langchain_text_splitters import HTMLHeaderTextSplitter
headers_to_split_on = [
('h1', 'Header 1'),
('h2', 'Header 2'),
('h3', 'Header 3'),
]
splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
with open('page.html') as f:
html = f.read()
sections = splitter.split_text(html)
for sec in sections[:3]:
print(sec.metadata)
print(sec.page_content[:200])
print('---')Markdown: Mempertahankan Hierarki Judul
Dokumentasi Markdown disusun menggunakan judul #, ##, dan ###. MarkdownHeaderTextSplitter memisahkan teks pada batas judul dan menyimpan hierarki judul dalam metadata. Artinya, setiap potongan mengetahui seluruh jalur judulnya, yang sangat meningkatkan relevansi konteks yang diambil ketika pengguna menanyakan bagian dokumentasi tertentu.
from langchain_text_splitters import MarkdownHeaderTextSplitter
headers_to_split_on = [
('#', 'H1'),
('##', 'H2'),
('###', 'H3'),
]
md_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
with open('README.md') as f:
markdown = f.read()
docs = md_splitter.split_text(markdown)
for doc in docs[:2]:
print('Metadata:', doc.metadata)
print('Content:', doc.page_content[:300])
print()Pemotongan Sekunder Setelah Pemisahan Berdasarkan Judul
Setelah dipisahkan berdasarkan judul, setiap bagian mungkin masih terlalu panjang untuk batas token model penyematan Anda. Pola yang disarankan adalah pemisahan dua langkah: pertama, pisahkan berdasarkan hierarki judul untuk mempertahankan konteks semantik, lalu terapkan pemisah berbasis karakter pada bagian yang melebihi batas ukuran potongan. Dengan demikian, tidak ada potongan yang terlalu besar dan metadata judul tetap terjaga.
from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
header_splitter = MarkdownHeaderTextSplitter(
headers_to_split_on=[('#', 'H1'), ('##', 'H2')]
)
char_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
)
with open('docs.md') as f:
md = f.read()
header_chunks = header_splitter.split_text(md)
final_chunks = char_splitter.split_documents(header_chunks)
print(f'{len(final_chunks)} final chunks produced')Memotong PDF dengan Memperhatikan Tabel
PDF yang diekstrak dengan alat seperti PyMuPDF atau pdfplumber sering kehilangan struktur tabel sehingga menghasilkan baris-baris teks yang kacau. Untuk menanganinya, gunakan pengurai PDF yang memahami tata letak, yang dapat mendeteksi kotak pembatas tabel dan mengubahnya menjadi format Markdown atau CSV sebelum pemotongan. Perlakukan setiap tabel sebagai satu potongan dengan metadata terstruktur yang mengidentifikasinya sebagai tabel, bukan prosa.
import pdfplumber
def extract_pdf_chunks(pdf_path: str) -> list[dict]:
chunks = []
with pdfplumber.open(pdf_path) as pdf:
for page_num, page in enumerate(pdf.pages):
# Extract tables separately
for table in page.extract_tables():
rows = ['|'.join(str(c) for c in row) for row in table]
chunks.append({
'type': 'table',
'content': '\n'.join(rows),
'page': page_num + 1,
})
# Extract prose text
text = page.extract_text()
if text:
chunks.append({'type': 'text', 'content': text, 'page': page_num + 1})
return chunksDeteksi Bahasa untuk Korpus Campuran
Basis pengetahuan perusahaan sering mencampur berbagai jenis file: skrip Python, dokumentasi API dalam HTML, catatan arsitektur dalam Markdown, dan ekspor data dalam CSV. Alur pemotongan yang andal harus mendeteksi jenis file dari ekstensi atau tipe MIME, lalu mengarahkan setiap dokumen ke pemotong khusus yang sesuai. Dengan begitu, logika pemotongan kode tidak diterapkan pada prosa, dan sebaliknya.
from pathlib import Path
def route_document(filepath: str) -> list[dict]:
ext = Path(filepath).suffix.lower()
if ext == '.py':
return chunk_python_file(filepath)
elif ext in ('.html', '.htm'):
with open(filepath) as f:
return chunk_html_by_section(f.read())
elif ext == '.md':
# use MarkdownHeaderTextSplitter
return chunk_markdown(filepath)
elif ext == '.pdf':
return extract_pdf_chunks(filepath)
else:
# fallback: plain text recursive splitter
return chunk_plain_text(filepath)Mempertahankan Konteks dengan Baris di Sekitar
Saat memotong kode berdasarkan fungsi, sering kali berguna untuk menyertakan beberapa baris konteks di sekitar, seperti pernyataan impor di bagian atas file atau definisi kelas yang memuat suatu metode. Konteks ini membantu LLM memahami pustaka yang tersedia dan peran fungsi tersebut dalam kelas yang lebih luas, sehingga meningkatkan kualitas jawaban yang dihasilkan.
def chunk_with_imports(source_code: str, fn_node, lines: list[str]) -> str:
# Gather top-of-file imports (first block before first non-import)
import_lines = []
for line in lines:
stripped = line.strip()
if stripped.startswith('import ') or stripped.startswith('from '):
import_lines.append(line)
elif stripped and not stripped.startswith('#'):
break
fn_body = '\n'.join(lines[fn_node.lineno - 1:fn_node.end_lineno])
return '\n'.join(import_lines) + '\n\n' + fn_bodyPemeriksaan Singkat
Uji pemahaman Anda tentang strategi pemotongan khusus dokumen dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: pemotongan berbasis AST mempertahankan batas fungsi dan kelas Python, HTMLHeaderTextSplitter dan MarkdownHeaderTextSplitter menghormati hierarki judul untuk menjaga konteks tetap bersama bagiannya, dan pendekatan dua langkah (pemisahan berdasarkan judul yang diikuti pemisahan berdasarkan karakter) menangani bagian yang terlalu besar tanpa kehilangan metadata struktural. Selanjutnya, kita akan membahas pencarian hibrida yang menggabungkan pengambilan padat dan jarang.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Strategi Khusus Dokumen untuk Kode dan HTML” gratis?
Ya — teks lengkap “Strategi Khusus Dokumen untuk Kode dan HTML” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Strategi Khusus Dokumen untuk Kode dan HTML”?
Terapkan pemotongan khusus untuk kode Python menggunakan pemisah fungsi berbasis AST, untuk HTML menggunakan pengurai yang memahami tag, dan untuk Markdown menggunakan hierarki tajuk. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Strategi Khusus Dokumen untuk Kode dan HTML” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Pemotongan Naif Menghambat Pengambilan
- Pemotongan Semantik dengan Kemiripan Embedding
- Pengambilan Induk-Anak dan Kecil-ke-Besar
- Strategi Khusus Dokumen untuk Kode dan HTML