Yapay Zeka Ajanları

Uygulamalı Kurulum Rehberi

Yapay Zeka Müşteri Asistanı Sıfırdan Üretime

SaaS aboneliği yerine kendi yapay zeka müşteri asistanınızı 4-6 hafta içinde Claude Code ile kurun. Mimari kararlardan deploy ve izlemeye kadar, 9 aşamada uçtan uca rehber. Veriniz sizde, fiyatlandırma sizde, marka sesi sizde.

%80+
Rutin sorularda otomasyon
7/24
Kesintisiz erişim
10-15x
Eşzamanlı konuşma kapasitesi
<2 sn
Ortalama yanıt süresi

Hızlı Tanım

Yapay zeka müşteri asistanı nedir, neden kendin kurmalısın?

Modern bir yapay zeka müşteri asistanı; doğal dilde müşteriyle konuşan, sipariş/iade gibi gerçek işlemleri tool'lar üzerinden tetikleyen, şirketin kendi belgelerinden cevap üreten ve insan ekibe gerektiğinde devreden bir sistemdir. Bir kural-tabanlı chatbot'tan farkı: üretken LLM (Claude, GPT, Gemini) + RAG bilgi tabanı + tool calling + memory kombinasyonudur.

SaaS çözümleri hızlı başlar ama: aylık abonelik + mesaj başına ücret + müvekkil verisinin üçüncü tarafa gitmesi + sınırlı özelleştirme demektir. Bu rehberi takip ederseniz, aynı mimariyi kendi sunucunuzda, kendi fiyatınıza ve kendi marka sesinizle kurarsınız. 4-6 hafta sonra üretimde çalışan, ölçeklenebilir, test edilebilir bir sisteminiz olur.

Karşılaştırma

Geleneksel çağrı merkezi vs AI müşteri asistanı

Özellik
Geleneksel / Kural-tabanlı bot
AI Müşteri Asistanı
Çalışma saati
9-18, hafta içi; 7/24 için yüksek maliyet
7/24, tatil/mola yok
Yanıt hızı
Sıraya bağlı, dakikalar
Saniyeler içinde anında
Eş zamanlı görüşme
1 temsilci = 1 müşteri
Tek sistem = binlerce müşteri
Kişiselleştirme
Temsilciye bağlı, sınırlı
CRM + tool calling ile tam kişisel
Öğrenme
İnsan eğitimiyle, yavaş
Her görüşmeden öğrenir, prompt + RAG iterasyonu
Maliyet (aylık, küçük işletme)
₺40-80K (temsilci + altyapı)
₺2-8K (API + sunucu) + kuruluş
Kanal genişletme
Her kanal için ayrı ekip
Tek backend → WhatsApp + Web + Telegram + Mail

Mimari

Asistanın 8 ana parçası

Hangi araç kullanılırsa kullanılsın, sürdürülebilir bir müşteri asistanı bu 8 katmana sahiptir. Claude Code rehberi bunların hepsini sırasıyla kurar.

Channel (WhatsApp/Web)
Pre-process
AI Agent
RAG Retrieve
Tools
Memory
Handoff?
Respond
1

Kanal (Channel) Katmanı

Müşteri hangi yolla geldi: WhatsApp Business API, web widget, Telegram bot, Instagram DM veya canlı destek pencereniz. Hepsi tek bir backend webhook'una düşer.

WhatsApp Cloud API · Web Widget · Telegram · Instagram Graph API

2

Routing & Pre-processing

Gelen mesajı normalize et (audio → Whisper transcribe, image → vision tanıma), dil tespit et, mesaj burst'ünü birleştir (3 mesaj art arda → tek bağlam).

n8n · Whisper · GPT-4o Vision

3

AI Agent (Beyin)

LLM (Claude Sonnet/Haiku, GPT-4o, Gemini), system prompt, tool listesi ve memory bağlı. Mesajı anlayıp hangi tool'u çağıracağına karar veriyor.

Claude · GPT · Gemini

4

RAG Bilgi Tabanı

Ürün katalogu, iade politikası, SSS, kullanım kılavuzları — vektör DB'de saklanır. Agent gerektiğinde kaynaklı bilgi çeker.

Supabase pgvector · Pinecone · Qdrant

5

Tools (Yetenekler)

order_lookup (sipariş sorgula), ticket_create (talep aç), refund_initiate (iade başlat), agent_handoff (temsilciye devret), appointment_book (randevu).

REST API · Postgres · Slack

6

Memory & Session

