CarFinanceAgent / README.md
emreceniklioglu
Remove unused fastapi/uvicorn deps and minor fixes
39171a4
|
Raw
History Blame Contribute Delete
16.6 kB
---
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ü |