# Output Format Control: JSON, Markdown, Tables

> Source: https://sukruyusufkaya.com/en/learn/claude-ustaligi/output-format-kontrolu
> Updated: 2026-05-13T09:36:16.318Z
> Category: Claude Ustalığı
> Module: 3. Advanced Prompting Techniques
**TLDR:** Master three techniques to keep Claude's output parseable, consistent, and error-free: schema, prefill, and validator-loop.

> **Üç teknik, sıfır toleranslı format**
>
> Format hatası genelde geliştiriciyi en çok yakan şeydir. Bu derste schema-driven prompting, assistant prefill ve validator-loop tekniklerini öğreneceksin.

# Format Kontrolü Neden Bu Kadar Önemli?

Çıktıyı bir başka sistem (parser, UI, başka API) tüketecekse, her küçük format sapması bug demektir. Bizim için ideal: **çıktı her seferinde aynı kalıpta**.

![Format pipeline: schema → prefill → model → validate → retry](/images/learn/claude-ustaligi/diagram-format-pipeline.svg)

_Format kontrol pipeline'ı: schema, prefill, model, validate, retry._

## Teknik 1 — Schema-Driven Prompting

Çıktıyı bir JSON schema ile sınırla. Schema'yı doğrudan prompt'a yapıştır.

```text
<output_schema>
{
  "type": "object",
  "required": ["category", "confidence", "next_action"],
  "properties": {
    "category": {
      "type": "string",
      "enum": ["auth", "billing", "tech", "other"]
    },
    "confidence": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "next_action": {
      "type": "string",
      "maxLength": 120
    }
  },
  "additionalProperties": false
}
</output_schema>

<rules>
Sadece geçerli JSON döndür. Açıklama / yorum ekleme.
Bilinmeyen alan ekleme. Schema'ya tam uymayan değer üretme.
</rules>
```

## Teknik 2 — Assistant Prefill

API çağrılarında `assistant` mesajını yarım bırakarak başlatabilirsin. Claude o noktadan devam eder. Bu, formatı **fizik olarak zorlar**.

```python
# Anthropic SDK ile prefill örneği
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=512,
    system="Sen bir destek bileti sınıflandırıcısısın. Sadece geçerli JSON döndür.",
    messages=[
        {"role": "user", "content": "Şifremi sıfırlayamıyorum"},
        {"role": "assistant", "content": "{"},  # ← prefill
    ],
)

# Çıktı garantili '{' ile başlar, JSON parse'a hazır
text = "{" + response.content[0].text
print(text)
```

## Teknik 3 — Validator-Loop

Schema doğrulamasını kodla yap; başarısızsa **aynı hata mesajını Claude'a yolla** ve düzeltmesini iste.

```python
# Sentetik validator loop demo
import json

def validate(payload: str) -> tuple[bool, str]:
    try:
        obj = json.loads(payload)
    except json.JSONDecodeError as e:
        return False, f"JSON parse hatası: {e}"
    if "category" not in obj:
        return False, "category alanı eksik"
    if obj["category"] not in {"auth","billing","tech","other"}:
        return False, "category enum dışı: " + str(obj["category"])
    if not (0.0 <= obj.get("confidence", -1) <= 1.0):
        return False, "confidence 0..1 aralığında olmalı"
    return True, "ok"

# Bozuk cevap
bozuk = '{"category":"login","confidence":1.4}'
ok, msg = validate(bozuk)
print("Geçerli mi?", ok, "—", msg)

# Düzeltilmiş cevap (Claude bir tur sonra dönecek diye varsay)
duzelt = '{"category":"auth","confidence":0.91,"next_action":"şifre sıfırlama linki gönder"}'
ok, msg = validate(duzelt)
print("Geçerli mi?", ok, "—", msg)
```

### Markdown çıktıyı kontrol etmek

Markdown serbest formattır ama yine de kontrol edilebilir:

- Başlık seviyelerini kısıtla: "Sadece H2 ve H3 kullan."
- Maksimum madde sayısı belirt.
- Tablo gerektiğinde format örneği ver: "Şu sütunlar: | Tarih | Olay | Kaynak |"
- "Cevabın tamamı tek bir Markdown bloğunda olsun" diyerek dağılma riskini azalt.

### Tabloda 'kayan hücre' problemi

LLM'ler bazen tablonun ortasına bir hücreyi unutarak kolonları bozar. Çözümler:

- **Her tabloyu JSON dizisinden render et:** Önce JSON üret, kodda Markdown'a dönüştür.
- **Sınır: maksimum 12 sütun, maksimum 50 satır.** Daha büyük tabloları parçalara böl.
- **Ekleyici örnekler ver:** İdeal tablo 3 örnekle göster.

### Tool use ile schema enforcement

Claude'un Tool Use API'sinde tool input schema otomatik olarak JSON schema ile kısıtlıdır. Çoğu yapısal cevap için tool kullanmak, schema-driven prompting'in 'native' versiyonudur. Modül 8'de işleyeceğiz.

**Önce:**
```json
// Naif istek — olası başarısızlık
{
  "model": "claude-sonnet-4-6",
  "messages": [
    {"role": "user", "content": "Şu bileti sınıflandır: ..."}
  ]
}
```

**Sonra:**
```json
// Üretim seviyesi: schema + prefill
{
  "model": "claude-sonnet-4-6",
  "system": "Sınıflandırıcı. Sadece geçerli JSON. Schema: {...}",
  "messages": [
    {"role": "user", "content": "Şu bileti sınıflandır: ..."},
    {"role": "assistant", "content": "{"}
  ],
  "max_tokens": 256,
  "temperature": 0.0
}
```

**Boşluk doldurma egzersizi (text):**
```text
Çıktı formatını kontrol etmenin üç tekniği: schema, _____ ve _____ -loop. JSON formatını fiziksel olarak zorlayan teknik _____ olarak adlandırılır.
```

> ✋ Kontrol noktası: `q-302-mc1`