Aynı müşterinin geçmiş konuşması (Postgres/Redis), kullanıcı profili (CRM'den çekilir), günlük token bütçesi.

Postgres · Redis · HubSpot

7

Handoff & Insan Onayı

Iade, şikayet, şirketsel taahhüt gerektiren konular insan onayına geçer. Slack'e onay butonlu mesaj, temsilci 'Onayla' deyince bot devam.

Slack · n8n Wait node

8

İzleme & Audit

Her görüşme Postgres'e loglanır (başarı, gecikme, token, maliyet). Haftalık 'bilmiyorum' raporu sistem iyileştirme döngüsünü besler.

Postgres · Grafana · Slack

Detaylı Rehber

Claude Code ile kurma — 9 aşamada üretim asistanı

Aşağıdaki rehber, terminalden claude komutuyla Claude Code'u açtığınız andan üretime alındığı ana kadar olan akışı uçtan uca anlatır. Her aşamada: amacı, atılacak adımları, Claude Code'a verilecek hazır prompt'u, kritik yanlış-yönlendirmeleri ve uygulanacak workflow diyagramını bulacaksınız. Sıkıştığınızda Claude Code'un kendisine "plan'ı tekrar göster" diyebilirsiniz.

0

Aşama 0Hazırlıklar — gereksinimler ve hesaplar

Amaç: Claude Code'a oturumu açmadan önce gerekli hesapları ve key'leri hazırlamak.

Adımlar

  1. Node.js 20+ ve npm kurulu, terminal erişimi var.
  2. Claude Code CLI kurulu (`npm install -g @anthropic-ai/claude-code`) ve `claude` komutu çalışıyor.
  3. Anthropic Console'da API key alındı (Claude Sonnet/Haiku için).
  4. OpenAI API key (embeddings için text-embedding-3-small — ucuz).
  5. Vektör DB seçildi: Supabase (ücretsiz başlangıç) veya Pinecone serverless.
  6. WhatsApp Business: Meta Business Manager'da doğrulanmış bir telefon numarası + Cloud API access token.
  7. Postgres veritabanı (Supabase veya self-host) — chat memory + audit log için.
  8. Boş bir git repository (örn. müsteri-asistani) — Claude Code burada çalışacak.
Tuzak

API key'leri terminale doğrudan yazmayın. Her zaman .env dosyasında saklayın ve .gitignore'a ekleyin. Aksi halde yanlışlıkla GitHub'a push edilir ve dakikalar içinde kötüye kullanılır.

1

Aşama 1Claude Code'u projeyi başlatmaya yönlendir

Amaç: Claude Code'la oturum açıp proje iskeletini, klasör yapısını ve temel bağımlılıkları kurdurmak.

Adımlar

  1. Terminal'de proje klasörüne girin: `cd musteri-asistani`
  2. `claude` komutuyla Claude Code'u başlatın.
  3. Aşağıdaki başlangıç prompt'unu yapıştırın — Claude Code önce plan yapacak, sonra onayınızla kodu üretecek.
  4. Her büyük adımdan sonra `git add . && git commit` çalıştırın; bir şey ters giderse geri dönebilirsiniz.
  5. Üretilen .env.example dosyasını .env'e kopyalayın ve key'lerinizi doldurun.

Claude Code'a ver

Prompt
Sen müşteri hizmetleri için yapay zeka asistanı kuran bir kıdemli geliştirici/mimarsın.

Bağlam:
- Müşteri tabanı: [şirketin adı + sektör] — örn. "Pamuk Tekstil, B2C online satış"
- Kanal öncelikleri: 1) WhatsApp Cloud API 2) Web widget 3) ileride Telegram
- LLM: Anthropic Claude Sonnet (ana akıl), Haiku (sınıflandırma)
- Vektör DB: Supabase pgvector (başlangıç)
- Veritabanı: Postgres (Supabase)
- Deploy hedefi: n8n + Docker Compose (kendi sunucumuz)

Görevin:
1. Önce yüksek seviyeli mimari (ASCII diyagram + 5-7 cümle açıklama) çiz.
2. Proje klasör yapısını öner: /src, /agents, /tools, /channels, /rag, /db, /tests, infrastructure/ — neden böyle bölündüğünü kısaca açıkla.
3. package.json ve temel bağımlılıkları öner (Anthropic SDK, OpenAI SDK, supabase-js, express veya fastify, dotenv, zod, pino).
4. .env.example üret (ANTHROPIC_API_KEY, OPENAI_API_KEY, SUPABASE_URL, SUPABASE_KEY, WHATSAPP_TOKEN, DATABASE_URL, ENCRYPTION_KEY).
5. TypeScript + ESLint + Prettier kurulumu öner.
6. /healthz endpoint'i olan minimal bir HTTP server kur.
7. README'ye 'nasıl başlanır' yaz.

