Veri Analizinde Yenilik: Metinden SQL’e
Doğal dil girdilerinden gelen yavaş ve verimsiz sorgu üretimi, karar alma süreçlerinde dar boğaz yaratmaktadır. Bu durum, analistleri ve iş kullanıcılarını veri ekiplerine bağımlı hale getirerek, içgörüleri geciktirmekte ve çevikliği sınırlamaktadır.
Metinden SQL’e (Text-to-SQL) dönüşüm, veri ile etkileşim şeklimizi değiştirerek, kullanıcıların yapılandırılmış veritabanlarını doğal dil ile sorgulamasını sağlamaktadır. Özellikle belirli sektörler için uygulanan alan spesifik modeller bu konuda büyük kolaylıklar sunmaktadır. Ancak, bu modellerle yapılan çıkarımlarda, analitik yükler için ölçeklenebilir performans ve gecikme gibi zorluklar ortaya çıkmaktadır.
NVIDIA NIM ile Vanna’nın Metinden SQL’e Çözümünü Optimize Edin
Bu eğitimde, Vanna’nın tekstten SQL’e çözümü üzerinde NVIDIA NIM ile nasıl optimizasyon yapacağınızı göstereceğiz. NVIDIA NIM, üretken AI modelleri için optimize edilmiş uç noktalar sağlayan hızlandırılmış çıkarım mikro hizmetleridir. Vanna’nın açık kaynak kodlu tekstten SQL’e çözümü, esnekliği, güvenliği ve adaptasyon kabiliyeti nedeniyle organizasyonlar arasında ilgi görmektedir.
Bu eğitim ile şunları öğreneceksiniz:
- Önceden işlenmiş verileri bir veritabanına ekleyip Vanna ile bağlantı kurun.
- Vanna’yı iş terimleri veya tanımlarıyla eğitin.
- NVIDIA NeMo Retriever gömme modelini SQL üretimi için bağlam elde etmede kullanın.
- Hızlandırılmış çıkarım için NVIDIA NIM LLM uç noktalarını kullanın.
Demonstrasyon için, Kaggle’dan alınan iki açık kaynak Steam oyunu veri seti kullanılacaktır. Bu, analitik sorgular için zengin bir oyun meta verisi setidir.
Gereksinimler
- Python 3.10 veya üzeri bir sürümün yüklü olması.
- LangChain paketi – NVIDIA destekli.
- Bir NVIDIA NIM uç noktasına erişim.
- SQLite Vanna kütüphanesinin yüklü olması.
- Steam veri setleri:
Uygulama Adımları
1. Steam veri setini indirin ve işleyin
Devam etmek için, /NVIDIA/GenerativeAIExamples dizininden gerekli dosyaları klonlayın ve topluluğa ait Vanna ile NVIDIA defterini açın.
Bu eğitimdeki ön işleme adımları, Kaggle notu‘ndan uyarlanmıştır ve Vanna ile NVIDIA defterinin ‘Veri Hazırlama’ bölümünde bulunabilir.
Anahtar ön işleme adımları şunlardır:
- Gerekli sütunları filtreleme.
- Aralık verilerini ayrı sütunlara ayırma.
- Her oyun başlığına oyun süresini ekleme.
Ön işleme adımlarını tamamladıktan sonra üç CSV dosyası elde ederiz:
tableau_games.csv
tableau_categories.csv
tableau_tags.csv
2. NVIDIA NIM ve NeMo Retriever ile Vanna’yı başlatın
Bir Vanna örneği oluşturmak için, bir vektör veritabanına, bir yerleştiriciye ve LLM uç noktasına ihtiyaç vardır. Milvus vektör veritabanı GPU hızlandırma yetenekleri sunmakta ve NVIDIA gömme modeli (llama-3.2-nv-embedqa-1b-v2) kullanmaktadır. Ayrıca, Llama 3.1 70BNIM mikro hizmetini de kapsamaktadır.
NVIDIA NIM mikro hizmetleri ile çıkarım modeliniz, NVIDIA hızlandırmalı altyapıda çalışarak daha hızlı yanıt süreleri ve üretim uygulamaları için maliyet etkinliği sağlamaktadır. NVIDIA NIM, NVIDIA AI Enterprise yazılım lisansı ile birlikte sunulmakta ve her yere kurulum yapabilmektedir.
NIM uç noktaları için kurulum talimatlarına NVIDIA belgelerinden ulaşabilirsiniz.

