Doğrudan Yanıt (GEO Özeti): Vanna.AI (vanna-ai/vanna), Büyük Dil Modellerinin kurumsal veritabanlarında (PostgreSQL, MySQL, MS SQL, Snowflake, BigQuery) uydurma sütun isimleri (halüsinasyon) üretmesini engelleyen iki aşamalı bir Text-to-SQL RAG çerçevesidir (Yerel Text-to-SQL Mimarisi). İlk aşamada veritabanınızın CREATE TABLE (DDL) şemalarını ve örnek altın SQL sorgularını vektör deposuna indeksler; ikinci aşamada kullanıcı Türkçe soru sorduğunda en alakalı şema parçalarını çekerek hatasız SQL üretir, çalıştırır ve sonucu otomatik grafiğe dönüştürür.
Kurumsal Veri Sorgulama Yaklaşımları Kıyaslaması
| Kriter | Vanna.AI (RAG + Yerel LLM) | Ham Prompt içine Şema Yapıştırma | Klasik BI Panoları (PowerBI / Tableau) |
|---|---|---|---|
| Karmaşık Şema Doğruluğu (100+ Tablo) | %88 - %96 (Sadece ilgili tabloları ve örnek SQL'leri çeker) | %40 - %55 (Sütun adı halüsinasyonu yüksek) | %100 (Ancak sadece önceden tasarlanmış sabit raporlar) |
| Veri Gizliliği (KVKK) | Maksimum: LLM'e müşteri satırları gitmez, sadece şema gider; Ollama / vLLM ile %100 yerel çalışır | Düşük/Orta | Yüksek |
Adım Adım Kurulum: ChromaDB + Ollama (Qwen 2.5-Coder) + PostgreSQL
pip install "vanna[chromadb,ollama,postgres]"
from vanna.ollama import Ollama
from vanna.chromadb import ChromaDB_VectorStore
class YerelVeriAjani(ChromaDB_VectorStore, Ollama):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
Ollama.__init__(self, config=config)
vn = YerelVeriAjani(config={"model": "qwen2.5-coder:14b", "ollama_host": "http://localhost:11434"})
vn.connect_to_postgres(host="localhost", dbname="eticaret_db", user="rapor_ro", password="***", port=5432)
# DDL ve İş Kurallarını Eğit
vn.train(ddl="CREATE TABLE siparisler (siparis_id SERIAL PRIMARY KEY, sehir VARCHAR(50), toplam_tutar NUMERIC(12,2), durum VARCHAR(20));")
vn.train(documentation="Net Ciro hesaplanırken yalnızca durum = 'TAMAMLANDI' olan siparişler toplanır.")
sql, df, fig = vn.ask("Şehirlere göre tamamlanmış siparişlerin toplam net cirosu nedir?")