Önce planı tek mesajda göster. Onayımdan sonra kodu adım adım üret; her dosyayı oluşturduğunda hangi dosya olduğunu belirt.
Tuzak

Claude Code'a baştan 'tek seferde her şeyi yap' demeyin. Aşama aşama ilerleyin: önce mimari + iskelet, sonra her aşama için ayrı prompt. Aksi halde 30+ dosya bir kerede üretilir, sonra hata ayıklayamazsınız.

2

Aşama 2RAG bilgi tabanı — şirket bilgisini agent'a vermek

Amaç: Şirketinizin SSS, ürün katalogu, iade politikası, kullanım kılavuzu gibi belgelerini parçalayıp embedding'leyip Supabase'e yükleyen bir 'ingestion' workflow'u kurmak.

Adımlar

  1. Şirket içi belgeleri /data klasörüne PDF/Markdown olarak koyun (örn. iade-politikasi.md, urun-katalogu.json, sss.md).
  2. Claude Code'a aşağıdaki prompt'u verin — ingestion script + Postgres migration üretsin.
  3. `npm run ingest` komutuyla belgeleri vektör DB'ye yükleyin.
  4. Vektör DB'de 'iade hakkı kaç gündür?' gibi sorularla test edin (kosinüs benzerlik ≥ 0.75 = işe yarar).
  5. Belge değişince ingestion'ı yeniden çalıştırın — content hash sayesinde sadece değişen chunk'lar yüklenecek.

Workflow görünümü

/data PDF/MD
Text Splitter
OpenAI Embeddings
Dedup (hash)
Supabase pgvector INSERT

Claude Code'a ver

Prompt
Şu anda /data klasöründe şirketin bilgi dokümanları var (PDF, MD, JSON).

Görev: /src/rag/ingest.ts dosyasını üret.

İstekler:
1. Dokümanları oku (pdf-parse, fs.readFile).
2. Text Splitter: chunk_size=1000 token, overlap=150 token (LangChain RecursiveCharacterTextSplitter).
3. Her chunk için OpenAI text-embedding-3-small ile embedding üret.
4. Supabase 'documents' tablosuna yaz: { id, source, chunk_index, content, embedding (vector(1536)), content_hash, updated_at }.
5. Aynı (source, chunk_index, content_hash) varsa atla — dedup.
6. Batch insert: 100 chunk'ı tek INSERT'te yaz.
7. Sonunda özet: yüklenen chunk sayısı + toplam token + tahmini maliyet.
8. CLI: 'npm run ingest -- --source iade-politikasi.md' belirli dosyayı, parametresizse tümünü işle.

Supabase migration da üret: documents tablosu + IVFFLAT index (lists=100) + permission_level alanı (public/internal/admin).

Önce planı göster.
Tuzak

Embedding modelini sonradan değiştirmek isterseniz (text-embedding-3-small → large) tüm chunk'ları yeniden embedding'lemek zorunda kalırsınız. Başlangıçta 'small' ile yola çıkıp gerçekten gerekirse upgrade edin.

3

Aşama 3AI Agent + System Prompt — asistanın kimliği

Amaç: Müşteriyle konuşacak ana agent fonksiyonunu yazıp marka sesinde sınırlarını çizmek.

Adımlar

  1. System prompt 4 ana bloktan oluşmalı: Rol, Kapsam, Format, Sınırlar.
  2. Claude Code'a aşağıdaki prompt ile /src/agents/customerAgent.ts dosyasını ürettirin.
  3. Test mesajlarıyla ('iade hakkım kaç gün?', 'siparişim nerede?', 'fiyat indirelim mi?') agent davranışını doğrulayın.
  4. Beklenmedik cevaplar görürseniz system prompt'a kısıtlama ekleyin ('Asla fiyat sözü verme', 'Kaynakta yoksa bilmiyorum de').

Workflow görünümü

Webhook
Memory (last 10)
Vector Retrieve (top_k=5)
Claude Sonnet
Postgres Log
Respond

Claude Code'a ver

Prompt
/src/agents/customerAgent.ts dosyasını üret.

İçindeki fonksiyon: async function customerAgent({ userMessage, userId, channel }): Promise<AgentResponse>