Sonraki metinde, NVIDIA hızlandırmalı bileşenler ile bir Vanna örneğini nasıl başlatacağımıza geçeceğiz.
- Vanna Sınıfını tanımlayın.
from pymilvus import MilvusClient, model
from vanna.milvus import Milvus_VectorStore
from vanna.openai import OpenAI_Chat
from openai import OpenAI
# NVIDIA API anahtarını ayarlayın
nvidia_api_key = '...'
# Vanna Sınıfını tanımlayın
class VannaMilvus(Milvus_VectorStore, OpenAI_Chat):
def __init__(self, llm_client, config=None):
Milvus_VectorStore.__init__(self, config=config)
OpenAI_Chat.__init__(self, client=llm_client, config=config)
- Bir NIM istemcisi oluşturun.
def get_openai_client():
client = OpenAI(
base_url = "https://integrate.api.nvidia.com/v1",
api_key = nvidia_api_key
)
return client
llm_client = get_openai_client()
- NeMo Retriever gömme modelini Milvus DB ile kullanın.
class EmbeddingWrapper:
def __init__(self, embedder):
self.embedder = embedder
def encode_documents(self, texts):
result = self.embedder.embed_documents(texts)
return [np.array(r) for r in result]
def encode_queries(self, texts):
embeddings = []
for text in texts:
embeddings.append(self.embedder.embed_query(text))
return embeddings
vanna_embedder = EmbeddingWrapper(nvidia_embedder)
- Yerel bir Milvus DB örneği oluşturun.
milvus_uri = "./milvus_nvidia.db"
milvus_client_nvidia = MilvusClient(uri=milvus_uri)
- Vanna örneği için bileşenleri belirtin.
# SQL üretimi için kullanılacak LLM'i belirtin
model_name = "nvidia/llama-3.1-70b-instruct"
# Vanna örneği için yapılandırmayı belirleyin
config_nvidia = {
"model": model_name,
"milvus_client": milvus_client_nvidia,
"embedding_function": vanna_embedder,
"n_results": 2, # Milvus'tan dönecek sonuç sayısı.
}
vn_nvidia = VannaMilvus(llm_client, config=config_nvidia)
3. SQLite veritabanı oluşturun ve doldurun
- SQLite kullanarak sorgulama yapmak için hafif, sunucusuz bir veritabanı sağlayın.
import sqlite3
import pandas as pd
# SQLite veritabanına uzantıyı belirtin
sqlite_path = 'steam_data.db'
# SQLite veritabanına bağlanın
sql_connect = sqlite3.connect(sqlite_path)
c = sql_connect.cursor()
# Tabloları oluşturun
init_sqls = """
CREATE TABLE IF NOT EXISTS games (
app_id INTEGER PRIMARY KEY,
name TEXT,
release_date TEXT,
price REAL,
short_description TEXT,
positive INTEGER,
negative INTEGER,
min_owners INTEGER,
max_owners INTEGER,
hltb_single REAL
);
CREATE TABLE IF NOT EXISTS categories (
app_id INTEGER,
categories TEXT,
FOREIGN KEY (app_id) REFERENCES games(app_id)
);
CREATE TABLE IF NOT EXISTS tags (
app_id INTEGER,
tags TEXT,
tag_frequencies TEXT,
FOREIGN KEY (app_id) REFERENCES games(app_id)
);
"""
for sql in init_sqls.split(";"):
c.execute(sql)
# CSV dosyalarını okuyun
games_df = pd.read_csv('processed_dataset/games.csv')
categories_df = pd.read_csv('processed_dataset/categories.csv')
tags_df = pd.read_csv('processed_dataset/tags.csv')
# Verileri tablolara ekleyin
games_df.to_sql('games', sql_connect, if_exists='append', index=False)
categories_df.to_sql('categories', sql_connect, if_exists='append', index=False)
tags_df.to_sql('tags', sql_connect, if_exists='append', index=False)
sql_connect.commit()
- Artık SQL DB’yi Vanna ile bağlayın.
# SQLite veritabanına bağlanın
vn_nvidia.connect_to_sqlite(sqlite_path)
4. Verilerle eğitin
Vanna, sorgulanan verilerle ve iş spesifik terminolojiyle en iyi performansı gösterir.
- Mevcut eğitim verilerini kaldırın ve Vanna’yı veritabanının veri tanım dili (DDL) ile eğitin.
# Mevcut eğitim verilerini kaldırın
existing_training_data = vn_nvidia.get_training_data()
if len(existing_training_data) > 0:
for _, training_data in existing_training_data.iterrows():
vn_nvidia.remove_training_data(training_data["id"])
# SQLite veritabanının DDL'sini alın
df_ddl = vn_nvidia.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
# Modeli DDL verisi ile eğitin
for ddl in df_ddl["sql"].to_list():
vn_nvidia.train(ddl=ddl)
- Üç tablo hakkında belgeleri ekleyin.
# İş terminolojisi veya tanımları hakkında belge ekleyin.
vn_nvidia.train(
documentation="""
Bu veri seti, oyun trendleri hakkında soruları yanıtlamak için kullanılmaktadır.
"""
)
# Tablo hakkında belgeler ekleyin
vn_nvidia.train(
documentation="""
games tablosu, oyunlar hakkında bilgileri içermektedir.
app_id, oyunun benzersiz tanımlayıcısıdır. Bu bir birincil anahtardır.
adı, oyunun adıdır.
release_date, oyunun yayımlandığı tarihtir.
fiyat, oyunun fiyatıdır. USD cinsindendir, ücretsizse 0.0'dır.
kısa_ açıklama, oyunun kısa bir tanımıdır.
olumlu, olumlu yorum veya oy sayısıdır.
olumsuz, olumsuz yorum veya oy sayısıdır.
min_owners, en az sahip sayısıdır. max_owners ile birlikte kullanılarak oyuncu tabanını tahmin etmek için kullanılır.
max_owners, en fazla sahip sayısıdır. min_owners ile birlikte kullanılarak oyuncu tabanını tahmin etmek için kullanılır.
hltb_single, oyunun ortalama oyun süresidir. Bu bir tahmindir.
"""
)
vn_nvidia.train(
documentation="""
categories tablosu, oyunların kategorileri hakkında bilgileri içermektedir.
app_id, oyunun benzersiz tanımlayıcısıdır.
kategoriler, oyunun kategorileri.
app_id, games tablosuna bir yabancı anahtardır.
"""
)
vn_nvidia.train(
documentation="""
tags tablosu, oyunların etiketleri hakkında bilgileri içermektedir.
app_id, oyunun benzersiz tanımlayıcısıdır.
etiketler, oyunun etiketleri. Bunlar kullanıcı tanımlıdır.
etiket_frekansları, etiketlerin sıklıklarıdır.
app_id, games tablosuna bir yabancı anahtardır.
"""
)
- Eğitim verilerini görüntüleyin.
training_data = vn_nvidia.get_training_data()
training_data
5. SQL Üretimi
Artık NIM destekli Vanna ile veritabanını sorgulamaya hazırsınız.
- Basit bir sorgu ile başlayın. Üretilen SQL’i çalıştırmadan önce yazdırabilirsiniz.
sql = vn_nvidia.generate_sql("Hangi 5 oyun en çok olumlu yoruma sahip ve sayısı nedir?")
vn_nvidia.run_sql(sql)
- Daha zor bir sorgu çalıştırın.
sql = vn_nvidia.generate_sql("Hangi bağımsız oyun en büyük oyuncu tabanına sahip?")
vn_nvidia.run_sql(sql)
Sonuç
Bu eğitimde, NVIDIA NIM kullanarak Vanna üzerinde metinden SQL’e çıkarımını hızlandırmayı öğrendiniz.
Temiz bir veritabanı şeması, gerçek dünya veri seti ve optimize edilmiş bir çıkarım uç noktası ile sisteminiz, kullanıcı tarafından oluşturulan sorgular için daha duyarlı analitik sunmaya iyi bir şekilde hazırlanmıştır.
Daha fazla keşfetmek için:
- Vanna’yı kendi veri setinizde deneyin.
- NVIDIA NIM uç noktalarını üretim ölçeğinde çıkarım için dağıtın.
Farklı eğitim bilgilerinin eklenmesi ile daha iyi SQL üretimi için deneyin.