Ana içeriğe atla

Qwen 3.6 Plus API Eğitimi: Python ile Bir Fatura İşleme Hattı Kurma

Alibaba'nın Qwen 3.6 Plus modelini, Python'u ve OpenAI SDK'sını kullanarak yerel görme ve araç çağırma özellikleriyle otomatik bir fatura işleme hattı oluşturmayı öğrenin.
Güncel 27 Nis 2026  · 13 dk. oku

Alibaba, Nisan 2026'da Qwen 3.6 Plus'ı yayımladı. Teknik özellikler: SWE-bench Verified 78.8, varsayılan olarak 1M belirteçlik bağlam penceresi, yerel çok kipli girdiler ve her zaman açık akıl yürütme. Bir Python geliştiricisi için ilginç olan kısım kıyaslama tablosu değil. Modelin yalnızca API üzerinden sunuluyor olması ve temel URL'yi değiştirerek düz OpenAI paketiyle çalışması.

Bu eğitimde, tek bir projede üç ana özelliğini kullanacağız: düşünce zinciri (chain-of-thought) akıl yürütmesi, yapısal çıktı için araç çağırma ve taranmış faturalar üzerinde görme. Sonuç, PDF ve JPG okuyan, akıl yürütmesini gösteren ve CSV'ye yazabileceğiniz doğrulanmış JSON döndüren küçük bir fatura işleme hattı olacak.

Python 3.10 veya daha yenisine ve API çağrıları yapma konusunda aşinalığa ihtiyacınız var. GPU yok, model indirmeleri yok, self-hosting yok. Qwen 3.6 Plus'a OpenRouter üzerinden erişeceğiz; böylece kayıt tek formdan ibaret ve OpenAI SDK'sı değişmeden çalışıyor.

Ayrıca, Qwen'in en güncel açık-ağırlık sürümü olan Qwen 3.6'yı İnce Ayarlama eğitimimize de göz atmanızı özellikle öneririm. Rakip modellere ilgi duyuyorsanız, DeepSeek v4, OpenAI’nin GPT-5.5 ve Anthropic’in Claude Opus 4.7 rehberlerimizi mutlaka okuyun.

Qwen 3.6 Plus Nedir?

Qwen 3.6 Plus, Alibaba'nın Nisan 2026 amiral gemisi modeli. Omurga, hibrit doğrusal-dikkat ve seyrek uzman karışımı; akıl yürütme varsayılan olarak çalışıyor ve metin, görseller ve video aynı API üzerinden geçiyor. 

Fonksiyon çağırma OpenAI araç-çağırma protokolünü kullanır. Alibaba bu sürümü "gerçek dünya ajanlarına doğru" olarak konumlandırıyor; yani tek adımda akıl yürütme, görsel okuma ve fonksiyon çağrısı gerektiren düzensiz girdiler için tek bir model.

Fatura çıkarımında birleşen Qwen 3.6 Plus özellikleri

Plus katmanı kapalı ağırlıklara sahip. Kontrol noktasını indirip kendi donanımınızda çalıştıramazsınız (model zaten tüketici donanımında çalıştırılamayacak kadar büyük). Alibaba, varsayılan 262K bağlamlı açık kaynak Qwen/Qwen3.6-35B-A3B varyantını yayımlıyor, ancak bu ayrı bir ürün. Bu eğitimde barındırılan API'yi kullanıyoruz.

Yeteneklere genel bakış

Qwen 3.6 Plus, tek çağrıda 1M'e kadar giriş belirteci alır ve 65.536'ya kadar çıkış belirteci döndürebilir. Girdi kipleri metin, görsel ve videoyu içerir. Araç çağırma OpenAI şeması üzerinden yereldir. OpenRouter'ın model sayfası, yönlendirilen arka uçlar için fiyatlandırmayı, sağlayıcı gecikmesini ve aktarım hızını listeler.

OpenRouter Qwen 3.6 Plus model sayfası

Düşünce zinciri her çağrıda varsayılan olarak çalışır ve akıl yürütme içeriği yanıttan ayrı bir alanda akar. Yeni bir 3.6 Plus parametresi, önceki akıl yürütme izlerini çoklu turlarda iletilere bağlı tutar. 

Alibaba, bunu, sonraki turların önceki düşünce zincirlerinden faydalandığı ajan döngüleri için önerir. Bizimki gibi tek atımlık çıkarımlarda izi korumak belirteç israfıdır; bu yüzden devre dışı bırakıyoruz.