İçeride:
1. Postgres'ten son 10 mesajı çek (memory).
2. Vector store'dan userMessage için top_k=5 chunk retrieve et.
3. Anthropic Messages API'ye gönder: model='claude-sonnet-4-5', max_tokens=1024.
4. System prompt'u şu 4 bloklu şablonla kur:

  [ROL]
  Sen [ŞİRKET_ADI]'nin müşteri hizmetleri asistanısın. Markamızın sesi: profesyonel, sıcak, kısa ve uygulanabilir.

  [KAPSAM]
  Yalnızca aşağıdaki konularda yanıt verirsin:
  - Sipariş takibi ve kargo durumu
  - İade ve değişim talepleri
  - Ürün katalogu ve fiyat bilgisi
  - Kullanım kılavuzu ve SSS
  - Randevu / rezervasyon
  Bu konuların DIŞINDA gelen sorulara nazikçe yön ver ('Bu konuda size [insan ekibimiz] yardımcı olabilir').

  [FORMAT]
  - Kısa paragraflar, gerekirse madde işareti.
  - Her cevabın sonunda 1 'sonraki adım' öner.
  - Türkçe, samimi ama formal değil ('siz' kullan).

  [SINIRLAR]
  - Kaynakta (context) olmayan bilgiye 'Bu konuda dokümanlarımda bilgi yok, ekibimize bağlayayım mı?' de.
  - İade kararı, fiyat indirimi, hediye paketleme gibi kararlar agent_handoff tool'unu çağır.
  - Asla kişisel veriyi (TC, kart no) sorma.
  - Halüsinasyon yapma; emin değilsen sor veya bilmediğini söyle.

  [KAYNAK BİLGİ]
  ${retrievedChunks.join("\n---\n")}

5. Cevabı döndür + Postgres 'messages' tablosuna user + assistant kayıt at.
6. Hata olursa pino logger'a yaz, kullanıcıya 'bir saniye, tekrar denemeniz gerekebilir' dön.

Zod ile AgentResponse şeması: { reply, sources[], should_handoff, confidence }.

Önce plan, sonra kod.
Tuzak

System prompt'u 'sıkı' tutun. 'Yardımcı ol' gibi soyut talimatlar yerine, ne yapacağını VE ne yapmayacağını net yazın. Vagus prompt = halüsinasyon + müşteri şikayeti.

4

Aşama 4Tools — agent'a iş yaptırma yeteneği

Amaç: order_lookup, ticket_create, refund_initiate, agent_handoff gibi gerçek iş yapabilecek tool'ları tanımlamak.

