eliza555beth2002 commited on
Commit
df3c0b2
·
verified ·
1 Parent(s): b6b0a4b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -26
app.py CHANGED
@@ -1,19 +1,57 @@
1
  import gradio as gr
2
  from llama_cpp import Llama
3
  import os
 
 
4
 
5
- # Загрузка модели (GGUF из HF)
6
- model_path = "eliza555beth2002/DeepSeek-R1-Distill-Text2SQL-OneEpoch-GGUF-q4"
7
- llm = Llama.from_pretrained(
8
- model_path,
9
- n_ctx=2048, # Контекст для схемы БД
10
- n_gpu_layers=-1, # Использовать GPU, если доступно
11
- verbose=False
12
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  def generate_sql(natural_query, db_schema):
15
- # Шаблон промпта для Text2SQL (адаптируйте, если у модели другой)
16
- prompt = f"""You are a SQL expert. Given the database schema below, generate a valid SQL query for the natural language question.
 
17
 
18
  Database Schema:
19
  {db_schema}
@@ -22,36 +60,60 @@ def generate_sql(natural_query, db_schema):
22
 
23
  SQL Query:"""
24
 
25
- output = llm(
26
- prompt,
27
- max_tokens=150,
28
- stop=[";", "\n\n"],
29
- echo=False
30
- )
31
- sql_query = output['choices'][0]['text'].strip()
32
- return sql_query
 
 
 
 
 
 
33
 
34
  # Gradio интерфейс
35
  with gr.Blocks(title="Text2SQL Demo") as demo:
36
- gr.Markdown("# Text2SQL: Преобразование текста в SQL")
 
 
37
  with gr.Row():
38
- natural_input = gr.Textbox(label="Вопрос на естественном языке", placeholder="Найди всех пользователей старше 30 лет")
39
- schema_input = gr.Textbox(label="Схема БД (таблицы и поля)", placeholder="CREATE TABLE users (id INT, name VARCHAR, age INT);")
40
- output = gr.Textbox(label="Сгенерированный SQL")
41
- submit_btn = gr.Button("Генерировать SQL")
 
 
 
 
 
 
 
 
 
42
 
 
43
  submit_btn.click(
44
  fn=generate_sql,
45
  inputs=[natural_input, schema_input],
46
  outputs=output
47
  )
 
 
48
  gr.Examples(
49
  examples=[
50
- ["Сколько продуктов дороже 100?", "CREATE TABLE products (id INT, name VARCHAR, price DECIMAL);"],
51
- ["Пользователи из Москвы", "CREATE TABLE users (id INT, name VARCHAR, city VARCHAR);"]
 
52
  ],
53
  inputs=[natural_input, schema_input]
54
  )
 
 
 
55
 
56
  if __name__ == "__main__":
57
- demo.launch()
 
1
  import gradio as gr
2
  from llama_cpp import Llama
3
  import os
4
+ from huggingface_hub import snapshot_download
5
+ import logging
6
 
7
+ # Настройка логирования для отладки в HF Spaces
8
+ logging.basicConfig(level=logging.INFO)
9
+ logger = logging.getLogger(__name__)
10
+
11
+ # ID модели на HF
12
+ model_repo = "eliza555beth2002/DeepSeek-R1-Distill-Text2SQL-OneEpoch-GGUF-q4"
13
+
14
+ # Локальная директория для модели (HF Spaces монтирует /app)
15
+ model_dir = "./model"
16
+ model_filename = "DeepSeek-R1-Distill-Text2SQL-OneEpoch-Q4_K_M.gguf" # Точное имя файла из репозитория
17
+
18
+ # Скачивание модели (если не скачана)
19
+ if not os.path.exists(os.path.join(model_dir, model_filename)):
20
+ logger.info("Скачиваем модель... Это может занять 5–10 мин.")
21
+ try:
22
+ snapshot_download(
23
+ repo_id=model_repo,
24
+ local_dir=model_dir,
25
+ local_dir_use_symlinks=False, # Избежать проблем с симлинками в Spaces
26
+ allow_patterns=[model_filename] # Скачать только GGUF
27
+ )
28
+ logger.info("Модель скачана успешно.")
29
+ except Exception as e:
30
+ logger.error(f"Ошибка скачивания: {e}")
31
+ raise
32
+
33
+ # Полный путь к модели
34
+ model_path = os.path.join(model_dir, model_filename)
35
+
36
+ # Загрузка модели
37
+ logger.info("Загружаем Llama...")
38
+ try:
39
+ llm = Llama(
40
+ model_path=model_path,
41
+ n_ctx=2048, # Контекст для схемы БД
42
+ n_gpu_layers=-1, # Использовать GPU, если доступно (в Spaces с T4)
43
+ verbose=False,
44
+ seed=42 # Для воспроизводимости
45
+ )
46
+ logger.info("Модель загружена успешно.")
47
+ except Exception as e:
48
+ logger.error(f"Ошибка загрузки модели: {e}")
49
+ raise
50
 
51
  def generate_sql(natural_query, db_schema):
52
+ # Шаблон промпта для Text2SQL (улучшенный для точности)
53
+ prompt = f"""You are a SQL expert. Given the database schema below, generate a valid SQL query for the natural language question.
54
+ Use only the provided schema. Output only the SQL query, no explanations.
55
 
56
  Database Schema:
57
  {db_schema}
 
60
 
61
  SQL Query:"""
62
 
63
+ try:
64
+ output = llm(
65
+ prompt,
66
+ max_tokens=150,
67
+ temperature=0.1, # Низкая для точности SQL
68
+ stop=[";", "\n\n", "Question:"], # Стоп на конце запроса
69
+ echo=False
70
+ )
71
+ sql_query = output['choices'][0]['text'].strip()
72
+ if not sql_query.endswith(';'):
73
+ sql_query += ';'
74
+ return sql_query
75
+ except Exception as e:
76
+ return f"Ошибка генерации: {e}"
77
 
78
  # Gradio интерфейс
79
  with gr.Blocks(title="Text2SQL Demo") as demo:
80
+ gr.Markdown("# Text2SQL: Преобразование текста в SQL\n\nМодель: DeepSeek-R1-Distill (8B, q4 GGUF)")
81
+ gr.Markdown("**Статус:** Модель загружена. Введите вопрос и схему для генерации SQL.")
82
+
83
  with gr.Row():
84
+ natural_input = gr.Textbox(
85
+ label="Вопрос на естественном языке",
86
+ placeholder="Найди всех пользователей старше 30 лет из Москвы",
87
+ lines=2
88
+ )
89
+ schema_input = gr.Textbox(
90
+ label="Схема БД (CREATE TABLE)",
91
+ placeholder="CREATE TABLE users (id INT, name VARCHAR(100), age INT, city VARCHAR(50));",
92
+ lines=3
93
+ )
94
+
95
+ output = gr.Textbox(label="Сгенерированный SQL", lines=3)
96
+ submit_btn = gr.Button("Генерировать SQL", variant="primary")
97
 
98
+ # Связь событий
99
  submit_btn.click(
100
  fn=generate_sql,
101
  inputs=[natural_input, schema_input],
102
  outputs=output
103
  )
104
+
105
+ # Примеры
106
  gr.Examples(
107
  examples=[
108
+ ["Сколько продуктов дороже 100?", "CREATE TABLE products (id INT, name VARCHAR(100), price DECIMAL(10,2));"],
109
+ ["Пользователи из Москвы старше 25", "CREATE TABLE users (id INT, name VARCHAR(100), age INT, city VARCHAR(50));"],
110
+ ["Топ 5 самых дорогих заказов", "CREATE TABLE orders (id INT, customer_id INT, total DECIMAL(10,2));"]
111
  ],
112
  inputs=[natural_input, schema_input]
113
  )
114
+
115
+ # Футер с логами
116
+ gr.Markdown("**Логи:** Проверьте консоль для деталей.")
117
 
118
  if __name__ == "__main__":
119
+ demo.launch(server_name="0.0.0.0", server_port=7860) # Для HF Spaces