Bu eğitim için üç kıyaslama skoru önemlidir:

  • OmniDocBench1.5'te 91.2 — belge görme
  • RefCOCO'da 93.5 — nesne konumlandırma
  • TAU3-Bench'te 70.7 — genel ajan davranışı

İlk ikisi, taranmış faturaları makul bir hedef yapıyor. Üçüncüsü ise, modelin ağır istem mühendisliği olmadan bir araç-çağırma protokolünü takip etmesini bekleyebileceğimiz anlamına geliyor.

Qwen 3.6 Plus ve Qwen 3.5 Plus karşılaştırması

3.5 Plus'tan 3.6 Plus'a sürüm sıçraması çoğu ölçütte küçük. Kodlama ve akıl yürütme kıyasları birkaç puan artıyor. Asıl değişim, akıl yürütmenin bir anahtardan varsayılan davranışa dönüşmesi. OCR ve nesne konumlandırma en çok iyileşiyor.

Yetenek

Qwen 3.5 Plus

Qwen 3.6 Plus

Akıl yürütme modu

Varsayılan olarak açık (enable_thinking=False ile kapatılabilir)

Her zaman açık CoT

Bağlam penceresi

1M belirtece kadar

1M belirteç (varsayılan)

Çok kipli (multimodal)

Yerel görme-dil

Yerel + geliştirilmiş OCR, nesne konumlandırma

SWE-bench Verified

76.8

78.8

Terminal-Bench 2.0

58.0

61.6

GPQA

90.0

90.4

Turlar arası akıl yürütme

preserve_thinking parametresi

Üretimde 3.5 Plus çalıştırıyorsanız, yükseltme yeni preserve_thinking parametresini benimsemek ve düşünmenin artık her çağrıda ücretlendirildiğini not etmek anlamına gelir. Başlıca kazanımlar ajan döngülerinde ve belge görmede; bu eğitim de bunları kullanıyor.

Modele iki şekilde erişebilirsiniz. Resmi yol Alibaba Cloud Model Studio'dur; size doğrudan https://dashscope-intl.aliyuncs.com/compatible-mode/v1 adresinde bir uç nokta sağlar. Diğeri OpenRouter'dır; birleşik bir faturalama katmanı ve daha basit bir kayıtla Alibaba'ya yönlendirir.

Eğitimde OpenRouter kullanıyoruz çünkü anahtar oluşturma akışı daha hızlı ve uç nokta tuhaflıkları daha az. Doğrudan yolu istiyorsanız, iki satırı değiştirip devam edin.

Qwen 3.6 Plus Ortamınızı Hazırlama

Bu eğitim için Alibaba Cloud Model Studio, OpenRouter kadar iyi çalışır. Değişen tek şey temel URL ve ortam değişkeni adıdır.

API anahtarınızı alma

Bir Google veya GitHub hesabıyla openrouter.ai adresine kaydolun. Ücretsiz katman kredi kartı olmadan kullanılabilir; bu, bu eğitimi baştan sona takip etmek için yeterlidir. Daha sonra daha yüksek hacimde çalıştırmayı planlıyorsanız, kredi eklemek daha yüksek geçirgenlikli bir katman verir ve model başına hız sınırını kaldırır.

Oturum açtıktan sonra openrouter.ai/settings/keys sayfasına gidin ve bir anahtar oluşturun. Daha sonra iptal edebilmek için qwen-tutorial gibi bir etiket verin.

OpenRouter API keys sayfasında eğitim anahtarı oluşturulmuş

Anahtar değerini şimdi kopyalayın; çünkü OpenRouter onu yalnızca bir kez gösterir. Ardından proje kök dizininizde bir .env dosyasına kaydedin:

OPENROUTER_API_KEY=sk-or-v1-...

python-dotenv ile bir sonraki bölümde yükleyeceğiz. Alibaba Cloud'u doğrudan kullanmak isterseniz, anahtar modelstudio.console.alibabacloud.com adresinden gelir ve DASHSCOPE_API_KEY değişkenine yazılır.

Bağımlılıkları kurma ve kurulumu doğrulama

İlk doğrulama çağrısı için gereken iki paketi kurun:

pip install openai python-dotenv

openai paketi, OpenAI'nin uç noktasıyla da kullanacağınız aynı SDK'dır. Hem OpenRouter hem de Alibaba Cloud Model Studio, OpenAI Chat Completions API'sini uygular; bu nedenle istemci kodunu değiştirmeniz gerekmez.

Bir hello.py dosyası oluşturun ve bağlantıyı doğrulayın:

import os
from dotenv import load_dotenv
from openai import OpenAI
 
load_dotenv()
 
