Fatura ve Formlardan AI ile JSON Veri Çıkarma

AgentRoost · April 11, 2026 · 5 dk okuma · Markdown olarak görüntüle
AgentRoost — AI & LLM How-To

Manuel veri girişi biteviye tekrarlanan, hataya açık bir iş. Bir faturayı ekrana bakarak muhasebeye yazmak ya da gelen e-postalardaki sipariş bilgilerini tabloya kopyalamak, gerçek anlamda değer üretmeyen bir zaman hırsızıdır.

Bu yazıda n8n'nin AI Agent ve Information Extractor düğümlerini kullanarak serbest metin belgeleri (PDF fatura, JPEG fiş, e-posta gövdesi) → temiz, şema-doğrulanmış JSON'a dönüştüren bir akış kuracağız. Şema uyuşmazlığını ve kötü LLM çıktısını da yakalamayı anlatacağız.


Ne İnşa Ediyoruz?

Hedef: gelen her belge için aşağıdaki JSON'u üretmek.

{
  "invoice_date": "2024-03-15",
  "invoice_number": "INV-2024-0347",
  "vendor_name": "Örnek Tedarik A.Ş.",
  "tax_id": "1234567890",
  "subtotal": 8474.58,
  "vat_amount": 1525.42,
  "total": 10000.00,
  "currency": "TRY",
  "line_items": [
    { "description": "Yazılım Lisansı", "qty": 1, "unit_price": 8474.58 }
  ]
}

Çıktı doğrulanıp bir Google Sheets satırına veya muhasebe API'sine gidecek. Eksik alan varsa akış hatayı loglayıp işlemi atlayacak.


n8n Akışının Yapısı

[Trigger] → [Belge Al / Metni Hazırla] → [AI Veri Çıkarıcı] → [JSON Şema Doğrula] → [Hata Dalı / Başarı Dalı]

1. Trigger: E-posta, Webhook veya Zamanlayıcı

Kullanım senaryonuza göre üç başlangıç seçeneği var:

Senaryo n8n Düğümü Detay
Muhasebe e-postalarını işle Gmail Trigger veya IMAP Email Has Attachment: true, Subject Contains: "Fatura"
Müşteri form yüklemeleri Webhook POST body'den file_url ve document_type alır
Dosya klasörü tarama Schedule Trigger + Read Binary Files Her gece 02:00, /invoices/incoming/ klasörü

Schedule Trigger kurulumu (periyodik tarama için):

Trigger Mode: Interval
Every: 1 Hour

Webhook ile gelen bir örnek body:

{ "file_url": "https://storage.example.com/inv-2024-0347.pdf", "type": "invoice" }

2. Belgeyi Hazırlama

PDF veya görsel geliyorsa önce metne çevirmeniz gerekiyor. İki yol var:

Yol A — HTTP Request ile harici PDF → metin servisi:

Node: HTTP Request
Method: POST
URL: https://api.example-pdf-parser.com/extract
Body (JSON):
{
  "url": "{{ $json.file_url }}",
  "output": "text"
}

Yol B — Extract Document düğümü (n8n 1.40+): Extract Document Text düğümünü ekleyin, girişi Binary Data olarak seçin. PDF ve görsel formatlar doğrudan desteklenir; çıkış text alanında düz metin gelir.

E-posta gövdesinden çıkarım yapıyorsanız bu adım gereksiz — {{ $json.text }} zaten düz metni içerir.

3. AI Bilgi Çıkarıcı (Information Extractor)

n8n'nin yerleşik Information Extractor düğümü, LLM'i doğrudan JSON şema çıkarmaya yönlendirmek için tasarlanmış en temiz yoldur.

