Merkez Bankası Ne Zaman "Kararlı", Ne Zaman "Temkinli" Konuşuyor?

2026-08-27

Merkez Bankası her toplantıda aynı iki şeyi söylüyormuş gibi görünür: bir faiz kararı ve birkaç paragraf gerekçe. Ama o birkaç paragrafın tonu toplantıdan toplantıya değişiyor — bazen "kararlı duruş", bazen "temkinli yaklaşım", bazen "riskler yakından izlenecek". Bu ton gazetecilerin, ekonomistlerin, piyasa katılımcılarının okuyup yorumladığı bir şey ama sistematik olarak ölçülmüyor.

Biz de TCMB'nin Para Politikası Kurulu'nun (PPK) 2025-2026 dönemine ait 14 toplantısını — 28 açıklama metnini — HuMetric'e uçtan uca, gerçek prod ortamında işlettik. Bu yazı o pilotun geliştirici günlüğü: nasıl bağlandık, pack'i kim yazdı, sinyaller nasıl gitti, sonuç ne çıktı — hepsi gerçek isteklerle, gerçek JSON çıktılarıyla.

PPK metninin beş adımda kanıtlı bir metriğe dönüşmesi

Pack'i biz yazmadık, bir agent yazdı

Yedi metrik tanımlamak (belirsizlik, temkinlilik, kararlilik, sikilastirma_egilimi, risk_vurgusu, dis_etken_atfi, somutluk), her birine bir prompt, bir yön (higher_is_better / lower_is_better) ve bant eşikleri yazmak — bunu elle yapmadık. HuMetric'in Pack Wizard'ına tek bir doğal dil isteği verdik, Gentic (agent'ın kendi kararıyla çağırabildiği bir araştırma katmanı) gerisini halletti.

Site tarafında önce bir oturum açtık:

curl -s -X POST https://gethumetric.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"...","password":"..."}'
# → {"token": "...", "user": {...}}

Sonra wizard oturumunu tek bir cümleyle başlattık:

curl -s -X POST https://gethumetric.com/api/wizard/sessions \
  -H "Authorization: Bearer $SITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "TCMB PPK toplantı metinlerinden belirsizlik/temkinlilik/kararlılık/sıkılaştırma eğilimi/risk vurgusu/dış etken atfı/somutluk ölçen bir pack; entity = tek bir PPK toplantısı",
    "entity_type_hint": "ppk_toplantisi",
    "lang": "tr"
  }'
# → {"session_id": "b9257ec7-9629-4387-b551-8cefd936e2c8"}