client = OpenAI(
    api_key=os.environ["OPENROUTER_API_KEY"],
    base_url="https://openrouter.ai/api/v1",
)
 
response = client.chat.completions.create(
    model="qwen/qwen3.6-plus",
    messages=[{"role": "user", "content": "Say hi in five words."}],
)
 
print(response.choices[0].message.content)

python hello.py çalıştırmak kısa bir yanıt yazdırmalıdır. Ücretsiz katmanda ilk belirteç gecikmesi birkaç saniye sürebilir; çünkü model görünür cevabı üretmeden önce bir akıl yürütme izi oluşturur.

Qwen 3.6 Plus ile örnek bir proje oluşturma

Örnek proje bir fatura işleme hattıdır. İki formatı kabul eder: metin PDF'ler ve taranmış JPG'ler. Her fatura Qwen 3.6 Plus'tan akıl yürütme açık şekilde geçirilir ve çıkarılan alanlar bir araç çağrısı ile geri döner. Her fatura dört aşamadan geçer:

  1. Girdiyi çöz (görseli base64 ile kodla veya önce her PDF sayfasını bir görsele dönüştür)

  2. Akıl yürütme izini modelden akışla geri al

  3. Araç çağrısını yapısal JSON'a ayrıştır

  4. results.csv dosyasına bir satır yaz

Uçtan uca fatura çıkarım hattı akışı

Bu bölümün tüm kodu bextuychiev/qwen-invoice-pipeline-tutorial deposunda yer alır. Adım adım takip etmek için klonlayın ya da kendi sürümünüzü oluştururken referans olarak kullanın.

Proje yapısını kurma

Bir invoice-pipeline/ dizini oluşturun ve şöyle yapılandırın:

invoice-pipeline/
├── .env
├── .env.example
├── client.py
├── tools.py
├── main.py
├── processors/
│   ├── image.py
│   └── pdf.py
├── sample_invoices/
│   ├── invoice_01.pdf
│   ├── invoice_02.pdf
│   ├── invoice_03.pdf
│   ├── invoice_04.jpg
│   ├── invoice_05.jpg
│   └── invoice_06.jpg
└── requirements.txt

client.py ile işleyiciler arasındaki ayrım, OpenRouter yapılandırmasını tek bir dosyada tutar. Daha sonra Alibaba Cloud'a geçerseniz, yalnızca client.py dosyasını düzenlersiniz, başka bir şey değil.

client.py, OpenAI istemcisini doğru temel URL ve model kimliğiyle sarmalar:

import os
from dotenv import load_dotenv
from openai import OpenAI
 
load_dotenv()
 
MODEL_ID = "qwen/qwen3.6-plus"
 
 
def get_client() -> OpenAI:
    return OpenAI(
        api_key=os.environ["OPENROUTER_API_KEY"],
        base_url="https://openrouter.ai/api/v1",
    )

.env.example dosyası yanına konur; böylece depoyu klonlayan herkes neyi dolduracağını bilir:

OPENROUTER_API_KEY=your-openrouter-key
 
# Optional: Alibaba Cloud Model Studio (direct path)
# DASHSCOPE_API_KEY=your-dashscope-key
# DASHSCOPE_BASE_URL=https://dashscope-intl.aliyuncs.com/compatible-mode/v1

Eşlik eden depo, üç kaynaktan altı örnek fatura içerir:

Gerçek şirket faturaları KKB verileri nedeniyle kamuya yeniden dağıtılabilir değildir; bu yüzden bunları kullanıyoruz. Doğruluk kontrolü yapmak isterseniz, altın gerçek toplamlar repo README'sinde listelenmiştir.

Qwen'in düşünce zinciri akıl yürütmesini çalışırken görmek

Qwen 3.5 kullandıysanız, CoT çağrı başına bir anahtardı: enable_thinking=True, extra_body içinde. 3.6 Plus'ta akıl yürütme varsayılan olarak çalışır ve bu parametre esasen kapatmak için vardır. Düşünme etkin olduğunda akıl yürütme belirteçleri her zaman ücretlendirilir; bu da "her zaman açık" olmayı ücretsiz bir özellikten ziyade bir maliyet kararına dönüştürür.

Bir yanıtı akışla aldığınızda, delta.reasoning_content önce gelir, ardından delta.content (veya bizim durumumuzda delta.tool_calls) takip eder.

Bir faturayı çıkaran ve akışla gelen akıl yürütme izini yazdıran en küçük çağrı şöyle görünür:

import base64
from pathlib import Path
from client import get_client, MODEL_ID
 
client = get_client()
 
