Knowledge Bases

Sağlam RAG Boru Hatları İçin Çok Biçimli Belge Yükleme Konusunda Uzmanlaşma

Çekme-Artırılmış Üretim (RAG), Büyük Dil Modellerini (LLM'ler) özel kurumsal verilere bağlamak için standart mimari haline gelmiştir. Ancak bir RAG sisteminin etkinliği, vektör deposuna yüklenen verilerin kalitesi ve yapısı tarafından temelde sınırlanır. Düz metin belgeleri işlemek kolay olsa da, gerçek dünya verileri dağınık, parçalıdır ve sayısız standart dışı biçimde bulunur. Veri mühendisleri ve ML geliştiricileri için zorluk artık sadece bir boru hattı oluşturmak değil, Word belgelerini, Excel elektronik tablolarını ve görüntü dosyalarını birleştirilmiş bir parçalama stratejisine normalize edebilen dayanıklı bir boru hattı oluşturmaktır.

Bu yazı, RAG sisteminizin hem anlamsal olarak ilgili hem de yapısal olarak bütünlüklü bağlamı getirmesini sağlayarak bu üç kritik dosya türünü yükleme teknik nüanslarını incelemektedir.

Microsoft Word Belgelerinin (.docx) Normalizasyonu

Word belgeleri benzersiz bir zorluk sunar: bunlar sadece metin için değil, karmaşık biçimlendirme için de birer kapdır. İkili akışın basit bir okuması, anlamsal hiyerarşinin kaybolmasına ve LLM'nin başlıkları, madde işaretleri ve gövde metnini ayırt etmekte zorlanmasına neden olacaktır. Çözüm, python-docx veya Unstructured gibi belge yapısını koruyan kütüphaneler kullanmaktan geçer.

Word belgesinden metni parçalarken, başlıklar ile içerik arasındaki ilişkiyi korumak çok önemlidir. Başlıkları çıkarırsanız, resulting parçalar bağlamını kaybeder. Aşağıda, paragraflar ve sayfalar gibi anlamsal sınırlara saygı duymak üzere tasarlanmış yinelenen karakter metin ayırıcısı ile langchain kullanılarak hazırlanmış bir örnek bulunmaktadır.

from langchain.document_loaders import Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Belgeyi yükle
loader = Docx2txtLoader("project_proposal.docx")
documents = loader.load()

# Belge yapısına duyarlı şekilde böl
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
)
chunks = text_splitter.split_documents(documents)

print(f"Yapı korunarak {len(chunks)} parça oluşturuldu.")

Excel'deki Tablo Verilerinin Çözümlemesi

Excel elektronik tabloları genellikle yapılandırılmış verinin en zengin kaynağıdır, ancak LLM'ler için doğrudan tüketilmesi son derece zordur. Satırları dizgelere dönüştürmek gibi naif bir yaklaşım, genellikle halüsinasyonlara veya sütun hizalamasının kaybolmasına neden olur. En iyi uygulama, her sayfayı temiz bir Markdown tablosuna veya satır tabanlı sözlükler dizisine dönüştürmektir.

pandas kütüphanesi kullanımı, yüklemeden önce sağlam veri manipülasyonuna olanak tanır. Ancak, karmaşık RAG senaryolarında, elektronik tabloyu ham CSV dönüşümünden daha iyi getirme puanları veren yarı-yapılandırılmış bir biçime (JSON veya Markdown gibi) dönüştürmek genellikle daha iyidir.

import pandas as pd
import json

# Excel dosyasını yükle
df = pd.read_excel("financial_data.xlsx", sheet_name=None)

processed_docs = []
for sheet_name, sheet_data in df.items():
    # Belirli satırları bağlam açısından zengin dizgelere dönüştür
    for _, row in sheet_data.iterrows():
        context = " | ".join([f"{col}: {val}" for col, val in row.items()])
        processed_docs.append(f"Sayfa: {sheet_name} | Veri: {context}")

print(f"{len(processed_docs)} kayıt bağlam dizgelerine işlendi.")

Görsellerle Başa Çıkma: OCR Boru Hattı

Görseller, ister tarama PDF'leri, ister fotoğraflar, ister ekran görüntüleri olsun, LLM'ler tarafından kullanılabilir olması için Optik Karakter Tanıma (OCR) gerektirir. Bu, yükleme boru hattının en yoğun kaynak tüketen kısmıdır. pytesseract (Tesseract OCR sarmalayıcısı) veya bulut tabanlı API'ler (AWS Textract, Azure Form Recognizer) standart seçeneklerdir.

Doğruluğu artırmak için OCR'den önce gürültü azaltma için görselleri önceden işlemek çok önemlidir. Ayrıca, diyagramlar veya grafikler için, sadece metin çıkarmak yerine görsel içeriği açıklamak için bir görme-dil modeli (VLM) kullanmanız gerekebilir. Standart belge yükleme için sağlam bir OCR boru hattı şöyledir:

from unstructured.partition.image import partition_image

# Tesseract veya diğer altta yatan motorları kullanır
elements = partition_image("scan_001.png")

for element in elements:
    # Gürültüyü filtrele ve sadece metin öğelerini tut
    if hasattr(element, 'text') and element.text.strip():
        print(element.text)

Sonuç

Üretim düzeyinde bir RAG boru hattı oluşturmak, sadece dize birleştirmekten daha fazlasını gerektirir. Word belgelerinin temel yapısına, Excel sayfalarının ilişkisel bütünlüğüne ve görsellerin yapılandırılmamış doğasına saygı duyan, doküman ayrıştırma konusunda nüanslı bir yaklaşım gerektirir. Sağlam kütüphaneler ve düşünceli parçalama stratejileri benimseyerek geliştiriciler, en karmaşık kurumsal veri havuzlarından bile türetilen, doğru ve bağlama duyarlı yanıtlar sağlayan AI uygulamaları sağlayabilirler.

Share: