0Pricing
AI Engineering Academy · Ders

Kod ve HTML İçin Belgeye Özel Stratejiler

Python kodu için AST tabanlı işlev bölücülerle, HTML için etiketleri dikkate alan ayrıştırıcılarla ve Markdown için üst bilgi hiyerarşisiyle özelleştirilmiş parçalama uygulayın.

Kod ve HTML İçin Belgeye Özel Stratejiler, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

Genel Parçalama Neden Uzmanlaşmış Belgelerde Başarısız Olur

Metin tabanlı parçalama düzyazı için tasarlanmıştır, ancak gerçek dünyadaki verilerde kaynak kodu, HTML sayfaları ve Markdown belgeleri bulunur. Kodu sabit bir karakter sınırında bölmek, bir işlevi gövdesinin ortasından ayırabilir ve parçayı getirme açısından kullanışsız hâle getirebilir. Uzmanlaşmış belgeler yalnızca uzunluklarını değil, iç yapılarını da anlayan parçalayıcılara ihtiyaç duyar.

AST Tabanlı Python Kodu Parçalama

Bir Python dosyasının soyut söz dizimi ağacı (AST), her işlevi, sınıfı ve modülü yapılandırılmış bir düğüm olarak içerir. AST üzerinde gezinerek her işlevi veya yöntemi, imzasını, belge dizgesini ve gövdesini birlikte tutan ayrı bir parça olarak çıkarabilirsiniz. LangChain'in PythonCodeTextSplitter bileşeni bu yaklaşımı dahili olarak kullanır.

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 chunks

Sınıf Sınırlarına Göre Parçalama

Nesne yönelimli kod tabanlarında sınıf düzeyinde parçalama, çoğu zaman işlev düzeyinde parçalamadan daha iyidir. Bir sınıf parçası, yöntemler ile bunların üzerinde işlem yaptığı ortak durum arasındaki ilişkiyi korur. Sınıfın belge dizgesini ve tüm yöntem gövdelerini tek bir parça olarak içerebilir, ardından yalnızca uzun yöntemler için daha ayrıntılı ayrı parçalar oluşturabilirsiniz.

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')

Parçalara Kod Üst Verileri Ekleme

Ham kod parçaları ancak üst verileri kadar kullanışlıdır. Kod parçalarını bir vektör veritabanında saklarken dosya yolunu, işlev adını, programlama dilini ve satır aralığını ekleyin. Bu üst veriler, getiricinin dile veya dosyaya göre filtreleme yapmasını ve LLM'in yanıtında tam kaynak konumuna atıfta bulunmasını sağlar.

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 docs

HTML: Karakterlerden Önce Yapı

HTML belgeleri başlıklar, kısımlar, paragraflar ve listelerle hiyerarşik olarak yapılandırılır. HTML'yi karakter sayısına göre bölmek çoğu zaman etiketlerin ortasından keserek hatalı parçalar üretir. Doğru yaklaşım, HTML'yi BeautifulSoup gibi uygun bir ayrıştırıcıyla ayrıştırmak ve <article>, <section> ve <p> etiketleri gibi anlamsal açıdan anlamlı öğeleri çıkarmaktır.

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 chunks

Başlık Hiyerarşisine Göre HTML Parçalama

Daha gelişmiş bir HTML stratejisi, içeriği kendisine en yakın başlığın altında gruplar. Bir <h2> başlığından sonra gelen her paragraf ve liste o bölüme aittir. Metni üst başlığıyla gruplandırarak, tek başına bırakıldığında kaybedeceği konu bağlamını korursunuz. LangChain'in HTMLHeaderTextSplitter bileşeni bunu otomatik olarak uygular.

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: Başlık Hiyerarşisine Uyma

Markdown belgeleri #, ## ve ### başlıklarıyla düzenlenir. MarkdownHeaderTextSplitter, başlık sınırlarında böler ve başlık hiyerarşisini üst verilerde saklar. Böylece her parça tam başlık yolunu bilir; bu da kullanıcılar belgenin belirli kısımları hakkında soru sorduğunda getirilen bağlamın ilgililiğini büyük ölçüde artırır.

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()