image_bytes = Path("sample_invoices/invoice_04.jpg").read_bytes()
data_uri = f"data:image/jpeg;base64,{base64.b64encode(image_bytes).decode()}"
 
stream = client.chat.completions.create(
    model=MODEL_ID,
    messages=[
        {"role": "system", "content": "Read the invoice and summarize the vendor, date, and total."},
        {"role": "user", "content": [
            {"type": "text", "text": "Here is the invoice:"},
            {"type": "image_url", "image_url": {"url": data_uri}},
        ]},
    ],
    extra_body={"enable_thinking": True},
    stream=True,
)
 
for chunk in stream:
    delta = chunk.choices[0].delta
    reasoning = getattr(delta, "reasoning_content", None)
    if reasoning:
        print(reasoning, end="", flush=True)
    if delta.content:
        print(delta.content, end="", flush=True)

Diskten JPG baytlarını okur, base64 ile kodlarız ve sonucu bir data: URI içine sararız. Bu format, OpenAI içerik-blok protokolünün barındırılan bir URL olmadan satır içi görselleri kabul etmesini sağlar. image_url bloğu URI'yı doğrudan alır ve model faturayı bir bağlantı iletmişsiniz gibi görür.

extra_body={"enable_thinking": True}, enable_thinking bayrağını Qwen'e iletir. OpenAI SDK'sı bu parametreden haberdar değildir; bu nedenle extra_body, sağlayıcıya özgü seçenekleri geçirmenin yoludur.

Bunu invoice_04.jpg üzerinde çalıştırdığınızda, akışla gelen yanıt kısa bir özet olarak döner:

Based on the invoice provided:
 
*   **Vendor:** Dunn PLC
*   **Date:** 01/23/2019
*   **Total:** $ 3 120,51

Kısa olması istediğimiz şeydi: sistem istemi "özetle" dedi ve başka bir şey söylemedi. Görev büyüdüğünde (satır öğeleri, kategoriler, yapısal alanlar) akıl yürütme izi de onunla birlikte büyür. Bunu bir sonraki bölümde göreceğiz; aynı model, aynı görsel üzerinde yanıtından önce çıktı bütçesinin çoğunu düşünmeye harcar.

Kullanıcı istemine /no_think eklemek, o çağrı için CoT'yi devre dışı bırakan yumuşak bir anahtardır. Hata ayıklarken ve daha hızlı, düşünmeyen bir yanıt istediğinizde kullanışlıdır.

Fonksiyon çağırma ile yapısal veri çıkarma

Akıl yürütme, çıkarımı okunabilir kılar; ancak çıktı hâlâ bir akıl yürütme izi içinde serbest biçimli metindir. Her seferinde yapısal, ayrıştırılabilir JSON almak için bir araç tanımlarız, extract_invoice, ve modele her zaman aracı çağırmasını söyleyen bir sistem istemi ile tool_choice="auto" ayarlarız.

JSON şemasını tanımlama

Şemayı tools.py içinde tanımlarız; altı alanı açıklar. Dış şekil standart OpenAI fonksiyon-aracı formatını takip eder:

EXTRACT_INVOICE_TOOL = {
    "type": "function",
    "function": {
        "name": "extract_invoice",
        "description": "Extract structured fields from an invoice image.",
        "parameters": {
            "type": "object",
            "properties": {
                # fields defined below
            },
            "required": ["vendor", "date", "total", "tax", "line_items", "category"],
        },
    },
}

Altı alan parameters.properties içinde yer alır. Skaler alanlar (vendor, date, total, tax) düz JSON Şeması türlerini kullanır. category bir enum kullanır; böylece model etiket uydurmak yerine dört sabit değerden birini seçer. line_items tek yapısal alandır; nesnelerden oluşan bir dizi ve her nesnenin kendi required listesi vardır:

"line_items": {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "description": {"type": "string"},
            "quantity": {"type": "number"},
            "unit_price": {"type": "number"},
            "amount": {"type": "number"},
        },
        "required": ["description", "amount"],
    },
},
"category": {
    "type": "string",
    "enum": ["software", "services", "hardware", "other"],
},

Şema iki düzeyde required içerir. Dış listedeki öğeler, her çıkarımda görünmesi gereken üst düzey alanları işaretler. Öğeye özgü liste ise her satır öğesinde bulunması gereken alt alanları işaretler. Tam şema eşlik eden depodaki tools.py içinde yer alır.

Argümanlar, tool_calls[0].function.arguments içinde JSON biçiminde bir metin olarak geri gelir; ayrıştırılmış bir nesne olarak değil; bu yüzden json.loads ile kendiniz ayrıştırırsınız. Akışta, argümanlar birleştirdiğiniz bir dizi delta olarak gelir.

