Bu proje, Akbank GenAI Bootcamp kapsamında geliştirilmiş , RAG (Retrieval-Augmented Generation) temelli bir yemek tarifi chatbot'udur
Projenin temel amacı, turkish_food.csv (veya benzer bir) veri setindeki yemek tariflerini kullanarak kullanıcıların doğal dilde sorduğu sorulara yanıt veren bir web tabanlı chatbot oluşturmaktır. Kullanıcılar, "Bana bir çorba tarifi ver" veya "İçinde et olan hangi yemekler var?" gibi sorular sorarak tarif veritabanını sorgulayabilir.
Proje, turkish_food.csv (veya create_database.py betiğine --csv argümanı ile sağlanan herhangi bir) CSV dosyasını işleyerek bir vektör veritabanı oluşturur.
Veri Seti Bilgisi:
Bu projede, turkish_food.csv adlı bir CSV dosyası kullanılmıştır. (Not: Kod, indian_food.csv gibi benzer yapıdaki diğer dosyalarla da çalışabilir).
Veri setinin, create_database.py betiğinin beklentilerine göre şu sütunları içermesi gerekmektedir:
name: Yemeğin adıdiet: Diyet türü (örn: vejetaryen, glutensiz)course: Kategori (örn: ana yemek, çorba, tatlı)flavor_profile: Lezzet profili (örn: tatlı, tuzlu, baharatlı)prep_time: Hazırlama süresi (dakika)cook_time: Pişirme süresi (dakika)state: (Bölge/Eyalet)region: (Bölge)ingredients: Malzemeler (virgülle ayrılmış metin)
Hazırlanış Metodolojisi:
Veri seti, create_database.py betiği kullanılarak RAG mimarisine uygun hale getirilmiştir. Bu betik sırasıyla şu işlemleri yapar:
- CSV Okuma: Pandas kütüphanesi ile
--csvyolundaki veri seti okunur. - Sütun Doğrulama:
name,diet,course,flavor_profile,prep_time,cook_time,state,region,ingredientssütunlarının varlığı kontrol edilir. - Veri Temizleme ve Normalizasyon:
norm_strfonksiyonu: Tüm metin alanlarındaki (örn:name,diet) başındaki/sonundaki boşluklar alınır ve birden fazla boşluk tek boşluğa indirgenir.to_intfonksiyonu:prep_timevecook_timesütunlarındaki değerler güvenli bir şekilde tamsayıya (integer) dönüştürülür. "-1" veya "N/A" gibi hatalı girdiler "0" olarak ayarlanır.norm_ingredientsfonksiyonu:ingredientssütunundaki virgül (,) veya noktalı virgül (;) ile ayrılmış malzeme listesi ayrıştırılır, her bir malzeme küçük harfe çevrilir, temizlenir ve yinelenen girdiler kaldırılır.
- Doküman Oluşturma (
build_doc_text):- Her bir tarif satırı, LLM'in (Büyük Dil Modeli) anlayabileceği yapılandırılmış bir metin dokümanına dönüştürülür. Bu doküman, model için "Bağlam (Context)" görevi görecektir.
- Embedding ve Depolama:
- Hazırlanan tüm metin dokümanları, Google'ın
models/text-embedding-004modeli kullanılarak vektörlere dönüştürülür. - Bu vektörler, tariflerin metadata'ları (isim, diyet, süre vb.) ile birlikte
Chromavektör veritabanına kaydedilir. Veritabanı,./chroma_dbdizininde saklanır.
- Hazırlanan tüm metin dokümanları, Google'ın
Bu proje bir Google Colab ortamında veya lokal bir makinede çalıştırılabilir.
1.Gereksinimler (requirements.txt)
Aşağıdaki kütüphanelerin kurulu olması gerekmektedir: flask flask-ngrok google-generativeai langchain-google-genai langchain-community chromadb markdown python-dotenv pandas pyngrok google-api-python-client google-auth 2. Kurulum ve Çalıştırma (Lokal/Sunucu)
-
Sanal Ortam (Önerilir):
-
Kütüphanelerin Kurulumu:]
-
Google API Anahtarı:
GOOGLE_API_KEYadında bir ortam değişkeni tanımlayın veya Colab kullanıyorsanız "Secrets" bölümüne ekleyin.
-
Veri Seti:
turkish_food.csvdosyasını ana dizine yerleştirin.
-
Veritabanını Oluşturma:
create_database.pybetiğini çalıştırarak vektör veritabanını (./chroma_db) oluşturun:
python create_database.py --csv turkish_food.csv
-
Sunucuyu Başlatma:
app.pybetiğini çalıştırarak Flask sunucusunu başlatın:
python app.py
- Sunucu varsayılan olarak
http://0.0.0.0:5000adresinde çalışacaktır.
3. Çalıştırma (Google Colab)
- API Anahtarı: Colab'in sol tarafındaki "Secrets" (Anahtar ikonu 🔑) bölümüne
GOOGLE_API_KEY'inizi ekleyin. - Veri Seti: Colab'in sol tarafındaki "Files" bölümüne
turkish_food.csvdosyasını yükleyin. - Kod Hücreleri: Proje notebook'undaki tüm
!pip installhücrelerini çalıştırın. %%writefilekomutlarını içeren tüm hücreleri çalıştırarakcreate_database.py,templates/index.htmlveapp.pydosyalarını oluşturun.!python create_database.py ...hücresini çalıştırarak veritabanını oluşturun.- API anahtarını yükleyen (Cell 11) ve sunucuyu başlatan (Cell 12:
!python app.py &) hücreleri çalıştırın. - Son hücreyi (
output.eval_js...) çalıştırarak proxy URL'sini alın ve chatbot arayüzüne erişin.
Çözülen Problem: Bu proje, yapılandırılmış bir CSV dosyasında (yemek tarifleri) bulunan bilgilere doğal dil ile erişim problemini çözmektedir. Kullanıcıların, SQL veya filtreleme mantığı bilmeden, "Bana 30 dakikadan az süren bir tarif bul" gibi karmaşık sorgular yapabilmesini sağlar.
Kullanılan Teknolojiler:
- Generation (Üretken) Model:
gemini-2.5-flash(Google Gemini API) - Embedding Modeli:
models/text-embedding-004(Google) - Vektör Veritabanı (Vector DB):
Chroma(Lokal disk tabanlı) - RAG Pipeline Framework:
LangChain - Web Framework & Arayüz:
Flask&HTML/CSS/JavaScript
RAG Mimarisi: Mimari iki ana aşamadan oluşur:
1. İndeksleme (Offline) - create_database.py
Bu aşama, veri hazırlandıktan sonra bir kez çalıştırılır:
- Yükle:
turkish_food.csvdosyası Pandas DataFrame'e yüklenir. - Dönüştür: Her satır,
build_doc_textfonksiyonu ile yapılandırılmış bir metin dokümanına çevrilir. - Göm (Embed): Her doküman
GoogleGenerativeAIEmbeddings(text-embedding-004) kullanılarak vektörel bir temsile dönüştürülür. - Depola: Bu vektörler ve ilişkili meta veriler (isim, diyet, süre vb.)
Chromaveritabanına kaydedilir.
2. Sorgulama (Online) - app.py (get_answer fonksiyonu)
Bu aşama, kullanıcı her mesaj gönderdiğinde çalışır:
- Sorgu (Query): Kullanıcının (örn: "Hafif bir tatlı tarifi") mesajı alınır.
- Sorgu Gömme (Query Embedding): Kullanıcının sorgusu da aynı
text-embedding-004modeli ile bir vektöre dönüştürülür. - Getir (Retrieve): Bu sorgu vektörü,
Chromaveritabanındasimilarity_searchyapmak için kullanılır. Veritabanı, sorguya anlamsal olarak en yakınk=5adet tarifi (dokümanı) döndürür. - Büyüt (Augment): Alınan bu 5 tarif dokümanı, bir "Bağlam (Context)" bloğu olarak birleştirilir.
- Üret (Generate): Bu bağlam,
gemini-2.5-flashmodeline bir sistem talimatı (prompt) ile birlikte gönderilir. - Yanıt: Modelin ürettiği yanıt, Flask üzerinden web arayüzüne geri gönderilir.
Deploy Linki:
Proje Google Colab üzerinde çalıştırıldığında, proxy URL'si (örn: https://5000-m-s-2dgccsbfqwft2-a.us-west4-1.prod.colab.dev/) deploy linki olarak kullanılır.
Çalışma Akışı ve Arayüz Testi:
Bunları destekleyen ekran görüntüleri image klasöründedir
Web arayüzü (index.html), sol tarafta bir sohbet geçmişi listesi ve sağ tarafta ana sohbet penceresi bulunan klasik bir chatbot tasarımıdır.
- Ana Sayfa: Kullanıcı linki açtığında,
index.htmlyüklenir. Eğer mevcut bir sohbet yoksa, "Yemek Tarifi Chatbot" başlığı ve örnek bir soru (Örn: “Air fryer’da patates var mı?”) görünür. - Yeni Sohbet: Soldaki "Yeni Sohbet +" butonuna tıklayarak mevcut sohbeti temizleyebilir ve yeni bir oturum (
session_id) başlatabilirsiniz. - Mesaj Gönderme: Alttaki giriş kutusuna sorunuzu yazıp "Gönder" butonuna tıkladığınızda:
- Mesajınız "user" (mavi) olarak ekrana eklenir.
- "Yazıyor..." göstergesi belirir.
/send_messageendpoint'ine (uç noktasına) birPOSTisteği gönderilir.app.pyiçindekiget_answerfonksiyonu çalışır (RAG süreci).- Modelden gelen yanıt "bot" (gri) olarak ekranda görünür.
- Sohbet Geçmişi:
- Gönderdiğiniz ilk mesaj, o sohbetin başlığı olarak (örn: "Bana bir çorba tarifi...") sol taraftaki listeye eklenir.
- Geçmiş sohbet başlıklarına tıklayarak o konuşmaları geri yükleyebilirsiniz.
Projenin Kabiliyetlerini Test Etme Senaryoları: Botun kabiliyetlerini test etmek için aşağıdaki gibi sorular sorabilirsiniz:
- Genel Tarif İsteği: "Bana bir ana yemek tarifi verebilir misin?"
- Spesifik Malzeme Sorgusu: "İçinde patlıcan olan hangi tarifler var?"
- Diyet/Kategori Filtrelemesi: "Vejetaryen tatlı tarifi arıyorum."
- Süre Filtrelemesi: "Hazırlaması 15 dakikadan az süren bir yemek var mı?"
- Veri Setinde Olmayan Soru (Negatif Test): "Bana İtalyan pizzası tarifi ver." (Eğer
turkish_food.csviçinde yoksa, modelin "Veritabanımda bu tarif yok." demesi beklenir). - Konu Dışı Soru (Güvenlik Testi): "Türkiye'nin başkenti neresidir?" (Modelin, "Sadece tariflerle ilgili soruları yanıtla." kuralına uyması beklenir)