Oturum arka planda asenkron çalıştığı için sonucu polling ile bekledik (gerçek zamanlı akış da mümkün, ama curl'de polling daha basit):

curl -s https://gethumetric.com/api/wizard/sessions/$SID \
  -H "Authorization: Bearer $SITE_TOKEN"
# status: queued → running → completed

3 tur sonunda (turn_count: 3) oturum completed oldu. Gentic bu sırada kendi kararıyla bir web araştırma aracı çağırmış (gentic_tools: {"search_web": {"count": 1, "cost_cents": 5}}) — bizim bir şey tetiklememize gerek kalmadan, "PPK metinlerinde belirsizlik ve sıkılaştırma dili nasıl ifade edilir" gibi bir şeyi kendi araştırmış. Hiç soru sormadı (pending_question: null), bize doğrudan bir öz-değerlendirme skoruyla (confidence: 0.85) yayına hazır bir pack verdi:

Tek cümlelik istekten agent'ın ürettiği 7 metrikli TCMB/PPK pack'i

Üretilen pack'in bir dilimi (tam hâli yazının sonunda):

entity_type: ppk_toplantisi
metrics:
  - key: sikilastirma_egilimi
    label: Sıkılaştırma Eğilimi
    type: float
    direction: higher_is_better
    prompt: >
      PPK toplantı metnindeki parasal sıkılaştırma (şahin) eğilimini
      -1 ile 1 arasında puanla. Metinde 'sıkılaştırma', 'sıkı para
      politikası', 'faiz artırımı' ... gibi ifadelerin sıklığını ve
      gücünü değerlendir.
    bands:
      - {max: -0.33, level: critical}
      - {max: 0.33, level: warn}
      - {max: 1, level: good}

Peki Gentic tam olarak ne yaptı? Bu bir kara kutu değil — panel, agent'ın hangi aracı ne için çağırdığını, hangi kaynakları bulduğunu ve kendi ürettiği pack'i kendisinin nasıl eleştirdiğini gösteriyor:

Wizard'ın İncele adımı: Gentic'in search_web aracıyla bulduğu 5 kaynak, agent'ın öz-değerlendirmesi ve kullanılan model

Gentic'in elinde birden fazla araç var — bir hafıza/bağlam aracı, bir wiki arama aracı, bir de web araştırma aracı (search_web). Bu oturumda yalnızca search_web çağrıldı (kategori: research), 5 sonuç döndü — "Para Politikası Kurulu Kararları", "Merkez Bankası Para Politikası Metinleri Analizi", "Uzmanlar TCMB'nin Faiz Kararını Değerlendirdi" gibi başlıklarla, her biri açılabilir kaynak linkiyle. Agent'ın kendi araç seçimi bu — hangi aracın gerekli olduğuna biz karar vermedik.

Altında agent'ın kendi ürettiği pack'i kendisinin eleştirdiği bir liste var — örneğin: "bant eşikleri (−0,33 / 0,33) örnek veriyle doğrulanmadı, gerçek dağılımı yansıtmayabilir" (medium önem). Bu, agent'ın kör bir onay değil, öz-farkındalıklı bir değerlendirme ürettiğini gösteriyor — ve bu bulgu gerçekten doğru: pack'i biz de örnek veri vermeden, tek cümleyle istedik. Kullanılan model de görünür: deepseek:deepseek-chat — tenant'ın bağladığı sağlayıcı neyse, wizard'ın agent'ı da onunla çalışıyor.

Prod'a bağlanmak — iki yol

Bu pilotu panelden değil, doğrudan API'den yürüttük — bu yazı da o yüzden ekran görüntüsü yerine gerçek isteklerin kendisini gösteriyor.

Yol 1 — düz curl. Önce oturum açıp bir token aldık, sonra tenant'ın LLM sağlayıcısını DeepSeek'e bağladık (kendi API anahtarınızı getirip kullanma — BYOK):

curl -s -X POST https://api.gethumetric.com/v1/login \
  -H "Content-Type: application/json" \
  -d '{"email":"...","password":"..."}'
# → {"dashboard_token": "...", "tenant_id": 2, ...}

curl -s -X PUT https://api.gethumetric.com/v1/tenant/keys \
  -H "Authorization: Bearer $DASH_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"deepseek_key":"sk-...","llm_provider":"deepseek"}'
# → {"has_deepseek_key": true, "llm_provider": "deepseek", ...}

Buradan itibaren gerçek isteklerin geçtiği API anahtarını ayrı üretiyoruz (bu, giriş token'ından farklı — sinyal/entity uç noktaları için gereken uzun ömürlü anahtar bu):

curl -s -X POST https://api.gethumetric.com/v1/tenant/rotate-api-key \
  -H "Authorization: Bearer $DASH_TOKEN"
# → {"api_key": "hm_live_...", "api_key_prefix": "hm_live", ...}

Yol 2 — MCP. Aynı işi bir sohbet asistanının (Claude Code dahil, MCP konuşan herhangi bir istemci) doğrudan araç çağrılarıyla yapmasını da istedik. Kurulum tek komut:

claude mcp add humetric --scope local \
  --env HUMETRIC_MCP_API_KEY=hm_live_... \
  --env HUMETRIC_BASE_URL=https://api.gethumetric.com \
  -- uvx --from git+https://github.com/bestekarx/humetric.git humetric-mcp

Bağlandıktan sonra asistan artık şu araçları görüyor: sinyal gönderme (humetric_ingest_signal), varlık metriklerini okuma (humetric_get_entity_metrics), bir değerin neden o olduğunu sorma (humetric_explain_metric), zaman içindeki değişimi okuma (humetric_metric_history), varlıkları bir metriğe göre sıralama (humetric_query_entities) — panelle sohbet penceresi arasında kopyala-yapıştır yapmaya gerek kalmıyor.

Gerçek bir işletim notu: MCP istemcisi bağlantı ortam değişkenlerini yalnızca oturum başında okuyor. Yani API anahtarını veya adresini değiştirdiğinizde, o değişiklik zaten açık olan bir oturuma canlı yansımıyor — yeni bir oturum gerekiyor. Bu pilotta gerçekten yaşadık: prod'a geçtikten sonra bir süre eski (yerel) bağlantıya konuşmaya devam ettiğimizi fark ettik, çünkü MCP alt-süreci hâlâ eski ayarları belleğinde tutuyordu. Küçük ama gerçek bir ayrıntı — CI/CD'de config değiştirip "neden hâlâ eskisini görüyorum" diyen herkesin tanıdığı bir durum.

Bir toplantı, uçtan uca

Bir toplantı entity olarak oluşturulup (gerekli alanlar pack'in tanımladığı gibi: toplanti_id, tarih, karar_no, metin), sonra karar metni bir sinyal olarak gönderiliyor:

curl -s -X POST https://api.gethumetric.com/v1/entities \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "id": "ppk-2025-15",
    "entity_type": "ppk_toplantisi",
    "fields": {
      "toplanti_id": "2025-15", "tarih": "6 Mart 2025",
      "karar_no": "2025-15", "metin": "..."
    }
  }'

curl -s -X POST https://api.gethumetric.com/v1/signals \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{
    "entity_id": "ppk-2025-15",
    "entity_type": "ppk_toplantisi",
    "text": "<karar metninin tamamı>",
    "external_id": "2025-15-karar",
    "occurred_at": "2025-03-06T00:00:00Z"
  }'
# → 202 {"signal_id": "450c7428-..."}

occurred_at burada kritik: toplantının gerçek tarihi, sinyalin gönderildiği an değil. HuMetric'in zaman aşındırması (confidence, okuma anında yaşa göre üstel olarak azalır) bu tarihe göre hesaplanıyor — geçmişe dönük 14 toplantıyı hangi sırayla gönderdiğimizin sonucu etkilememesi için şart.

İşlem tamamlandıktan sonra sonuca üç farklı derinlikte bakılabiliyor. Değer:

curl -s https://api.gethumetric.com/v1/entities/ppk-2025-15/metrics \
  -H "Authorization: Bearer $API_KEY"
{
  "entity_id": "ppk-2025-15",
  "metrics": [
    {"metric_key": "kararlilik", "value": 0.8, "confidence": 0.85, "source_count": 2},
    {"metric_key": "sikilastirma_egilimi", "value": 0.61, "confidence": 0.75, "source_count": 2}
  ]
}

"Bu değer neden bu" sorusunun cevabı /explain'de — hangi cümle:

curl -s https://api.gethumetric.com/v1/entities/ppk-2025-15/metrics/kararlilik/explain \
  -H "Authorization: Bearer $API_KEY"
{
  "metric_key": "kararlilik", "value": 0.8, "confidence": 0.85,
  "extracted": [{
    "value": 0.8,
    "reasoning": "Metinde 'kararlı duruş', 'kararlılıkla', 'sürdürülecek' gibi güçlü kararlılık ifadeleri mevcut.",
    "source_span": "Para politikasındaki kararlı duruş; yurt içi talepte dengelenme, Türk lirasında reel değerlenme ve enflasyon beklentilerinde düzelme vasıtası ile dezenflasyon sürecini güçlendirmektedir."
  }]
}
Bir PPK karar metnindeki kararlı duruş cümlesinin kararlilik: +0.80 metriğine kanıtlı şekilde dönüşmesi

source_span uydurulmuş bir özet değil — sinyal metninin birebir bir alt dizgesi. Motor bunu doğruluyor; tutmazsa metrik silinmiyor, insan onayına düşüyor. Yani "neden bu skor" sorusunun cevabı her zaman kopyala-yapıştır edilebilir bir cümle.

Ve /history ile zaman içindeki değişim — her nokta gerçek toplantı tarihine bağlı:

curl -s https://api.gethumetric.com/v1/entities/ppk-2025-15/metrics/sikilastirma_egilimi/history \
  -H "Authorization: Bearer $API_KEY"

Asıl bulgu: faiz inerken ton sertleşiyor

14 toplantının tamamını işledikten sonra ortaya çıkan tablo tek bir cümleyle özetlenebilir: politika faizi 18 ay boyunca %47,5'ten %37'ye inerken (arada piyasa oynaklığına karşı bir sıkılaştırma dönemi de var), Kurul'un dilindeki sıkılaştırma vurgusu hiç düşmedi.

İlk toplantı (%47,5, sıkılaştırma 0.65) ile son toplantı (%37, sıkılaştırma 0.80) karşılaştırması, kanıt cümleleriyle

İlk toplantıda (23 Ocak 2025, %47,5) sikilastirma_egilimi +0,65; son toplantıda (23 Temmuz 2026, %37) +0,80. Ara dönemde bazı toplantılarda düşüşler de var (bir toplantıda +0,45'e kadar iniyor) — düz bir çizgi değil, ama yön net: faiz inerken bile Kurul "gerekirse sıkılaştırma" dilini terk etmiyor. Aynı dönemde dis_etken_atfi de belirgin şekilde yükseliyor (0,60'tan 0,90'a) — toplantı özetleri küresel gelişmelere giderek daha çok atıf yapıyor. somutluk ise baştan beri zaten yüksek (0,85-0,90 bandında) — TCMB metinleri en başından bu yana rakam ve tarih açısından zengin, bu dönemde daha da somutlaşmıyor.

Kanıt artık tek linkle paylaşılıyor

19 Haziran 2025 toplantısının tam metrik profili — 7 metrik, her biri kanıt cümlesiyle birlikte, hesap açmadan:

gethumetric.com/share/type/…/e/ppk-2025-37

Sonda: tam pack

entity_type: ppk_toplantisi
label: TCMB PPK Toplantı Metni Ton Analizi Paketi
version: 1
required_fields:
  - key: toplanti_id
    type: str
    label: Toplantı Kimliği
  - key: tarih
    type: str
    label: Toplantı Tarihi
  - key: karar_no
    type: str
    label: Karar Numarası
  - key: metin
    type: str
    label: PPK Metni
metrics:
  - key: belirsizlik
    label: Belirsizlik Vurgusu
    type: float
    prompt: 'PPK toplantı metnindeki belirsizlik vurgusunu -1 ile 1 arasında puanla. Metinde ''belirsizlik'', ''öngörülemez'', ''belirsiz'', ''net değil'', ''önemli ölçüde belirsiz'', ''riskler'', ''gelişmeler yakından izlenecek'' gibi ifadelerin sıklığını ve gücünü değerlendir. -1: metin hiç belirsizlik ifadesi içermiyor, kesin ve net bir dil kullanılıyor. 0: metin orta düzeyde belirsizlik ifadesi içeriyor, bazı koşullu ifadeler var. 1: metin yoğun belirsizlik vurgusu yapıyor, geleceğe dair çok sayıda koşullu ve belirsiz ifade içeriyor.'
    direction: lower_is_better
    unit: ''
    bands:
      - max: -0.33
        level: good
      - max: 0.33
        level: warn
      - max: 1
        level: critical
    default_confidence: 0.8
    sensitive: false
  - key: temkinlilik
    label: Temkinlilik Dili
    type: float
    prompt: 'PPK toplantı metnindeki temkinlilik/ihtiyatlılık dilini -1 ile 1 arasında puanla. Metinde ''temkinli'', ''ihtiyatlı'', ''dikkatli'', ''tedbirli'', ''yakından izlenecek'', ''gerekirse'', ''ihtiyaç duyulması halinde'' gibi ihtiyatlı ifadelerin sıklığını ve gücünü değerlendir. -1: metin hiç temkinli ifade içermiyor, doğrudan ve iddialı bir dil kullanılıyor. 0: metin orta düzeyde temkinli ifade içeriyor. 1: metin aşırı temkinli, neredeyse her cümlede ihtiyat ve koşul ifadesi var.'
    direction: lower_is_better
    unit: ''
    bands:
      - max: -0.33
        level: good
      - max: 0.33
        level: warn
      - max: 1
        level: critical
    default_confidence: 0.8
    sensitive: false
  - key: kararlilik
    label: Kararlılık Dili
    type: float
    prompt: 'PPK toplantı metnindeki kararlılık vurgusunu -1 ile 1 arasında puanla. Metinde ''kararlılıkla'', ''kararlı'', ''kesin'', ''azimle'', ''sürdürülecek'', ''devam edilecek'', ''taahhüt'', ''kararlı adımlar'' gibi kararlılık ifadelerinin sıklığını ve gücünü değerlendir. -1: metin hiç kararlılık ifadesi içermiyor, tereddütlü ve zayıf bir dil kullanılıyor. 0: metin orta düzeyde kararlılık ifadesi içeriyor. 1: metin güçlü kararlılık vurgusu yapıyor, net taahhütler ve kesin ifadeler içeriyor.'
    direction: higher_is_better
    unit: ''
    bands:
      - max: -0.33
        level: critical
      - max: 0.33
        level: warn
      - max: 1
        level: good
    default_confidence: 0.8
    sensitive: false
  - key: sikilastirma_egilimi
    label: Sıkılaştırma Eğilimi
    type: float
    prompt: 'PPK toplantı metnindeki parasal sıkılaştırma (şahin) eğilimini -1 ile 1 arasında puanla. Metinde ''sıkılaştırma'', ''sıkı para politikası'', ''faiz artırımı'', ''sıkılaştırıcı'', ''ek sıkılaştırma'', ''şahin'', ''dezenflasyon'' gibi sıkılaştırma yönlü ifadelerin sıklığını ve gücünü değerlendir. -1: metin genişleme/gevşeme yönlü ifadeler içeriyor, sıkılaştırmadan hiç bahsedilmiyor. 0: metin nötr, sıkılaştırma veya gevşeme yönünde net sinyal vermiyor. 1: metin güçlü sıkılaştırma eğilimi gösteriyor, ek sıkılaştırma sinyalleri veriyor.'
    direction: higher_is_better
    unit: ''
    bands:
      - max: -0.33
        level: critical
      - max: 0.33
        level: warn
      - max: 1
        level: good
    default_confidence: 0.8
    sensitive: false
  - key: risk_vurgusu
    label: Risk Vurgusu
    type: float
    prompt: 'PPK toplantı metnindeki risk vurgusunu -1 ile 1 arasında puanla. Metinde ''risk'', ''riskler'', ''aşağı yönlü risk'', ''yukarı yönlü risk'', ''tehdit'', ''olumsuz gelişme'', ''bozulma'' gibi risk ifadelerinin sıklığını ve gücünü değerlendir. -1: metin hiç risk ifadesi içermiyor, olumlu ve güvenli bir tablo çiziyor. 0: metin orta düzeyde risk ifadesi içeriyor, dengeli bir risk değerlendirmesi yapıyor. 1: metin yoğun risk vurgusu yapıyor, çok sayıda risk ve tehdit ifadesi içeriyor.'
    direction: lower_is_better
    unit: ''
    bands:
      - max: -0.33
        level: good
      - max: 0.33
        level: warn
      - max: 1
        level: critical
    default_confidence: 0.8
    sensitive: false
  - key: dis_etken_atfi
    label: Dış Etken Atfı
    type: float
    prompt: 'PPK toplantı metnindeki dış etkenlere atıf yapma eğilimini -1 ile 1 arasında puanla. Metinde ''küresel'', ''uluslararası'', ''jeopolitik'', ''küresel risk iştahı'', ''enerji fiyatları'', ''küresel finansal koşullar'', ''dış talep'', ''küresel belirsizlik'' gibi dış faktörlere yapılan atıfların sıklığını ve gücünü değerlendir. -1: metin hiç dış etken atfı içermiyor, tüm gelişmeleri iç dinamiklerle açıklıyor. 0: metin orta düzeyde dış etken atfı içeriyor, iç ve dış faktörleri dengeli ele alıyor. 1: metin gelişmeleri ağırlıklı olarak dış etkenlere bağlıyor, dış faktörlere yoğun atıf yapıyor.'
    direction: lower_is_better
    unit: ''
    bands:
      - max: -0.33
        level: good
      - max: 0.33
        level: warn
      - max: 1
        level: critical
    default_confidence: 0.8
    sensitive: false
  - key: somutluk
    label: Somutluk Düzeyi
    type: float
    prompt: 'PPK toplantı metninin somutluk düzeyini -1 ile 1 arasında puanla. Metinde somut rakamlar, yüzde değerleri, tarihler, spesifik politika araçları, net hedefler ve ölçülebilir ifadelerin varlığını değerlendir. -1: metin tamamen soyut ve genel ifadelerden oluşuyor, hiç somut rakam veya spesifik politika detayı içermiyor. 0: metin orta düzeyde somut, bazı rakam ve spesifik ifadeler içeriyor. 1: metin yüksek somutlukta, çok sayıda spesifik rakam, yüzde, tarih ve net politika taahhüdü içeriyor.'
    direction: higher_is_better
    unit: ''
    bands:
      - max: -0.33
        level: critical
      - max: 0.33
        level: warn
      - max: 1
        level: good
    default_confidence: 0.8
    sensitive: false
display:
  title_field: karar_no
  subtitle_field: tarih
  primary_metrics:
    - sikilastirma_egilimi
    - kararlilik
    - belirsizlik
  groups:
    - label: Ton ve Yön
      metrics:
        - kararlilik
        - temkinlilik
        - sikilastirma_egilimi
    - label: Risk ve Belirsizlik
      metrics:
        - belirsizlik
        - risk_vurgusu
        - dis_etken_atfi
    - label: İletişim Kalitesi
      metrics:
        - somutluk