Belge Sınıflandırma ve Yönlendirme
Belgeleri türe göre kategorilere ayırma ve uzmanlaşmış aracı işleyicilerine yönlendirme.
Belge Sınıflandırma ve Yönlendirme, CoddyKit'te ücretsiz bir AI Agents 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 Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Belge Sınıflandırması Neden Önemlidir
Bir belge zekâsı aracısı birçok farklı belge türü alabilir: faturalar, sözleşmeler, raporlar, e-postalar ve makbuzlar. Her tür, farklı çıkarma mantığı ve iş kuralları gerektirir.
Belge sınıflandırması, daha ileri işlemler başlamadan önce her belgeyi doğru işleyiciye yönlendirir; aracının kabul mantığı olarak görev yapar.
LLM Tabanlı Sınıflandırma
En basit ve esnek sınıflandırıcı LLM'yi kullanır. Belge metninden bir örneği aktarın ve modelden belge türünü belirlemesini isteyin. Bu yöntem, belge türleri birbirinden açıkça ayrıldığında iyi çalışır.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
DOC_TYPES = ['invoice', 'contract', 'report', 'email', 'receipt', 'form', 'letter', 'other']
CLASSIFY_PROMPT = '''Classify this document into one of these types: {types}
Document excerpt (first 1000 characters):
{text}
Respond with ONLY the document type as a single word from the list above.'''
def classify_with_llm(text):
response = client.chat.completions.create(
model='gpt-4o-mini', # cheap and fast for classification
messages=[{
'role': 'user',
'content': CLASSIFY_PROMPT.format(
types=', '.join(DOC_TYPES),
text=text[:1000]
)
}],
max_tokens=10,
temperature=0
)
predicted = response.choices[0].message.content.strip().lower()
return predicted if predicted in DOC_TYPES else 'other'Kural Tabanlı Sınıflandırmaya Geri Dönüş
LLM ile sınıflandırma doğrudur, ancak maliyet getirir ve gecikme ekler. Yaygın ve iyi tanımlanmış belge türleri için anahtar sözcük tabanlı sınıflandırıcı hızlı, ücretsiz ve anlaşılırdır.
Hızlı yol olarak kural tabanlı sınıflandırmayı kullanın; belirsiz durumlarda LLM'ye geri dönün.
CLASSIFICATION_RULES = {
'invoice': [
'invoice', 'invoice number', 'bill to', 'amount due',
'total amount', 'tax invoice', 'payment terms'
],
'contract': [
'agreement', 'terms and conditions', 'hereby agrees',
'party a', 'party b', 'whereas', 'obligations'
],
'report': [
'executive summary', 'quarterly report', 'annual report',
'findings', 'recommendations', 'methodology'
],
'email': ['from:', 'to:', 'subject:', 'date:', 'dear ', 'regards,'],
'receipt': ['receipt', 'thank you for your purchase', 'transaction id', 'cashier']
}
def classify_with_rules(text):
text_lower = text.lower()
scores = {}
for doc_type, keywords in CLASSIFICATION_RULES.items():
score = sum(1 for kw in keywords if kw in text_lower)
if score > 0:
scores[doc_type] = score
if not scores:
return None # no match — fall through to LLM
return max(scores, key=scores.get)
if __name__ == '__main__':
demo_text = 'INVOICE\nBill To: Acme Corp\nAmount Due: $500\nPayment Terms: Net 30'
print('Classified as:', classify_with_rules(demo_text))
Katmanlı Sınıflandırma Stratejisi
Kural tabanlı ve LLM sınıflandırmasını katmanlı bir yaklaşımla birleştirin: önce hızlı kuralları, yalnızca kurallar kesin bir sonuç vermediğinde LLM'yi kullanın. Bu, sınır durumlarda doğruluğu korurken maliyeti en aza indirir.
def classify_document(text):
# Tier 1: rule-based (free, fast)
result = classify_with_rules(text)
if result:
print(f'Rule-based classification: {result}')
return {'type': result, 'method': 'rules', 'confidence': None}
# Tier 2: LLM (accurate, slower)
result = classify_with_llm(text)
print(f'LLM classification: {result}')
return {'type': result, 'method': 'llm', 'confidence': None}Güven Eşikleri
Tüm sınıflandırmalar aynı güven düzeyine sahip değildir. LLM sınıflandırıcılarında sınıflandırmayla birlikte bir güven puanı da isteyin. Güven düşükse belgeyi insan incelemesi için işaretleyin.
import json
CLASSIFY_WITH_CONFIDENCE_PROMPT = '''Classify this document. Return JSON:
{{"type": "invoice", "confidence": 0.95, "reason": "Contains invoice number and payment terms"}}
Valid types: {types}
Document excerpt: {text}
JSON:'''
def classify_with_confidence(text):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': CLASSIFY_WITH_CONFIDENCE_PROMPT.format(
types=', '.join(DOC_TYPES),
text=text[:1000]
)}],
temperature=0
)
try:
result = json.loads(response.choices[0].message.content)
return result
except json.JSONDecodeError:
return {'type': 'other', 'confidence': 0.0, 'reason': 'Parse error'}
LOW_CONFIDENCE_THRESHOLD = 0.6
def classify_and_check(text):
result = classify_with_confidence(text)
if result['confidence'] < LOW_CONFIDENCE_THRESHOLD:
result['needs_review'] = True
print(f'Low confidence ({result["confidence"]}) — flagging for review')
return resultBelge Yönlendiricileri
Belge sınıflandırıldıktan sonra bir yönlendirici, belgeyi uzmanlaşmış işleyicisine gönderir. Her işleyici, ilgili belge türüne özgü alanları nasıl çıkaracağını bilir.
def handle_invoice(text):
# Extract: vendor, invoice number, total, due date
extract_prompt = f'''Extract from this invoice (JSON):
{{"vendor": "", "invoice_number": "", "total": 0, "due_date": "", "line_items": []}}
{text[:2000]}\n\nJSON:'''
return llm_call(extract_prompt)
def handle_contract(text):
# Extract: parties, effective date, term, key obligations
extract_prompt = f'''Extract from this contract (JSON):
{{"parties": [], "effective_date": "", "term_months": 0, "key_obligations": []}}
{text[:2000]}\n\nJSON:'''
return llm_call(extract_prompt)
ROUTERS = {
'invoice': handle_invoice,
'contract': handle_contract,
'report': lambda t: llm_call(f'Summarize this report in 3 bullet points:\n{t[:2000]}'),
'email': lambda t: llm_call(f'Extract: sender, subject, action required from this email:\n{t[:1000]}')
}
def route_document(text):
classification = classify_document(text)
doc_type = classification['type']
handler = ROUTERS.get(doc_type, lambda t: llm_call(f'Describe this document:\n{t[:1000]}'))
return handler(text)Alt Tür Sınıflandırması
«Sözleşme» gibi üst düzey türlerin alt türleri olabilir: iş sözleşmesi, NDA, hizmet sözleşmesi ve kira sözleşmesi. İkinci bir alt tür sınıflandırması, alanların daha hassas biçimde çıkarılmasını sağlar.
CONTRACT_SUBTYPES = {
'employment': ['employment', 'employee', 'employer', 'salary', 'compensation', 'job title'],
'nda': ['non-disclosure', 'confidential', 'nda', 'proprietary information'],
'service': ['service agreement', 'scope of work', 'deliverables', 'milestone'],
'lease': ['lease', 'landlord', 'tenant', 'rent', 'premises', 'square feet']
}
def classify_contract_subtype(text):
text_lower = text.lower()
scores = {
subtype: sum(1 for kw in keywords if kw in text_lower)
for subtype, keywords in CONTRACT_SUBTYPES.items()
}
best = max(scores, key=scores.get)
if scores[best] == 0:
return 'general'
return best
def handle_contract_routed(text):
subtype = classify_contract_subtype(text)
print(f'Contract subtype: {subtype}')
# Route to specialized extractor
if subtype == 'nda':
return extract_nda_fields(text)
elif subtype == 'employment':
return extract_employment_fields(text)
else:
return handle_contract(text)Toplu Sınıflandırma İşlem Hattı
Üretim ortamında belgeler toplu hâlde gelir. Bunları verimli biçimde işleyin: önce tüm belgeleri sınıflandırın, türe göre gruplandırın, ardından her grubu paralel olarak işleyin.
from concurrent.futures import ThreadPoolExecutor
import time
def classify_batch(documents):
results = []
for doc in documents:
text = extract_text(doc['path']) # PDF, OCR, or plain text
classification = classify_document(text[:1500])
results.append({
'doc_id': doc['id'],
'path': doc['path'],
'type': classification['type'],
'method': classification['method'],
'text': text
})
return results
def process_batch(documents, max_workers=4):
# Step 1: classify all (fast)
classified = classify_batch(documents)
# Step 2: group by type
from collections import defaultdict
by_type = defaultdict(list)
for doc in classified:
by_type[doc['type']].append(doc)
# Step 3: process each group
all_results = {}
for doc_type, docs in by_type.items():
handler = ROUTERS.get(doc_type)
if handler:
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {executor.submit(handler, d['text']): d for d in docs}
for fut, doc in futures.items():
all_results[doc['doc_id']] = fut.result()
return all_results«Diğer» ve Bilinmeyen Türleri İşleme
«diğer» olarak sınıflandırılan veya güven düzeyi düşük olan belgeler için bir geri dönüş stratejisi gerekir. Seçenekler şunlardır: insan incelemesi için işaretlemek, genel amaçlı çıkarma denemek veya kullanıcıya belgenin türünü sormak.
HUMAN_REVIEW_QUEUE = []
def process_document(doc_path):
text = extract_text(doc_path)
classification = classify_with_confidence(text[:1500])
# High confidence path
if classification['confidence'] >= 0.8 and classification['type'] != 'other':
handler = ROUTERS.get(classification['type'])
return {
'result': handler(text),
'type': classification['type'],
'auto_processed': True
}
# Low confidence or unknown type
HUMAN_REVIEW_QUEUE.append({
'path': doc_path,
'predicted_type': classification['type'],
'confidence': classification['confidence'],
'reason': classification.get('reason', '')
})
print(f'Added to review queue: {doc_path} ({classification["confidence"]:.0%} confident)')
return {'auto_processed': False, 'queued_for_review': True}Sınıflandırma Geri Bildirim Döngüsü
İnsanlar hatalı bir sınıflandırmayı düzelttiğinde bu düzeltmeyi kaydedin. Kural tabanlı sınıflandırıcıyı geliştirmek ve zaman içinde LLM sınıflandırıcısına ince ayar yapmak veya az örnekli istemler uygulamak için bu kayıtları kullanın.
correction_log = []
def log_correction(doc_path, predicted_type, correct_type, text_sample):
correction_log.append({
'doc_path': doc_path,
'predicted': predicted_type,
'correct': correct_type,
'text_sample': text_sample[:200]
})
print(f'Logged correction: {predicted_type} -> {correct_type}')
def build_few_shot_examples(n=5):
recent = correction_log[-n:] # use most recent corrections
examples = []
for entry in recent:
examples.append(
f'Text: {entry["text_sample"]}\nCorrect type: {entry["correct"]}'
)
return '\n\n'.join(examples)
def classify_with_few_shot(text):
few_shot = build_few_shot_examples()
prompt = f'''Examples of correct classifications:\n{few_shot}\n\nNow classify:\n{text[:800]}\n\nType:'''
return llm_call(prompt).strip().lower()Sınıflandırmadan Sonra Yapılandırılmış Veri Çıkarma
Belge türü belirlendikten sonra, o tür için önemli olan belirli alanları çıkarın. Tutarlı ve ayrıştırılabilir bir çıktı elde etmek için JSON şemasıyla LLM tabanlı yapılandırılmış çıkarma kullanın.
import json
class FakeMsg:
def __init__(self, content): self.content = content
class FakeChoice:
def __init__(self, content): self.message = FakeMsg(content)
class FakeResponse:
def __init__(self, content): self.choices = [FakeChoice(content)]
class _Completions:
@staticmethod
def create(model, messages, temperature):
return FakeResponse('{"vendor_name": "Acme", "invoice_number": "123", "total": 100}')
class _Chat:
completions = _Completions()
class FakeClient:
chat = _Chat()
client = FakeClient()
EXTRACTION_SCHEMAS = {
'invoice': '{vendor_name: , invoice_number: , invoice_date: , due_date: , subtotal: 0, tax: 0, total: 0, line_items: []}',
}
def extract_structured_fields(text, doc_type):
schema = EXTRACTION_SCHEMAS.get(doc_type)
if not schema:
return {'error': f'No extraction schema for type: {doc_type}'}
prompt = (f'Extract fields from this {doc_type}. Return JSON matching this schema:\n'
f'{schema}\n\nDocument:\n{text[:2000]}\n\nJSON:')
response = client.chat.completions.create(model='gpt-4o-mini', messages=[{'role': 'user', 'content': prompt}], temperature=0)
try:
return json.loads(response.choices[0].message.content)
except json.JSONDecodeError:
return {'error': 'Could not parse extraction result'}
print(extract_structured_fields('Invoice #123 from Acme for $100', 'invoice'))Bilgi Kontrolü
Katmanlı bir sınıflandırma stratejisi (önce kurallar, ardından LLM'ye geri dönüş) kullanmanın avantajı nedir?
Tekrar: Belge Sınıflandırması ve Yönlendirme
Belge sınıflandırması, gelen belgeleri uzmanlaşmış işleyicilere yönlendirir. Katmanlı bir yaklaşım kullanın: yaygın türler için hızlı anahtar sözcük kuralları, sınır durumlar için güven puanlı LLM sınıflandırması ve güven düzeyi düşük belgeler için insan inceleme kuyrukları.
Her belge türünün kendine ait bir çıkarma işleyicisi olur. Alt tür sınıflandırması (örneğin NDA ile iş sözleşmesini ayırt etmek), alanların daha hassas biçimde çıkarılmasını sağlar. Geri bildirim döngüsü aracılığıyla sınıflandırıcıları zaman içinde geliştirmek için düzeltmeleri kaydedin.
Sıkça Sorulan Sorular
“Belge Sınıflandırma ve Yönlendirme” dersi ücretsiz mi?
Evet — “Belge Sınıflandırma ve Yönlendirme” 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 Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Belge Sınıflandırma ve Yönlendirme” dersinde ne öğreneceğim?
Belgeleri türe göre kategorilere ayırma ve uzmanlaşmış aracı işleyicilerine yönlendirme. AI Agents 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 Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, 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.
“Belge Sınıflandırma ve Yönlendirme” 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 Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents 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
- PyMuPDF ve pdfplumber ile PDF Ayrıştırma
- Taranmış Belgeler İçin OCR
- Çok Belgeli Soru-Cevap Aracıları
- Belge Sınıflandırma ve Yönlendirme