Adımlar

  1. Her tool için açık bir 'name + description + JSON schema' tanımı yapın.
  2. Tool implementasyonu ayrı fonksiyonlar olsun (/src/tools/*.ts).
  3. Claude Code'a aşağıdaki prompt ile 4 ana tool'u ürettirin.
  4. Test: agent'a 'siparişim 1234 nerede?' yazın; order_lookup çağrılmalı.
  5. Tool çağrısı başarısızsa agent'a yapılandırılmış hata göndererek 'müşteriye dürüst ol' davranışını sağlayın.

Claude Code'a ver

Prompt
/src/tools/ klasöründe 4 tool dosyası üret. Hepsi Anthropic Tool Use formatında.

1. order_lookup.ts
   - input: { order_id: string }
   - DB'den siparişi getir, durumu döndür (placed/shipped/delivered/cancelled + tracking_no).
   - Bulunamazsa { error: "not_found" } dön.

2. ticket_create.ts
   - input: { topic: enum, summary: string, priority: "low"|"medium"|"high" }
   - 'tickets' tablosuna kayıt at, Slack'e bildirim gönder (#support channel).
   - id ve eta dön.

3. refund_initiate.ts
   - input: { order_id, reason: string }
   - DB'de "iade_taleplerinde" hak süresi (14 gün) kontrolü yap.
   - Sürede ise: status='pending_approval', Slack'e 'Onayla/Reddet' butonlu bildirim gönder.
   - Süre dışıysa: hatayı agent'a dön ('14 günlük iade süresi geçmiş — müvekkilimize bağlı').

4. agent_handoff.ts
   - input: { reason: string, conversation_summary: string }
   - Slack'e canlı temsilciye bildirim gönder, konuşma id'sini eşle.
   - 'paused: true' işaretle — bot artık yanıt vermez, temsilci alır.

Her tool için Anthropic Messages tool tanımı (name, description, input_schema) /src/agents/toolRegistry.ts'de toplansın. customerAgent her cevap turunda tool_use bloğu görürse uygun tool'u çağırıp sonucu agent'a geri ver, agent nihai cevabı üretsin (multi-turn).

Önce plan.
Tuzak

Tool description'ı belirsiz yazarsanız agent yanlış tool seçer veya gerekmedikçe çağırır. Her tool için: 'NE ZAMAN çağrılır + NE ZAMAN çağrılmaz' örnekleri ekleyin.

5

Aşama 5Memory + Session — konuşma sürekliliği

Amaç: Aynı müşterinin geçmiş mesajlarını hatırlamak; kullanıcı başına token + maliyet bütçesi tutmak.

Adımlar

  1. Postgres 'messages' tablosu: id, session_id, user_id, role, content, tokens, created_at.
  2. Session ID = WhatsApp phone number veya web widget cookie hash'i.
  3. Claude Code'a kullanıcı başına günlük token sayacı yazdırın — eşik aşılırsa 'sistem yoğun' dönsün.
  4. Eski mesajları otomatik özetletip (Haiku ile) bağlam penceresini şişirmemeyi sağlayın.

Claude Code'a ver

Prompt
Postgres'te 'sessions' ve 'messages' tabloları için migration üret.

sessions: id (uuid), channel (text), external_id (text, WhatsApp phone veya web cookie), user_profile (jsonb), daily_token_used (int), daily_token_reset_at (timestamp), created_at.

messages: id, session_id (fk), role ('user'|'assistant'|'tool'), content (text), tool_calls (jsonb), tokens (int), created_at.

/src/db/sessionStore.ts:
- getOrCreateSession(channel, externalId)
- appendMessage(sessionId, role, content, tokens)
- getRecentMessages(sessionId, limit=10)
- checkDailyBudget(sessionId, limit=10000): boolean
- summarizeOldMessages(sessionId): mesaj sayısı 50'yi aştıysa Claude Haiku ile özetle, eskisini sil

customerAgent'a bağla: her çağrıdan önce checkDailyBudget, false ise 'Bugünkü ücretsiz konuşma hakkın doldu, yarın görüşmek üzere' dön.

Önce plan.
Tuzak

Session ID'yi yanlış belirlerseniz iki müşterinin konuşması karışır. WhatsApp'ta phone number kullanın; web widget'ta cookie + IP combo değil, kalıcı bir cookie hash kullanın.

6

Aşama 6Multi-channel adapter — WhatsApp + Web Widget + Telegram

Amaç: Aynı agent'ı 3 farklı kanaldan tetiklemek; her kanal için ayrı webhook + ortak agent fonksiyonu.

Adımlar

  1. Her kanal için /src/channels/ altında ayrı dosya (whatsapp.ts, webWidget.ts, telegram.ts).
  2. Her adapter: gelen payload'ı normalize et → customerAgent çağır → kanala özgü formatta yanıt dön.
  3. Web widget için /public/widget.js — sitenize embed edilebilen küçük JS dosyası.
  4. WhatsApp HMAC imza doğrulama unutulmasın (Meta App Secret).
  5. Telegram için bot token + chat.id kullanılır.

Workflow görünümü

WhatsApp/Web/Telegram
Verify + Rate limit
Burst buffer (5s)
customerAgent
Channel-specific Response

Claude Code'a ver

Prompt
/src/channels/ altında 3 adapter dosyası üret.

1. whatsapp.ts (Express/Fastify route POST /webhook/whatsapp)
   - Meta webhook verify token kontrolü (GET).
   - HMAC SHA-256 imza doğrula (X-Hub-Signature-256 header'ı).
   - Audio mesajsa Whisper transcribe, image ise GPT-4o Vision tanıma.
   - customerAgent çağır.
   - Response'u WhatsApp Cloud API'ye POST et (messages endpoint).
   - 24 saat penceresi: müşteri son 24 saatte yazmadıysa template mesajı zorunlu.

2. webWidget.ts (POST /widget/chat)
   - CORS doğru ayarlı; sadece izinli domain'lerden kabul et.
   - Rate limit: IP başına dakikada 20 istek (Redis sayacı).
   - customerAgent çağır, JSON dön.

3. telegram.ts (POST /webhook/telegram)
   - Telegram bot secret token kontrolü.
   - chat.id ile sessionStore.getOrCreateSession.
   - customerAgent çağır, sendMessage API ile yanıt.

Tüm webhook'lar 'message_burst_buffer': aynı session'dan 5 saniye içinde gelen mesajları birleştir, sonra agent'a tek seferde ver (Redis ile timer + debounce).

/public/widget.js: 200 satırlık vanilla JS — site sahibi <script src="https://yourdomain.com/widget.js" data-key="xxx"></script> ekler, sağ alt köşede chat penceresi açılır, /widget/chat'e konuşur.

Önce plan.
Tuzak

Webhook verify token'ı public'te bırakmayın. Her kanalın HMAC veya bot secret token doğrulamasını mutlaka yapın — aksi halde sahte istekler dakikada $100'lerce OpenAI fatura yer.

7

Aşama 7Test, staging ve canlıya alma

Amaç: Production'a çıkmadan önce 3 aşamalı test: birim → senaryo → beta kullanıcı.

Adımlar

  1. Birim testler (/tests/): order_lookup, refund_initiate, sessionStore — mock DB ile.
  2. Senaryo testleri: 20-30 farklı müşteri sorusu için beklenen davranış (vitest + snapshot).
  3. Staging: ayrı bir Supabase projesi + test telefon numarası + sandbox API key'ler.
  4. Beta: 5-10 dost müşteriye 1 hafta — 'bilmiyorum' dediği soruları logla, system prompt ve RAG belgelerini iyileştir (2-3 iterasyon).
  5. Soft launch: müşterilerin %10'una, sonra %50, sonra %100.

Claude Code'a ver

Prompt
/tests/ altında 3 dosya üret:

1. agent.test.ts — vitest ile customerAgent test:
   - Mock Anthropic SDK + sahte vector store.
   - 5 senaryo: 'iade nasıl?', 'siparişim 1234 nerede?', 'fiyat indirelim', 'silahları kontrol et' (off-topic), 'TC'min yaz' (PII testi).
   - Her senaryoda beklenen: doğru tool çağrısı veya doğru reddetme cevabı.

2. tools.test.ts — order_lookup, refund_initiate:
   - In-memory SQLite ile DB mock.
   - 14 gün geçmiş iade → hata; sürede iade → pending_approval.

3. integration.test.ts — webhook → agent → response:
   - Supertest ile /webhook/whatsapp endpoint'i test.
   - HMAC imza doğru/yanlış senaryoları.

Ayrıca scripts/eval.ts: 30 satırlık eval seti (questions.jsonl) okuyup her birini agent'a verip, beklenen tool veya cevap eşleşmesini ölçen bir rapor üret (success_rate, avg_latency, total_token).

Önce plan.
Tuzak

Eval setini bir kez yazıp unutmayın. Her büyük system prompt değişikliğinden sonra eval'i çalıştırın — regresyon olmadığından emin olun. 'Bir yer düzelttim, başka bir yer bozuldu' AI projelerinin standart sorunudur.

8

Aşama 8Production deploy — Docker Compose + Caddy + Postgres

Amaç: VPS'e Docker Compose ile asistanı, Postgres'i, n8n'i (yedek otomasyonlar için) ve Caddy reverse proxy'i kurmak.

Adımlar

  1. infrastructure/docker-compose.yml: app, postgres, n8n, caddy.
  2. Caddyfile: chat.yourdomain.com → app:3000 ve n8n.yourdomain.com → n8n:5678 (HTTPS Let's Encrypt otomatik).
  3. GitHub Actions: main'e push'ta build → SSH ile sunucuya deploy.
  4. Sağlık kontrolü: /healthz endpoint'i Uptime Kuma ile her dakika ping.
  5. n8n'i 'fallback otomasyonlar' (yorum cevaplama, lead routing) için hazır tut — Bölüm 14'teki projeleri buraya ekleyebilirsin.

Workflow görünümü

GitHub push
Actions build
SSH deploy
docker compose up -d
{ }Caddy HTTPS
app + postgres + redis + n8n

Claude Code'a ver

Prompt
infrastructure/docker-compose.yml üret. Servisler:

- app: bizim Node.js servisimiz (custom Dockerfile, port 3000 internal).
- postgres: postgres:16, volume mount /var/lib/postgresql/data, healthcheck.
- redis: redis:7-alpine (rate limit + session burst için).
- n8n: docker.n8n.io/n8nio/n8n, depends_on postgres+redis, ortam değişkenleriyle queue mode aktif.
- caddy: caddy:2-alpine, Caddyfile mount, 80+443 expose, auto HTTPS.

infrastructure/Caddyfile:
chat.example.com { reverse_proxy app:3000 }
n8n.example.com { reverse_proxy n8n:5678 }

infrastructure/Dockerfile (app için): Node 20 Alpine, multistage build, prod deps only, non-root user, healthcheck CMD.

.github/workflows/deploy.yml: main push → docker build → ssh deploy.example.com 'cd /opt/asistan && git pull && docker compose pull && docker compose up -d --build app'.

scripts/backup.sh: günlük pg_dump → Backblaze B2'ye yükle, 30 günü geçenleri sil.

Önce plan.
Tuzak

Docker image tag'i 'latest' KULLANMAYIN. Sabit sürüm pin (örn. node:20.11.0-alpine, postgres:16.4) — aksi halde bir gece kendiliğinden upgrade olur ve sabah çalışmıyor olur.

9

Aşama 9İzleme + iyileştirme döngüsü — sürdürülebilirlik

Amaç: Asistanı 'kur ve unut' yapmamak; haftalık ritim ile sürekli iyileşmesini sağlamak.

Adımlar

  1. Dashboard: günlük konuşma sayısı, başarı oranı, ortalama gecikme, toplam token harcaması, en sık tetiklenen tool.
  2. Haftalık 'bilmiyorum' raporu: agent'ın hangi sorulara cevap veremediğini sıralı liste.
  3. Aylık model A/B testi: yeni Claude/GPT versiyonu çıktığında 1 hafta paralel çalıştırıp metrikleri karşılaştır.
  4. Üç ayda bir güvenlik denetimi: webhook secret rotasyonu, PII kontrol, KVKK uyum yenileme.
  5. Müşteri geri bildirimi: her görüşme sonunda '1-5 yıldız' iste, düşük puanlı konuşmaları manuel incele.

Claude Code'a ver

Prompt
/src/dashboard/metrics.ts üret.

Postgres'ten şu sorgu fonksiyonlarını yaz:
- conversationsByDay(days=30)
- successRate(): cevap verilen / toplam
- avgLatencyMs()
- tokenUsageByDay()
- topUnansweredQuestions(limit=20) — 'sources_used = 0' veya 'should_handoff = true' olanları grupla
- topToolsCalled()

/src/dashboard/page.tsx (Next.js): basic auth korumalı bir dashboard sayfası, 6 metrik kartı + 'son 20 başarısız konuşma' tablosu.

scripts/weekly-report.ts: pazartesi 09:00'da Postgres'i sorgulayıp Slack #ops kanalına özet gönderen cron job.

Önce plan.
Tuzak

Müşteri 'bilmiyorum' aldığında o soruyu KAYDETMEK kritik. Aksi halde sistem hangi soruları cevaplayamadığını sen göremezsin ve iyileştiremezsin. Audit log'a 'unanswered' flag eklemeyi unutmayın.

Alternatif Yollar

Claude Code dışında kurma yöntemleri

Her ekibe Claude Code uygun değil. İşte 4 popüler alternatif ve hangi durumda mantıklı.

ChatGPT (web) + Custom GPT

Kod yazmadan başlangıç prototipi

Sınırlı bütçe, küçük işletme, sadece web sohbeti, üretim gerekliliği orta. Custom GPT'ye knowledge upload + system instructions yazıp ChatGPT'nin paylaşılabilir linkini kullanırsınız.

Claude.ai (web) + Projects

Karmaşık belge analizi gerektiren danışmanlık

Uzun belgeler (sözleşme, mevzuat), titiz yazım, atıf gereken işler. Claude.ai'da bir Project oluşturup belgeleri Knowledge'a yükleyin; ekibin tarayıcıdan kullanması yeterli.

n8n + AI Agent node

Görsel akış kurmak isteyenlere

Kod yazmayı sevmiyorsanız veya backend ekibi yoksa. n8n'de Webhook → AI Agent → Vector Store → WhatsApp adımlarını sürükle-bırak kurarsınız. n8n öğrenme yolumuzda Bölüm 14'te uçtan uca bu proje var.

Claude Code (önerimiz)

Üretim kalitesi + tam kontrol

Veriniz size kalsın, ölçeklensin, test edilebilir olsun istiyorsanız. Bu rehberin tamamı bu yolu anlatıyor.

Güvenlik ve KVKK

Üretim öncesi 10 maddelik güvenlik checklist

Hepsi yeşil olmadan asistanı canlıya almayın. Bir tanesinin eksikliği bile gerçek dünya saldırı veya KVKK ihlali demektir.

  • 1Tüm webhook'larda HMAC veya bearer token doğrulama var mı?
  • 2API key'ler .env'de, .gitignore'a eklenmiş mi? Repository public ise asla git'te değil mi?
  • 3Kullanıcıdan TC kimlik, kart numarası, parola istemeyecek şekilde system prompt'ta yasak var mı?
  • 4PII (e-posta, telefon) loglara ham yazılmıyor; maskelenip yazılıyor mu?
  • 5KVKK aydınlatma metni chat penceresinin altında veya ilk mesajda görünür mü?
  • 6Veri sahibi haklarına (silme, taşıma) yanıt verecek bir 'sessions/:id/delete' endpoint'i var mı?
  • 7Production veritabanı yedeği günlük + offsite (S3/Backblaze) alınıyor mu?
  • 8ENCRYPTION_KEY ayrı bir yerde yedekli mi (parola yöneticisi + offline)?
  • 9Rate limit: IP ve session başına dakika/gün kotaları aktif mi?
  • 10Kill switch: tek bir env değişkeniyle tüm AI çağrılarını durdurabiliyor musunuz?

Sıkça sorulan sorular

Hazır SaaS'lar varken neden kendim kurayım?

Üç ana sebep: (1) Maliyet — SaaS'lar mesaj başına ücret alır, ölçek büyüdükçe kendinizi kurmak 5-10x ucuzlar. (2) Veri sahipliği — müvekkil/müşteri verisi kendi sunucunuzda kalır, KVKK uyumu çok daha kolay olur. (3) Esneklik — kendi sektörünüze, marka sesinize, tool'larınıza birebir uyarlama yaparsınız. Hızlı bir prototip için SaaS başlangıç olabilir; üretimde kendi mimarinizi kurmanız neredeyse her zaman daha sürdürülebilir.

Kurma süresi ne kadar?

Claude Code ile bu rehbere göre: ilk MVP (RAG + agent + web widget) 1-2 hafta. WhatsApp + tools eklemek 1 hafta daha. Test + beta süreci 2-3 hafta. Toplam 4-6 hafta üretime hazır asistan. Mevcut ekip 1 backend geliştirici varsayımıyla. SaaS'lardaki '5 dakikada kur' iddiası gerçekçi değildir; kuruluş hızlı, gerçekten işe yaramasını sağlamak süreç ister.

Aylık maliyeti ne kadar olur?

Küçük işletme (günlük 200 konuşma): VPS ~₺250, Anthropic API ~₺1.500-3.000, OpenAI embeddings ~₺50, Supabase ~₺0-200, WhatsApp Business ~₺0 (1000 mesaj/ay ücretsiz). Toplam ~₺2.000-4.000/ay. Orta işletme (günlük 2.000 konuşma): ~₺8.000-15.000/ay. Aynı işi insan ekibi yapsaydı temsilci başına aylık ₺25-40K + altyapı.

Halüsinasyon riskini nasıl azaltırız?

Üç katmanlı savunma: (1) System prompt'ta 'sadece kaynak bilgiye dayan, yoksa bilmiyorum de' kuralı zorunlu. (2) Structured output ile { reply, sources[], confidence } şeması — model kaynak olmadan cevap veremez. (3) confidence < 0.7 ise otomatik handoff. Bu üçü uygulanırsa pratik halüsinasyon oranı %1 altına iner.

KVKK + GDPR için ne yapmalıyım?

Minimum: (1) Chat penceresinde aydınlatma metni görünür. (2) İlk mesajda 'AI asistanı ile konuşuyorsunuz; hizmet kalitesi için kayıt tutulur' bilgisi. (3) Veri minimizasyonu: TC, kart numarası asla soruluyor olmasın. (4) Silme hakkı: 'verilerimi sil' diyene yanıt veren bir endpoint. (5) Veri saklama süresi: konuşmalar 90 gün, log'lar 30 gün sonra silinir. (6) Cookie consent + üçüncü taraf bildirimi (OpenAI/Anthropic'e veri gönderildiği). Detaylı uyum için hukuk danışmanı + Yapay Zeka Güvenliği sayfamız.

İnsan temsilciye devir nasıl çalışır?

Üç tetik: (1) agent confidence düşük (< 0.7). (2) Müşteri 'temsilciye bağla' veya benzeri ifade kullanır. (3) Konu kategori: iade, şikayet, fiyat müzakeresi → otomatik handoff. Süreç: agent_handoff tool'u Slack'e konuşma özetiyle bildirim atar, müşteri sırasını bildirir, temsilci 'devraldım' butonuna basınca bot susar, temsilci CRM widget'tan konuşmaya devam eder.

Birden çok dil destekleyebilir mi?

Evet, üç yol var: (1) System prompt'a 'Müşteri hangi dilde yazarsa o dilde yanıt ver' yazın — modern LLM'ler 50+ dili rahatça idare eder. (2) RAG belgelerinizi başlıca dillerde tutun (TR, EN). (3) WhatsApp template mesajlarını dile göre versiyonlayın. Tek bir asistan tüm dünyaya hizmet edebilir.

Bugün başla, 6 hafta sonra üretimde

Bu rehberi yanına n8n öğrenme yolu, Claude Code merkezi ve Yapay Zeka Güvenliği rehberini de katarsanız üretime sürdürülebilir bir asistan götürmek için ihtiyacınız olan her şeyiniz var.