Otomatik araç seçimi kullanma

Bir püf noktası: OpenRouter'ın Qwen 3.6 Plus uç noktası zorunlu araç çağrılarını desteklemez. tool_choice={"type": "function", "function": {"name": "extract_invoice"}} denerseniz, istek bir hatayla döner:

No endpoints found that support the provided 'tool_choice' value

Pratik çözüm, tool_choice="auto" kullanmak ve sistem istemine güvenmektir:

SYSTEM_PROMPT = """You are an invoice extraction assistant. Read the invoice
image and respond by calling the extract_invoice tool with the fields you find.
Do not reply in prose, always call the tool. If a field is missing from the
invoice, use a sensible default: empty string for text fields, 0 for numeric
fields, an empty array for line_items."""

Eşlik eden depodaki altı örnek fatura boyunca bu istem her seferinde bir araç çağrısı alır. Üretim kodu yine de istisna durumunu gözetmelidir: finish_reason değerini kontrol edin, tool_calls dolu mu doğrulayın; değilse daha keskin bir talimatla yeniden deneyin. Qwen'in kendi fonksiyon çağırma dokümanları da aynı şeyi belirtir. Araç çağrısı oluşturma garanti değildir ve üretim kodunun bir yedek yolu olmalıdır.

Bir yan etki: istem yapılandırılmış alanlar ister istemez, delta.reasoning_content uzun bir iz ile dolar. Model tabloyu satır satır ayrıştırır, invoice_04.jpg üzerinde Avrupa ondalık gösterimini tartışır ve satır öğesi tutarlarını toplamla karşılaştırır. Bu tür istemlerde akıl yürütme belirteçleri yanıt belirteçlerinden 10 kata kadar daha fazla olabilir.

Bu, yapısal çıkarımda her zaman açık CoT'nin maliyetidir; bu yüzden preserve_thinking yalnızca daha sonraki bir turun izi okuduğu çok turlu ajan döngülerinde işe yarar. Biz tek atımlık çıkarım yapıyoruz; bu nedenle iz terminale akar ve biz onu atarız.

Taranmış görsellerin yanında PDF'leri de destekleme

JPG'ler için akış üç adımdır:

  1. Görsel baytlarını diskten oku

  2. Base64 ile kodla

  3. Sonucu data: URI ile bir image_url içerik bloğuna yerleştir

PDF'ler bir ek adıma ihtiyaç duyar; çünkü Qwen'in görsel yolu doğrudan PDF dosyaları yerine görselleri kabul eder. Her sayfayı pdf2image ile bir PIL görseline dönüştürün; ardından sayfaları aynı iletide birer görsel içerik bloğu listesi olarak gönderin.

Her iki yol da aynı model çağrısını paylaşır; bu nedenle çağrı processors/image.py içinde yaşar ve processors/pdf.py ona delege eder. İçe aktarmalarla başlayın (yukarıdaki SYSTEM_PROMPT aynı modülde bulunur):

# processors/image.py
import base64
import json
from pathlib import Path
 
from openai import OpenAI
from client import MODEL_ID
from tools import EXTRACT_INVOICE_TOOL
 
# SYSTEM_PROMPT defined above

Kodlayıcı, bir JPG yolunu API'nin beklediği data: URI'sine dönüştürür:

def _encode_image(image_path: Path) -> str:
    data = image_path.read_bytes()
    b64 = base64.b64encode(data).decode("ascii")
    suffix = image_path.suffix.lower().lstrip(".")
    mime = "jpeg" if suffix in ("jpg", "jpeg") else suffix
    return f"data:image/{mime};base64,{b64}"

Paylaşılan yardımcı _call_with_images, kullanıcı-içeriği dizisini (metin + bir veya daha fazla görsel) oluşturur ve akışlı isteği gönderir. Akıştan iki veri parçasını toplar: akıl yürütme izi ve araç çağrısı argümanları. Önce istek kurulumu gelir:

def _call_with_images(client: OpenAI, data_uris: list[str], filename: str) -> dict:
    user_content = [{"type": "text", "text": f"Invoice file: {filename}"}]
    for uri in data_uris:
        user_content.append({"type": "image_url", "image_url": {"url": uri}})
 
    stream = client.chat.completions.create(
        model=MODEL_ID,
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_content},
        ],
        tools=[EXTRACT_INVOICE_TOOL],
        tool_choice="auto",
        extra_body={"enable_thinking": True},
        stream=True,
    )