Başlıkla Bölmeden Sonra İkincil Bölme

Başlığa göre böldükten sonra tek tek kısımlar, gömme modelinizin belirteç sınırı için hâlâ çok uzun olabilir. Önerilen yöntem iki adımlı bölmedir: önce anlamsal bağlamı korumak için başlık hiyerarşisine göre bölün, ardından parça boyutu sınırınızı aşan kısımlara karakter tabanlı bir bölücü uygulayın. Böylece başlık üst verileri korunurken hiçbir parça aşırı büyük olmaz.

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')

Tablo Farkındalığıyla PDF Parçalama

PyMuPDF veya pdfplumber gibi araçlarla çıkarılan PDF'ler çoğu zaman tablo yapısını kaybeder ve bozulmuş metin satırları üretir. Bunu ele almak için tablo sınırlayıcı kutularını algılayan ve parçalamadan önce bunları Markdown veya CSV biçimine dönüştüren yerleşim farkındalığına sahip PDF ayrıştırıcıları kullanın. Her tabloyu, düzyazı yerine tablo olduğunu belirten yapılandırılmış üst verilerle tek bir parça olarak ele alın.

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 chunks

Karışık Derlemler İçin Dil Algılama

Kurumsal bilgi tabanlarında genellikle farklı dosya türleri bir arada bulunur: Python betikleri, HTML biçimindeki API belgeleri, Markdown biçimindeki mimari notları ve CSV biçimindeki veri dışa aktarımları. Sağlam bir parçalama işlem hattı, dosya türünü uzantıdan veya MIME türünden algılamalı ve her belgeyi uygun uzman parçalayıcıya yönlendirmelidir. Bu, düzyazıya kod parçalama mantığının veya bunun tersinin uygulanmasını önler.

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)

Çevredeki Satırlarla Bağlamı Koruma

Kodu işleve göre parçalarken, dosyanın üst kısmındaki içe aktarma ifadeleri veya bir yöntemi içeren sınıf tanımı gibi birkaç çevre bağlamı satırını eklemek çoğu zaman değerlidir. Bu bağlam, LLM'in hangi kitaplıkların kullanılabildiğini ve işlevin daha geniş sınıf içindeki rolünü anlamasına yardımcı olarak oluşturulan yanıtların kalitesini artırır.

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_body

Kısa Kontrol

Bu dersteki belgeye özgü parçalama stratejilerini anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: AST tabanlı parçalama, Python işlev ve sınıf sınırlarını korur; HTMLHeaderTextSplitter ve MarkdownHeaderTextSplitter, bağlamı ait olduğu kısımla birlikte tutmak için başlık hiyerarşisine uyar; ayrıca iki adımlı yaklaşım (başlıkla bölmenin ardından karakterle bölme), yapısal üst verileri kaybetmeden aşırı büyük kısımları işler. Sırada yoğun ve seyrek getirmeyi birleştiren hibrit aramayı inceleyeceğiz.

Sıkça Sorulan Sorular

“Kod ve HTML İçin Belgeye Özel Stratejiler” dersi ücretsiz mi?

Evet — “Kod ve HTML İçin Belgeye Özel Stratejiler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“Kod ve HTML İçin Belgeye Özel Stratejiler” dersinde ne öğreneceğim?

Python kodu için AST tabanlı işlev bölücülerle, HTML için etiketleri dikkate alan ayrıştırıcılarla ve Markdown için üst bilgi hiyerarşisiyle özelleştirilmiş parçalama uygulayın. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Kod ve HTML İçin Belgeye Özel Stratejiler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Saf Parçalamanın Getirme İşlemini Zayıflatmasının Nedeni
  2. Gömme Benzerliğiyle Anlamsal Parçalama
  3. Üst-Alt ve Küçükten Büyüğe Getirme
  4. Kod ve HTML İçin Belgeye Özel Stratejiler
← AI Engineering Academy Sayfasına Dön