--- title: CarFinanceAgent emoji: 🚗 colorFrom: blue colorTo: indigo sdk: gradio sdk_version: 5.10.0 app_file: chatbot/app.py python_version: "3.11" pinned: false --- Huggingface space : https://huggingface.co/spaces/emrecn/CarFinanceAgent # Araç Finansmanı Chatbot — Agentic Demo Bankacılık mobil uygulaması için geliştirilmiş **LangGraph tabanlı çok-ajanlı (multi-agent)** araç finansmanı ön başvuru chatbotu. Müşteri, konuşma arayüzü üzerinden yeni veya ikinci el araç finansmanı ön başvurusunu tamamen otomatik olarak tamamlayabilir; süreç boyunca SSS sorabilir, verilerini düzeltebilir ve çapraz satış teklifini kabul edebilir. --- ## İçindekiler 1. [Proje Kapsamı](#1-proje-kapsamı) 2. [İş Kuralları](#2-iş-kuralları) 3. [Agentic Workflow](#3-agentic-workflow) 4. [Agent'lar](#4-agentlar) 5. [Tool'lar (Araçlar)](#5-toollar-araçlar) 6. [Güvenlik Katmanları](#6-güvenlik-katmanları) 7. [Teknolojiler](#7-teknolojiler) 8. [Proje Yapısı](#8-proje-yapısı) 9. [İzleme Paneli](#9-i̇zleme-paneli) 10. [Kurulum ve Çalıştırma](#10-kurulum-ve-çalıştırma) 11. [Konfigürasyon](#11-konfigürasyon) 12. [Diyagramlar](#12-diyagramlar) --- ## 1. Proje Kapsamı | Kapsam İçi | Kapsam Dışı | |---|---| | Yeni araç finansman ön başvurusu | Nihai kredi onayı | | 2. el araç finansman ön başvurusu | Faiz oranı garantisi | | SSS / genel bilgi sorguları (RAG) | Ticari araç finansmanı | | HGS çapraz satış teklifi | Bireysel kredi, konut kredisi vb. | | Hedefli alan güncellemesi | Şube işlemleri | | Başvuru numarası oluşturma | Gerçek kredi skorlama | Sistem, müşteriye **adım adım rehberlik** eder. LLM her cevabı üretmez; deterministik iş kuralları önceliklidir ve LLM yalnızca niyet sınıflandırma, slot çıkarımı ile FAQ cevaplama için kullanılır. --- ## 2. İş Kuralları ### 2.1 Yeni Araç Finansmanı | Kural | Değer | |---|---| | Proforma fatura üst limiti | **7.000.000 TL** | | Maksimum finansman oranı | Fatura tutarının **%60'ı** | | Kefil zorunluluğu eşiği | Fatura **≥ 5.000.000 TL** ise kefil TCKN zorunlu | | Araç tipi kısıtı | Yalnızca **binek** araç — ticari araçlar reddedilir | | Limit aşımı davranışı | Sistem maksimum tutarı önerir, müşteriden yeni değer ister | ### 2.2 İkinci El Araç Finansmanı | Kural | Değer | |---|---| | Maksimum araç yaşı | **5 yıl** | | Maksimum finansman oranı | Kasko değerinin **%40'ı** | | Mutlak finansman üst limiti | **3.000.000 TL** | | Uygulanan limit | `min(%40 × kasko, 3.000.000 TL)` | | Satıcı TCKN | Opsiyonel (müşteri vermek istemeyebilir) | ### 2.3 Genel Kurallar - **TCKN format kontrolü** intake aşamasında regex ile yapılır: 11 hane, yalnızca rakam, sıfırla başlamaz. Mod-11 doğrulama fonksiyonu (`validate_tckn`) araç olarak kodda hazır fakat validation agent tarafından şu an çağrılmıyor. - Tüm TCKN'ler veritabanına yazılmadan önce **maskelenir** (`123****8901` formatı). - Müşteri onay ekranında her alanı **hedefli olarak değiştirebilir**; yalnızca değiştirilen alan ve ona bağımlı alanlar yeniden sorulur. - Başvuru tamamlandıktan sonra **başvuru numarası** üretilir (uuid4'ten türetilen 8 karakterlik kısa kod, örn. `A3F9C2B1`). - HGS çapraz satış yalnızca **aktif HGS'i olmayan** müşterilere sunulur. --- ## 3. Agentic Workflow Sistem **Supervisor + Specialist Agents** mimarisi üzerine inşa edilmiştir. ``` Müşteri Mesajı │ ▼ [Input Guard] ← PII maskeleme, injection tespiti │ ▼ [Supervisor] ← Niyet sınıflandırma, yönlendirme │ ┌────┴─────────────────────────────────────────┐ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ [Intake [Intake [FAQ/RAG [Submission [Cross-sell Yeni] 2.El] Agent] Agent] Agent HGS] │ │ └────┬──────┘ ▼ [Validation Agent] ← finansman limit / iş kuralı kontrolleri (deterministik) │ ▼ [Output Guard] ← PII redaction, finansal taahhüt filtresi (şu an yalnızca FAQ cevaplarında) │ ▼ Müşteri Cevabı ``` ### Paralel FAQ Akışı Müşteri herhangi bir adımda SSS sorarsa: 1. Supervisor `intent=faq` tespit eder 2. Mevcut adım bilgisi state içindeki `faq_snapshot` alanına kaydedilir (`{"step": current_step}`) 3. FAQ Agent soruyu yanıtlar 4. Oturum önceki adımdan **devam eder** — müşteri yerini kaybetmez ### Hedefli Güncelleme Akışı Onay ekranında müşteri alan değiştirmek istediğinde: 1. Anahtar kelime eşleştirmesiyle hangi alanın değiştirileceği belirlenir (deterministik — LLM değil) 2. Yalnızca o alan yeniden sorulur 3. Bağımlı alanlar bozulduysa otomatik uyarı verilir --- ## 4. Agent'lar | Agent | Sorumluluk | Agentic Desen | |---|---|---| | **Supervisor Agent** | Niyet sınıflandırma, yönlendirme | Supervisor / Router | | **Intake Agent (Yeni Araç)** | Fatura, model, finansman, kefil TCKN toplanması; araç kataloğu sorgusu (binek/ticari doğrulama) | Slot Filling + Tool Use | | **Intake Agent (2. El)** | Kasko, yaş, finansman, satıcı TCKN toplanması | Slot Filling + Tool Use | | **Validation Agent** | Finansman limit kontrolü, iş kuralı kontrolleri | Tool Use (deterministik) | | **Reflection Agent** | Onay öncesi self-check: eksik slot + çapraz kural kontrolü | Reflection (deterministik) | | **FAQ/RAG Agent** | SSS sorularını vektör DB'den yanıtlama | RAG + Tool Use | | **Submission Agent** | Onaylanan başvuruyu SQLite'a kaydetme | Tool Use + Write | | **Cross-sell Agent** | HGS durumu sorgulama ve kayıt | Tool Use (Scoped Access) | Her agent **least-privilege** prensibine göre çalışır: yalnızca ihtiyaç duyduğu tool'lara erişimi vardır. --- ## 5. Tool'lar (Araçlar) | Tool | Dosya | Açıklama | |---|---|---| | `validate_tckn` / `_mask` | `tools/tckn_tool.py` | Mod-11 doğrulama fonksiyonu (hazır, şu an çağrılmıyor) + TCKN maskeleme (`_mask` her yerde aktif) | | `lookup_vehicle` | `tools/catalog_tool.py` | Marka/model → binek/ticari sınıflandırması (JSON katalog) | | `validate_new_car_amount` / `validate_used_car_amount` | `tools/amount_tool.py` | Finansman tutarı iş kuralı doğrulaması (limit, oran, kefil eşiği) | | `calculate_max_finance_new` / `calculate_max_finance_used` | `tools/amount_tool.py` | Maksimum finansman tutarı hesaplama | | `retrieve_faq` | `tools/rag_tool.py` | ChromaDB'den semantic arama, chunk döndürme | | `write_application` | `tools/db_tool.py` | Ön başvuruyu SQLite'a kayıt | | `check_hgs_status` | `tools/hgs_tool.py` | Müşterinin aktif HGS'i var mı? (mock) | | `register_hgs` | `tools/hgs_tool.py` | HGS başvurusu kayıt (mock) | Tüm tool'lar `@tool` decorator ile tanımlıdır; ancak hangi tool'un ne zaman çağrılacağına **agent kodu deterministik olarak karar verir** — LLM tool seçmez, `bind_tools` kullanılmaz. LLM yalnızca intent sınıflandırma, slot çıkarımı ve FAQ cevaplama için kullanılır; iş mantığı tool içinde deterministik çalışır. --- ## 6. Güvenlik Katmanları Bu projede uygulanan güvenlik katmanları: | Katman | Bileşen | İşlev | |---|---|---| | **L4** | Input Guard (`guardrails/input_guard.py`) | PII maskeleme (TCKN, IBAN, kart), prompt injection tespiti, uzunluk limiti | | **L5** | Orchestrator | Least-privilege tool erişimi, deterministik kural motoru | | **L7** | Output Guard (`guardrails/output_guard.py`) | PII redaction, finansal taahhüt filtresi, FAQ kaynak zorunluluğu — *şu an yalnızca FAQ agent çıktısında çağrılıyor* | > L1 (TLS), L2 (IDP), L3 (API Gateway/WAF) bu projenin kapsam dışındaki altyapı gereksinimleridir. Tüm guard ve tool olayları **SQLite Audit Log**'a yazılır (`audit_events` tablosu, append-only); TCKN gibi hassas veriler maskelenmiş haliyle kaydedilir. --- ## 7. Teknolojiler ### Çerçeveler ve Kütüphaneler | Teknoloji | Kullanım Amacı | |---|---| | **LangGraph** | Multi-agent state machine, checkpointing, graph orchestration | | **LangChain** | Tool dekoratörü (`@tool`), mesaj formatları (Human/AI Message) | | **LiteLLM** | LLM soyutlama katmanı — GPT/Claude/Gemini'yi tek arayüzle çağırır (`llm/factory.py`) | | **Gradio** | Chatbot web arayüzü | | **OpenTelemetry** | Tracing iskeleti kodda mevcut (`observability/tracer.py`, ConsoleSpanExporter) fakat **şu an hiçbir node/agent tarafından çağrılmıyor** — aktif span üretilmiyor. Gerçek izleme SQLite audit log ile yapılıyor | ### Yapay Zeka / LLM | Teknoloji | Kullanım Amacı | |---|---| | **Gemini 2.5 Flash-Lite** (`ACTIVE_MODEL` + `ROUTER_MODEL`) | Varsayılan model — hem muhakeme/FAQ hem niyet sınıflandırma & slot çıkarımı için kullanılır | | **GPT-4o / GPT-4o-mini (OpenAI)** | Opsiyonel alternatif (`.env` ile seçilir) | | **Claude (Anthropic)** | Opsiyonel alternatif (`.env` ile seçilir) | | **Jina Embeddings v3** | FAQ chunk embedding (API tabanlı) | ### Depolama | Teknoloji | Kullanım Amacı | |---|---| | **ChromaDB** | Vektör veritabanı — FAQ RAG için semantic arama | | **SQLite** | Ön başvuru ve HGS kayıtları | | **LangGraph MemorySaver** | Oturum başına konuşma durumu (short-term memory) | ### Üretim Hedefi (Planlanan, Şu An Kodda Yok) | Teknoloji | Kullanım Amacı | |---|---| | **vLLM** | LLM inference sunucusu (Llama 3.1 8B / 70B) | | **BAAI/bge-m3** | On-prem embedding modeli | | **Qdrant** | On-prem vektör veritabanı | | **Redis** | Oturum store ve checkpointer | --- ## 8. Proje Yapısı ``` CarFinanceAgent/ └── chatbot/ ├── app.py # Gradio arayüzü — giriş noktası ├── config.py # Merkezi konfigürasyon, iş kuralları, API key'ler ├── setup.py # Kurulum scripti (DB init, FAQ indeksleme) │ ├── graph/ │ ├── state.py # ConversationState TypedDict │ ├── workflow.py # LangGraph StateGraph tanımı + compile │ ├── nodes.py # Node fonksiyonları (agent sarmalayıcı) │ └── edges.py # Koşullu yönlendirme (routing) │ ├── agents/ │ ├── supervisor.py # Niyet sınıflandırma, yönlendirme │ ├── intake_new.py # Yeni araç slot filling │ ├── intake_used.py # 2. el slot filling │ ├── faq_agent.py # RAG tabanlı SSS yanıtlama │ ├── validation_agent.py # Finansman/iş kuralı doğrulaması (deterministik) │ ├── reflection_agent.py # Onay öncesi self-check │ ├── submission_agent.py # Başvuru kayıt │ └── crosssell_agent.py # HGS çapraz satış │ ├── tools/ │ ├── tckn_tool.py # TCKN mod-11 doğrulama │ ├── catalog_tool.py # Araç kataloğu lookup (binek/ticari) │ ├── amount_tool.py # Finansman tutarı doğrulama/hesaplama │ ├── rag_tool.py # ChromaDB retrieval │ ├── db_tool.py # SQLite yazma/okuma │ └── hgs_tool.py # HGS mock servisi │ ├── guardrails/ │ ├── input_guard.py # L4: PII maskeleme, injection filtresi │ └── output_guard.py # L7: PII redaction, finansal taahhüt filtresi │ ├── memory/ │ ├── checkpointer.py # LangGraph MemorySaver konfigürasyonu │ └── vector_store.py # ChromaDB bağlantısı, indexleme, arama │ ├── llm/ │ ├── factory.py # LLM seçimi/üretimi (ACTIVE_MODEL / ROUTER_MODEL) │ ├── json_utils.py # LLM JSON çıktısı güvenli parse │ └── prompts.py # Tüm sistem prompt şablonları │ ├── observability/ │ ├── tracer.py # OpenTelemetry tracing altyapısı (ConsoleSpanExporter) │ ├── audit_logger.py # KVKK uyumlu SQLite audit log │ ├── metrics.py # SQLite'tan metrik hesaplama (latency, dönüşüm oranı vb.) │ └── dashboard.py # Gradio İzleme Paneli sekmesi │ └── data/ ├── faq.md # SSS kaynak dokümanı (Markdown) ├── vehicle_catalog.json # Araç marka/model → binek/ticari kataloğu ├── chroma/ # ChromaDB persist dizini └── applications.db # SQLite veritabanı ``` --- ## 9. İzleme Paneli Uygulama, sohbet sekmesinin yanında **📊 İzleme Paneli** sekmesi içerir. Yenile butonuna basıldığında SQLite `audit_events` tablosundan anlık veri çeker; ek bir servis gerekmez. ### Gösterilen Metrikler | Metrik | Kaynak | |---|---| | Toplam başvuru sayısı | `applications` tablosu | | HGS dönüşüm oranı (%) | `hgs_registrations / applications` | | Guard tetiklenme sayısı | `audit_events` — `event_type=guard_event` | | LLM latency p50 / p95 (ms) | Son 100 `llm_call` olayından hesaplanır | ### Denetim Olay Tablosu Son 30 audit olayı listelenir: oturum ID, saat, olay türü (`llm_call`, `tool_call`, `guard_event`, `slot_change`), agent adı ve özet. ### LLM Çağrı Tablosu Son 50 LLM çağrısı; model, latency, token sayısı, prompt ve response önizlemesiyle gösterilir. Kısmî oturum UUID'siyle filtrelenebilir. > İlgili dosyalar: `observability/dashboard.py` (Gradio sekme), `observability/metrics.py` (SQLite sorgular), `observability/audit_logger.py` (kayıt). --- ## 10. Kurulum ve Çalıştırma ### Gereksinimler - Python 3.11+ - Google API key (varsayılan Gemini modeli için) — veya OpenAI / Anthropic key (alternatif modeller) - Jina AI API key (FAQ embedding için) ### Adımlar ```bash # 1. Sanal ortam oluştur ve aktifleştir cd chatbot python -m venv .venv .venv\Scripts\activate # Windows # source .venv/bin/activate # Linux/Mac # 2. Bağımlılıkları yükle pip install -r requirements.txt # 3. Ortam değişkenlerini ayarla cp .env.example .env # .env dosyasını düzenleyip API key'leri gir # 4. İlk kurulumu çalıştır (DB init + FAQ indeksleme) python setup.py # 5. Uygulamayı başlat python app.py ``` Uygulama başladıktan sonra `http://localhost:7860` adresinde Gradio arayüzü açılır. --- ## 11. Konfigürasyon `config.py` dosyası merkezi konfigürasyon noktasıdır. Model değiştirmek için yalnızca `.env` dosyasını güncellemek yeterlidir: ```env # .env GOOGLE_API_KEY=AI... # varsayılan Gemini için OPENAI_API_KEY=sk-... # opsiyonel (GPT seçilirse) ANTHROPIC_API_KEY=sk-ant-... # opsiyonel (Claude seçilirse) JINA_API_KEY=jina_... # FAQ embedding için # Model seçimi ACTIVE_MODEL=gemini/gemini-2.5-flash-lite # veya: gpt-4o, claude-sonnet-4-6 ROUTER_MODEL=gemini/gemini-2.5-flash-lite # hızlı sınıflandırma modeli ``` ### İş Kurallarını Değiştirme Tüm eşikler `config.py`'de sabitler olarak tanımlıdır: ```python NEW_CAR_MAX_INVOICE = 7_000_000.0 # TL NEW_CAR_FINANCE_RATIO = 0.60 # %60 NEW_CAR_GUARANTOR_THRESHOLD = 5_000_000.0 USED_CAR_MAX_AGE = 5 # yıl USED_CAR_FINANCE_RATIO = 0.40 # %40 USED_CAR_MAX_FINANCE = 3_000_000.0 # TL ``` --- ## 12. Diyagramlar Detaylı sistem mimarisi, use case akışları ve güvenlik katmanı diyagramları için [chatbot/DIAGRAMS.md](chatbot/DIAGRAMS.md) dosyasına bakın. > **Not:** Diyagramlar Mermaid formatındadır. VS Code'da görüntülemek için **"Markdown Preview Mermaid Support"** uzantısını yükleyin, ardından `Ctrl+Shift+V` ile önizleyin. Alternatif olarak [mermaid.live](https://mermaid.live) sitesini kullanabilirsiniz. ### Diyagram Listesi | # | Diyagram | Açıklama | |---|---|---| | 1 | Agentic Tasarım | Agent'lar, tool'lar ve shared memory | | 2 | Ana Akış (Use Case) | Yeni araç ve 2. el dalları, SSS entegrasyonu | | 3 | Hedefli Güncelleme Akışı | Onay ekranında alan değiştirme mantığı | | 4 | Paralel FAQ Akışı | Sequence diagram — snapshot / restore döngüsü |