Ardından akış döngüsü, akıl yürütme deltalarını araç çağrısı argüman deltalarından ayırır:

    reasoning_parts: list[str] = []
    tool_args_parts: list[str] = []
 
    for chunk in stream:
        delta = chunk.choices[0].delta
        reasoning = getattr(delta, "reasoning_content", None)
        if reasoning:
            reasoning_parts.append(reasoning)
        if delta.tool_calls:
            for tc in delta.tool_calls:
                if tc.function and tc.function.arguments:
                    tool_args_parts.append(tc.function.arguments)
 
    extracted = json.loads("".join(tool_args_parts))
    return {"file": filename, "reasoning": "".join(reasoning_parts), "extracted": extracted}

JPG'ler için genel giriş noktası, bu yardımcıları kullanan tek satırlık bir fonksiyondur:

def process_image_invoice(client: OpenAI, image_path: Path) -> dict:
    uri = _encode_image(image_path)
    return _call_with_images(client, [uri], image_path.name)

PDF'leri işleme

PDF işlemcisi _call_with_images fonksiyonunu yeniden kullanır ve yalnızca sayfadan görsele dönüşümü ekler:

# processors/pdf.py
import base64
import io
from pathlib import Path
 
from openai import OpenAI
from pdf2image import convert_from_path
from processors.image import _call_with_images
 
 
def _page_to_data_uri(page) -> str:
    buf = io.BytesIO()
    page.save(buf, format="PNG")
    b64 = base64.b64encode(buf.getvalue()).decode("ascii")
    return f"data:image/png;base64,{b64}"
 
 
def process_pdf_invoice(client: OpenAI, pdf_path: Path) -> dict:
    pages = convert_from_path(str(pdf_path), dpi=150)
    uris = [_page_to_data_uri(p) for p in pages]
    return _call_with_images(client, uris, pdf_path.name)

pdf2image, poppler kurulumunu gerektirir. Şöyle kurun:

# macOS
brew install poppler
 
# Debian / Ubuntu
apt install poppler-utils

Çok sayfalı PDF'ler için, her sayfayı aynı mesajda kendi görsel bloğu olarak gönderin. Qwen hepsini birlikte okur ve tek bir çıkarım üretir; toplamların 2. sayfada yer aldığı bir fatura için istediğiniz de budur.

150 DPI, fatura metnini okunabilir tutar ve yükü şişirmez. Daha yukarı çıkmak, bu örneklere karşı testlerde doğruluğu artırmadan isteği büyütür. Alibaba'nın görme dokümantasyonu desteklenen formatları ve üst sınırları kapsar.

Tüm hattı çalıştırma

main.py, sample_invoices/ dizininde dolaşır, her dosyayı uzantıya göre yönlendirir, doğru işlemciyi çağırır ve birleşik sonuçları bir CSV'ye yazar. Önce içe aktarmalar ve sabitler:

# main.py
import csv
from pathlib import Path
 
from client import get_client
from processors.image import process_image_invoice
from processors.pdf import process_pdf_invoice
 
SAMPLES_DIR = Path(__file__).parent / "sample_invoices"
RESULTS_PATH = Path(__file__).parent / "results.csv"
 
IMAGE_EXTS = {".jpg", ".jpeg", ".png"}
PDF_EXTS = {".pdf"}

Ana döngü örnekler dizininde sıralı olarak dolaşır, dosya uzantısına göre yönlendirir ve her çıkarımı CSV'ye uygun bir satıra düzleştirir:

def main() -> None:
    client = get_client()
    results = []
 
    invoice_paths = sorted(
        p for p in SAMPLES_DIR.iterdir()
        if p.suffix.lower() in IMAGE_EXTS | PDF_EXTS
    )
 
    for path in invoice_paths:
        if path.suffix.lower() in PDF_EXTS:
            result = process_pdf_invoice(client, path)
        else:
            result = process_image_invoice(client, path)
 
        extracted = result["extracted"]
        results.append({
            "file": result["file"],
            "vendor": extracted.get("vendor", ""),
            "date": extracted.get("date", ""),
            "total": extracted.get("total", ""),
            "tax": extracted.get("tax", ""),
            "category": extracted.get("category", ""),
            "line_item_count": len(extracted.get("line_items", [])),
        })