Düğümü ekleyin:

  • Node Type: Information Extractor
  • Text: {{ $json.document_text }}
  • Model: (AgentRoost'ta dahili krediyle bağlı, ek ayar gerekmez)

Extraction Schema alanına aşağıdaki şemayı girin:

{
  "type": "object",
  "properties": {
    "invoice_date":   { "type": "string", "description": "ISO 8601 tarih, ör. 2024-03-15" },
    "invoice_number": { "type": "string" },
    "vendor_name":    { "type": "string" },
    "tax_id":         { "type": "string", "description": "10 haneli vergi kimlik no" },
    "subtotal":       { "type": "number" },
    "vat_amount":     { "type": "number" },
    "total":          { "type": "number" },
    "currency":       { "type": "string", "enum": ["TRY","USD","EUR"] }
  },
  "required": ["invoice_date","vendor_name","total","currency"]
}

required alanında olmayan alanlar bulunamazsa null döner; sizi panikleten undefined hatası yerine temiz bir null.

4. Model Seçimi

Information Extractor'ı farklı modellerle yönlendirmek için bir AI Model (LLM) alt-düğümü bağlayın.

Faturalar için önerilen modeller:

  • openai/gpt-4o-mini — hız/maliyet dengesi, çoğu yapılandırılmış fatura için yeterli
  • anthropic/claude-3-5-haiku — karmaşık Türkçe belgeler için daha güvenilir
  • google/gemini-flash-1.5 — çok sayfalı PDF'lerde uzun bağlam avantajı

AgentRoost'ta çok sayıda model seçeneği mevcut; akış panelinden istediğiniz zaman değiştirebilirsiniz.

5. JSON Şema Doğrulama

LLM her zaman mükemmel çıktı üretmez. Bir Code düğümüyle zorunlu alan kontrolü ekleyin:

const data = $input.first().json;
const required = ['invoice_date', 'vendor_name', 'total', 'currency'];
const missing = required.filter(k => data[k] === null || data[k] === undefined);

if (missing.length > 0) {
  throw new Error(`Eksik alanlar: ${missing.join(', ')}`);
}

// Sayısal alanların tip kontrolü
if (typeof data.total !== 'number') {
  throw new Error(`'total' sayı olmalı, gelen: ${typeof data.total}`);
}

return [{ json: data }];

6. IF Düğümü: Başarı vs. Hata Yolu

IF düğümü ekleyin:

  • Condition: {{ $json.invoice_date }}is not empty
  • True branch → Google Sheets / veritabanı / Airtable
  • False branch → Slack/e-posta bildirim + hata logu

Hata yolunda Send Email veya Slack düğümüyle uyarı gönderin:

Mesaj: "⚠️ Belge işlenemedi: {{ $('Webhook').item.json.file_url }} — Eksik: {{ $json.error_message }}"

Yaygın Tuzaklar ve Çözümleri

Tuzak 1 — LLM sayıyı string döndürüyor "total": "10.000,00" gibi formatlı string alabilirsiniz. Code düğümünde normalize edin:

const raw = data.total;
if (typeof raw === 'string') {
  data.total = parseFloat(raw.replace(/\./g, '').replace(',', '.'));
}

Tuzak 2 — Tarih formatı tutarsız LLM "15/03/2024" veya "Mart 15, 2024" dönebilir. Şema description'ına "ISO 8601 format YYYY-MM-DD olarak döndür" yazın ya da prompt'ta açıkça belirtin.

Tuzak 3 — Uzun PDF'lerde bağlam kaybı 100 sayfalık bir belgenin tamamını LLM'e göndermek hem yavaş hem de verimsiz. İlk birkaç sayfanın metnini kesmek için:

const text = $json.document_text;
return [{ json: { document_text: text.slice(0, 8000) } }];

AgentRoost'ta Bu Akışı Çalıştırma

Kendi n8n örneğinizi AgentRoost'ta çalıştırmak yaklaşık 2 dakika alıyor:

  1. agentroost.app/tr/agents/n8n adresine gidin.
  2. Kayıt olun (e-posta, Google, Microsoft veya Discord ile).
  3. "n8n" framework'ünü seçin, örneğinize bir isim verin.
  4. Birkaç saniye içinde https://<sizin-id>.agentroost.app adresinde kendi özel n8n editörünüz açılır — bu örnek tamamen size aittir.
  5. Yukarıdaki akışı oluşturun; AI nodes zaten bağlı, API anahtarı girmenize gerek yok. AI kredileri aboneliğe dahil.

Rakip platformlarda (n8n Cloud, Elestio, Sliplane) AI düğümlerini kullanmak için OpenAI veya Anthropic API anahtarı almanız ve aylık kullanım ücreti ödemeniz gerekir. AgentRoost'ta bu maliyet abonelik fiyatına dahil: $19,99/ay, 14 gün iade garantisi.

Model değiştirmek ister misiniz? n8n editöründeki LLM alt-düğümünden istediğiniz modeli seçin, akışı yeniden başlatın — başka bir ayar gerekmez.

Planları karşılaştır →


Sonuç

Belgeden yapılandırılmış veri çıkarma artık büyük mühendislik projesi değil: doğru n8n düğümleri + bir LLM + basit şema doğrulama = çalışan bir boru hattı. En zor kısım genellikle altyapı (API anahtarı bulma, sunucu kurma, SSL ayarlama) olur — AgentRoost bunu ortadan kaldırır ve sizi iş mantığına odaklanmanızı sağlar.

Sıkça sorulan sorular

AI çıkarma için hangi n8n düğümünü kullanmalıyım — Basic LLM Chain mi, AI Agent mi, Information Extractor mı?

Yapılandırılmış JSON çıkarımı için Information Extractor düğümü en doğru seçimdir. Şema tanımını girişe bağladığınızda LLM'yi doğrudan şema-uyumlu JSON üretmeye yönlendirir. AI Agent araç çağrısı gerektiren çok adımlı işler için; Basic LLM Chain ise şemasız serbest metin yanıtı için uygundur.

AgentRoost'ta API anahtarı girmem gerekiyor mu?

Hayır. AgentRoost'ta AI/LLM kredileri aboneliğe dahildir. n8n editörünüzdeki AI düğümleri zaten bağlıdır; OpenAI, Anthropic veya başka bir sağlayıcıya ayrı kayıt olmanıza gerek yoktur.

PDF'den metin çıkarmak için ne kullanmalıyım?

n8n 1.40 ve sonrasındaki Extract Document Text düğümü PDF ve görsel formatları doğrudan destekler. Daha eski sürümler veya özel dil desteği için HTTP Request düğümüyle harici bir PDF ayrıştırma servisi (Unstructured, Mathpix vb.) çağırabilirsiniz.

AgentRoost'u iptal edersem verilerim ne olur?

n8n örneğiniz tamamen sizindir — tüm workflow'larınızı, kimlik bilgilerinizi ve verilerinizi n8n'nin yerleşik dışa aktarma özelliğiyle (Settings → Export) JSON olarak indirebilirsiniz. İptal etmeden önce dışa aktarmanız yeterlidir.

14 gün içinde memnun kalmazsam ne olur?

14 gün içinde herhangi bir sebepten iade talep edebilirsiniz. Ödeme Polar üzerinden gerçekleşir ve iade politikası abonelik sayfasında açıkça belirtilmiştir. Aylık faturalandırma ile çalışır, uzun vadeli taahhüt yoktur.