emirozalp commited on
Commit
5c554f2
·
verified ·
1 Parent(s): ff2e97e

Upload 3 files

Browse files
Files changed (3) hide show
  1. .env +2 -0
  2. app.py +138 -0
  3. requirements.txt +10 -0
.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ GEMINI_API_KEY="AIzaSyAon2zSROtezSHa19yQtCJItskzkYcDVxI"
2
+
app.py ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import google.generativeai as genai
4
+ from datasets import load_dataset
5
+ from sentence_transformers import SentenceTransformer
6
+ import pandas as pd
7
+ import numpy as np
8
+ import faiss
9
+ from dotenv import load_dotenv
10
+ from pyngrok import ngrok
11
+ import os
12
+ os.environ.pop("http_proxy", None)
13
+ os.environ.pop("https_proxy", None)
14
+
15
+
16
+ load_dotenv()
17
+
18
+ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
19
+ genai.configure(api_key=GEMINI_API_KEY)
20
+
21
+ # MODEL_CONFIG
22
+ MODEL_CONFIG = {
23
+ "temperature": 0.7,
24
+ "top_p": 0.95,
25
+ "top_k": 40,
26
+ "max_output_tokens": 4096
27
+ }
28
+
29
+ # SYSTEM_PROMPT
30
+ SYSTEM_PROMPT = (
31
+ "Sen deneyimli bir Türk aşçısısın. "
32
+ "Kullanıcılara yemek tarifleri, pişirme önerileri ve püf noktaları hakkında yardımcı oluyorsun. "
33
+ "Yanıtlarında doğal, açıklayıcı ve sıcak bir üslup kullan. "
34
+ "Tarifleri anlaşılır adımlarla anlat, gerekirse püf noktası ver. "
35
+ "Eğer kullanıcı malzemeler belirtirse, o malzemelere uygun bir yemek öner. "
36
+ "Rastgele uydurma bilgi verme; sadece veri setinde bulunan bilgilerden yararlan."
37
+ )
38
+
39
+ # Hugging Face veriseti: https://huggingface.co/datasets/mertbozkurt/turkish-recipe
40
+ dataset = load_dataset("mertbozkurt/turkish-recipe", data_files="datav2.csv")
41
+
42
+ df = pd.DataFrame(dataset["train"])
43
+ df.dropna(subset=["Title", "How-to-do"], inplace=True)
44
+ df["text"] = (
45
+ "Yemek Adı: " + df["Title"].astype(str) + "\n"
46
+ + "Kategori: " + df["Category"].astype(str) + "\n"
47
+ + "Malzemeler: " + df["Materials"].astype(str) + "\n"
48
+ + "Yapılışı: " + df["How-to-do"].astype(str)
49
+ )
50
+
51
+ model_embed = SentenceTransformer("intfloat/multilingual-e5-base")
52
+
53
+ # Tüm tariflerin embedding'lerini oluştur
54
+ embeddings = model_embed.encode(df["text"].tolist(), normalize_embeddings=True)
55
+
56
+ # FAISS ile index oluştur
57
+ index = faiss.IndexFlatIP(embeddings.shape[1])
58
+ index.add(embeddings)
59
+
60
+ def retrieve_recipes(query, k=3):
61
+ q_emb = model_embed.encode([query], normalize_embeddings=True)
62
+ D, I = index.search(q_emb, k)
63
+ return df.iloc[I[0]]["text"].tolist()
64
+
65
+
66
+ def chat_function(message, history):
67
+ try:
68
+ context = "\n\n".join(retrieve_recipes(message))
69
+ chat_context = "\n".join([f"Kullanıcı: {h[0]}\nAsistan: {h[1]}" for h in history])
70
+
71
+ prompt = f"""{SYSTEM_PROMPT}
72
+
73
+ Geçmiş konuşma:
74
+ {chat_context}
75
+
76
+ Yeni kullanıcı mesajı: {message}
77
+
78
+ Aşağıda veri tabanında benzer bulunan tarifler:
79
+ {context}
80
+
81
+ Bu bilgiler ışığında, kullanıcıya uygun Türkçe bir yanıt oluştur.
82
+ """
83
+
84
+ model = genai.GenerativeModel(
85
+ model_name="gemini-2.0-flash",
86
+ generation_config=MODEL_CONFIG,
87
+ system_instruction=SYSTEM_PROMPT
88
+ )
89
+
90
+ response = model.generate_content(prompt)
91
+ return response.text if response.text else "Yanıt alınamadı."
92
+ except Exception as e:
93
+ return f"Hata: {str(e)}"
94
+
95
+
96
+ theme = gr.themes.Soft(
97
+ primary_hue="amber",
98
+ secondary_hue="red",
99
+ neutral_hue="stone",
100
+ text_size="lg",
101
+ font=["Poppins", "sans-serif"],
102
+ ).set(
103
+ body_background_fill="linear-gradient(135deg, #fff8f0, #ffe9d6)",
104
+ block_background_fill="rgba(255, 255, 255, 0.85)",
105
+ block_shadow="0 4px 20px rgba(0,0,0,0.1)",
106
+ block_border_color="rgba(255, 200, 150, 0.5)",
107
+ button_primary_background_fill="linear-gradient(90deg, #ff9d2f, #ff6126)",
108
+ button_primary_background_fill_hover="linear-gradient(90deg, #ffb347, #ff6a2f)",
109
+ button_primary_text_color="white",
110
+ input_background_fill="rgba(255,255,255,0.9)",
111
+ background_fill_secondary="rgba(255,255,255,0.6)",
112
+ )
113
+
114
+ demo = gr.ChatInterface(
115
+ fn=chat_function,
116
+ title="👨‍🍳 ChefMind - Türkçe Yapay Zekalı Yemek Asistanı Emir ÖZALP 🍽️",
117
+ description=(
118
+ "👋 Hoş geldin! Ben senin kişisel Türk aşçınım. 👩‍🍳\n\n"
119
+ "🥘 Sen elindeki malzemeleri yaz, ne pişirebileceğini birlikte bulalım.\n"
120
+ "🍲 Ya da doğrudan bir yemeğin nasıl yapıldığını sor!\n\n"
121
+ "ChefMind olarak sana , 11.000+ yemek tarifi arasından özel öneriler sunabilirim ✨"
122
+ ),
123
+ examples=[
124
+ ["Evde tavuk, patates ve biber var, ne pişirebilirim?"],
125
+ ["Sodalı köfte nasıl yapılır?"],
126
+ ["Kıymalı makarna için önerin var mı?"],
127
+ ["Tatlı istiyorum ama süt yok, ne yapabilirim?"],
128
+ ["Hatay usulü kebap tarifi verir misin?"]
129
+ ],
130
+ theme=theme,
131
+ )
132
+
133
+ if __name__ == "__main__":
134
+ demo.launch(server_name="0.0.0.0", server_port=7860, share=True)
135
+ public_url = ngrok.connect(7860)
136
+ print(public_url)
137
+
138
+
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ gradio==5.5.0
2
+ google-generativeai==0.8.3
3
+ datasets==3.1.0
4
+ sentence-transformers==3.0.1
5
+ faiss-cpu==1.8.0.post1
6
+ pandas==2.2.3
7
+ numpy==1.26.4
8
+ python-dotenv==1.0.1
9
+ gunicorn==23.0.0
10
+ flask==3.0.3