Son olarak, satırları diske yazın ve sayıyı günlüğe kaydedin:

    with RESULTS_PATH.open("w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=list(results[0].keys()))
        writer.writeheader()
        writer.writerows(results)
 
    print(f"\nProcessed {len(results)} invoices → {RESULTS_PATH.name}")
 
 
if __name__ == "__main__":
    main()

python main.py komutunu çalıştırmak, altı örneği sırayla dolaşır. Her fatura dosya adını, ardından akıl yürütme izini, ardından çıkarılan JSON'u akışla verir ve sonra bir sonrakine geçer:

Hattı çalıştırmanın terminal çıktısı

results.csv, her çıkarımı fatura başına bir satırda toplar:

file

vendor

date

total

tax

category

line_item_count

invoice_01.pdf

CONTOSO LTD.

2019-11-15

610.00

10.00

other

1

invoice_02.pdf

Contoso, 

Ltd.

2020-09-10

10686.25

311.25

services

3

invoice_03.pdf

ABC Private Limited

2021-01-01

6231.09

61.69

other

4

invoice_04.jpg

Dunn PLC

2019-01-23

3120.51

283.68

hardware

4

invoice_05.jpg

Crawford, Acosta and Solomon

2012-08-22

60.45

5.50

hardware

1

invoice_06.jpg

Paul, Wilson and Gonzalez

2016-02-25

1025.61

93.24

other

5

Toplamlar altın gerçeğe altısında da uyuyor. Ücretsiz katmanda gecikme fatura başına 15 ila 40 saniye arasında. Bunun çoğu, araç çağrısı akışı başlamadan önceki akıl yürütme aşaması.

Qwen 3.6 Plus API En İyi Uygulamalar ve Sınırlamalar

Birkaç desen, bir kez çalışan bir hattan gerçek faturalar üzerinde çalışmayı sürdüren bir hattı ayırır.

En iyi uygulamalar

  • Sırları koddan uzak tutun. Boyunca kullandığımız .env ve python-dotenv deseni taban çizgisidir. Anahtarın depoya hiç ulaşmaması için ilk committan önce .env'yi .gitignore'a ekleyin.

  • Oran sınırlamalarını üstel geri çekilme ile yönetin. OpenRouter, sağlayıcı başına sınırları HTTP 429 yanıtlarıyla uygular. tenacity kütüphanesi dekoratör tabanlı bir uygulama sunar ve OpenAI cookbook desenindeki wait_random_exponential değişmeden çalışır.

  • Yanıtlar uzun olacaksa akış kullanın. Her zaman açık CoT, yanıt uzunluğunu varsayılan olarak artırır. Akışsız çağrılar, bir şey görmeden önce tüm akıl yürütme bloğunu beklemek demektir. Akış, erken geri bildirim verir, UI'yi duyarlı tutar ve bariz şekilde ters giden bir isteği iptal etmenizi sağlar.

  • preserve_thinking'i yalnızca sonraki turlar önceki akıl yürütmeyi okuyorsa kullanın. Bu hat gibi tek atımlık çıkarıcılar için belirteç israfıdır. Çok turlu ajan döngülerinde (araç çağırma zincirleri, planlama görevleri, hata ayıklama iş akışları) parametre, turlar arası bağlam için vardır. Alibaba'nın derin düşünme dokümantasyonu ayrıca, çağrı başına akıl yürütme belirteçlerine sert bir üst sınır olan thinking_budget'ı kapsar.

Bilinen sınırlamalar

  • Ücretsiz katman yanıtları eğitim için günlüğe alınabilir. OpenRouter'ın ücretsiz katmanı, istemleri saklayabilen sağlayıcılardan geçer. Bu durum, gerçek KKB, müşteri adları veya ödeme detayları içeren faturalar için uygun değildir. Gerçek veriler hattan geçmeden önce ücretli bir OpenRouter katmanına (veya ücretli bir hesapla doğrudan Alibaba Cloud'a) geçin.

  • Plus katmanında self-hosting yok. Hava boşluklu veya şirket içi dağıtımlar barındırılan API'yi kullanamaz. Açık kaynak Qwen3.6-35B-A3B varyantı bu durumlar için değerlendirilmeye değer ayrı bir seçenektir.

  • İlk belirtece kadar geçen süre akıl yürütme başladığında yavaş olabilir. Zaman aşımlarını cömertçe ayarlayın; görsel girdi için 30 ila 60 saniye makuldür. Yeniden deneme mantığınızın okuma zaman aşımlarını 429'lardan ayrı ele aldığından emin olun.

  • Her zaman açık CoT ile bile çıktı belirleyici değildir. Eşlik eden deponun örneklerine karşı testte, invoice_01.pdf çoğu çalıştırmada 610.00 $ olarak çıkarıldı. En az bir yeniden çalıştırmada, girdiler özdeş olmasına rağmen 110.00 $'a döndü. Akıl yürütme izi her iki seferde de doğru sonuca ulaştı; ancak son araç çağrısı argümanı farklıydı. İki önlem: temperature'ı düşük ayarlayın (saf çıkarım için 0.1–0.2) ve doğruluğun fazladan çağrıyı haklı çıkardığı durumlarda altın gerçeğe göre doğrulayın veya ikinci bir geçiş kullanın.

