File size: 6,972 Bytes
c399543
 
8e05fb6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c399543
 
8e05fb6
 
 
 
c399543
8e05fb6
 
 
 
c399543
8e05fb6
c399543
8e05fb6
c399543
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
 
 
8e05fb6
 
 
c399543
 
 
 
8e05fb6
 
 
c399543
8e05fb6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c399543
 
 
 
 
 
 
8e05fb6
 
 
 
 
 
 
c399543
8e05fb6
 
 
 
 
c399543
 
8e05fb6
c399543
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
8e05fb6
c399543
8e05fb6
c399543
 
 
 
 
8e05fb6
c399543
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
import gradio as gr
import time
import json

# Import RAG system components
from rag_system.vector_store import VectorStore
from rag_system.retriever import SQLRetriever
from rag_system.prompt_engine import PromptEngine
from rag_system.sql_generator import SQLGenerator

# Initialize RAG system components
print("Initializing RAG system...")
try:
    vector_store = VectorStore()
    retriever = SQLRetriever(vector_store)
    prompt_engine = PromptEngine()
    sql_generator = SQLGenerator(retriever, prompt_engine)
    print("RAG system initialized successfully!")
except Exception as e:
    print(f"Error initializing RAG system: {e}")
    sql_generator = None

def generate_sql(question, table_headers):
    """Generate SQL using the RAG system directly."""
    if sql_generator is None:
        return "❌ Error: RAG system not initialized"
    
    try:
        start_time = time.time()
        
        # Generate SQL using RAG system
        result = sql_generator.generate_sql(question, table_headers)
        
        processing_time = time.time() - start_time
        
        return f"""
**Generated SQL:**
```sql
{result['sql_query']}
```

**Model Used:** {result['model_used']}
**Processing Time:** {processing_time:.2f}s
**Status:** {result['status']}
**Retrieved Examples:** {len(result['retrieved_examples'])} examples used for RAG
"""
    except Exception as e:
        return f"❌ Error: {str(e)}"

def batch_generate_sql(questions_text, table_headers):
    """Generate SQL for multiple questions."""
    if sql_generator is None:
        return "❌ Error: RAG system not initialized"
    
    try:
        # Parse questions
        questions = [q.strip() for q in questions_text.split("\n") if q.strip()]
        
        output = f"**Batch Results:**\n"
        output += f"Total Queries: {len(questions)}\n"
        successful_count = 0
        
        for i, question in enumerate(questions):
            try:
                start_time = time.time()
                result = sql_generator.generate_sql(question, table_headers)
                processing_time = time.time() - start_time
                
                output += f"\n**Query {i+1}:** {question}\n"
                output += f"```sql\n{result['sql_query']}\n```\n"
                output += f"Model: {result['model_used']} | Time: {processing_time:.2f}s\n"
                
                if result['status'] == 'success':
                    successful_count += 1
                    
            except Exception as e:
                output += f"\n**Query {i+1}:** {question}\n"
                output += f"❌ Error: {str(e)}\n"
        
        output += f"\n**Successful:** {successful_count}/{len(questions)}"
        return output
        
    except Exception as e:
        return f"❌ Error: {str(e)}"

def check_system_health():
    """Check the health of the RAG system."""
    try:
        if sql_generator is None:
            return "❌ System Status: RAG system not initialized"
        
        # Get model info
        model_info = sql_generator.get_model_info()
        
        return f"""
**System Health:**
- **Status:** βœ… Healthy
- **System Loaded:** βœ… Yes
- **System Loading:** ❌ No
- **Error:** None
- **Timestamp:** {time.strftime('%Y-%m-%d %H:%M:%S')}

**Model Info:**
{json.dumps(model_info, indent=2) if model_info else 'Not available'}
"""
    except Exception as e:
        return f"❌ Health check error: {str(e)}"

# Create Gradio interface
with gr.Blocks(title="Text-to-SQL RAG with CodeLlama", theme=gr.themes.Soft()) as demo:
    gr.Markdown("#Text-to-SQL RAG with CodeLlama")
    gr.Markdown("Generate SQL queries from natural language using **RAG (Retrieval-Augmented Generation)** and **CodeLlama** models.")
    gr.Markdown("**Features:** RAG-enhanced generation, CodeLlama integration, Vector-based retrieval, Advanced prompt engineering")
    
    with gr.Tab("Single Query"):
        with gr.Row():
            with gr.Column(scale=1):
                question_input = gr.Textbox(
                    label="Question",
                    placeholder="e.g., Show me all employees with salary greater than 50000",
                    lines=3
                )
                table_headers_input = gr.Textbox(
                    label="Table Headers (comma-separated)",
                    placeholder="e.g., id, name, salary, department",
                    value="id, name, salary, department"
                )
                generate_btn = gr.Button("Generate SQL", variant="primary", size="lg")
            
            with gr.Column(scale=1):
                output = gr.Markdown(label="Result")
    
    with gr.Tab("Batch Queries"):
        with gr.Row():
            with gr.Column(scale=1):
                batch_questions = gr.Textbox(
                    label="Questions (one per line)",
                    placeholder="Show me all employees\nCount total employees\nAverage salary by department",
                    lines=5
                )
                batch_headers = gr.Textbox(
                    label="Table Headers (comma-separated)",
                    placeholder="e.g., id, name, salary, department",
                    value="id, name, salary, department"
                )
                batch_btn = gr.Button("Generate Batch SQL", variant="primary", size="lg")
            
            with gr.Column(scale=1):
                batch_output = gr.Markdown(label="Batch Results")
    
    with gr.Tab("System Health"):
        with gr.Row():
            health_btn = gr.Button("Check System Health", variant="secondary", size="lg")
            health_output = gr.Markdown(label="Health Status")
    
    # Event handlers
    generate_btn.click(
        generate_sql,
        inputs=[question_input, table_headers_input],
        outputs=output
    )
    
    batch_btn.click(
        batch_generate_sql,
        inputs=[batch_questions, batch_headers],
        outputs=batch_output
    )
    
    health_btn.click(
        check_system_health,
        outputs=health_output
    )
    
    gr.Markdown("---")
    gr.Markdown("""
    ## How It Works
    
    1. **RAG System**: Retrieves relevant SQL examples from vector database
    2. **CodeLlama**: Generates SQL using retrieved examples as context
    3. **Vector Search**: Finds similar questions and their SQL solutions
    4. **Enhanced Generation**: Combines retrieval + generation for better accuracy
    
    ## Technology Stack
    
    - **Backend**: Direct RAG system integration
    - **LLM**: CodeLlama-7B-Python-GGUF (primary)
    - **Vector DB**: ChromaDB with sentence transformers
    - **Frontend**: Gradio interface
    - **Hosting**: Hugging Face Spaces
    
    ## Performance
    
    - **Model**: CodeLlama-7B-Python-GGUF
    - **Response Time**: < 5 seconds
    - **Accuracy**: High (RAG-enhanced)
    - **Cost**: Free (local inference)
    """)

# Launch the interface
if __name__ == "__main__":
    demo.launch()