Son Düşünceler

Buradan, hattı bir ajan çatısı içine sarmak küçük bir adımdır. Araç çağırma döngüsü, akışlı ayrıştırıcı ve CSV yazıcı, bir ajan çatısının çoklu turlar boyunca düzenlediği aynı ilkelerdir. DataCamp'in LangChain ile LLM Uygulamaları Geliştirme kursu bu desenleri bellek, durum ve çoklu araç yönlendirmesiyle anlatır.

Qwen 3.6 Plus API SSS

Qwen 3.6 Plus nedir ve nasıl erişirim?

Qwen 3.6 Plus, Alibaba'nın Nisan 2026 amiral gemisi modelidir. Yalnızca API üzerinden sunulur; 1M belirteçlik bağlam penceresi, yerel çok kipli girdiler ve her zaman açık düşünce zinciri akıl yürütmesi sunar. Temel URL'yi değiştirerek standart OpenAI Python SDK'sı ile Alibaba Cloud Model Studio veya OpenRouter üzerinden erişirsiniz.

Qwen 3.5 Plus ile Qwen 3.6 Plus arasında ne değişti?

En büyük değişim, akıl yürütmenin anahtarlanabilir enable_thinking parametresinden her zaman açık duruma geçmesidir. SWE-bench Verified 76.8'den 78.8'e, Terminal-Bench 2.0 58.0'dan 61.6'ya yükseldi ve en büyük kazanımlar OCR ile nesne konumlandırmada görüldü. Yeni preserve_thinking parametresi, çok turlu ajan döngülerinde akıl yürütme izlerini turlar arasında taşır.

preserve_thinking parametresi ne yapar?

preserve_thinking, önceki akıl yürütme izlerini konuşma turları boyunca iletilere bağlı tutar; böylece sonraki turlar önceki düşünce zincirini okuyabilir. Yalnızca çok turlu ajan döngülerinde kullanmaya değerdir. Tek atımlık çıkarımlarda, yanıt geldikten sonra izi kimse okumadığı için belirteç israfıdır; bu yüzden devre dışı bırakmalısınız.

Qwen 3.6 Plus'ı kendi sunucumda barındırabilir miyim?

Hayır, Plus katmanı kapalı ağırlıklıdır ve yalnızca barındırılan API üzerinden kullanılabilir. Self-hosting veya hava boşluklu dağıtımlar için Alibaba, varsayılan 262K bağlamlı açık kaynak Qwen3.6-35B-A3B varyantını yayımlar. Bu, Qwen 3.6 Plus'tan ayrı bir üründür ve kendi başına değerlendirilmelidir.

Aynı fatura tekrarlanan çalıştırmalarda neden farklı toplamlar çıkarabilir?

Her zaman açık düşünce zinciri ile bile çıktı belirleyici değildir. Testlerde, invoice_01.pdf çoğu çalıştırmada 610.00 $ olarak çıkarıldı; ancak özdeş girdilerle en az bir yeniden çalıştırmada 110.00 $'a döndü. Akıl yürütme izi her iki seferde de doğru cevaba ulaştı; ancak son araç çağrısı argümanı farklıydı. Bunu hafifletmek için temperature'ı düşük ayarlayın (saf çıkarım için 0.1–0.2) ve altın gerçeğe göre doğrulayın ya da doğruluğun önemli olduğu durumlarda ikinci bir geçiş çalıştırın.


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium'da en büyük takipçi kitlelerinden birine sahibim. Yapay zeka ve makine öğrenimi üzerine, biraz da alaycı bir üslupla, ayrıntılı yazılar yazmayı seviyorum; çünkü bu konuları biraz olsun sıkıcılıktan çıkarmak gerekiyor. 130'dan fazla makale ve bir DataCamp kursu hazırladım; bir diğeri de yolda. İçeriklerim 5 milyondan fazla kişi tarafından görüntülendi; bunların 20 bini Medium ve LinkedIn'de takipçim oldu. 

Konular

Ajanik Yapay Zekâ Kursları

Program

AI Ajanının Temelleri

6 sa
AI ajanlarının çalışma şeklinizi nasıl değiştirebileceğini ve kuruluşunuza nasıl değer katabileceğini keşfedin!
Ayrıntıları GörRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

Devamını GörDevamını Gör